Вообще резюме я решил написать, чтобы сформулировать отличия, которые я заметил в сравнении с 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
Комментариев нет:
Отправить комментарий