[gelöst] OnClick auf Button einer dynam. Form anwenden

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

[gelöst] OnClick auf Button einer dynam. Form anwenden

Beitrag von Linkat »

Hallo,
ich möchte mit einem OnClick-Ereignis eines Buttons auf einer dynamisch erstelllten Form eine procedure ausführen. Folgender Code läuft unter Delphi 2009:

Code: Alles auswählen

unit dynformu;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes,SysUtils,FileUtil,Forms,Controls,Graphics,Dialogs,StdCtrls,Buttons;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1:TBitBtn;
    Button1:TButton;
    procedure Button1Click(Sender:TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
//    procedure SetzeColor(sender:TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
var Form     :TForm;
    Button   :TButton;
    BitBtn   :TBitBtn;
 
 
 
procedure SetzeColor(sender:TObject);
begin
  Form1.Color:=Form1.Color+1000;
end;
 
procedure TForm1.Button1Click(Sender:TObject);
begin
  Form:=TForm.Create(self);
  Form.Top:=100;
  Form.Left:=100;
  Form.Width:=400;
  Form.Height:=300;
  Form.Visible:=true;
 
  Button:=TButton.create(Form);
  Button.parent:=Form;
  Button.Top:=Form.Height-30;
  Button.Left:=10;
  Button.Anchors:=[akLeft,akBottom];
  Button.Width:=90;
  Button.caption:='S&tart Farbe';
  @Button.OnClick:=@SetzeColor;        <-- hier ist der Fehler
 
  BitBtn:=TBitBtn.Create(Form1);
  BitBtn.parent:=Form;
  BitBtn.Top:=Form.Height-30;
  BitBtn.Left:=Form.Width-80;
  BitBtn.Height:=25;
  BitBtn.Anchors:=[akRight,akBottom];
  BitBtn.Kind:=bkClose;
  BitBtn.Caption:='&Schließen';
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
//  Form1.Free;
end;
 
end.
Folgende Fehlermeldung erscheint:

Code: Alles auswählen

Incompatible types: got "<address of procedure;Register>" expected "<procedure variable type of procedure(TObject) of object;Register>"
Leider weis ich nichts mit der Fehlermeldung anzufangen.

Wer kann helfen?

Gruß, Linkat
Zuletzt geändert von Linkat am Do 28. Jul 2011, 13:22, insgesamt 1-mal geändert.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: OnClick auf Button einer dynam. Form anwenden

Beitrag von u-boot »

Code: Alles auswählen

@Button.OnClick:=@SetzeColor;    //    <-- hier ist der Fehler

Code: Alles auswählen

Button.OnClick:=@SetzeColor;  // <-- gibts so auch noch nen Fehler ?
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: OnClick auf Button einer dynam. Form anwenden

Beitrag von Linkat »

Hallo u-boot,

Code: Alles auswählen

Button.OnClick:=@SetzeColor;  // <-- gibts so auch noch nen Fehler ?
ging auch nicht.
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: OnClick auf Button einer dynam. Form anwenden

Beitrag von u-boot »

Die procedure in TForm reinpacken (wie es wohl schon mal war?) dann gehts.

Code: Alles auswählen

TForm1 = class(TForm)
    BitBtn1:TBitBtn;
    Button1:TButton;
    procedure Button1Click(Sender:TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure SetzeColor(Sender: TObject);
  private
     { private declarations }
  public
    { public declarations }
  end;       
 
// ... einiges dazwischen
 
procedure TForm1.SetzeColor(Sender:TObject);
begin
  Form1.Color:=Form1.Color+1000;
end;     
 
procedure TForm1.Button1Click(Sender:TObject);
begin
  Form:=TForm.Create(self);
  Form.Top:=100;
  Form.Left:=100;
  Form.Width:=400;
  Form.Height:=300;
  Form.Visible:=true;
 
  Button:=TButton.create(Form);
  Button.parent:=Form;
  Button.Top:=Form.Height-30;
  Button.Left:=10;
  Button.Anchors:=[akLeft,akBottom];
  Button.Width:=90;
  Button.caption:='S&tart Farbe';
  Button.OnClick:=@SetzeColor;
 
 
  BitBtn:=TBitBtn.Create(Form1);
  BitBtn.parent:=Form;
  BitBtn.Top:=Form.Height-30;
  BitBtn.Left:=Form.Width-80;
  BitBtn.Height:=25;
  BitBtn.Anchors:=[akRight,akBottom];
  BitBtn.Kind:=bkClose;
  BitBtn.Caption:='&Schließen';
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: OnClick auf Button einer dynam. Form anwenden

Beitrag von Linkat »

Leider ist es unerheblich, ob ich den procedure Kopf in die Class hineinschreibe. Gleiche Fehlermeldung.

Wer kann noch helfen?

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: OnClick auf Button einer dynam. Form anwenden

Beitrag von Displaced »

Nein es ist nicht unerheblich..

Code: Alles auswählen

Public
    procedure SetzeColor(Sender:TObject);
In die Klasse rein und die Procedur muss so aussehen:

Code: Alles auswählen

procedure TForm1.SetzeColor(Sender:TObject);
begin
  Form1.Color:=Form1.Color+1000;
end;
Und die Zuordnung geht dann auch

Code: Alles auswählen

Button.OnClick:=@SetzeColor;
Ich habs getestet! Es funktioniert genau so.

(PS Irgendwie hab ich was überssehen beim Vor Vor poster, es ist das selbe ^^' Aber wie gesagt ich habs grad getestet und es funktioniert einwandfrei.)

Linkat
Lazarusforum e. V.
Beiträge: 560
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: [gelöst] OnClick auf Button einer dynam. Form anwenden

Beitrag von Linkat »

Hallo Displaced und u-boot,
vielen Dank für die Hilfe.
Die richtigen Hinweise sind:

Code: Alles auswählen

Button.OnClick:=@SetzeColor;
und

Code: Alles auswählen

procedure SetzeColor(Sender:TObject);
unter private oder public einsetzen.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Antworten