Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit Variablentypen und deren Nutzung bei "case of"
Xodem - Fr 12.06.09 19:40
Titel: Problem mit Variablentypen und deren Nutzung bei "case of"
Ich hab ein Problem mit einem Projekt. Ich möchte einen ganz ganz simplen taschenrechner erstellen. Der Benutzer soll in 3 Felder etwas eintippen: in das Erste die erste Zahl, dann in das nächste das Rechenzeichen und in das Letzte die 2. Zahl. Mein Problem ist jetzt das ich mit den Variablen Typen anscheinend kommplett durcheinander komme.
Aber hier erst mal der Quellcode:
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:
| procedure TForm1.Button1Click(Sender: TObject); var zahl1, zahl2, ergebnis: Extended; var verk: String[1];
begin zahl1 := StrToFloat(Edit1.Text); zahl2 := StrToFloat(Edit2.Text);
verk := Edit3.Text;
case verk of '+' : ergebnis := zahl1+zahl2; '*' : ergebnis := zahl1*zahl2; '/' : ergebnis := zahl1/zahl2; '-' : ergebnis := zahl1-zahl2; else Label4.Caption := 'Achtung keine Gültige Verknüpfung eingegeben';
end;
Label4.Caption := FloatToStr(ergebnis); end;
end. |
Ich bin wirklich anfänger was delphi angeht, dessweegn hab ich auch keine Ahnung ob hier das Thema angebracht ist.
Ich behersche aber schon Javascript so wie teilweise c++ und java.
Mir sind also Begriffe wie Funktionen usw geläufig.
Ich würde mich sehr freuen, wenn mir jemand sagen kann warum mein compiller immer sagt ungültige übertrageung von Extend zu String und Integer zu Char.
Moderiert von
Gausi: Highlight- durch Delphi-Tags ersetzt
Moderiert von
Gausi: Topic aus VCL (Visual Component Library) verschoben am Fr 12.06.2009 um 19:57
Sinspin - Fr 12.06.09 19:53
Hi und :welcome: in der EE!
Schreib mal bitte in welcher Zeile die Fehlermeldung kommt. Ich kann nämlich keinen Fehler finden, es sei denn ich bin Blind ;-)
Gausi - Fr 12.06.09 19:56
Hallo und :welcome: in der Entwickler-Ecke,
Erstmal: Bitte ändere den Titel, denn "Anfängerfrage" hilft nicht wirklich, den Inhalt der Frage etwas einzugrenzen.
Zum Problem: Case mit Strings geht nicht, auch wenn es ein String[1] ist. Das muss dann schon ein Char sein - Delphi ist bei sowas recht pingelig. ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| verk: Char;
begin if Edit3.Text <> '' then verk := Edit3.Text[1] else verk := 'o'; |
Xodem - Fr 12.06.09 20:05
ja danke erst mal für die schnellen antworten.
Also bei Turbo Delphi wird diese Zeile rot unterlegt:
Der rest bleibt unverändert.
Und hier noch mal die komplette fehlermeldung:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| [Pascal Fehler] Unit1.pas(46): E2001 Ordinaltyp erforderlich [Pascal Fehler] Unit1.pas(47): E2010 Inkompatible Typen: 'Integer' und 'Char' [Pascal Fehler] Unit1.pas(47): E2010 Inkompatible Typen: 'Extended' und 'string' [Pascal Fehler] Unit1.pas(48): E2010 Inkompatible Typen: 'Integer' und 'Char' [Pascal Fehler] Unit1.pas(48): E2010 Inkompatible Typen: 'Extended' und 'string' [Pascal Fehler] Unit1.pas(49): E2010 Inkompatible Typen: 'Integer' und 'Char' [Pascal Fehler] Unit1.pas(49): E2010 Inkompatible Typen: 'Extended' und 'string' [Pascal Fehler] Unit1.pas(50): E2010 Inkompatible Typen: 'Integer' und 'Char' [Pascal Fehler] Unit1.pas(50): E2010 Inkompatible Typen: 'Extended' und 'string' [Pascal Fataler Fehler] Project2.dpr(5): F2063 Verwendete Unit '..\Delphi\Rechner\Unit1.pas' kann nicht compiliert werden |
Gibs denn noch ne andere möglichkeit sowas zu realisieren, Taschenrechner jetzt mein ich ohne die Oberfläche zu verändern?
Oberfläche=anordnung von Buttons Labels etc.
Moderiert von
Gausi: Highlight- durch Code-Tags ersetzt
Moderiert von
Gausi: Beiträge zusammengefasst.
wenn ich den Typ von verk zu Char änder kommt die Fehlermedung hier:
Quelltext
1: 2:
| [Pascal Fehler] Unit1.pas(44): E2010 Inkompatible Typen: 'Char' und 'TCaption' [Pascal Fataler Fehler] Project2.dpr(5): F2063 Verwendete Unit '..\Delphi\Rechner\Unit1.pas' kann nicht compiliert werden |
jaenicke - Fr 12.06.09 23:54
Xodem hat folgendes geschrieben : |
wenn ich den Typ von verk zu Char änder kommt die Fehlermedung hier:
Quelltext 1:
| [Pascal Fehler] Unit1.pas(44): E2010 Inkompatible Typen: 'Char' und 'TCaption' | |
Dann weist du irgendwo Edit1.Text als ganzer String an verk zu, das musst du machen wie
Gausi dir geschrieben hatte. ;-)
(Nämlich nur den ersten Buchstaben nehmen falls der existiert.)
Xodem - Sa 13.06.09 15:20
Danke ich habs jetztsoweit hinbekommen.
Kann man das eiendlich auch alles in ein Edit schreiebn lassen, sodass z.B.: Edit1.Text:='22+8' ist und das das Programm, dann 30 ausgibt, je nach rechenzeichen?
Bei javascript gabs dafür die function char(), baer bei delphi hab ich keine Ahnung.
Geht das?
jaenicke - Sa 13.06.09 15:49
Delphi ist keine interpretierte Sprache, dementsprechend musst du das selbst parsen.
Wenn du hier nach Parser suchst, solltest du sehr viel finden, die Frage kommt ständig immer wieder.
Christian S. - Sa 13.06.09 16:21
Xodem,
bitte komme Gausis Aufforderung nach, einen anständigen Titel zu wählen :mahn:
Christian
Xodem - So 14.06.09 13:38
äähhhm wie änrt man das denn?
Popov - So 14.06.09 14:14
Xodem hat folgendes geschrieben : |
Danke ich habs jetztsoweit hinbekommen.
Kann man das eiendlich auch alles in ein Edit schreiebn lassen, sodass z.B.: Edit1.Text:='22+8' ist und das das Programm, dann 30 ausgibt, je nach rechenzeichen?
Bei javascript gabs dafür die function char(), baer bei delphi hab ich keine Ahnung.
Geht das? |
Ja. Hier nur um das Prinzip zu zeigen.
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:
| procedure TForm1.Button1Click(Sender: TObject); var i, p: Integer; s, sz1, sop, sz2: String; r, rz1, rz2: Double; begin s := Edit1.Text;
for i := 1 to 4 do begin p := Pos(Copy('+-*/', i, 1), s); if p > 0 then begin sz1 := Copy(s, 1, p-1); sop := Copy(s, p, 1); sz2 := Copy(s, p+1, Length(s)); Break; end; end;
try rz1 := StrToFloat(sz1); rz2 := StrToFloat(sz2);
case sop[1] of '+': r := rz1 + rz2; '-': r := rz1 - rz2; '*': r := rz1 * rz2; '/': r := rz1 / rz2; end;
Label1.Caption := FloatToStr(r); except ShowMessage('Fehler'); end; end; |
Xodem - So 14.06.09 18:14
Danke für deine Bemühingen dein beispiel code hat mir viel gebracht, aber was genau bewirkt copy() inerhab der function pos().
Ich hab zwar bei google schon sachen darüber gefunden, aber meistends nur in irgendsoeinem fach chinesisch.
jaenicke - So 14.06.09 18:18
Xodem hat folgendes geschrieben : |
| Danke für deine Bemühingen dein beispiel code hat mir viel gebracht, aber was genau bewirkt copy() inerhab der function pos(). |
Damit wird der i-te Buchstabe, also der i-te Operator benutzt. Es wird ja das Zeichen 1, 2, 3 und am Ende 4 kopiert, das sind die 4 Operatoren der Reihe nach.
Ich würde ein konstantes Array bevorzugen, aber so gehts notfalls eben auch.
Xodem - So 14.06.09 18:53
ok danke
Popov - So 14.06.09 22:50
jaenicke hat folgendes geschrieben : |
| Ich würde ein konstantes Array bevorzugen, aber so gehts notfalls eben auch. |
Jep, hab ich auch zuerst so gehabt, aber mit Copy sieht es schöner aus :D
Ne, Spaß beiseite. Vor allem bei Delphi Neulingen versuche ich nicht zu viele Funktionen in ein Beispiel zu packen, denn das Beispiel muß auch verstanden werden. Und Copy kommt paar mal vor. Ich dachte das wird eher verstanden als mit einer Konstantenvariable oder zB so:
Delphi-Quelltext
1:
| p := Pos('+-*/'[i], s); |
Das muß man auch erst verstehen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!