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.