![]() |
Delphi-Version: 10 Berlin
TPanel als Sender Casten
Hallo zusammen,
vorneweg entschuldige ich mich schon einmal für den eventuell falsch gewählten Titel, aber ich weiß nicht wirklich wie ich es sonst nennen soll. Ich bin ziemlicher Neuling was Delphi angeht, als eines meiner ersten "Spielereien" habe ich einen Taschenrechner erstellt. Dieser arbeitet mittlerweile auch so wie ich es will. Jedoch habe ich einige Procedures für jeden Button (bzw. habe ich Panels anstatt Buttons verwendet) erstellt und ich hoffe, dass sich das irgendwie kürzen lässt. Mein "Problem" sieht wie folgt aus; ich habe die Buttons 0-9, für jeden habe ich eine Procedure erstellt die onClick zum Anzeige-Feld die jeweilige Zahl hinzufügt. Da habe ich jetzt für jedes Panel eine eigene Procedure erstellt:
Delphi-Quellcode:
Ich habe schon viel rumgegoogelt, und dort wird öfters beschrieben ich soll "casten", aber ich verstehe nicht wirklich wie das funktioniert. Wenn ich mir die beschreibung von
rocedure TForm1.Panel0Click(Sender: TObject);
begin resultedit.Text := (resultedit.Text + '0'); end; //============================================================================================================================ procedure TForm1.Panel1Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '1'); end; //============================================================================================================================ procedure TForm1.Panel2Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '2'); end; //============================================================================================================================ procedure TForm1.Panel3Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '3'); end; //============================================================================================================================ procedure TForm1.Panel4Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '4'); end; //============================================================================================================================ procedure TForm1.Panel5Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '5'); end; //============================================================================================================================ procedure TForm1.Panel6Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '6'); end; //============================================================================================================================ procedure TForm1.Panel7Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '7'); end; //============================================================================================================================ procedure TForm1.Panel8Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '8'); end; //============================================================================================================================ procedure TForm1.Panel9Click(Sender: TObject); begin resultedit.Text := (resultedit.Text + '9'); end; ![]() MfG |
AW: TPanel als Sender Casten
Hallo,
"Casten" bedeutet, dass Du dem Compiler sagst, eine Referenz auf ein Objekt (also "Sender : TObject") deutet auf eine Instanz eine bestimmter Klasse. Delphi kennt zwei Möglichkeiten zu casten: das low-level casten TPanel(Sender).Text oder das high level casten (Sender as TPanel). Text. Letzteres prüft zunächst, ob "Sender" überhaupt den genannten Typ ist oder diesen als Vorfahr hat. Wenn nicht, wird eine Exception ausgelöst. Falls Du "TPanel(Sender)" verwendest und Sender ist kein TPanel (und stammt nicht davon ab) gibt es eine böse Schutzverletzung. Du kast auch den "is" Operator verwenden um dies selbst zu prüfen: if Sender is TPanel then x := TPanel(Sender).Text So mache ich es normalerweise. |
AW: TPanel als Sender Casten
Zitat:
|
AW: TPanel als Sender Casten
Noch ein kleiner Tip der hier dazu passt:
Die Controls haben alle ein Property "Tag" (=Etikett) welche man frei verwenden kann. Es wäre für den Taschenrechner möglich den jeweiligen Wert der Taste in dem "Tag" zu hinterlegen. Dann braucht man für alle OnClick nur noch eine Prozedur welche eben dann ""Tag" auswertet. Gerne verwendet wird auch solcher code: case (Sender as TControl).Tag of 0 : raise Exception.Create('Tag wurde nicht zugewiesen"); 1 : tue dies 2: tue das end; |
AW: TPanel als Sender Casten
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, als Neuling kann dir dieser Source im Anhang vielleicht ein wenig helfen um das eine oder andere zu lernen.
Es ist ein ur-alter Taschenrechner Source. (Die .res Datei hab ich wegen inkompatibilät gelöscht, lass Delphi eine neue erstellen, da ist nur das Icon drinn) Grüße und viel Spass mit Delphi! ps: der source ist nicht von mir, diente mir auch nur als Beispiel um davon zu lernen. |
AW: TPanel als Sender Casten
Halo,
um das Bsp. von jziersch fortzuführen. Gib allen dein OnClick-Events über den Objektinspektor das Panel0Click. Die anderen PanelXClick-Methoden können gelöscht werden. Dann bekommen alle Panels auch über den Objektinspektor im Property Tag die entsprechende Nummer (0-9).
Delphi-Quellcode:
Die lokale Variable Panel dient der Übersicht, kann aber auch weggelassen werden.
procedure TForm1.Panel0Click(Sender: TObject);
var Panel: TPanel; begin if Sender is TPanel then begin Panel := TPanel(Sender); // Sender auf TPanel casten resultedit.Text := resultedit.Text + IntToStr(Panel.Tag); end; end; Das is dient zur Absicherung, dass es wirklich ein TPanel ist. |
AW: TPanel als Sender Casten
Danke für die weiteren Antworten. Habe es wie folgt gelöst;
Code:
Jeder Button mit Nummer hat nun diese Procedure bei "OnClick" zugewiesen und es funktioniert ohne Probleme. Habe damit auch die verschiedenen Rechenarten und die Drückeffekte für die Panels generell umgesetzt. Konnte somit von ca. 550 Zeilen auf ca. 210 verkürzen :-)
procedure TForm1.PanelNumberClick(Sender: TObject);
var Panelcap : string; begin if Sender is Tpanel then Panelcap := TPanel(Sender).caption; resultedit.Text := (resultedit.Text + Panelcap); end; |
AW: TPanel als Sender Casten
Sagt der Compiler nichts dazu? Ich würde da beherzt noch ein begin und end einfügen.
Delphi-Quellcode:
procedure TForm1.PanelNumberClick(Sender: TObject);
var Panelcap : string; begin if Sender is Tpanel then begin Panelcap := TPanel(Sender).caption; resultedit.Text := (resultedit.Text + Panelcap); end; end; |
AW: TPanel als Sender Casten
Die ursprüngliche Variante ist so schon ok, aber mit begin und end sicherlich "schöner" (verständlicher). Es würde aber auch so ausreichen:
Delphi-Quellcode:
Die Caption des Panels muss nicht erst in eine Variabel übernommen werden, die dann an den Text angehängt wird.
procedure TForm1.PanelNumberClick(Sender: TObject);
begin if Sender is TPanel then resultedit.Text := resultedit.Text + TPanel(Sender).Caption; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 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