Вообще резюме я решил написать, чтобы сформулировать отличия, которые я заметил в сравнении с Delphi. Lazarus производит вполне себе нормальное впечатление, пока делаешь несложные штуки. Местами я конечно поломал голову, но с ума не сошел ;-) (это я говорю скорее про вторую часть поста, которая на подходе).
Различия с Delphi 7 на самом деле небольшие (наверняка опять же, пока делаешь, что-то не слишком мудреное). Наверняка люди, берущиеся портировать под Lazarus, испытывают… приятное ;-)
В общем не так много чего я и заметил. Впредь буду внимательнее.
Справочная система
Имхо, справочные системы Lazarus и Delphi вполне себе сравнимы. Если хочется чего-то выяснить – можно попробовать на форум какой-нибудь слазить.
Назначение обработчиков событий в RunTime.
button1.OnClick := @Button1Click;
В Delphi можно было бы обойтись и без оператора взятия адреса.
Утечки памяти
Отлов утечек памяти предлагают выполнять директивой компилятора –gh. (Может быть установлен в Проект-Параметры проекта-Параметры компилятора-Компоновка-Использовать модуль Heaptrc (-gh)).
Sleep и ProcessMessages
В Delphi, если необходимо в процессе выполнения одного обработчика события дать возможность приложению обработать другое событие, нужно было использовать процедуру Sleep(). То есть:
procedure Form1.Button1Click(Sender:TObject);
begin
Stopped:=false;
while true do
begin
DoSomething;
Sleep(20);
Application.ProcessMessages;
if Stopped then
Break;
end;
end;
procedure Form1.Button2Click(Sender:TObject);
begin
Stopped:=true;
end;
В Lazarus достаточно Application.ProcessMessages. По крайней мере, в однопоточных приложениях рекомендуют делать именно так. Я попробовал, такой код, как в примере, со Sleep и работать не будет.
В документации наткнулся на недлинный рассказ про многопоточность.
Set of Char
Примечательно, что Set of Char = ['а'..'я'] вызывает ошибку компиляции. Почему? По-простому отвечено тут
А! И еще приятно, что for in do работает.
Далее привожу фрагмент консольного приложения:
type
TSomeChars = set of char;
procedure TMyApplication.DoRun;
procedure WriteSet(const S: TSomeChars);
var
c: char;
begin
WriteLn;
for c in S do
Write(c + ' ');
end;
begin
WriteSet(['0'..'9']);
WriteSet(['1'..'0']);
WriteSet(['0', '1'..'9']);
//WriteSet([['а'..'я']); Ошибка компиляции: Ordinal expression expected
WriteSet(['a'..'z', 'A'..'Z']);
ReadLn;
Terminate;
end;
Листинг:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
Комментариев нет:
Отправить комментарий