Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Button OnClick wird nicht ausgelöst.. (https://www.delphipraxis.net/67618-button-onclick-wird-nicht-ausgeloest.html)

Angel4585 17. Apr 2006 19:28


Button OnClick wird nicht ausgelöst..
 
Hallo zusammen,

ich hab folgendes Problem:

Hiermit mach ich in Stringgrid einen bzw. mehrere Buttons:

Delphi-Quellcode:
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;
mein kleines aber feines Problem ist jetzt, dass das zugewiesene OnClick nicht ausgeführt wird. weis jemand was da noch fehlt?

MfG :angel:

SirThornberry 17. Apr 2006 19:47

Re: Button OnClick wird nicht ausgelöst..
 
bist du dir sicher das nicht ins OnClick gesprungen wird? hast du dort mal einen Haltepunkt gesetzt?

Angel4585 17. Apr 2006 19:53

Re: Button OnClick wird nicht ausgelöst..
 
ja türlich habbich.. iss nich rein... ich kann draufklicken.. aber es springt einfach net rein..

SirThornberry 17. Apr 2006 19:57

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.

mkinzler 17. Apr 2006 19:58

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;

Angel4585 17. Apr 2006 20:00

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?

SirThornberry 17. Apr 2006 20:02

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.

Angel4585 17. Apr 2006 20:09

Re: Button OnClick wird nicht ausgelöst..
 
Delphi-Quellcode:
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;
hier funktioniert das OnClick. Also er springt bei nem Klick rein. Und jetzt?

mkinzler 17. Apr 2006 20:12

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.

SirThornberry 17. Apr 2006 20:13

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

Angel4585 17. Apr 2006 20:15

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.

DGL-luke 17. Apr 2006 20:29

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)

Angel4585 17. Apr 2006 20:42

Re: Button OnClick wird nicht ausgelöst..
 
Zitat:

Zitat von DGL-luke
vielleicht kommt auch OnMouseUp an (hat der button das? falls nicht, Windowproc überschreiben)

Tatsache.. ein OnMouseUp, und OnMouseDown usw funzen alle :thumb: Problem erledigt..

[OT]Meint ihr das mit dem Button im Grid wär was für die Codelib?[/OT]

SirThornberry 17. Apr 2006 21:53

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.

Angel4585 18. Apr 2006 06:53

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...

Sidorion 18. Apr 2006 17:01

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.

Sidorion 10. Jul 2007 16:00

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:
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;
Dazu muss die WMCommand-Methode überschrieben werden (ist nicht virtuell, macht aber in diesem Fall nix, da diese speziellen Nachrichtenbehandlungsmethoden anders behandelt werden)
Delphi-Quellcode:
  protected
    procedure WMCommand(var Message: TWMCommand); message WM_COMMAND;
Vielleicht brauchts ja jemand nochmal.


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