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-Tag wird nicht erkannt (https://www.delphipraxis.net/132468-button-tag-wird-nicht-erkannt.html)

FabianClassen 13. Apr 2009 14:22


Button-Tag wird nicht erkannt
 
Hi
ich habe paralell zu diesem Thread http://www.delphipraxis.net/internal...t.php?t=155919
mal versucht eine Lösung für die letzten Post zu erstellen.
Wollte den Code da auch eigentlich als Beispiel posten.
Nun habe ich aber selbst ein Problem:

Das ist mein Code:

Delphi-Quellcode:
unit Test_Unit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Btn_1: TButton;
    Btn_2: TButton;
    Btn_3: TButton;
    Btn_4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Btn_1Click(Sender: TObject);
    procedure Btn_2Click(Sender: TObject);
    procedure Btn_3Click(Sender: TObject);
    procedure Btn_4Click(Sender: TObject);
  private
    { Private-Deklarationen }
    BtnNumber: Integer;
    procedure onButtonClick(Sender: TButton);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  BtnNumber := Random(3);
end;

procedure TForm1.onButtonClick(Sender: TButton);
begin
  if Sender.Tag = BtnNumber then
    ShowMessage('Du hast den richtigen Button erwischt!');
end;

procedure TForm1.Btn_1Click(Sender: TObject);
begin
  onButtonClick(Btn_1);
end;

procedure TForm1.Btn_2Click(Sender: TObject);
begin
  onButtonClick(Btn_2);
end;

procedure TForm1.Btn_3Click(Sender: TObject);
begin
  onButtonClick(Btn_3);
end;

procedure TForm1.Btn_4Click(Sender: TObject);
begin
  onButtonClick(Btn_4);
end;

end.
Nur Irgendwie bringt die Procedur onButtonClick kein Ergebnis.

Woran liegt das?
Schonmal danke.

MFG
FC
;)

Meflin 13. Apr 2009 14:25

Re: Button-Tag wird nicht erkannt
 
Schonmal nen Breakpoint im onButtonClick gesetzt und geguckt, was da so für Werte in Tag und BtnNumber stehen?

Hast du die Tags überhaupt gesetzt?

mkinzler 13. Apr 2009 14:28

Re: Button-Tag wird nicht erkannt
 
Der Parameter Sender ist vom Typ TComponent du musst ihn zu einem Button casten:
Delphi-Quellcode:
if (Sender as TButton).Tag = ...

Meflin 13. Apr 2009 14:31

Re: Button-Tag wird nicht erkannt
 
Zitat:

Zitat von mkinzler
Der Parameter Sender ist vom Typ TComponent du musst ihn zu einem Button casten

Ist er nicht :stupid: Und selbst wenn müsste es doch egal sein, sosnt könnten wir OOP ja gleich irgendwie sein lassen :gruebel:

mkinzler 13. Apr 2009 14:38

Re: Button-Tag wird nicht erkannt
 
Die Eventmethode für den Buttonklick liefert den geklickten Sender als TComponent.
Und OOp heisst das eine abgeleitete Klasse an die Stelle der Superklasse treten kann, aber nicht umgekehrt!

FabianClassen 13. Apr 2009 14:42

Re: Button-Tag wird nicht erkannt
 
Ist es denn schlimm, wenn ich hier den Sender als TButton direkt initialisiere,
Ich übergebe ja auch einen Button ;)

Ich habe übrigens die Variable mal in einer MessageBox abgefragt ... der Wert ist drin ...

Bitte um weitere Hilfe.

MFG
FC
;)

jaenicke 13. Apr 2009 14:45

Re: Button-Tag wird nicht erkannt
 
Aber wozu hast du denn überhaupt nochmal die einzelnen OnClicks? Das ist doch genau was du mit der Unterscheidung nach Sender verhindern willst... So macht das ja gar keinen Sinn. ;-)

Schau doch im Debugger was passiert, setz doch einfach einen Haltepunkt auf das if.

mkinzler 13. Apr 2009 14:45

Re: Button-Tag wird nicht erkannt
 
Warum weist du nichtbei allen buttons die selbe Methode zu und entscheidest dann per Sender?

hoika 13. Apr 2009 14:48

Re: Button-Tag wird nicht erkannt
 
Hallo,

poste doch mal das ganze Projekt als Zip ohne Exe (incl. der DFM).

Ich sehe nirgendwo, dass du Tag zuweist.

Ausserdem liefert Random(3) eine Zahl zwischen 0 und <3 zurück.


Heiko

mkinzler 13. Apr 2009 14:50

Re: Button-Tag wird nicht erkannt
 
Zudem überschneidet sich der Thread themenmässig mit diesem:
http://www.delphipraxis.net/internal...t.php?t=155919

FabianClassen 13. Apr 2009 14:54

Re: Button-Tag wird nicht erkannt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab ja auch geschrieben, dass die sich überschneiden ^^
Ich wollte das nur nicht auch noch in den Thread packen, weil er schon ziemlich lang ist.
Der Übersicht halber.

Werden die Tags nicht schon automatisch festgelegt?
Wird der Sender automatisch angegeben?
Ich habe vorher noch nie mit einem "ereignissorientiertem Framework" wie VLC/Delphi gearbeitet.

MFG
FC
;)

Im Anhang ist das Projekt :)

mkinzler 13. Apr 2009 14:56

Re: Button-Tag wird nicht erkannt
 
