Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Zahl über Button in Edit Felder
Stread - So 28.12.08 21:25
Titel: Zahl über Button in Edit Felder
Hi
Ich habe einen Taschenrechner der mehrere (3 Stück) Edit Felder hat. Wenn ich mit der Maus die einzelnen Felder anklicke kann ich ganz normal die Zahlen eingeben. Nun habe ich aber (wie im Windowsrechner) die Zahlen als Button gemacht und möchte nun dass man die Edit Felder auch so füllen kann.
1.Problem: Die zuletzt eingegebene Zahl wir immer mit der neuen überschrieben.
2.Problem: Wie lege ich fest in welches Feld die Zahl reingeschrieben werden soll?
3.Problem: Kann man es einrichten dass man über einen Button oder die ENTER Taste zum nächsten Feld kommt?
Danke
Stread
jaenicke - So 28.12.08 21:34
Crossposts solltest du zumindest angeben... :roll:
http://forum.delphi-treff.de/showthread.php?p=183609
Zum Problem:
Stread hat folgendes geschrieben : |
| 1.Problem: Die zuletzt eingegebene Zahl wir immer mit der neuen überschrieben. |
Dann wirst du das auch so programmiert haben. Wenn du die neue Zahl an den alten Inhalt anfügen willst, dann musst du den alten Inhalt auch wieder mit reinlegen.
Stread hat folgendes geschrieben : |
| 2.Problem: Wie lege ich fest in welches Feld die Zahl reingeschrieben werden soll? |
Wie meinst du das? Du schreibst ja in deinem Code wo sie landet. Meinst du wie du das Feld findest, das derzeit den Eingabefokus hat, wo also die Eingaben landen würden, wenn man die Tastatur benutzt?
Stread hat folgendes geschrieben : |
| 3.Problem: Kann man es einrichten dass man über einen Button oder die ENTER Taste zum nächsten Feld kommt? |
Dafür gibt es SetFocus. Die Entertaste kannst du in OnKeyPress abfangen (#13).
Stread - So 28.12.08 21:56
Ja sry ist so eine Angewohnheit von mir. Ich will erstmal sehen wie die unterschiedlichen Foren so sind bevor ich mich auf eins festlege.
jaenicke hat folgendes geschrieben : |
Dann wirst du das auch so programmiert haben. Wenn du die neue Zahl an den alten Inhalt anfügen willst, dann musst du den alten Inhalt auch wieder mit reinlegen. |
Wie mache ich das?
jaenicke hat folgendes geschrieben : |
Wie meinst du das? Du schreibst ja in deinem Code wo sie landet. Meinst du wie du das Feld findest, das derzeit den Eingabefokus hat, wo also die Eingaben landen würden, wenn man die Tastatur benutzt? |
Genau. Ich habe jetzt z.B. mit der Maus das 2. Edit Feld angeklickt. Wenn ich (im Moment) den Button für eine Zahl anklicke erscheint die Zahl nur immer in dem Feld wo ich es im Quelltext definiert habe. z.B. immer im 1. Feld.
jaenicke hat folgendes geschrieben : |
Dafür gibt es SetFocus. Die Entertaste kannst du in OnKeyPress abfangen (#13). |
Geht auch beides zusammen? Kannst du es mir bitte anhand eines Beispiel zeigen?
Danke Stread
Stread - Mo 29.12.08 20:34
OnEnter ist ja so ähnlich wie OnClick oder?
Wie weiß ich denn in welchem Feld ich bin und wie kann ich dann das Edit1 mit dem Edit2 oder Edit3 austauschen?
Delphi-Quelltext
1:
| Edit1.Text := Edit1.Text + '1'; |
Brauche ich dann noch ein OnExit?
jaenicke - Mo 29.12.08 20:37
OnEnter wird ausgelöst, wenn das entsprechende Feld den Eingabefokus erhalten hat. Wenn du auf den Button klickst, dann hat dieser den Eingabefokus und nicht mehr das Editfeld, und deshalb musst du das Editfeld speichern.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TFormX = class(TForm) ... private fCurrentEdit: TEdit; public end;
...
procedure EditXEnter(Sender: TObject); begin fCurrentEdit := TEdit(Sender); end; |
Dann kannst du fCurrentEdit benutzen.
// EDIT:
Und nicht vergessen, dass du das auch initialisierst ggf. ;-)
Stread - Mo 29.12.08 22:01
Warum fCurrentEdit? Geht auch nur CurrentEdit?
Warum muss ich es da
Delphi-Quelltext
1: 2: 3: 4: 5:
| private fCurrentEdit: TEdit; public end; |
und da
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure THauptfenster.Edit1Enter(Sender: TObject); var fCurrentEdit : TEdit; begin fCurrentEdit := TEdit(Sender); end; |
Nochmals angeben?
Stimmt das überhaupt mit dem var?
Quelltext
1:
| [DCC Hinweis] Rechner.pas(440): H2077 Auf 'fCurrentEdit' zugewiesener Wert wird niemals benutzt |
Wo muss ich das denn noch reintun? Da?
Delphi-Quelltext
1: 2: 3: 4:
| procedure THauptfenster.Button15Click(Sender: TObject); begin Edit1.Text := Edit1.Text + '1'; end; |
Statt dem Edi1.Text das fCurrentEdit ?
jaenicke - Mo 29.12.08 22:06
Stread hat folgendes geschrieben : |
| Warum fCurrentEdit? Geht auch nur CurrentEdit? |
Ja, natürlich, aber normalerweise stellt man bei privaten Feldern ein f vor um das zu kennzeichnen. So kann man auch nur ein f eingeben und hat dann (ggf. mit Strg + Leertaste) eine Liste aller privaten Felder.
Stread hat folgendes geschrieben : |
Warum muss ich es da [...] und da Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure THauptfenster.Edit1Enter(Sender: TObject); var fCurrentEdit : TEdit; begin fCurrentEdit := TEdit(Sender); end; |
Nochmals angeben? |
Letzteres (das hervorgehobene) habe ich nie geschrieben. :roll:
So geht der Wert natürlich nach dem Ende von OnEnter verloren, da die lokale Variable benutzt wird statt dem gleichnamigen Feld unter private, deshalb auch der Hinweis des Compilers...
Stread hat folgendes geschrieben : |
| Statt dem Edi1.Text das fCurrentEdit ? |
Ja, stattdessen
fCurrentEdit.Text.
Das Edit1Enter musst du unter Ereignisse bei OnEnter allen drei Edits zuweisen.
Stread - Mo 29.12.08 22:27
Für den Button 1
Delphi-Quelltext
1: 2: 3: 4:
| procedure THauptfenster.Button15Click(Sender: TObject); begin fCurrentEdit.Text := fCurrentEdit.Text + '1'; end; |
und es funktioniert.
Delphi-Quelltext
1: 2: 3:
| begin fCurrentEdit := TEdit(Sender); end; |
Das fCurrentEdit was in dem private Teil deklariert wurde wird als das Edit festgelegt wo der Sender, der Cursour ist.
Stimmt das?
jaenicke - Mo 29.12.08 22:29
Richtig, und dadurch, dass Sender verwendet wird, musst du das nicht für jedes Edit einzeln schreiben. Denn Sender enthält das Edit, das das Event ausgelöst hat.
Stread - Mo 29.12.08 23:15
Ich schreib mein neues Problem einfach hier rein. Passt ja zum Thema.
Ich möchte nun noch einen +/- (Vorzeichenwechsel Button) einbauen. Bis jetzt habe ich
Delphi-Quelltext
1: 2:
| begin fCurrentEdit.Text := '-' + fCurrentEdit.Text; |
Wie stelle ich das nun an dass wenn ich nochmal auf den Button klicke dass nun das - wieder verschwindet?
Die Zahl also wieder positiv ist, wie sie am Anfang war.
Auf müsste das Feld auf ein Minuszeichen hin suchen und dieses dann löschen.
Wie macht man das?
jaenicke - Mo 29.12.08 23:24
Delphi-Quelltext
1: 2:
| if (Length(fCurrentEdit.Text) > 0) and (fCurrentEdit.Text[1] = '-') then Delete(fCurrentEdit.Text, 1, 1); |
Oder du kannst es gleich als Zahl behandeln und beide Richtungen direkt machen, wenn eine Zahl drin steht:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var zahl: Double; begin if TryStrToFloat(fCurrentEdit.Text, zahl) then fCurrentEdit.Text := -1 * FloatToStr(zahl); |
Stread - Di 30.12.08 00:01
Bei deinem ersten Code kommt der Fehler
Quelltext
1:
| [DCC Fehler] Rechner.pas(159): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden |
Bei deinem zweiten Code kommt der Fehler.
Quelltext
1:
| [DCC Fehler] Rechner.pas(161): E2010 Inkompatible Typen: 'string' und 'Integer' |
jaenicke - Di 30.12.08 00:07
Ja, stimmt. fCurrentEdit.Text kann ja nicht direkt editiert werden.
Delphi-Quelltext
1: 2:
| if (Length(fCurrentEdit.Text) > 0) and (fCurrentEdit.Text[1] = '-') then fCurrentEdit.Text := Copy(fCurrentEdit.Text, 2, Length(fCurrentEdit.Text) - 1); |
Oder:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var zahl: Double; begin if TryStrToFloat(fCurrentEdit.Text, zahl) then fCurrentEdit.Text := FloatToStr(-1 * zahl); |
Stread - Di 30.12.08 00:35
Beim ersten Code funktioniert gar nichts aber der ist eh ziemlich schwer zu verstehen weshalb ich den zweiten nehme :D
jaenicke - Di 30.12.08 00:36
Der erste Code entfernt nur ein vorhandenes Minus, der zweite kehrt es tatsächlich um. ;-)
Stread - Di 30.12.08 00:48
Dann brauche ich noch beim ersten Code etwas was das minus hinschreibt. Beim zweiten ist es ja eine normale Rechnung.
Wenn ich nun einen einzelne Zahl (die lezte) löschen möchte habe ich mir das gedacht
Delphi-Quelltext
1: 2: 3:
| begin fCurrentEdit.Text := fCurrentEdit.Text - ''; end; |
Aber das funktioniert nicht.
jaenicke - Di 30.12.08 00:51
In diesem Fall ist der zweite Code ja ganz gut.
Zum Löschen des letzten Zeichens schau dir mal den Befehl Copy an, den ich ja ebenfalls benutzt habe um im ersten Code das erste Zeichen wegzulassen und nur den Rest zu kopieren.
Stread - Mi 31.12.08 00:22
Ich habs jetzt so gemacht
Delphi-Quelltext
1: 2: 3: 4:
| begin if (Length(fCurrentEdit.Text) > 0) then fCurrentEdit.Text := Copy(fCurrentEdit.Text, 1, Length(fCurrentEdit.Text) - 1); end; |
Aber ich könnte es aich so machen
Delphi-Quelltext
1: 2: 3: 4:
| begin if (Length(fCurrentEdit.Text) > 0) then fCurrentEdit.Text := Copy(fCurrentEdit.Text, -8, Length(fCurrentEdit.Text) - 1); end; |
Dass verstehe ich gerade nicht so. Der Code heißt doch: Wenn die Länge des momentanen Edits größer als 0 ist dann ist das momentane Edit ??? ... die Länge des momentanen Edits -1)
Was hat das 1 oder -8 damit zu tun? Wirrd damit bestimmt wo das -1 abgezogen wird?
jaenicke - Mi 31.12.08 00:27
Copy kopiert von dem angegebenen String ab der angegebenen Position die angegebene Anzahl an Zeichen.
Copy('Test', 2, 1) ergibt 'e', denn es wird ab Position 2 genau 1 Zeichen kopiert.
Wenn ich jetzt von Position 1 ab "Length(fCurrentEdit.Text) - 1" Zeichen kopiere, dann sind das alle bis auf das letzte. ;-)
Denn ich nehme ja die Anzahl der Zeichen insgesamt minus eins.
Und diese aus dem String kopierten Zeichen kommen dann wieder in das Editfeld hinein.
Stread - Mi 31.12.08 00:39
Length(fCurrentEdit.Text) Nimmt man deshalb weil die Länge des Strings haben möchte? Und ab -1 Zeichen ist dann ab dem ersten Zeichen oder?
jaenicke - Mi 31.12.08 00:44
Wenn der erste Parameter 1 ist, dann ist es ab dem ersten Zeichen.
Beispiel:
In fCurrentEdit.Text steht drin 'Beispiel' und ich benutze die Zeile von eben. Ich schreibe der Reihe nach was passiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| fCurrentEdit.Text := Copy(fCurrentEdit.Text, 1, Length(fCurrentEdit.Text) - 1); fCurrentEdit.Text := Copy('Beispiel', 1, Length(fCurrentEdit.Text) - 1); fCurrentEdit.Text := Copy('Beispiel', 1, Length('Beispiel') - 1); fCurrentEdit.Text := Copy('Beispiel', 1, 8 - 1); fCurrentEdit.Text := Copy('Beispiel', 1, 7); fCurrentEdit.Text := 'Beispie'; |
Ab dem ersten Zeichen 1 werden 7 Zeichen kopiert. Und das landet dann in fCurrentEdit.Text am Ende.
XUDO - Mi 31.12.08 14:38
Titel: Re: Zahl über Button in Edit Felder
Stread hat folgendes geschrieben : |
Nun habe ich aber (wie im Windowsrechner) die Zahlen als Button gemacht und möchte nun dass man die Edit Felder auch so füllen kann. |
Hallo Stread,
warum überhaupt noch Eingabefelder, wenn per Buttons die Ziffern/Zahlen bestimmt werden / sind?
Anbei ein rudimentärer Vorschlag, der nur das Prinzip darstellen soll, allerdings mit ganzen Zahlen bereits umgehen kann, daher auch nur "DIV"
anstelle von "/".
XUDO
Stread - Mi 31.12.08 15:07
Warum? Weil ich viel Ausprobieren wollte :D
Deshalb ist mein Rechner auch schon schön gewachsen.
jaenicke - Mi 31.12.08 15:27
Verbesserungsvorschläge:
Fang andere Tastendrücke als Zahlen in OnKeyPress ab. ;-)
Gleichzeitig könntest du dann bei einem Operator statt einer Fehlermeldung ins zweite Feld wechseln, wenn man im ersten Feld ist und den auf der Tastatur oder per ButtonClick eingibt. Denn das wäre ja eigentlich der normale Ablauf beim Rechnen, und da du mehrere Felder benutzen möchtest, wäre das vielleicht die sinnvollste Lösung.
Stread - Mi 31.12.08 15:54
Meinst du das Feld was erst angezeigt wird wenn man eine Quadratische Gleichung mit 2 Lösungen hat?
Das mit dem OnKeyPress schau ich mir noch an.
jaenicke - Mi 31.12.08 15:58
Stread hat folgendes geschrieben : |
| Meinst du das Feld was erst angezeigt wird wenn man eine Quadratische Gleichung mit 2 Lösungen hat? |
Nein, ich meine das zweite Feld der Rechnung. Normalerweise drücke ich bei einem taschenrechner nacheinander die Tasten für Zahl 1, dann den Operator, dann die Tasten für Zahl 2. Egal ob bei einem Taschenrechner im PC oder einem normalen.
Zum Beispiel beim Windowstaschenrechner ist das ja auch so.
Stread - Mi 31.12.08 16:04
Dann müsste ich ja soviel umschreiben :(
Ich habe jetzt ein neues Projekt angefangen mache ich lieber das :D
jaenicke - Mi 31.12.08 20:02
Stread hat folgendes geschrieben : |
| Dann müsste ich ja soviel umschreiben :( |
Eigentlich nur ergänzen. ;-)
Ich meinte ja nicht, dass es nur ein Eingabefeld sein soll, sondern, dass du einfach zum zweiten Feld springst, wenn dort die Eingabe fehlt (mit SetFocus und statt der Fehlermeldung). ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!