Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ButtonClick wird nicht ausgeführt (https://www.delphipraxis.net/170233-buttonclick-wird-nicht-ausgefuehrt.html)

Ykcim 6. Sep 2012 13:19

ButtonClick wird nicht ausgeführt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

ich arbeite mit Delphi xe2 Starter und habe ein Phänomen, dass ich mir nicht erklären kann und was ganz schön nervig ist.

Vereinzeln führen Buttons ihre ButtonClick Proceduren nicht mehr aus. Ich habe keine Ahnung, woran das liegen könnte...

Anbei mal ein Screenshot, dass die Procedure dem Button zugewiesen ist und die Procedure (ich habe jetzt, nachdem die alte Procudure nicht mehr funktionierte eine einfache genommen).
Delphi-Quellcode:
procedure TWSAgenda.ButtonZeitraumBearbeitenClick(Sender: TObject);
begin
  Showmessage('Hallo');
end;
Hat jemand einen Idee?

Vielen Dank
Ykcim

Jonas Shinaniganz 6. Sep 2012 13:54

AW: ButtonClick wird nicht ausgeführt
 
Das was du hier gepostet hast sieht richtig aus...

Hast du mal einen Haltepunkt in die
Zitat:

Showmessage('Hallo');
Zeile gesetzt und den Button zur Laufzeit betätigt?

Ykcim 6. Sep 2012 14:08

AW: ButtonClick wird nicht ausgeführt
 
Ja, habe ich gemacht. Wenn ich auf den Button klicke, verfärbt ersich, wie es alle Buttons machen, die man klickt, aber er läuft nicht in die Procedur rein. Es ist so, als gäbe es die Procedur gar nicht.

Ich habe schon an einen Fehler in Delphi xe2 gedacht und das ganze System heute Morgen neu aufgesetzt... Aber leider ohne Erfolg...

DeddyH 6. Sep 2012 14:18

AW: ButtonClick wird nicht ausgeführt
 
Wird evtl. irgendwo im Code der Eventhandler neu gesetzt?

Ykcim 6. Sep 2012 14:38

AW: ButtonClick wird nicht ausgeführt
 
Nicht das ich das bewusst gemacht hätte...

Anbei der gesamte Code dieser Unit:
Delphi-Quellcode:
unit UnitAgenda;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ExtCtrls,
  Vcl.Menus, Vcl.StdCtrls, Planner, AdvObj, BaseGrid, AdvGrid, Vcl.ImgList,
  W7Classes, W7Buttons, Vcl.Buttons, Codes;

type
  TWSAgenda = class(TFrame)
    PanelAgenda: TPanel;
    PanelZeitraum: TPanel;
    PanelAgendaListe: TPanel;
    Panel3: TPanel;
    Splitter3: TSplitter;
    Splitter4: TSplitter;
    PopupZeitraum: TPopupMenu;
    PopupAgenda: TPopupMenu;
    bearbeiten1: TMenuItem;
    N1: TMenuItem;
    Zeitraumhinzufgen1: TMenuItem;
    Zeitraumlschen1: TMenuItem;
    bearbeiten2: TMenuItem;
    N2: TMenuItem;
    AgendaPunkthinzufgen1: TMenuItem;
    AgendaPunktlschen1: TMenuItem;
    Panel1: TPanel;
    Panel2: TPanel;
    PanelZiele: TPanel;
    Planner1: TPlanner;
    GridZeitraum: TAdvStringGrid;
    GridZiele: TAdvStringGrid;
    ImageList1: TImageList;
    ButtonAgendaBearbeiten: TSpeedButton;
    ButtonAgendaLoeschen: TSpeedButton;
    ButtonAgendaNeu: TSpeedButton;
    Panel7: TPanel;
    Splitter5: TSplitter;
    Splitter6: TSplitter;
    Panel6: TPanel;
    Splitter1: TSplitter;
    Splitter2: TSplitter;
    ButtonZeitraumBearbeiten: TSpeedButton;
    ButtonZeitraumNeu: TSpeedButton;
    ButtonZeitraumLoeschen: TSpeedButton;
    ButtonZieleBearbeiten: TSpeedButton;
    ButtonZieleNeu: TSpeedButton;
    ButtonZieleLoeschen: TSpeedButton;
    procedure FrameResize(Sender: TObject);
    procedure Planner1ItemDelete(Sender: TObject; Item: TPlannerItem);
    procedure Planner1ItemInsert(Sender: TObject; Position, FromSel,
      FromSelPrecise, ToSel, ToSelPrecise: Integer);
    procedure ButtonAgendaLoeschenClick(Sender: TObject);
    procedure ButtonAGendaBearbeitenClick(Sender: TObject);
    procedure ButtonAgendaNeuClick(Sender: TObject);
    procedure ButtonZeitraumLoeschenClick(Sender: TObject);
    procedure ButtonZeitraumBearbeitenClick(Sender: TObject);
    procedure ButtonZieleBearbeitenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

procedure TWSAgenda.FrameResize(Sender: TObject);
begin

  ImageList1.GetBitmap(64, ButtonZeitraumBearbeiten.Glyph);
  ImageList1.GetBitmap(18, ButtonZeitraumNeu.Glyph);
  ImageList1.GetBitmap(5, ButtonZeitraumLoeschen.Glyph);

  ImageList1.GetBitmap(64, ButtonZieleBearbeiten.Glyph);
  ImageList1.GetBitmap(18, ButtonZieleNeu.Glyph);
  ImageList1.GetBitmap(5, ButtonZieleLoeschen.Glyph);

  ImageList1.GetBitmap(64, ButtonAgendaBearbeiten.Glyph);
  ImageList1.GetBitmap(18, ButtonAgendaNeu.Glyph);
  ImageList1.GetBitmap(5, ButtonAgendaLoeschen.Glyph);

  Panel1.Height:=round(PanelAgenda.Height*0.21);
  PanelZeitraum.Width:=round(PanelAgenda.Width*0.45);
    GridZeitraum.ColWidths[0]:=25;
    GridZeitraum.ColWidths[1]:=round((GridZeitraum.Width)*0.20);
    GridZeitraum.ColWidths[2]:=round((GridZeitraum.Width)*0.20);
    GridZeitraum.ColWidths[3]:=round((GridZeitraum.Width)*0.41);
    GridZeitraum.ColWidths[4]:=(GridZeitraum.Width-GridZeitraum.ColWidths[0]-
                            GridZeitraum.ColWidths[1]-GridZeitraum.ColWidths[2])-
                            GridZeitraum.ColWidths[3]-25;

  //PanelZiele
    GridZiele.ColWidths[0]:=25;
    GridZiele.ColWidths[2]:=40;
    GridZiele.ColWidths[1]:=Gridziele.Width-GridZiele.ColWidths[0]-
                                            GridZiele.ColWidths[2]-25;

  //Übershriften
  //Zeitraum
  GridZeitraum.Cells[0,0]:='Nr';
  GridZeitraum.Cells[1,0]:='Von';
  GridZeitraum.Cells[2,0]:='Bis';
  GridZeitraum.Cells[3,0]:='Ort';
  GridZeitraum.Cells[4,0]:='KW';

  GridZiele.Cells[0,0]:='Nr';
  GridZiele.Cells[1,0]:='Ziel';
  GridZiele.Cells[2,0]:='Status';

end;

procedure TWSAgenda.Planner1ItemDelete(Sender: TObject; Item: TPlannerItem);
begin
  Planner1.FreeItem(Item);
end;

procedure TWSAgenda.Planner1ItemInsert(Sender: TObject; Position, FromSel,
  FromSelPrecise, ToSel, ToSelPrecise: Integer);
begin
  with Planner1.CreateItemAtSelection do
    begin
      Text.Text:='Item created at runtime on '+Formatdatetime('hh:nn dd/mm/yyyy',Now);
      Update;
    end;
end;

procedure TWSAgenda.ButtonAGendaBearbeitenClick(Sender: TObject);
begin
  if ButtonAgendaBearbeiten.Caption='Bearbeiten' then
    begin
      ButtonAgendaBearbeiten.Caption:='Speichern';
      ButtonAgendaBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(29, ButtonAgendaBearbeiten.Glyph);
      ButtonAgendaNeu.Visible:=true;
      ButtonAgendaLoeschen.Visible:=true;
    end
  else
    begin
      ButtonAgendaBearbeiten.Caption:='Bearbeiten';
      ButtonAgendaBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(64, ButtonAgendaBearbeiten.Glyph);
      ButtonAgendaNeu.Visible:=false;
      ButtonAgendaLoeschen.Visible:=false;
    end;
end;

procedure TWSAgenda.ButtonAgendaLoeschenClick(Sender: TObject);
begin
  PostKeyEx32(VK_delete, [], False);
end;

procedure TWSAgenda.ButtonAgendaNeuClick(Sender: TObject);
begin
  PostKeyEx32(VK_insert, [], False);
end;


procedure TWSAgenda.ButtonZeitraumBearbeitenClick(Sender: TObject);
begin
  if ButtonZeitraumBearbeiten.Caption='Bearbeiten' then
    begin
      ButtonZeitraumBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(29, ButtonZeitraumBearbeiten.Glyph);
      ButtonZeitraumBearbeiten.Caption:='Speichern';
      ButtonZeitraumNeu.Visible:=true;
      ButtonZeitraumLoeschen.Visible:=true;
    end
  else
    begin
      ButtonZeitraumBearbeiten.Caption:='Bearbeiten';
      ButtonZeitraumBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(64, ButtonZeitraumBearbeiten.Glyph);
      ButtonZeitraumNeu.Visible:=false;
      ButtonZeitraumLoeschen.Visible:=false;
    end;
end;

procedure TWSAgenda.ButtonZeitraumLoeschenClick(Sender: TObject);
begin
  showmessage(inttostr(Panel3.Font.Size)+','+inttostr(Panel6.font.Size));
end;

procedure TWSAgenda.ButtonZieleBearbeitenClick(Sender: TObject);
begin
  if ButtonZieleBearbeiten.Caption='Bearbeiten' then
    begin
      ButtonZieleBearbeiten.Caption:='Speichern';
      ButtonZieleBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(29, ButtonZieleBearbeiten.Glyph);
      ButtonZieleNeu.Visible:=true;
      ButtonZieleLoeschen.Visible:=true;
    end
  else
    begin
      ButtonZieleBearbeiten.Caption:='Bearbeiten';
      ButtonZieleBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(64, ButtonZieleBearbeiten.Glyph);
      ButtonZieleNeu.Visible:=false;
      ButtonZieleLoeschen.Visible:=false;
    end;
end;

end.
Die drittletzte Procedure (ButtonZeitraumBearbeitenClick) und die letzte (ButtonZieleBearbeitenClick) funktionieren nicht mehr... Die gleiche Procedure wird noch an einer anderen Stellen ausgeführt (ButtonAGendaBearbeitenClick), bei der einen klappt es und bei den zweien nicht mehr... Gestern Abend klappte es noch und heute morgen habe ich nur neu compiliert und dann reagierten die Buttons nicht mehr...
Die Procedure soll eigentlich nur zwei Speedbuttons sicht bzw. unsichtbar machen und die Icons auf den Speedbutton steuern...

mkinzler 6. Sep 2012 14:39

AW: ButtonClick wird nicht ausgeführt
 
Funktioniert den irgendein Event bei diesen Buttons? Sind diese aktiv?

hathor 6. Sep 2012 14:40

AW: ButtonClick wird nicht ausgeführt
 
Wie gross ist die CPU-Last?

DeddyH 6. Sep 2012 14:42

AW: ButtonClick wird nicht ausgeführt
 
D.h. wenn Du einen Haltepunkt in die jeweils erste Zeile der Methode setzt, wird dieser nicht angesprungen? Übrigens ist es eher suboptimal, die Caption eines Buttons abzufragen und entsprechend zu reagieren, Du verlagerst damit die Logik in die Darstellung.

zyklame 6. Sep 2012 14:46

AW: ButtonClick wird nicht ausgeführt
 
Geh doch mal im Objektinspektor auf Ereignisse und guck dort ob unter OnClick deine procedure eingetragen ist.

DeddyH 6. Sep 2012 14:48

AW: ButtonClick wird nicht ausgeführt
 
Laut Screenshot im Ausgangspost ist das der Fall, sonst wäre das auch mein erster Verdacht gewesen.

Ykcim 6. Sep 2012 15:06

AW: ButtonClick wird nicht ausgeführt
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen,

vielen Dank für die Unterstützung!

@mkinzler
Zitat:

Funktioniert den irgendein Event bei diesen Buttons? Sind diese aktiv?
Nein, deshalb hatte ich zwischendurch einfach mal ein "showmessage" stattdessen reingesetzt. Aber es tut sich nichts.
Die Button.Enable ist auf true gesetzt.

@hathor
Zitat:

Wie gross ist die CPU-Last?
Da scheint sicht nichts zu tun - siehe Anhang. ich habe am Ende des Verlaufs ein ppar Mal auf den Button geklickt...

@DeddyH
Zitat:

D.h. wenn Du einen Haltepunkt in die jeweils erste Zeile der Methode setzt, wird dieser nicht angesprungen?
Nein, der Haltepunkt wird nicht angefahren - er springt also gar nicht in die Procedure rein...
Zitat:

Übrigens ist es eher suboptimal, die Caption eines Buttons abzufragen und entsprechend zu reagieren, Du verlagerst damit die Logik in die Darstellung.
Ich weiß, aber ich wusste nicht, wie ich es anders machen soll...

@Zyklame
Zitat:

Geh doch mal im Objektinspektor auf Ereignisse und guck dort ob unter OnClick deine procedure eingetragen ist.
Ist eingetragen - siehe zweiten Anhang.

Ich hoffe, alle Fragen vollständig beantwortet zu haben.

Gruß
Ykcim

Klaus01 6. Sep 2012 15:14

AW: ButtonClick wird nicht ausgeführt
 
Hallo,

wenn Du Dein Programm ausserhalb von Delphi ausführst - verhält es sich dann anders?

Grüße
Klaus

Ykcim 6. Sep 2012 15:26

AW: ButtonClick wird nicht ausgeführt
 
Nein, es verhält sich genau wie in Delphi - es tut sich bei den beiden Buttons nichts.

Das Problem ist, dass das jetzt schon öfter der Fall war und ich dann die Buttons neu erstellt habe... Aber auf Dauer ist das auch nichts...

DeddyH 6. Sep 2012 15:28

AW: ButtonClick wird nicht ausgeführt
 
Zumindest mir gehen die Ideen aus. Updatemäßig bist Du aktuell?

Klaus01 6. Sep 2012 15:29

AW: ButtonClick wird nicht ausgeführt
 
.. und wenn Du einen Haltepunkt in die onClick Routine setzt bleibt dieser dann rot
nachdem Du das Programm gestartet hast?

Grüße
Klaus

gmc616 6. Sep 2012 15:32

AW: ButtonClick wird nicht ausgeführt
 
Kann es sein, dass dein Formular, auf welches du den Frame platzierst, den Klick deiner Buttons abfängt?

Ykcim 6. Sep 2012 16:30

AW: ButtonClick wird nicht ausgeführt
 
@Klaus01
Ja, der Haltepunkt bleibt rot.

@gmc616
Interessante Idee. Wie kann ich das testen und woran erkenne ich das? Der Name des Buttons kommt in dem Ganzen Projekt nur einmal vor.

@DeddyH
Nein, ich habe noch nicht alle Updates durchgeführt. Aber dieser Fehler müsste ja dann bekannt sein, oder?

Gruß
Ykcim

mkinzler 6. Sep 2012 16:40

AW: ButtonClick wird nicht ausgeführt
 
Haben alle Buttons, den selben Parent/Owner?

Ykcim 6. Sep 2012 16:53

AW: ButtonClick wird nicht ausgeführt
 
Wie bekomme ich raus, wer der Parent ist. Im OI gibt es keine Möglichkeit dafür...

mkinzler 6. Sep 2012 16:55

AW: ButtonClick wird nicht ausgeführt
 
Ist in der Strukturansicht ersichtlich

Klaus01 6. Sep 2012 16:57

AW: ButtonClick wird nicht ausgeführt
 
.. ein Schuss ins Blaue - kann das etwas mit den LiveBindings zu tun haben?

Grüße
Klaus

Ykcim 6. Sep 2012 17:05

AW: ButtonClick wird nicht ausgeführt
 
Liste der Anhänge anzeigen (Anzahl: 1)
@mkinzler
Nein, dann haben sie nicht alle den gleichen Owner - siehe Anhang.

Aber um noch einmal auf die Frage von gmc616 zurückzukommen:
Ich habe ein Hauptformular, auf dem in PageControls verschiedene Frames liegen. Auf einem dieser Frames ist ein weiteres Frame mit eingebunden, um das es hier geht.
Also Form
--> Frame
--> Frame (hier passiert der Fehler)
Kann das Fehler verursachen?

@Klaus01
Mit LiveBindings arbeite ich nicht - damit kenne ich mich garnicht aus...

himitsu 6. Sep 2012 17:09

AW: ButtonClick wird nicht ausgeführt
 
Sind da irgendwo Actions verbaut?

Wäre es nicht soeine blöde Starter, dann hätte ich empfohlen mal die Debug-DCUs zu aktivieren und einen Haltepunkt in die Button-Klick-Methode der VCL reinzumachen.

Ykcim 6. Sep 2012 17:11

AW: ButtonClick wird nicht ausgeführt
 
Hört auf nachzudenken: Ich habe gerade das Frame mal direkt im HauptForm platziert und siehe da, jetzt funktioniert es.

Kann mir jemand erklären, was da passiert? Ist das ein no-go, wenn ich ein Frame in einem Frame platziere?

Danke
Ykcim

Ykcim 6. Sep 2012 17:25

AW: ButtonClick wird nicht ausgeführt
 
Liste der Anhänge anzeigen (Anzahl: 2)
Korrektur!
Ich habe das Frame gerade aus dem anderen Frame herausgelöscht und wieder neu eingesetzt - dann funktioniert es fast wieder.

Warum kann das sein?

Das fast deshalb, weil er irrationaler Weise bei dem einen Button die Reihenfolge der Buttons vertauscht und erst ab dem zweiten Mal sie wieder korrek anordnet.

Das erste Mal drücken: Anhang1 Press1.jpg
Das zweite Mal drücken: Anhang2 Press2.jpg

Warum???

Delphi-Quellcode:
  if ButtonZeitraumBearbeiten.Caption='Bearbeiten' then
    begin
      ButtonZeitraumBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(29, ButtonZeitraumBearbeiten.Glyph);
      ButtonZeitraumBearbeiten.Caption:='Speichern';
      ButtonZeitraumNeu.Visible:=true;
      ButtonZeitraumLoeschen.Visible:=true;
    end
  else
    begin
      ButtonZeitraumBearbeiten.Caption:='Bearbeiten';
      ButtonZeitraumBearbeiten.Glyph:=nil;
      ImageList1.GetBitmap(64, ButtonZeitraumBearbeiten.Glyph);
      ButtonZeitraumNeu.Visible:=false;
      ButtonZeitraumLoeschen.Visible:=false;
    end;
Vielen Dank
Ykcim

blawen 6. Sep 2012 21:09

AW: ButtonClick wird nicht ausgeführt
 
Ich hatte bei einem Projekt mit ähnlichen Problemen zu kämpfen, schlussendlich habe ich mich wieder von den Frames abgewendet.

Zitat:

Zitat von gmc616 (Beitrag 1181864)
Kann es sein, dass dein Formular, auf welches du den Frame platzierst, den Klick deiner Buttons abfängt?

Zumindest war es bei mir so, dass die MainForm alles abgefangen hat und ich das ganze "manuell weitergeleitet" habe.

Ykcim 6. Sep 2012 21:45

AW: ButtonClick wird nicht ausgeführt
 
Ich habe jetzt mein Programm so umgebaut, dass ich keine Frames auf Frames mehr habe, sondern wennn noch Frames, dann direkt auf dem Hauptformular.

Damit ist der Fehler weg und alles klappt wieder so wie gewünscht.

Vielen Dank an Alle für die Unterstützung.

Gruß und noch einen schönen Abend
Ykcim

gmc616 7. Sep 2012 12:54

AW: ButtonClick wird nicht ausgeführt
 
Ich kenne das Problem.

Man baut einen Frame mit einem Button drauf und definiert ein OnClick-Event (TFrame1.OnButton1Click).
Danach baut man den Frame in eine Form ein. Der Button funzt im Programm, alles bestens.

Jetzt kann man aber dem Button auf dem Frame ein weiters OnClick-Event in der Form zuweisen (TForm1.OnFrame1Button1Click).

Klick man dann im Programm auf diesen Button, wird nicht die OnClick-Prodedure des Frames gerufen, sondern die der Form. Und wenn im TForm1.OnFrame1Button1Click kein Code steht ... :zwinker: Ich denke genau das ist hier der Fall.

Nun kann es passieren, dass man beim basteln die Form und den Frame in der IDE verwechselt, schließlich sehen beide "Fenster" fast gleich aus. Ein einfacher Doppelklick auf dem Button des Frames in der Form-Ansicht reicht, damit die IDE ein TForm1.OnFrame1Button1Click einfügt und damit quasi den TFrame1.OnButton1Click überschreibt.

Normalerweise, wenn in diesen Event-Proceduren kein Code steht, entfernt die IDE diese Events und Proceduren wieder automatisch beim speichern bzw kompilieren, so das das eigentliche Event (des Frames) wieder "ziehen" müsste. Normalerweise ... , allerdings nicht immer, zb. dann, wenn ein Syntax-Fehler im Code der Form enthalten ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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