воскресенье, 25 марта 2012 г.

Примеры простых программ на Lazarus для Win32 (Часть 1). Резюме.

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

Комментариев нет:

Отправить комментарий