Tem um mês mais ou menos comecei a usar para ver diferenças menos óbvias de sintaxe entre diferentes compiladores de uma mesma linguagem (sou velho, programo em Delphi) e algumas coisas no Lazarus são diferentes. Acaba ajudando um bocado.
Por exemplo, tenho um conjunto de componentes TEdit (para entrada de texto) e quero que no evento onExit deles seja executada uma função que muda a cor de fundo do componente se ele estiver vazio. Escreveria a rotina em Delphi dessa forma:
procedure TForm1.varreEdits(Sender: TForm);
var
C: Smallint;
begin
with Sender do
begin
for C := 0 to ComponentCount - 1 do
begin
if (Components[C].ClassType = TEdit) then
begin
TEdit(Components[C]).OnExit := pintaFundo;
end
end;
end;
end;
No envento ou Show do Formulário eu exacutaria essa rotina:
procedure TForm1.FormShow(Sender: TObject);
begin
varreEdits(Self);
end;
E a rotina de "pintaFundo" ficaria:
procedure TForm1.pintaFundo(Sender: TObject);
begin
if (TEdit(Sender).Text = '') then
TEdit(Sender).Color := clRed
else
TEdit(Sender).Color := clBtnFace;
end;
No Lazarus eu teria que fazer a rotina "varreEdits" ligeiramente diferente:
procedure TForm1.varreEdits(Sender: TForm);
var
C: Smallint;
begin
with Sender do
begin
for C := 0 to ComponentCount - 1 do
begin
if (Components[C] is TEdit) then
begin
TEdit(Components[C]).OnExit := @pintaFundo;
end
end;
end;
end;
E a rotina "pintaFundo" também ficaria ligeiramente diferente:
procedure TForm1.pintaFundo(Sender: TObject);
begin
if (Sender is TEdit) and (TEdit(Sender).Text = '') then
TEdit(Sender).Color := clRed
else
TEdit(Sender).Color := clDefault;
end;
A única coisa que não mudaria seria a rotina do "onShow" do formulário, que chama a "varreEdits". Quebra um galhão quando você tenta rodar um código, no caso ObjectPascal do Lazarus para o Delphi (ObjectPascal renomeado), e está tudo como deve mas não funciona por conta dessas diferenças "arcanas" entre os dois dialetos.