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 user profile iconGausi: Highlight- durch Delphi-Tags ersetzt
Moderiert von user profile iconGausi: 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
//...
  // Sicherheitabfrage. Wenn Edit3 leer ist, knallt es sonst.
  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:

Quelltext
1:
case verk of                    

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 user profile iconGausi: Highlight- durch Code-Tags ersetzt
Moderiert von user profile iconGausi: 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

user profile iconXodem hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconGausi 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?


Christian S. - So 14.06.09 13:40

Hier [http://www.delphi-forum.de/help_schreiben_bearbeiten.html&sub=,19,27] gibt's die Erklärung dazu :-)


Popov - So 14.06.09 14:14

user profile iconXodem hat folgendes geschrieben Zum zitierten Posting springen:
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; // Verläßt die For-Schleife
    end;
  end;

  try
    rz1 := StrToFloat(sz1);
    rz2 := StrToFloat(sz2);

    case sop[1of
    '+': 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

user profile iconXodem hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.