![]() |
Delphi-Version: 7
TSpeedButton Sender Übergabe Problem
Hallo liebe Community!
da mir hier bislang immer wahnsinnig gut geholfen wurde, wende ich mich nochmal mit einem Problem an euch. Bevor ich jetzt meinen Code poste, es handelt sich um einen Taschenrechner den ich momentan übungshalber programmiere. Habe eine Form mit TSpeedButtons erstellt und würde jetzt gerne mit einer einzigen Procedure erkennen, welcher Button gedrückt wurde (anstatt eine procedure für jeden Button zu schreiben). Das Problem ist, das überhaupt keine Übergabe der Zeichen stattfindet und auch keine Ausgabe auf label1.Caption...(math_op dient übrigens der Abfrage, ob ein Operator gedrückt wurde)
Code:
Hat zufällig jemand eine Idee oder Anregung wie ich am besten an das Problem rangehen könnte?
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, Buttons; type { TForm1 } TForm1 = class(TForm) Label1: TLabel; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Tsb0: TSpeedButton; Tsb01: TSpeedButton; Tsb02: TSpeedButton; Tsb03: TSpeedButton; Tsb04: TSpeedButton; Tsb05: TSpeedButton; Tsb06: TSpeedButton; Tsb07: TSpeedButton; Tsb08: TSpeedButton; Tsb09: TSpeedButton; TsbClear: TSpeedButton; TsbDivision: TSpeedButton; TsbMultiplication: TSpeedButton; TsbSubtraction: TSpeedButton; TsbAddition: TSpeedButton; TsbEqual: TSpeedButton; procedure TsbClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure TsbOpClick(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; number,result: real; math_op : boolean; zeichen, op, current_op : char; zeichenkette : ansistring; implementation {$R *.lfm} { TForm1 } procedure TForm1.TsbClick(Sender: TObject); begin if Sender is TSpeedButton then if Sender = Tsb0 then zeichen := '0'; if Sender = Tsb01 then zeichen := '1'; if Sender = Tsb02 then zeichen := '2'; if Sender = Tsb03 then zeichen := '3'; if Sender = Tsb04 then zeichen := '4'; if Sender = Tsb05 then zeichen := '5'; if Sender = Tsb06 then zeichen := '6'; if Sender = Tsb07 then zeichen := '7'; if Sender = Tsb08 then zeichen := '8'; if Sender = Tsb09 then zeichen := '9'; if math_op = true then begin math_op:= false; zeichenkette := zeichen; end else zeichenkette := zeichenkette + zeichen; label1.Caption := zeichenkette; end; procedure TForm1.FormCreate(Sender: TObject); begin math_op := true; current_op := '0'; end; procedure TForm1.TsbOpClick(Sender: TObject); begin if Sender is TSpeedButton then if Sender = TsbAddition then op := '1'; if Sender = TsbSubtraction then op := '2'; if Sender = TsbMultiplication then op := '3'; if Sender = TsbDivision then op := '4'; if Sender = TsbClear then op := 'c'; if Sender = TsbEqual then op := '='; math_op := true; number := strtofloat(label1.Caption); if current_op = '0' then result := number; if current_op = '1' then result := result+number; if current_op = '2' then result := result-number; if current_op = '3' then result := result*number; if current_op = '4' then result := result/number; if current_op = 'c' then result := 0; if current_op = '=' then result := result; current_op := op; label1.Caption := floattostr(result); end; end. Könnte man einen Taschenrechner noch "übersichtlicher und leichter zu erweitern" aufbauen? Vielen, vielen Dank im Vorraus! Schöne Grüße, jdiephaus |
AW: TSpeedButton Sender Übergabe Problem
Mal ein bisserl rumgewuselt und ungetestet:
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, Buttons; type { TForm1 } TForm1 = class(TForm) Label1: TLabel; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; Tsb0: TSpeedButton; Tsb01: TSpeedButton; Tsb02: TSpeedButton; Tsb03: TSpeedButton; Tsb04: TSpeedButton; Tsb05: TSpeedButton; Tsb06: TSpeedButton; Tsb07: TSpeedButton; Tsb08: TSpeedButton; Tsb09: TSpeedButton; TsbClear: TSpeedButton; TsbDivision: TSpeedButton; TsbMultiplication: TSpeedButton; TsbSubtraction: TSpeedButton; TsbAddition: TSpeedButton; TsbEqual: TSpeedButton; procedure TsbClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure TsbOpClick(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; // Result ist eigentlich "reserviert" als Rückgabewert von Funktionen, // das kann ggfls. zu Verwirrung führen. // Result lieber in Ergebnis umbenennen. number,result: real; math_op : boolean; zeichen, op, current_op : char; zeichenkette : ansistring; implementation {$R *.lfm} { TForm1 } procedure TForm1.TsbClick(Sender: TObject); begin if Sender is TSpeedButton then begin // Wir nutzen für die Ziffer das Tag-Attribut der Buttons. // Button für die 1 erhält Tag := 1; // ... // Button für die 9 erhält Tag := 9; // Button für die 0 erhält Tag := 0; // Tag kann man im Objektinspektor entsprechend zuweisen. zeichen := Chr(TSpeedButton(Sender).Tag); end; if math_op then begin math_op:= false; zeichenkette := zeichen; end else zeichenkette := zeichenkette + zeichen; label1.Caption := zeichenkette; end; procedure TForm1.FormCreate(Sender: TObject); begin math_op := true; current_op := '0'; end; procedure TForm1.TsbOpClick(Sender: TObject); begin if Sender is TSpeedButton then begin // Auch hier könnte man mit Tag arbeiten: case TSpeedButton(Sender).Tag of 1 : op := '1'; // if Sender = TsbAddition then op := '1'; 2 : op := '2'; // if Sender = TsbSubtraction then op := '2'; 3 : op := '3'; // if Sender = TsbMultiplication then op := '3'; 4 : op := '4'; // if Sender = TsbDivision then op := '4'; 5 : op := 'c'; // if Sender = TsbClear then op := 'c'; 6 : op := '='; // if Sender = TsbEqual then op := '='; end; end; math_op := true; number := strtofloat(label1.Caption); case current_op of '0' : result := number; '1' : result := result+number; '2' : result := result-number; '3' : result := result*number; '4' : result := result/number; 'c' : result := 0; '=' : result := result; end; current_op := op; label1.Caption := floattostr(result); end; end. |
AW: TSpeedButton Sender Übergabe Problem
Zitat:
Ich habe mir dein Beispiel gerade vorgenommen und getestet und hätte erstmal eine Frage:
Code:
Verstehe ich das richtig, dass so der Tag von z.B Taste 9 in einen Char gewandelt an zeichen übergeben wird?
zeichen := Chr(TSpeedButton(Sender).Tag);
Ich habe jetzt alle Tags entsprechend vergeben, bekomme jedoch immernoch keine Ausgabe oder auch nur eine andere Anzeige als 0 auf label1.Caption. Habe dann auch noch folgendes getestet:
Code:
Habe dann sogar noch getestet direkt label1.Caption := 'Test' zu setzen, funktioniert leider auch nicht.
procedure TForm1.TsbClick(Sender: TObject);
begin if Sender is TSpeedButton then begin case TSpeedButton(Sender).Tag of 1 : zeichen := '1'; end; if math_op then begin math_op:= false; zeichenkette := zeichen; end else zeichenkette := zeichenkette + zeichen; label1.Caption := zeichenkette; end; Anscheinend liest er den Tag der Buttons nicht richtig aus sehe ich das richtig? Ich wäre wirklich sehr dankbar für sämtliche Hilfe.. Schöne Grüße, jdiephaus |
AW: TSpeedButton Sender Übergabe Problem
Oh ja, da ist ein Fehler drin.
Der ASCII-Wert von 0 ist ja nicht 0 sondern 48, da muss nochmal gerechnet werden. War wohl ein von mir etwas unüberlegter Schnellschuss :-( Nächster Versuch:
Delphi-Quellcode:
Hoffentlich ist das jetzt besser.
procedure TForm1.TsbClick(Sender: TObject);
begin if Sender is TSpeedButton then begin // Wir nutzen für die Ziffer das Tag-Attribut der Buttons. // Button für die 1 erhält Tag := 1; // ... // Button für die 9 erhält Tag := 9; // Button für die 0 erhält Tag := 0; // Tag kann man im Objektinspektor entsprechend zuweisen. // Die ASCII-Werte von 0 bis 9 sind 48 bis 57. // Chr(48) wäre also '0' // Chr(57) wäre '9' // Man könnte dem Button für die 0 als Tag auch 48 zuweisen, // dem Button für die 1 als Tag 49 // ... // bis zum Button für die 9 als Tag 57 zeichen := Chr(TSpeedButton(Sender).Tag + 48); end; if math_op then begin math_op := false; zeichenkette := zeichen; end else zeichenkette := zeichenkette + zeichen; label1.Caption := zeichenkette; end; |
AW: TSpeedButton Sender Übergabe Problem
Zitat:
Code:
Ich wäre dir wie zuvor sehr dankbar für deine Hilfe!
procedure TForm1.TsbClick(Sender: TObject);
begin if Sender is TSpeedButton then begin zeichen := Chr(TSpeedButton(Sender).Tag + 48); end; label1.Caption := zeichen; end; Schöne Grüße, jdiephaus |
AW: TSpeedButton Sender Übergabe Problem
.. kannst Du mal einen Haltepunkt setzen und dir den Inhalt der Variable "zeichen" ausgeben lassen?
Grüße Klaus |
AW: TSpeedButton Sender Übergabe Problem
Hast du den TSpeedButtons die Funktion TsbClick im OnClick Event überhaupt zugeordnet?
|
AW: TSpeedButton Sender Übergabe Problem
Zitat:
Delphi-Quellcode:
.
Sender is TSpeedButton
Also, wie schon von Klaus angedeutet, einen Haltepunkt auf die Zeile
Delphi-Quellcode:
Bleibt der Debugger dort stehen?
zeichen := Chr(TSpeedButton(Sender).Tag + 48);
Ohne Debugger mal sowas machen:
Delphi-Quellcode:
Was steht denn dann im Label?
label1.Caption := ClassName;
Ansonsten mal ein
Delphi-Quellcode:
ShowMessage(IntToStr(TSpeedButton(Sender).Tag));
Wir müssen letztlich drei Informationen bekommen: Wird die Routine TsbClick beim Klick auf 'nen Button aufgerufen? Wird eine Zuweisung auf Zeichen vorgenommen? Wenn ja, was wird Zeichen zugewiesen? Prüfe bitte zuerst was Klaus schrieb. Dann kontrolliere die Zuweisung des Ereignisses, wie Jumpy schrieb. Wenn dann noch keine Klarheit ist, versuche es mit meinen Vorschlägen. Kommst Du dann immer noch nicht weiter, hänge bitte das ganze Projekt hier an, damit wir den aktuellen Stand vollständig betrachten können. |
AW: TSpeedButton Sender Übergabe Problem
Hallo jdiephaus
für jeden deiner SpeedButtons vergibst du im Objektinspektor eine Tag-Nummer. Du musst nun für einen deiner SpeedButtons im Objektinspektor OnClick auswählen und dann Code reinschreiben
Delphi-Quellcode:
procedure machetwas( z : integer );
begin ShowMessage( z.ToString ); end; procedure TForm52.SpeedButton1Click(Sender: TObject); var ziffer : integer; begin if Sender is TSpeedButton then begin ziffer := ( sender as TSpeedButton ).tag; machetwas( ziffer ); end; end; Bis jetzt reagiert das Programm nur auf Klicks auf SpeedButton1. Wenn dein Programm auch auf SpeedButton2 reagieren soll, dann wähle im Objektinspektor für das OnClick Ereignis von SpeedButton2 "SpeedButton1Click" aus. Jetzt reagiert auch SpeedButton2 (via SpeedButton1Click) auf Klicks. Mach's für die weiteren SpeedButtons ähnlich. Fertig. Noch ein Tipp: Das Setzen und Abfragen der Eigenschaft Tag ist praktisch, wenn du viele Buttons mit ähnlicher Funktion hast. Wenn du einen Taschenrechner mit vielen Tasten [+,-,*,/,Speichern, Löschen, etc.] baust, dann wird die OnClick Ereignisbehandlungsroutine eventuell übersichtlicher, wenn du für diese Tastenklicks statt den Wert des jeweiligen Tags die Eigenschaft "Name" des Senders auswertest. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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