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:
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:


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?

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

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


jaenicke - So 28.12.08 22:16

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
Ja sry ist so eine Angewohnheit von mir. Ich will erstmal sehen wie die unterschiedlichen Foren so sind bevor ich mich auf eins festlege.
Das an sich ist nicht so sehr das Problem, aber du solltest einen entsprechenden Link angeben. Damit man im anderen Forum nachschauen kann, ob schon eine Lösung gepostet wurde, bevor man selbst etwas schreibt.

Hier wird ein Beitrag deshalb nicht sofort geschlossen, wenn jemand einen Crosspost nicht angibt (anders als im Delphi-Treff wie du sicherlich bemerkt hast...), aber gerne wird es natürlich auch hier nicht gesehen...

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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?

Delphi-Quelltext
1:
xy.Text := xy.Text + 'Neuer Inhalt';                    


user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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.
Du könntest in OnEnter der Eingabefelder das aktuelle in einer globalen Variable speichern und dann dieses benutzen.

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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?
Vielleicht hilft dir das:
http://www.delphi-forum.de/viewtopic.php?t=10555

Und noch ein Hinweis: Mehrere Fragen in einem Thema sind nicht besonders übersichtlich. Du solltest wenn möglich jeweils die Fragen einzeln stellen. Die dritte Frage passt thematisch nicht mehr zur ersten und auch nicht zum Titel. ;-)
Dass das sonst etwas unübersichtlich wird siehst du ja. ;-)


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;

...

// Dies muss als OnEnter Ereignisbehandlung in alle drei Edits
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
    { Public-Deklarationen }
  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

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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...

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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) > 0and (fCurrentEdit.Text[1] = '-'then
  Delete(fCurrentEdit.Text, 11);
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) > 0and (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) > 0then
    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) > 0then
    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'18 - 1);
fCurrentEdit.Text := Copy('Beispiel'17);
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
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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). ;-)