Autor |
Beitrag |
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 04.09.14 09:40
Hallo liebes Forum ,
ich bin hier neu und brauche eine kleine Hilfe für die ich als Neuling noch kein Rat finde.
Es geht wie im Titel genannt um if-Verknüpfungen. Genau genommen sind es 3.
Ausgangslage.
Ich habe ein Taschenrechner gebaut wie viele zu Beginn auch. Nur ich habe mir keinen genommen der schon existiert ich habe nen eigenen produziert. Alles Funktioniert wie es soll.
Aber als Anfänger habe ich natürlich alles einzeln berechnen lassen etc. . Nun kam mein Chef und will, dass ich alles verkürze. Nun hänge ich an dieser Stelle mit den if-verknüpfungen.
Es geht hierbei darum, dass ich sage ich will maximal 10 Zeichen haben, dann soll überprüft werden ob ein (,) vorhanden ist, wenn ja, darf es kein weiteren zulassen und wenn als erstes ein (,) oder eine (0) angegeben wird, soll (0,) stehen.
Die einzelne Befehle sehen so aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if (Length(Eingabefeld.Text) <=9) then Eingabefeld.Text := Eingabefeld.Text+Eingabe;
if (Eingabefeld.Text = ',') or (Eingabefeld.Text = '0') then Eingabefeld.Text := '0,'; if (pos(',', Eingabefeld.Text) = 0) then Eingabefeld.Text := Eingabefeld.Text+(','); |
Im alten Zustand wo ich alles noch einzeln habe geht der Code, aber nachdem ich die Befehle verkürzt habe, kriege ich diese 3 if-Verknüofungen nicht gebacken so laufen zu lassen wie ich Sie brauche.
Mein Chef meinte ich soll else nutzen, habe ich auch versuche, aber irgendwie klappt es nicht. Ich kriege nicht alles drei Sachen zum laufen. Trage ich diese so ein wie oben, dann gehen bei mir nur zwei Sachen, aber das (,) kommt so oft es will.
Wie kann ich es machen, dass es endlich geht und es funktioniert. Bitte um Hilfe :roll: Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 08.09.2014 um 16:27
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 04.09.14 10:25
Vorschlag meinerseits:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if Length(Eingabefeld.Text) = 10 then Eingabe := ''; if ((Eingabe = ',') and (pos(',', Eingabefeld.Text) > 0)) then Eingabe := ''; if ((Eingabefeld.Text = '') and ((Eingabe = '0') or (Eingabe = ','))) then Eingabe := '0,'; Eingabefeld.Text := Eingabefeld.Text+Eingabe; if Eingabe = '' then Beep; end; |
Für diesen Beitrag haben gedankt: GiuStyler
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 04.09.14 10:30
Hi.
Danke
Hat super geklappt. Problem ist damit gelöst.
Nun muss ich nachvollziehen wieso das so ist wie es ist, da ich selbst nicht draufgekommen bin.
PS: Problem ist erledigt, aber gibt es auch noch eine andere Möglichkeit mit den Verknüpfungen (else)?
Weil, mein Chef es mir ja so (angeordnet) hat. Bzw. gesagt hat, dass es so gehen soll/muss
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 04.09.14 10:37
Ein grober Fehler war das hier :
Delphi-Quelltext 1: 2:
| if (pos(',', Eingabefeld.Text) = 0) then Eingabefeld.Text := Eingabefeld.Text+(','); |
Ganz unabhängig vom eingegebenen Zeichen schaust du nach ob im Text bereits ein Komma ist, wenn nicht, klatscht du eins dran.
Sprich, steht im Text vorher nix drin und du tippst du ne "4", kam "4," raus.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 04.09.14 10:43
Ah ok. Ergibt im nachhinein Sinn, wenn man die Erklärung dazu hat.
Mein problem war auch gewesen, dass der Code wie oben geschrieben im anderen Fall wo noch alles einzeln eingetragen war auch funktionierte und ich nicht verstanden habe wieso es nun in der kürzeren weiße nicht ging.
Aber nun klingt es logisch.
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 04.09.14 10:45
Für diesen Beitrag haben gedankt: GiuStyler
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Do 04.09.14 10:52
Danke funktioniert auch.
Erstaublich das es mehr Wege gibt um das gleiche zu bekommen.
Ich gebe Dir recht, dass andere sieht übersichtlcher aus, aber mein Chef will es mit dem else haben. Ich mache das nun erst mal mit dem (else).
Es geht darum das ich Delphi lerne, weil wir im Betrieb dies nutzen.
Habe vorher nur seitenbezogen (HTML) und etwas (PHP) gemacht und auch damals mit PHP habe ich mich schwer gemacht und auch heute noch, dann kam ich hier und soll Delphi wusste bis vor meiner Ausbildung gar nicht das es Delphi gibt, aber ich finde Delphi sehr cool, vorallem, weil es sofort Rückmeldung gibt, wenn etwas verkehrt ist.
Um kurz etwas zu zeigen, vorher war es so, Grund ich habe zwei Seiten wo ich zwei Buttonbereiche habe. So hat der Code mit dem (,) problem funktioniert als ich es nun verkürzen sollte sieht es nun so aus (nach diesem Code schauen)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| if (Length(EditZahlA.Text) <=9) then if (Sender is TButton) then case (Sender as TButton).Tag of 0: EditZahlA.Text := EditZahlA.Text+IntToStr(0); 1: EditZahlA.Text := EditZahlA.Text+IntToStr(1); 2: EditZahlA.Text := EditZahlA.Text+IntToStr(2); 3: EditZahlA.Text := EditZahlA.Text+IntToStr(3); 4: EditZahlA.Text := EditZahlA.Text+IntToStr(4); 5: EditZahlA.Text := EditZahlA.Text+IntToStr(5); 6: EditZahlA.Text := EditZahlA.Text+IntToStr(6); 7: EditZahlA.Text := EditZahlA.Text+IntToStr(7); 8: EditZahlA.Text := EditZahlA.Text+IntToStr(8); 9: EditZahlA.Text := EditZahlA.Text+IntToStr(9); 21: if pos(',', EditZahlA.Text) = 0 then EditZahlA.Text := EditZahlA.Text+(','); end; if EditZahlA.Text = ',' then EditZahlA.Text := '0,';
if (Length(EditZahlB.Text) <=9) then if (Sender is TButton) then case (Sender as TButton).Tag of 10: EditZahlB.Text := EditZahlB.Text+IntToStr(0); 11: EditZahlB.Text := EditZahlB.Text+IntToStr(1); 12: EditZahlB.Text := EditZahlB.Text+IntToStr(2); 13: EditZahlB.Text := EditZahlB.Text+IntToStr(3); 14: EditZahlB.Text := EditZahlB.Text+IntToStr(4); 15: EditZahlB.Text := EditZahlB.Text+IntToStr(5); 16: EditZahlB.Text := EditZahlB.Text+IntToStr(6); 17: EditZahlB.Text := EditZahlB.Text+IntToStr(7); 18: EditZahlB.Text := EditZahlB.Text+IntToStr(8); 19: EditZahlB.Text := EditZahlB.Text+IntToStr(9); 22: if pos(',', EditZahlB.Text) = 0 then EditZahlB.Text := EditZahlB.Text+(','); end; if EditZahlB.Text = ',' then EditZahlB.Text := '0,'; end; |
Delphi-Quelltext 1: 2: 3: 4: 5:
| 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; |
Nun bliebt das problem mit dem was un erledigt ist. Dafür wurde eine eigene procedure erstellt. Mein Verständnisproblem war, dass eben der Code was scheinbar falsch ist mit dem alten muster klappte wieso auch immer.
Zuletzt bearbeitet von GiuStyler am Do 04.09.14 11:05, insgesamt 1-mal bearbeitet
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Do 04.09.14 11:01
Dass Programmcode als "Sprache" bezeichnet wird, finde ich sehr passend, denn man kann eine Aussage ganz verschieden formulieren, doch das Ergebnis ist immer das Gleiche.
Wichtig beim Programmieren ist es, zuerst in deiner Muttersprache klare Aussagen zu definieren. Diese dann in Programmcode umzusetzen, ist einfach. Deine Beschreibung "Es geht hierbei darum, dass ich sage ich will maximal 10 Zeichen haben, dann soll überprüft werden ob ein (,) vorhanden ist, wenn ja, darf es kein weiteren zulassen und wenn als erstes ein (,) oder eine (0) angegeben wird, soll (0,) stehen." war z.B. sehr gut.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Fr 05.09.14 07:56
Habe da noch eine Frage.
Mein Chef kam gerade und meinte ich könnte es auch so schreiben
Vorher von Dir
Delphi-Quelltext 1: 2: 3: 4: 5:
| if Length(Eingabefeld.Text) = 10 then else begin if((Eingabe = ',') and (pos(',',Eingabefeld.Text) >0)) then ... |
Nachher von meinem Chef
Delphi-Quelltext 1: 2: 3: 4:
| if Length(Eingabefeld.Text) <= 9 then begin if((Eingabe = ',') and (pos(',',Eingabefeld.Text) >0)) then ... |
und es geht auch. Nun will er das diese zwei Zeilen noch zusammengefasst werden.
Habe nun das versucht
Delphi-Quelltext 1: 2:
| begin if (Length(Eingabefeld.Text) <= 9) and ((Eingabe = ',') and (pos(',',Eingabefeld.Text) >0)) then |
aber dann geht nichts mehr. Wenn ich aus dem ersten and ein or mache, dann geht es zwar wieder, aber kann wieder massenweise (,) machen.
Wo ist mein Denkfehler beim zusammenfassen? Das das and nicht geht ist mir gerade auch logisch, da ja dann alles geschehen muss, damit es klappt.
MfG
mit dem zusammenfassen?
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Fr 05.09.14 08:22
Dein Chef möchte sicherlich, dass du dir das Verständnis der if-Abfragen so verinnerlichst, dass du es perfekt beherrscht. Er ist der Meinung, dass du das am Besten erreichst, in dem du dir das selbst erarbeitest und damit auch verstehst. Das entspricht auch meiner Meinung. Ich helfe immer wieder gerne, aber in deinem Fall tust du dir echt keinen Gefallen, hier Lösungen zu holen statt nachzudenken. Also bitte nicht böse sein, wenn du heute von mir keine vorgekauten Lösungen mehr bekommst.
Versuche wie in der Mathematik deine Vorgabe genau zu formulieren und setze diese dann in die Programmiersprache um. Viel Erfolg!
Grüßle
baumina
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 08.09.14 14:11
Hallo.
Da es sich ja noch um den gleichen Code handelt, der nun optimiert wurde bleibe ich bei diesem Thread statt einen neuen aufzumachen.
Es geht nun darum, dass ich vorher abfange das nur zahlen möglich sind, wenn ich die Eingaben über die Tastatur mache.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| 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; |
der Zweite Teil ist
Delphi-Quelltext 1: 2: 3: 4:
| procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char); begin Zeichenhinzu(TEdit(Sender), Key); end; |
Hier war vorher der Code drin, dass nur Zahlen und (,) erlaubte. Da ich nun das vereinfacht habe und auf den vorhanden Code oben zugreife, da es ja das gleiche macht was auch der untere tat.
Die Frage lautet nun, wie kriege ich noch in den obigen Code die Abfrage hin, dass nur Zahlen und (,) erlaubt sind.
Da steige ich noch nicht so ein. Die andere Variante hatte ich ja ohne Probleme, aber will das nun vereinfachen.
MfG
Edit:
Also, wenn ich unten das einfüge, dass es so aussieht, dann geht es
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char); begin Zeichenhinzu(TEdit(Sender), Key); end; |
nur oben kriege ich es nicht hin, und ich will es das es oben ist
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mo 08.09.14 14:42
Statt "Key in" solltest du lieber CharInSet verwenden. Der Compiler müsste aber diesbezüglich auch eine Warnung bringen.
Dann musst du in deiner Prozedur den Parameter "Eingabe" in "var Eingabe : String" ändern, damit du #0 auch zurückgeben kannst.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 08.09.14 14:58
Danke ich versuchs.
Die Eingabe ist ja schon string.
Der Code muss dann ins obere eingebaut werden. Das untere muss ja dann wieder weg also nur der Code für die Tasten.
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mo 08.09.14 15:03
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 08.09.14 15:21
Also mein Taschenrechner ist nicht Standard.
Ich begann erst mit
Zwei Editfelder (wo ich die einzelne Zahlen eingab über die Tastatur)
Ein Editfeld (wo das Ergebnis angezeigt wurde)
und die vier Buttons für die Operatoren
Das habe ich sofort hinbekommen ohne Probleme.
Danach dachte ich mir ok, dann kannst Du auch Buttons mit den einzelnen Zahlen machen.
Nun sieht es so aus, dass ich zwei mal die Buttons habe. Eine links und eine rechts.
Zu beginn hatte ich dann einen riesenlangen Quellcode. Einmal für die linke und einmal für die rechte Seite
Dann kam mein Chef und meinte man kann ja alles zusammenführen, wenn die gleichen Bedingungen für beide Seiten gelten. So Enstand dann das hier
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| 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; |
mit deiner Hilfe und ich habe es dann soweit optimiert. Nun war es aber so, dass diese procedure NUR mit den Buttons klappt.
In diesem Code war dann im groben das gleiche wie oben nur die Zahlen zulassen und das (,).
Dann kam mein Chef wieder uns meinte da ja bei beiden das gleiche passiert kann man es vereinfachen. So wurde aus dem langen Code für die Tastatureigenschaften, dieser Code. Nun greife ich auf das von oben. Alles klappt ja auch nur eben, dass jetzt die Begrenzung nur Zahlen und (,) fehlt.
Delphi-Quelltext 1: 2: 3: 4:
| procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char); begin Zeichenhinzu(TEdit(Sender), Key); end; |
nun habe ich unten den Code hinzugefügt und es funktioniert auch.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TFormTaschenrechner.EditZahlKeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9', Char(VK_BACK)]) then Key := #0; Zeichenhinzu(TEdit(Sender), Key); end; |
aber nun muss dass oben hinzugefügt werden in der procedure Zeichenhinzu. Als Tipp gab mein Chef mir (array of Char) aber weiter als array[0..9] of Char bin ich nicht, da ich das noch nicht verstehe.
Delphi-Quelltext 1: 2:
| if not (Key in ['0'..'9', Char(VK_BACK)]) then Key := #0; |
Hoffe Du hast die Geschichte nun verstanden. Am Ende kann ich den Taschenrechner hochladen, dann verstehst Du was ich genau wollte etc. Ist eben mein eigener Taschenrechner mit meinem Style. Am Ende habe ich mich selbst reingeritten. Wollte meinem Chef zeigen was ich schon gelernt habe usw. und am Ende habe ich mir die ganzen Steine im Weg gelegt als ich auf die Idee kam mit den Buttons, erst dann begannen die Probleme, da die (erste Version) mit den 3 Felden und 4 Buttons sofort klappte.
MfG
|
|
baumina
Beiträge: 305
Erhaltene Danke: 61
Win 7
Delphi 10.2 Tokyo Enterprise
|
Verfasst: Mo 08.09.14 15:39
Da meine Vorschläge irgendwie eh nicht gut bei deinem Chef ankommen, lass ichs lieber.
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mo 08.09.14 15:45
Na ja, wie sagt mein Chef immer
Es gibt gute Codes und Robuste Codes. Er will die Robusten, damit alle möglichen Einfälle die nicht sein sollen von vornherein bereinigt sind und es am Ende keine Probleme gibt.
mal schauen was dabei rauskommt.
array[0..9] of Char scheint richtig zu sein, aber irgendetwas fehlt noch. Mal schauen was.
|
|
Blup
Beiträge: 173
Erhaltene Danke: 43
|
Verfasst: Mo 08.09.14 16:29
Was willst du mit einem Array of Char hier erreichen?
Eigentlich sollte es reichen die einzelnen Bedingungen in richtiger Reihenfolge zu berücksichtigen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: Char); begin if Eingabe = Char(VK_BACK) then else if not (Eingabe in ['0'..'9', ',']) then Eingabe := #0 else if (Length(Eingabefeld.Text) >= 10) and (Eingabefeld.SelLength = 0) then Eingabe := #0 else if (Eingabe = ',') and (Pos(',', Eingabefeld.Text) > 0) then Eingabe := #0 else if (Eingabefeld.Text = '') and ((Eingabe = '0') or (Eingabe = ','))) then begin Eingabefeld.Text := '0,'; Eingabe := #0; end; end; |
|
|
GiuStyler
Beiträge: 65
Erhaltene Danke: 1
Win 8.1
Delphi XE6
|
Verfasst: Mi 10.09.14 08:02
Hi Blup,
Was ich mit dem array will, gute Frage. Hat mein Chef mir noch nicht verraten und wird es voraussichtlich bis Montag nicht mehr tun, da er außer Haus ist.
Es ging darum, dass
ich beim Zeichenhinzu die ereignisse für den Taschenrechner wenn ich die BUTTONS drücke einbeziehe.
Jetzt habe ich ja logischerweise auch noch eine Tastatur. Diese war in dem anderen Bereich KeyPress definiert. Mein Chef meinte zu mir dann, was dieser Bereich tut. Ich dann das gleiche/selbe wie das Zeichenhinzu, da es ja die gleichen befehle ausführen soll, darufhin mein Chef (also können wir alles in einem hinzufügen) als Tipp gab er mir dann array of Char.
Nun stehe ich hier und weiß nicht was er will. Und zur Klärung ist es noch nicht gekommen, da am Montag die Arbeitszeit zu Ende war und ich gestern meine Einschulung in der Berufschule hatte und er nun die restliche Woche wie oben erwähnt habe nicht da ist.
Ich nehme nun erstmal dein Tipp an. Mal schauen ob sich mein Chef damit zufrieden gibt.
Danke für die Hilfe.
|
|
|