Przypisanie własnej metody OnClick do dynamicznie tworzonych przycisków

0

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

0

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ć.

2

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.

0

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} .

1 użytkowników online, w tym zalogowanych: 0, gości: 1