AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TSpeedButton Sender Übergabe Problem

Ein Thema von jdiephaus · begonnen am 20. Apr 2017 · letzter Beitrag vom 23. Apr 2017
Antwort Antwort
jdiephaus

Registriert seit: 29. Nov 2016
13 Beiträge
 
#1

TSpeedButton Sender Übergabe Problem

  Alt 20. Apr 2017, 14:30
Delphi-Version: 7
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:
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.
Hat zufällig jemand eine Idee oder Anregung wie ich am besten an das Problem rangehen könnte?
Könnte man einen Taschenrechner noch "übersichtlicher und leichter zu erweitern" aufbauen?

Vielen, vielen Dank im Vorraus!

Schöne Grüße,
jdiephaus
  Mit Zitat antworten Zitat
nahpets

Registriert seit: 11. Okt 2006
2.599 Beiträge
 
Delphi 7 Professional
 
#2

AW: TSpeedButton Sender Übergabe Problem

  Alt 20. Apr 2017, 14:49
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.
Stephan
Weil die Lichtgeschwindigkeit höher als die Schallgeschwindigkeit ist, hält man viele Leute für helle Köpfe, bis man sie reden hört.
  Mit Zitat antworten Zitat
jdiephaus

Registriert seit: 29. Nov 2016
13 Beiträge
 
#3

AW: TSpeedButton Sender Übergabe Problem

  Alt 21. Apr 2017, 00:34
Mal ein bisserl rumgewuselt und ungetestet
Hallo Nahpets! Erstmal vielen Dank für die schnelle Antwort und natürlich dass du dir die Mühe gemacht hast.

Ich habe mir dein Beispiel gerade vorgenommen und getestet und hätte erstmal eine Frage:

Code:
zeichen := Chr(TSpeedButton(Sender).Tag);
Verstehe ich das richtig, dass so der Tag von z.B Taste 9 in einen Char gewandelt an zeichen übergeben wird?


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:
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;
Habe dann sogar noch getestet direkt label1.Caption := 'Test' zu setzen, funktioniert leider auch nicht.

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
  Mit Zitat antworten Zitat
nahpets

Registriert seit: 11. Okt 2006
2.599 Beiträge
 
Delphi 7 Professional
 
#4

AW: TSpeedButton Sender Übergabe Problem

  Alt 21. Apr 2017, 01:24
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:
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;
Hoffentlich ist das jetzt besser.
Stephan
Weil die Lichtgeschwindigkeit höher als die Schallgeschwindigkeit ist, hält man viele Leute für helle Köpfe, bis man sie reden hört.
  Mit Zitat antworten Zitat
jdiephaus

Registriert seit: 29. Nov 2016
13 Beiträge
 
#5

AW: TSpeedButton Sender Übergabe Problem

  Alt 21. Apr 2017, 14:07
Hoffentlich ist das jetzt besser.
Hallo Nahpets! Habe gerade getestet und bekomme leider immer noch keine Ausgabe. Habe es mit folgendem Minimalbeispiel probiert. Leider wie gesagt ohne Ausgabe auf label1.Caption. Ich weiß wirklich nicht was ich verkehrt mache, aber anscheinend erkennt er die Tags der SpeedButtons nicht.

Code:
procedure TForm1.TsbClick(Sender: TObject);
begin
  if Sender is TSpeedButton then begin
    zeichen := Chr(TSpeedButton(Sender).Tag + 48);
  end;
  label1.Caption := zeichen;
end;
Ich wäre dir wie zuvor sehr dankbar für deine Hilfe!

Schöne Grüße,
jdiephaus
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.100 Beiträge
 
Delphi XE7 Professional
 
#6

AW: TSpeedButton Sender Übergabe Problem

  Alt 21. Apr 2017, 14:13
.. kannst Du mal einen Haltepunkt setzen und dir den Inhalt der Variable "zeichen" ausgeben lassen?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.343 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: TSpeedButton Sender Übergabe Problem

  Alt 21. Apr 2017, 14:18
Hast du den TSpeedButtons die Funktion TsbClick im OnClick Event überhaupt zugeordnet?
Ralph
  Mit Zitat antworten Zitat
nahpets

Registriert seit: 11. Okt 2006
2.599 Beiträge
 
Delphi 7 Professional
 
#8

AW: TSpeedButton Sender Übergabe Problem

  Alt 21. Apr 2017, 14:30
Hoffentlich ist das jetzt besser.
Hallo Nahpets! Habe gerade getestet und bekomme leider immer noch keine Ausgabe. Habe es mit folgendem Minimalbeispiel probiert. Leider wie gesagt ohne Ausgabe auf label1.Caption. Ich weiß wirklich nicht was ich verkehrt mache, aber anscheinend erkennt er die Tags der SpeedButtons nicht.

Code:
procedure TForm1.TsbClick(Sender: TObject);
begin
  if Sender is TSpeedButton then begin
    zeichen := Chr(TSpeedButton(Sender).Tag + 48);
  end;
  label1.Caption := zeichen;
end;
Ich wäre dir wie zuvor sehr dankbar für deine Hilfe!

Schöne Grüße,
jdiephaus
Die Frage die sich hier stellt wäre dann erstmal: Ist Sender ein TSpeedButton, sprich ist diese Bedingung erfüllt:Sender is TSpeedButton .

Also, wie schon von Klaus angedeutet, einen Haltepunkt auf die Zeile zeichen := Chr(TSpeedButton(Sender).Tag + 48); Bleibt der Debugger dort stehen?

Ohne Debugger mal sowas machen:label1.Caption := ClassName; Was steht denn dann im Label?
Ansonsten mal ein 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.
Stephan
Weil die Lichtgeschwindigkeit höher als die Schallgeschwindigkeit ist, hält man viele Leute für helle Köpfe, bis man sie reden hört.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: Region Bern CH
51 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: TSpeedButton Sender Übergabe Problem

  Alt Heute, 11:07
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf