| 
| Autor | Beitrag |  
| GiuStyler 
          Beiträge: 65
 Erhaltene Danke: 1
 
 Win 8.1
 Delphi XE6
 
 | 
Verfasst: Mo 22.09.14 13: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Mo 22.09.14 13: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 13: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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Mo 22.09.14 13: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 13: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); beginif (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: 6395
 Erhaltene Danke: 149
 
 Windows 7 + Windows 10
 Sydney Prof + CE
 
 | 
Verfasst: Mo 22.09.14 13: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 14: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 15: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); varSpeicher: 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 15: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 09: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 14: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 15: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 15: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 15:58 
 
Versuch macht klug   |  |  |  |