![]() |
Zur Laufzeit erstellte Buttons - OnClick weigert sich
Mahlzeit zusammen,
ich weiß, dass dieses Thema hier regelmäßig hoch kommt und habe die Suche bemüht, leider hat mir keine der Lösungen dort weitergeholfen. Ich habe mir eine Klasse geschrieben, die das TStringGrid um Buttons erweitert und diese in die entsprechenden Zellen einfügt. Funktioniert alles einwandfrei, nur leider bringt meine Zuweisung der OnClick-Routine gar nichts. Kann mir vielleicht jemand einen Schubs in die richtige Richtung geben?
Delphi-Quellcode:
Ich bekomme keine Fehlermeldung, leider sagt mir aber auch keiner der Buttons hallo... :-(
TButtonGrid = class
private {...} Procedure ClickAction(Sender: TObject); published {...} Procedure AssignButtons(Captions: Array Of String); {...} end; implementation procedure TButtonGrid.AssignButtons(Captions: array of String); var i,j: integer; begin SetLength(Buttons,high(Captions)+1); for i := 0 to high(Buttons) do begin SetLength(Buttons[i],StringGrid.RowCount-StringGrid.FixedRows); for j := 0 to high(Buttons[i]) do begin Buttons[i,j] := TButton.Create(StringGrid); Buttons[i,j].Parent := StringGrid; Buttons[i,j].Caption := Captions[i]; Buttons[i,j].Name := 'TBGButton_'+inttostr(i)+'_'+inttostr(j); Buttons[i,j].Tag := strtoint(inttostr(i) + inttostr(j)); SetButtonPosition(Buttons[i,j]); SetButtonSize(Buttons[i,j]); Buttons[i,j].OnClick := ClickAction; // <----------- end; end; end; {...} procedure TButtonGrid.ClickAction(Sender: TObject); begin showmessage('hallo'); end; Grüße tkoenig |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Liegt das nicht daran, dass dein Event-Handler private-Deklariert ist?
Ich würde das eher so schreiben:
Delphi-Quellcode:
Edit: bin heute wohl noch nicht wach. So müsste es nun stimmen :-D
TButtonGrid = class
private {...} FClickAction: TNotifyEvent; published {...} Procedure AssignButtons(Captions: Array Of String); property ClickAction: TNotifityEvent read FClickAction write FClickAction; {...} end; |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Hallo,
Schreib mal statt
Delphi-Quellcode:
Buttons[i,j] := TButton.Create(StringGrid);
das hier:
Delphi-Quellcode:
Buttons[i,j] := TButton.Create(Self);
@blackfin: das hat doch damit nichts zu tun. Und dein Lösungsvorschlag hat irgendwie nichts mit dem Problem zu tun :gruebel: |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
ok du hast recht :stupid: ich hol mir lieber mal nen kaffee...
*merkzettel schreib*: nicht schreiben, wenn man noch nicht wach ist. |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Wer denn nun der Owner ist, dürfte für das Problem aber auch keine Rolle spielen, oder hab ich was verpasst? Das soll aber nicht heißen, dass self nicht besser wäre ;)
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Self bringt allerdings Fehlermeldung ('Inkompatible Typen: TComponent und TButtonGrid').. Nein, habe nicht abgeleitet, TButtonGrid hält nur die Komponenten vor.
Code:
bringt gleiches Ergebnis wie vorher: nichts passiert.
Buttons[i,j] := TButton.Create(Buttons[i,j]);
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Achso du bist nicht in nem Formular.. Jedenfalls.. Schau mal, dass deine Buttons ein Formular als Owner bekommen.
@DeddyH: Das einzige was mir eingefallen ist war, dass die Button-Messages an das StringGrid gesendet werden und dieses die Messages verwirft, weil es nichts damit anfangen kann (Theorie). Deshalb dachte ich es könnte evtl helfen wenn man das Formular zum Owner macht. Kann aber auch sein, dass ich da auch falsch liege. Mir fällt aber jetzt nichts besseres ein. Der Code sieht ja prinzipiell in Ordnung aus.. |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Beim Parent könnte ich mir sowas evtl. noch vorstellen, beim Owner weniger. Man könnte ja spaßhalber das ButtonGrid einmal von TComponent ableiten, dann sollte es sich auch zum Owner machen lassen. Allerdings fürchte ich, dass das nichts bringt.
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Naja, gut wenns klappt, aber schön ist das dann auch nicht. Die Buttons gehören somit nämlich NICHT zum Grid. Wenn du das Grid verschiebst dann verschieben sich z.B. nicht die Buttons und die Koordinaten für Left/Top werden relativ zum Formular angegeben und nicht relativ zu deinem Grid (fällt nicht auf wenn dein Grid bei 0/0 sitzt).
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Ja, dass die Buttons jetzt nicht mehr zum Grid gehören, ist mir auch aufgefallen.. Gibt es dafür einen einfachen Workaround?
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Ich würde das ganze wieder aufs Grid packen und versuchen heraus zu finden wo das Click verschwindet. Denn zum Beispiel MouseDown und MouseUp funktionieren beim Button weiterhin auch wenn der Parent des Buttons ein StringGrid ist (notfalls kann man sich sein eigenes Klick basteln was auf Grundlage von MouseDown und MouseUp arbeitet)
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Ich würde die Winmessagen umleiten also das grid subclassen.
gruss |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
War ernst gemeint. Aber davon ab verstehe ich nicht warum man hier ein ClickAction benötigt die Button müßten weiterhin auf das clicken reagieren können auch ohne extra event. gruss |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
Ich musste nur schmunzeln, als ich realisiert habe, was für ein Fachbegiff-Denglisch der Satz ist :-) Nix für ungut :stupid: Ja ich bin doof |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
Ich lerns nimmer. Ja ich bin doof Denke nicht.. gruss |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
Damals reichte es, wenn die Noten nur bis Fünf gingen, aber heutzutage braucht man schon die 6. :stupid: Wo hier nun schon Viele beim Problem mit dem OnClick helfen... Da du deine Buttons sowieso in einem Array verwaltest und vermutlich kein FindComponent verwendest, kannst'e auf den Komonentennamen verzichten. > die VCL braucht den Namenm um die gleichnamige Form-Variable mit der Komponente in der DFM zu verknüpfen und um eventuell die Komponenten untereinander zu verknüpfen (wie z.B. Eine ImageList irgendwo zuweisen). > und man braucht den Namen, wenn man darüber eine Komponete suchen will, wie z.B. über FindComponent (was aber auch oftmals anders/besser/schneller geht) Der Tag wird bestimmt falsch berechnet, denn
Delphi-Quellcode:
und
[1, 3] = 4
Delphi-Quellcode:
.
[3, 1] = 4
Und da das Array sowieso quadratisch wird, kann man alle ebenen auch gleichzeitig setzen.
Delphi-Quellcode:
SetLength(Buttons, Length(Captions), StringGrid.RowCount-StringGrid.FixedRows);
for i := 0 to high(Buttons) do |
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
Zitat:
Delphi-Quellcode:
und
[1, 3] = 13
Delphi-Quellcode:
liefern. Problematisch wird es trotzdem bei
[3, 1] = 31
Delphi-Quellcode:
:)
[11, 1] = 111 = [1, 11]
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Zitat:
das Problem könnte man mit einer durchgehenden Nummerierung umgehen und hätte dann auch nicht die doppelten Konvertierungen...
Delphi-Quellcode:
...Tag:=1+j*(high(Buttons)+1)+i
|
AW: Zur Laufzeit erstellte Buttons - OnClick weigert sich
Ups, aber dennoch falsch :stupid:
Delphi-Quellcode:
und
[12, 3] = 123
Delphi-Quellcode:
[1, 23] = 123
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz