Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit if-Verknüpfungen
GiuStyler - Do 04.09.14 09:40
Titel:  Probleme mit if-Verknüpfungen
Hallo liebes Forum  :D ,
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
Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 08.09.2014 um 16:27
 
baumina - 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;
 | 
        
      
 
GiuStyler - Do 04.09.14 10:30
Hi.
Danke  :D 
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 - 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 - 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 - Do 04.09.14 10:45
	  |  GiuStyler hat folgendes geschrieben  : | 
		  | 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
 | 
Natürlich kannst du den Code auch mit else-Zweigen machen. Das sähe dann evtl. so aus:
            
Delphi-Quelltext    
                                        | 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 
 |   if Length(Eingabefeld.Text) = 10 then
 begin
 beep; end else
 begin
 if ((Eingabe = ',') and (pos(',', Eingabefeld.Text) > 0)) then
 begin
 beep;
 end else
 begin
 if ((Eingabefeld.Text = '') and ((Eingabe = '0') or (Eingabe = ','))) then     begin
 Eingabefeld.Text := '0,';     end else
 begin
 Eingabefeld.Text := Eingabefeld.Text+Eingabe;
 end;
 end;
 end;
 | 
        
      
 
GiuStyler - 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)
            
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:
 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) thencase (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.
 
baumina - 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 - 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 thenelse
 begin
 if((Eingabe = ',') and (pos(',',Eingabefeld.Text) >0)) then
 ...
 | 
        
      
Nachher von meinem Chef
            
Delphi-Quelltext    
                                        | 1:2:
 3:
 4:
 
 | if Length(Eingabefeld.Text) <= 9 thenbegin
 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:
 
 | beginif (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 - 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 - 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 - 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 - 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 - Mo 08.09.14 15:03
Ich mein statt
            
Delphi-Quelltext    
                                        | 1:
 | procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; Eingabe: string);                     | 
        
      
            
Delphi-Quelltext    
                                        | 1:
 | procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: string);                     | 
        
      
bzw. noch besser
            
Delphi-Quelltext    
                                        | 1:
 | procedure TFormTaschenrechner.Zeichenhinzu(Eingabefeld: TEdit; var Eingabe: Char);                     | 
        
      
Aber spätestens jetzt frag ich mich warum eine extra procedure?
 
GiuStyler - 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)]) thenKey := #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 - Mo 08.09.14 15:39
Da meine Vorschläge irgendwie eh nicht gut bei deinem Chef ankommen, lass ichs lieber.  :roll:
GiuStyler - 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 - 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 - 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.
Entwickler-Ecke.de  based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!