OnChange Procedure ändern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

OnChange Procedure ändern

Beitrag von flashkid »

Hi :)

Ich versuche gerade meine Objekte während der Laufzeit zu erstellen. Nur leider bekomme ich bei diesem Code einen Fehler:

Code: Alles auswählen

var
  Form1: TForm1; 
  Checkbox: array[1..5] of TCheckBox;
 
implementation
 
{ TForm1 }
 
procedure ChangeCheckBox;
var n:  Integer;
begin
 
end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  Checkbox[1] := TCheckbox.Create(self);
  Checkbox[1].Parent := Form1;
  Checkbox[1].Show;
  Checkbox[1].Color := clRed;
  Checkbox[1].Caption := 'Test';
  Checkbox[1].OnChange := ChangeCheckBox;
end;
Der Fehler lautet:

Code: Alles auswählen

unit1.pas(45,27) Error: Incompatible types: got "untyped" expected "<procedure variable type of procedure(TObject) of object;Register>"
Ich hoffe ihr findet den Fehler :P

Gruß, flashkid

slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

Re: OnChange Procedure ändern

Beitrag von slai »

Checkbox[1].OnChange := @ChangeCheckBox;
Windows 7, Lazarus 0.9.28.2 fpc 2.2.4, Firebird 2.1, Zeoslib 6.6.6-stable

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: OnChange Procedure ändern

Beitrag von flashkid »

Danke, funktioniert mit:

Code: Alles auswählen

type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    procedure ChangeCheckBox(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
  Checkbox: array[1..5] of TCheckBox;
 
implementation
 
{ TForm1 }
 
procedure TForm1.ChangeCheckBox(Sender: TObject);
var n:  Integer;
begin
  n := 1;
  ShowMessage(IntToStr(n));
end;
Kann man auch eine Methode per Parameter angeben? Also

Code: Alles auswählen

n := 1;
Checkbox[n].OnClick := @ChangeCheckBox(n);
Sodass bei jedem Click auf eine Checkbox die ChangeCheckBox procedure ausgeführt wird und der derzeitige Wert von n mit übergeben wird?

Gruß, flashkid
Zuletzt geändert von flashkid am Di 16. Feb 2010, 00:10, insgesamt 1-mal geändert.

slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

Re: OnChange Procedure ändern

Beitrag von slai »

Die Methode ChangeCheckBox muss member eines Objekts sein.
z.B:

Code: Alles auswählen

TDynDBPanel = class(TPanel)
    procedure ChangeCheckBox(Sender: TObject);     
private
//
protected
//
published
//
public
//
end;
 
//irgendeine Methode des objekts TDynDBPanel 
CB.onChange := @ChangeCheckBox;
Windows 7, Lazarus 0.9.28.2 fpc 2.2.4, Firebird 2.1, Zeoslib 6.6.6-stable

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: OnChange Procedure ändern

Beitrag von flashkid »

Das sah ich jetzt auch gerade :)

Kann man noch zusätzlich einen Parameter übergeben, siehe oben, oder ist es auf den "unsichtbaren" Parameter "Sender" begrenzt?

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: OnChange Procedure ändern

Beitrag von theo »

flashkid hat geschrieben:Das sah ich jetzt auch gerade :)

Kann man noch zusätzlich einen Parameter übergeben, siehe oben, oder ist es auf den "unsichtbaren" Parameter "Sender" begrenzt?
Nein, es ist begrenzt, weil ja das "System" das Event auslöst und nicht "du".

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: OnChange Procedure ändern

Beitrag von flashkid »

Schade :(

Kann man es dann überhaupt so einrichten, dass man eine einzige CheckboxChange Procedure für alle Ceckboxen hat, die dann die jeweils geklickte Checkbox ausgibt?

Also in etwa:

Code: Alles auswählen

procedure TForm2.CheckBoxChange(Sender: TObject);
begin
     ShowMessage('Checkbox Number: ' + Sender);
end;
Nur leider würde im Sender nur "TCheckBox" statt CheckBox[1] stehen, und außerdem bekommt man bei dieser Methode einen Fehler beim Compilen, wahrscheinlich weil Sender ein TObject ist und kein String :(
Kann man das irgendwie lösen?

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: OnChange Procedure ändern

Beitrag von theo »

flashkid hat geschrieben: Kann man das irgendwie lösen?
Du musst halt auf die Properties des Sender zugreifen:
TComponent(Sender).Name
TComponent(Sender).Tag //im Tag kannst du irgend einen Integer unterbringen.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: OnChange Procedure ändern

Beitrag von monta »

Du brauchst einen Typecast, so sollte es funktionieren:

Code: Alles auswählen

ShowMessage('Checkbox Number: ' + TCheckBox(Sender).Name);
Johannes

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: OnChange Procedure ändern

Beitrag von flashkid »

Leider funktioniert keine der beiden Varianten.
Die Box zeigt nur "Checkbox Number: " aber leider keine Zahl :(

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: OnChange Procedure ändern

Beitrag von theo »

flashkid hat geschrieben:Leider funktioniert keine der beiden Varianten.
Die Box zeigt nur "Checkbox Number: " aber leider keine Zahl :(
Schalt doch mal dein Hirn ein ;-)
Du hast ihr keinen Namen oder Tag gegeben beim createn, was soll es denn da anzeigen?

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: OnChange Procedure ändern

Beitrag von flashkid »

Danke nun funktioniert es :D
Das ist super vielen Dank :)

Antworten