Autor |
Beitrag |
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 22.09.14 14:05
Hallo Leute,
wie im anderen Thread bereits besprochen (da ging es aber Hauptsächlich um die if-Verknüpfungen), habe ich immer noch einen Problem mit meinem Taschenrechner.
Ich habe nun fast zwei Wochen schon Versucht den Fehler bzw. den Code hinzubekommen, damit die Tasten der Tastatur das machen, was Sie machen sollen.
Habe nun die Datei inkl. exe mal eingefügt, damit man sehen kann wo das Problem liegt, wenn man es mit der Tastatur bedient.
im Endeffekt geht es nur darum, wie kriege ich es hin, dass das (,) nur einmal kommt, wenn es nicht vorhanden ist und wenn es vorhanden ist nicht mehr möglich ist dieses zu benutzen.
Mein Taschenrechner ist etwas unkonventionell. Bitte dies mal aussen vor lassen, da mein Taschenrechner zuerst nur aus dem oberen Teil bestand und dann noch die Buttons hinzukamen. Diese Funktionieren aber alle Einwadnfrei.
Es geht Hauptsächlich um diesen Codeabschnitt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; Eingabe: string); begin if Length(Eingabefeld.Text) <= 9 then begin if (Eingabe = ',') then if (pos (',',Eingabefeld.Text) > 0) then Eingabe := ''; if ((Eingabefeld.Text = '') and ((Eingabe = '0') or (Eingabe = ','))) then Eingabefeld.Text := '0,' else Eingabefeld.Text := Eingabefeld.Text+Eingabe; end; end;
procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char); begin Zeichenhinzu(TEdit(Sender), Key); end;
|
Der Code den man sieht ist das für die Buttons, aber dort muss nun auch der Code für die Tastatur hin, nur das kriege ich nicht wirklich so hin, dass es klappt. Kann mir da jemand sagen wie es sein soll. Den langsam raucht mein Kopf zuviel.
Wichtig ist, dass es entweder mit array of string oder array of Char gemacht wird, aber habe keine Idee wie.
PS: Blub, dein Vorschlag hat irgendwie nicht bei mir funktioniert oder ich habe sachen vergessen zu verändern.
PS²: Eigentlich wollte ich lange schon meinen Chef fragen, aber der ist immer noch auf Geschäftsreise da sich der Aufenthalt verlängert hat.
Mit freundlichen Grüßen
Einloggen, um Attachments anzusehen!
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 22.09.14 14:31
Ändere mal diese Zeile:
Delphi-Quelltext 1:
| procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; Eingabe: string); |
in
Delphi-Quelltext 1:
| procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: string); |
In deinem Source setzt du zwar den Parameter "Eingabe" auf Leerstring (""), aber da es kein Var-Parameter ist, wird dieser Wert nicht an die KeyPress-Methode zurück gegeben. Dadurch wird dann trotzdem das Komma gesetzt.
Das müsste meiner Meinung nach das Problem beheben. Habe aber gerade kein Delphi zur Verfügung, um das zu prüfen.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 22.09.14 14:35
Hallo jasocul,
wenn ich das oben ändere, dann tauchen nach und nach überall im Code Fehler auf, denke nicht das es so sein sollte.
Mit freundlichen Grüßen
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 22.09.14 14:38
Hallo GiuStyler,
hast du die Methode auch in deiner Klasse angepasst? Die Klassendeklaration muss natürlich damit übereinstimmen.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 22.09.14 14:41
Ich habe es im (type) geändert, dann in der (procedure), wenn ich dann starte taucht im case Bereich der Buttons ein Fehler auf
[dcc32 Fehler] aHaupt.pas(208): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
in diesem Bereich
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TFormTaschenrechner.ButtonZahlClick(Sender: TObject); begin if (Sender is TButton) then case (Sender as TButton).Tag of 0,1,2,3,4,5,6,7,8,9,21 : Zeichenhinzu(EditZahlA, TButton(Sender).Caption); 10,11,12,13,14,15,16,17,18,19,22 : Zeichenhinzu(EditZahlB, TButton(Sender).Caption); end; end; |
ob weitere Fehler auftauchen weis ich nicht.
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 22.09.14 14:56
OK, das liegt daran, dass die Parameter unterschiedliche Typen sind.
Ich würde es so lösen, dass ich zwei Methoden verwende. Die können sogar den selben Namen haben, da sie sich in den Parametern unterscheiden würden. Aber wenn du von "overload" noch nichts gehört hast, nimm 2 unterschiedliche Namen.
Due brauchst eine Methode, die als Var-Parameter einen Char übergeben bekommt. Also genauso, wie bei KeyPress. Du hast dort einen String. Das geht mit einem Var-Parameter nicht. Da müssen die Typen gleich sein. Es gibt auch noch andere Möglichkeiten, aber das würde an dieser Stelle zu weit führen.
Deine bisherige Methode kannst du so lassen.
Wichtig ist, dass die beiden Methoden im richtigen Kontext einsetzt. Beim KeyPress muss es diejenige mit dem Char sein. Die andere Methode sollte an den anderen Stellen benutzt werden, wo du keinen Rückgabe-Werte verarbeiten musst.
Ohne Delphi kann ich dir jetzt nicht mehr viel weiter helfen, aber ich hoffe, dass ich dich damit in die richtige Richtung stoßen konnte.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 22.09.14 15:42
Jain, ich bin noch relativ neu mit Delphi.
Was meinst Du mit Methode?
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mo 22.09.14 16:37
Eine Methode ist eine Prozedur oder Funktion, die zu einer Klasse gehört. Wenn Du Deine Methode nun so deklariert hast:
Delphi-Quelltext 1:
| procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: string); |
kannst Du keine Eigenschaft wie TButton.Caption direkt übergeben, sondern brauchst dafür eine Zwischenvariable.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TFormTaschenrechner.ButtonZahlClick(Sender: TObject); var Speicher: string; begin if (Sender is TButton) then begin Speicher := TButton(Sender).Caption; case (Sender as TButton).Tag of 0,1,2,3,4,5,6,7,8,9,21: begin Zeichenhinzu(EditZahlA, Speicher); TButton(Sender).Caption := Speicher; end; 10,11,12,13,14,15,16,17,18,19,22: begin Zeichenhinzu(EditZahlB, Speicher); TButton(Sender).Caption := Speicher; end; end; end; end; |
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 22.09.14 16:48
Ah ok. Verstehe,
aber Leider behebt das nicht mein Problem was ich habe mit der Tastatur. Das komma wird immer noch unzählige male gemacht.
Edit: 23.09
Evtl. hat man mich Falsch verstanden. Ich brauche das gleiche wie im Zeichenhinzu nur eben bezogen auf die Tastatur und das muss wiederum in dem Zeichenhinzu intigriert werden. Kann mir da jemand helfen?
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Di 23.09.14 10:32
Nach langem probieren, habe ich es endlich geschafft das, dass (,) auch über die Tastatur nur einmal erscheint und zwar so
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char); begin if Key = '.' then Key := ','; if Key = ',' then if (pos(',', (Sender as TEdit).Text) > 0) then Key := #0; if not (Key in [#8, '0'..'9', ',']) then Key := #0; end; |
Ich weiß zwar nun nicht ob die Reihenfolge richtig ist, aber es funktioniert. Meine Frage nun wie kriege ich es den hin, wenn das Feld leer ist und man zuerst ein (,) oder eine (0) drückt, dass automatisch (0,) erscheint?
Kann mir da jemand helfen, bevor ich wieder ne Weile dran sitze?
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 24.09.14 15:42
Hm. Kann mir keiner ein Rat geben oder helfen? Es fehlt mir nur noch das eine.
MfG
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mi 24.09.14 16:21
Schreib doch einen Ereignishandler für OnChange des Edits. Wenn da nur ',' oder '0' drinsteht, änderst Du den Text eben.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 24.09.14 16:43
Das Problem ist ja, dass ja nicht vorher schon (0) oder (,) steht. Erst mit dem drücken der Taste auf der Tastatur soll ja (0,) erscheinen. Kann ich es dann trotzdem machen mit dem OnChange.
Wir schon mal erwähnt ich arbeite erst seit knapp 1,5 Monate mit Delphi.
MfG
|
|
WasWeißDennIch
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mi 24.09.14 16:58
Versuch macht klug
|
|
|