![]() |
Button OnClick wird nicht ausgelöst..
Hallo zusammen,
ich hab folgendes Problem: Hiermit mach ich in Stringgrid einen bzw. mehrere Buttons:
Delphi-Quellcode:
mein kleines aber feines Problem ist jetzt, dass das zugewiesene OnClick nicht ausgeführt wird. weis jemand was da noch fehlt?
procedure TForm1.StringgridDrawCell(Sender : TObject; ACol, ARow : Integer; Rect : TRect; State : TGridDrawState);
begin if (ACol = 2) and (ARow > 0) and (Stringgrid1.Objects[ACol,ARow] = nil) then begin Stringgrid1.Objects[ACol,ARow]:=TButton.Create(Stringgrid1); with TButton(Stringgrid1.Objects[ACol,ARow]) do begin Name := 'sgButton'+IntTostr(ARow); Parent:=Stinggrid1; Top:=Rect.Top; Left:=Rect.Left; Width:=Rect.Right-Rect.Left; Height:=Rect.Bottom-Rect.Top; OnClick:=MyOnClick; end; end; end; procedure TForm1.MyOnClick(Sender : TObject); begin if Sender is TButton then with TButton(Sender) do Stringgrid1.Cells[0,StrToint(Copy(Name,9,Length(Name)-9))]:='Clicked'; end; MfG :angel: |
Re: Button OnClick wird nicht ausgelöst..
bist du dir sicher das nicht ins OnClick gesprungen wird? hast du dort mal einen Haltepunkt gesetzt?
|
Re: Button OnClick wird nicht ausgelöst..
ja türlich habbich.. iss nich rein... ich kann draufklicken.. aber es springt einfach net rein..
|
Re: Button OnClick wird nicht ausgelöst..
an dem source ist eigentlich alles richtig. Hast du probiert ob das ganze richtig funktioniert wenn du die Buttons nicht auf dem Stringgrid sondern auf dem Form direkt anlegst? Du könntest zum Debuggen auch mal den kreierten Button auf eine Zwischenvariable zuweisen und ohne "with" durchprobieren ob alles richtig gesetzt wird. Da der Button ja offensichtlich richtig erzeugt wird und auch sichtbar ist hätte ich noch die Vermutung das sich ein anderes Control in den Vordergrund schiebt so das der Click nie beim Button ankommt.
|
Re: Button OnClick wird nicht ausgelöst..
Warum schreibst du ARow nicht als .Tag in den Button, dann ist es im Eventhandler die richtige Zeile zu finden.
Delphi-Quellcode:
procedure TForm1.MyOnClick(Sender : TObject);
begin if Sender is TButton then with TButton(Sender) do Stringgrid1.Cells[0,Tag]:='Clicked'; end; |
Re: Button OnClick wird nicht ausgelöst..
@mkinzler: Danke für den Tipp, ist aber OT da er da nie ankommt.
@SirThornberry: der Buttonclick wird ja animiert, also sollte er auch ausgelöst werden und ankommen oder? |
Re: Button OnClick wird nicht ausgelöst..
wenn der "click" animiert wird sollte der Klick auch ausgelöst werden. Deswegen hatte ich auch vorgeschlagen das danze mal auf eine Zwischenvariable zu zuweisen um zu debuggen ob da wirklich das OnClick richtig zugewiesen wird.
|
Re: Button OnClick wird nicht ausgelöst..
Delphi-Quellcode:
hier funktioniert das OnClick. Also er springt bei nem Klick rein. Und jetzt?
var b : TObject;
... procedure TForm1.Button1Click(Sender : TObject); begin b:=TButton.Create(Self); with TButton(b) do begin Parent:=Self; Name:='Testb1'; Top:=0; Left:=0; Width:=100; Height:=100; OnClick:=MyOnClick; end; end; |
Re: Button OnClick wird nicht ausgelöst..
Setze mal zum Test in deinem originallem Programm den Parent der Buttons auf die Form. Es scheint hier ein Problem der Eventweiterreichnung des StringGrids zu geben.
|
Re: Button OnClick wird nicht ausgelöst..
[OT]Die b-Variable wäre bei dem Test lokal besser aufgehoben[OT]
Ich würde dir wenn es so funktioniert mal empfehlen das in die andere Funktion einzubauen. Also dort mit einer Zwischenvariablen arbeiten und dann die Zwischenvariable auf das "Objects" zuweisen |
Re: Button OnClick wird nicht ausgelöst..
@mkinzler: ui des mit dem Parent geht.. aber sie sind dann nimmer auf dem Grid und scrollen au nimmer mit...
@SirThornberry: Dein Vorschlag funktioniert nicht, es bleibt wie es ist. |
Re: Button OnClick wird nicht ausgelöst..
Irgendwo muss das OnClick ja ankommen ;)
Wenns im TStringGrid.onclick ankommt: Weiterleiten, vielleicht kommt auch OnMouseUp an (hat der button das? falls nicht, Windowproc überschreiben) |
Re: Button OnClick wird nicht ausgelöst..
Zitat:
[OT]Meint ihr das mit dem Button im Grid wär was für die Codelib?[/OT] |
Re: Button OnClick wird nicht ausgelöst..
für die Codelib? Ich finde eher nicht da es doch recht unelegant ist in jedem Draw einen Button neu zu erstellen. Desweiteren gibt es bei dieser Variante doch unschöne Effekte beim Scrollen.
|
Re: Button OnClick wird nicht ausgelöst..
japp.. diese Effekte muss ich noch beheben.. aber dafür brauch ich irgendwie die Position und die Größe einer Zelle...
|
Re: Button OnClick wird nicht ausgelöst..
Lass doch einfach den TButton weg und zeichne ihn selber. Dann berechnest Du im StringGrid.Click die Zelle (MouseToCell oder so).
Das selberzeichnen ist auch fett schneller, einziges Problem ist evtl. das Highlighting bei aktivierten Themes. da musst Du im MouseMove die verlassene und betretene Zelle ausrechnen und diese beiden neuzeichnen. |
Re: Button OnClick wird nicht ausgelöst..
Ist zwar schon älter, der Thread, aber ich hab gerade die Lösung gefunden: Die Stringgrid reicht die WM_COMMAND Nachricht nicht an ihre Childcontrols weiter. Abhilfe schafft dieser Code:
Delphi-Quellcode:
Dazu muss die WMCommand-Methode überschrieben werden (ist nicht virtuell, macht aber in diesem Fall nix, da diese speziellen Nachrichtenbehandlungsmethoden anders behandelt werden)
procedure TControlGrid.WMCommand(var Message: TWMCommand);
var Control: TWinControl; begin Control := FindControl(Message.Ctl); if Control <> nil then Begin with TMessage(Message) do Result:=(Control.Perform(Msg + CN_BASE, WParam, LParam)); If Message.Result<>0 Then Inherited; End; end;
Delphi-Quellcode:
Vielleicht brauchts ja jemand nochmal.
protected
procedure WMCommand(var Message: TWMCommand); message WM_COMMAND; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 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 by Thomas Breitkreuz