[Lazarus/Delphi] dynamiczne tworzenie zdarzeń

0

Więc chciałem stworzyć zdarzenie do dynamicznie tworzonego przycisku... próbowałem w sposób ten.
Niestety dowiedziałem się, że w Lazarusie robi się to inaczej niż w Delphi, ale z tego co wyczytałem tu i tutaj to tylko trzeba postawić @ przed podstawianiem, ale mi to nie wychodzi...

Tworzę dynamicznie formę... na tej formie tworzę dynamicznie przycisk i chcę by ten dynamicznie stworzony przycisk przekształcał elementy stworzone również dynamicznie na tej formie. Oto jak to u mnie wygląda:

w sekcji private dodałem:
procedure MyOnClick(Sender: TObject);

w kodzie właściwym dałem:

   procedure MyOnClick(Sender: TObject);
   begin

   end;       

a w procedurze odpowiadającej za dynamiczne stworzenie formy:

Dalej.OnClick := @MyOnClick;

niestety to nie działa i wypluwa błąd:

unit1.pas(130,20) Error: Incompatible types: got "<address of procedure(TObject);Register>" expected "<procedure variable type of procedure(TObject) of object;Register>"

Cały przykładowy niedziałający kod wygląda tak:

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Menus, ActnList, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    MenuItem8: TMenuItem;
    MenuItem9: TMenuItem;
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem9Click(Sender: TObject);

  private
    { private declarations }
     procedure MyOnClick(Sender: TObject);
  public
    { public declarations }

  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

   procedure MyOnClick(Sender: TObject);
   begin
   //tu ma przykładowo policzyć ilość liter w PoleTekstowe i podzielić na ilość liter
   //w PoleTekstowe2.
   end;

//FUNKCJE
  procedure Przykladowy(str_a, str_b : string);
var
  Forma2: TForm;
  Labelek, Labelek2, Labelek3: TLabel;
  RadioButton1: TRadioButton;
  RadioButton2: TRadioButton;
  PoleTekstowe, PoleTekstowe2: TEdit;
  Dalej: TButton;
  T_A : array[0..10] of Integer;
begin
//Tworzenie formy
  Forma2 := TForm.Create(Form1);
  //początek ustawiania formy
  Forma2.Height:=480;
  Forma2.Width:=640;
  Labelek := TLabel.Create(Form1);
  Labelek2 := TLabel.Create(Form1);
  Labelek3 := TLabel.Create(Form1);
  //początek labela
  Labelek.Left:=10;
  Labelek.Top:=10;
  Labelek.Caption:='Hello World';
  Labelek.Parent:=Forma2;
  Labelek.Visible:=True;

  Labelek2.Left:=10;
  Labelek2.Top:=70;
  Labelek2.Caption:='Podaj dwa teksty:';
  Labelek2.Parent:=Forma2;
  Labelek2.Visible:=True;

  Labelek3.Left:=268;
  Labelek3.Top:=70;
  Labelek3.Caption:=':';
  Labelek3.Parent:=Forma2;
  Labelek3.Visible:=True;
  //koniec labela
  RadioButton1 := TRadioButton.Create(Form1);
  RadioButton2 := TRadioButton.Create(Form1);
  //początek RadioButton
  RadioButton1.Left:=15;
  RadioButton1.Top:=25;
  RadioButton1.Caption:='Policz stosunek ilości liter';
  RadioButton1.Parent:=Forma2;
  RadioButton1.Visible:=True;

  RadioButton2.Left:=15;
  RadioButton2.Top:=45;
  RadioButton2.Caption:='Coś tam innego';
  RadioButton2.Parent:=Forma2;
  RadioButton2.Visible:=True;
  //koniec RadioButton
  PoleTekstowe := TEdit.Create(Form1);
  PoleTekstowe2 := TEdit.Create(Form1);
  //początek Edit
  PoleTekstowe.Left:=115;
  PoleTekstowe.Top:=68;
  PoleTekstowe.Parent:=Forma2;
  PoleTekstowe.Visible:=True;
  PoleTekstowe.Width:=150;
  PoleTekstowe2.Left:=275;
  PoleTekstowe2.Top:=68;
  PoleTekstowe2.Parent:=Forma2;
  PoleTekstowe2.Visible:=True;
  PoleTekstowe2.Width:=70;
  //koniec Edit
  Dalej := TButton.Create(Form1);
  //początek button
  Dalej.Left:=346;
  Dalej.Top:=68;
  Dalej.Caption:='Dawaj';
  Dalej.Parent:=Forma2;
  Dalej.Visible:=True;
  //koniec button



//działanie buttona
  Dalej.OnClick := @MyOnClick;
//koniec działania buttona

//koniec ustawiania formy
  if Forma2.ShowModal = mrOK then
  begin
  end;
  FreeAndNil(Forma2);

  end;
//

procedure TForm1.MenuItem4Click(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.MenuItem9Click(Sender: TObject);
begin
Przykladowy('','');
end;

initialization
  {$I unit1.lrs}

end.
0

Powinno być

   procedure TForm1.MyOnClick(Sender: TObject);
   begin
   //tu ma przykładowo policzyć ilość liter w PoleTekstowe i podzielić na ilość liter
   //w PoleTekstowe2.
   end;
0

dałem tak... wtedy mam błąd:

unit1.pas(129,30) Error: Identifier not found "MyOnClick"

0
  1. bez @
  2. Przykladowy to jest zwykła procedura
  3. MyOnClick a to jest METODA KLASY TForm1
  4. chyba wiesz jak się do metod odwołuje
0

Witam,
wystarczy na początku unitu dodać lub zamienić istniejącą linię na

{$mode delphi}

i nie będziesz musiał poprzedzać @. Dyrektywa zmienia dialekt na Delphi.

0

satq

napisałem, że robiłem to co w tym linku, a tam jest zamiana tej linijki "{$mode delphi}" i to nic nie dało (usunąłem "@").

Misiekd
ale ja piszę w object pascalu, a tam jest znak "@" co jest napisane na większości stron, które odszukałem na necie. Próbowałem robić jako metodę klasy TForm, na wszystkie kombinacje i nie wyszło - to samo z procedurą Przykladowy

Mógłby ktoś napisać przykładowy działający kod w lazarusie? Z "{$mode delphi}" lub lepiej "{$mode objfpc}{$H+}"

0
unit Unit1; 

{$mode delphi}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { private declarations }
    MyButton: TButton;
    procedure onklik(Sender: TObject);
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 MyButton:=TButton.Create(Form1);
 MyButton.Width:=50;
 MyButton.Height:=50;
 MyButton.Parent:=Form1;
 MyButton.Visible:=True;
 MyButton.OnClick:=onklik;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if MyButton<>nil then
  begin
   MyButton.Free;
   FreeAndNil(MyButton);
  end;
end;

procedure TForm1.onklik(Sender: TObject);
begin
 ShowMessage('klik');
end;

initialization
  {$I unit1.lrs}

end. 
0

Wprawdzie nie do końca o to chodziło (przycisk miał się znajdować na formie stworzonej dynamicznie i oddziaływać na obiekt na tej formie)... aczkolwiek udało mi się Twój kod zastosować... prawdopodobnie największym problemem było u mnie miejsce deklaracji takich rzeczy jak Forma2, itp.

Dzięki [soczek]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.