Zitat:

Werden die Tags nicht schon automatisch festgelegt?
Nein. .Tag ist eine Eigenschaft, die zur freien Verwendung zur Verfügung steht. Du kannst sie per OI setzen.
Zitat:

Ich hab ja auch geschrieben, dass die sich überschneiden ^^
Ich wollte das nur nicht auch noch in den Thread packen, weil er schon ziemlich lang ist.
Der Übersicht halber.
Nur werden so dinge doppelt diskutiert.

FabianClassen 13. Apr 2009 15:00

Re: Button-Tag wird nicht erkannt
 
Sorry ... kommt nicht wieder vor :)

Naja bei mir im OI sind die Tags aber auch in der richtigen Reihenfolge durchnummeriert ;)

MFG
FC
;)

jaenicke 13. Apr 2009 15:02

Re: Button-Tag wird nicht erkannt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang mal ein funktionierendes Beispiel, in dein Projekt schaue ich gleich.

// EDIT:
Du hast bei den Buttons Tag nicht gesetzt, deshalb ist das eben 0, da ist nur TabOrder aufsteigend gesetzt, aber das passiert ja automatisch.

Meflin 13. Apr 2009 15:26

Re: Button-Tag wird nicht erkannt
 
Zitat:

Zitat von mkinzler
Die Eventmethode für den Buttonklick liefert den geklickten Sender als TComponent.
Und OOP heisst das eine abgeleitete Klasse an die Stelle der Superklasse treten kann, aber nicht umgekehrt!

Schau dir doch mal seinen Quelltext an ;) Er gibt den Sender ja nicht weiter, sondern direkt den Button, und in seiner Methode hat er den Sender dann auch als TButton deklariert ;)

Und TButton ist doch ein Nachfahre von TComponent, und somit sollte das problemlos ohne Typecast funktionieren.

FabianClassen 13. Apr 2009 16:23

Re: Button-Tag wird nicht erkannt
 
Vielen Dank für die Hilfe.
Ich habe jetzt bei mir einfach die TabOrder genommen.
Dann klappts.
Ich werde das ganze aber auch heute Abend mal mit Tags versuchen.
Vielen Dank.

MFG
FC
;)

jaenicke 13. Apr 2009 16:57

Re: Button-Tag wird nicht erkannt
 
Was ist da groß zu versuchen? Du musst doch nur in Delphi den Button anklicken und im Objektinspektor die Eigenschaft Tag entsprechend setzen. :gruebel:

FabianClassen 13. Apr 2009 18:23

Re: Button-Tag wird nicht erkannt
 
Ja ... das war jetzt nur mal so daher gesagt.
Nur damit du weißt, dass ich deinen Tipp annehme und ausprobiere.

Ist doch das Mindeste was ich machen kann, wenn du dir schon die Mühe gemacht hast und dir mein Projekt runtergeladen hast.

MFG
FC
;)

hoika 14. Apr 2009 07:15

Re: Button-Tag wird nicht erkannt
 
Hallo,

Zitat:

Naja bei mir im OI sind die Tags aber auch in der richtigen Reihenfolge durchnummeriert
Wie schon gesagt, das sind nicht die Tags, sondern die Tabulator-Reihenfolge.
Du musst im Object-Insoector jedem ein anderes Tag eintragen.


Oder per Code:
Delphi-Quellcode:
FormCreate;
begin
  Btn1.Tag:= 1;
  Btn2.Tag:= 2;
  Btn3.Tag:= 3;
  Btn4.Tag:= 4;
end;
Heiko

mkinzler 14. Apr 2009 08:19

Re: Button-Tag wird nicht erkannt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Siehe Screenshot

FabianClassen 14. Apr 2009 08:58

Re: Button-Tag wird nicht erkannt
 
Danke sehr.
Klappt jetzt alles ;)

MFG
FC
;)

Dipl Phys Ernst Winter 4. Mai 2009 13:57

Re: Button-Tag wird nicht erkannt
 
Wenn ich richtig verstanden habe, so soll der Anwender einen zufällig ausgewählten Button drücken.

Zitat:

Nur Irgendwie bringt die Procedur onButtonClick kein Ergebnis.
Du hast dich da etwas in deinem Komplizissimus verfranzt. Was willst Du?
Beim Drücken eines der 4 Buttons abfragen, ob ihr Tag mit der Butonnummer übereinstimmt.
Schreib doch einfach einen gemeinsamen Eventhändler für das OnClick Ereignis der 4 Buttons und Vergleiche Tag mit ButNummer

Delphi-Quellcode:
var
  ButNummer: integer;

procedure TForm1.FormActivate(Sender: TObject);
begin
    ButNummer:= Random(3)+1;                  // 1..4
end;

procedure TForm1.ButtonClick(Sender: TObject); // gemeinsamer EventHändler für
begin                                         // die vier Buttons
  with Sender as TButton do
    if Tag=ButNummer then
       lblOut.Caption:= 'Du hast den richtigen Button erwischt'
    else lblOut.Caption:= 'falsch, ButNummer= ' + IntToStr(ButNummer);
  ButNummer:= Random(3)+1;                   // für das nächste Spiel
end;

DeddyH 4. Mai 2009 13:59

Re: Button-Tag wird nicht erkannt
 
Zitat:

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
    ButNummer:= Random(3)+1;                  // 1..4
end;

Nicht ganz ;), sondern 1..3


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