Gdy korzystam z inspektora obiektów mogę normalnie normalnie zdefiniować metodę OnClick po prostu w miejscu wygerowanym przez IDE. Jak stworzyć taką metodę, gdy tego do tego przycisku nie mogę się dostać przez inspektor obiektów, bo tworzę te przyciski w czasie wykonania programu. (nie wiem z góry ile ich jest) Wszystkie razem mają mieć tą samą metodę OnClick. Gdy próbuje się odwołać do elementu OnClick np. przez button.OnClick := jakaśProcedura
to mam błędy typów (być może nie wiem jak przekazać taką procedurę). Proszę o porady
Zdefinować jako element klasy procedure JakasProcedura(Sender : TObject);
i następnie stworzyć jej definicje należącą do włąściwej klasy. Na przykład procedure TForm1.JakasProcedura(Sender : TObject);
i tak dalej. Oczywiśce definicja w sekcji implementation
tego samego modułu.
Wtedy na pewno się uda. A najlepiej to zawsze najpierw pogooglować, pokombinować samodzielnie wytrwale. A dopiero w ostateczności pisać na forum. I nieważne dział Newbie czy też inny. Bo przecież skoro widzisz jak dodają się metody OnClick
poprzez Object Inspector. To jaki problem zrobić to samo samodzielnie poprzez kod, dodając tylko w odpowiednim miejscu zmianę właśności OnClick
Buttona/ów? Wystarczy jedynie pomyśleć.
Jak już kiedyś pisałem, pod Lazarusem (w odróżnieniu od Delphi) nie przejdzie standardowe przypisanie, np.:
Button.OnClick := OwnOnClick;
dlatego, że do takiego przypisania wymagany jest wskaźnik na metodę, czyli:
Button.OnClick := @OwnOnClick;
Przykład zastosowania poniżej:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FButtons: array [0 .. 4] of TButton;
private
procedure OwnOnClick(Sender: TObject);
end;
{...}
procedure TForm1.FormCreate(Sender: TObject);
var
I: UInt8;
begin
for I := Low(FButtons) to High(FButtons) do
begin
FButtons[I] := TButton.Create(Self);
with FButtons[I] do
begin
Parent := Self;
Width := 80;
Height := 25;
Left := 16;
Top := I * 25 + 16;
Caption := Format('Button no %d', [I]);
OnClick := @OwnOnClick;
end;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
I: UInt8;
begin
for I := Low(FButtons) to High(FButtons) do
FButtons[I].Free();
end;
procedure TForm1.OwnOnClick(Sender: TObject);
begin
ShowMessage('I''m the button named "' + TButton(Sender).Caption + '"');
end;
Po wciśnięciu dowolnego przycisku, zostanie wyświetlony komunikat z jego etykietą; Właściwość Name
nie została zainicjowana, więc zwróci pusty łańcuch; Trzeba ją koniecznie nadać, jeśli w późniejszej części kodu chciałbyś korzystać np. z metody FindComponent.
No cóż, w tagu jest lazarus
, ale w treści wspominki o tym nie ma. Również gdybym zamiast bezsensownego tagu Coyote samego code
, miał tam <code class="pascal">
to bym się domyślił. Oczywiście można zrobić tak jak pisze poprzednik. A można to "obejść" następującą dyrektywą kompilatora {$mode delphi}
.