Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Inkompatible Typen: "Char" und "Integer"


Linus - Di 07.01.03 22:07
Titel: Inkompatible Typen: "Char" und "Integer"
sorri ich nerve mal wieder...:-(


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var vokale: set of char;
    x, kette: string;
    i: Integer;
begin
vokale:=['a','e','i','o','u'];
Edit2.Text:=x;

kette:=Edit1.Text;
for i:=1 to length(kette) do
if kette[i] in vokale then kette[i]:=StrToInt(x);
Edit1.Text:=kette;

end;



if kette[i] in vokale then kette[i]:=StrToInt(x);

Fehlermeldung in dieser Zeile: Inkompatible Typen: "Char" und "Integer"


Kann mir nochmal jemand helfen? :-)
Danke sehr :-)


Klabautermann - Di 07.01.03 22:14

Hallo,

Kette[i] ist ein einzelner Char. Da ist also Platz für einen Buchstaben oder eine Ziffer (welche als Buchstabe dargestellt wird). EIn Integer ist heutzutage 32 Bit größ benötigt also den Platz von 4 Cahrs und einen Solchen erzeugst du mit StrToInt(x). Das geht also alleine wegen des benötigten Speichers nicht außerdem wüsste Delphi auch nicht in welcher Form er die Zahl in den String einfügen soll. Denn auch da gibt es mehrere Möglichkeiten.

Was genau willst du denn machen?
Beschreibe bitte dein Problem, dann finden wir auch eine Lösung ;).

Gruß
Klabautermann


Raphael O. - Di 07.01.03 22:18

als erstes ist x nicht initialisiert, wozu willst du das dann übergeben???
2. weiß ich nicht warum du strtoint(x)sagst denn kette erwartet einen char und x ist ein string...

Fiji-Fighter


Anonymous - Di 07.01.03 22:20

Was ist x, was ist kette? Beides sind String. kette[i] ist aber ein Char.


Linus - Di 07.01.03 22:21

hmpf :-(

okai....also....ich möchte, dass mein wort (string?) eingelesen wird

Quelltext
1:
kette:=Edit1.Text;                    

jeder der buchstaben meines wortes überprüft wird, ob er ein vokal ist

Quelltext
1:
2:
for i:=1 to length(kette) do
  if kette[i] in vokale then kette[i]:=StrToInt(x);

und wenn ja soll er ausgetauscht werden durch einen anderen buchstaben (anderen vokal), den man vorher eingibt (Edit2.Text:=x; )....

und das mein verändertes wort dann wieder ausgegebn wird....

Quelltext
1:
Edit1.Text:=kette;                    

hab ich total falsch gedacht? :-(

(08.01. 09:25 Tino) Code-Tags hinzugefügt.


Anonymous - Di 07.01.03 22:22

Popov hat folgendes geschrieben:
Was ist x, was ist kette? Beides sind String. kette[i] ist aber ein Char.


Ich sollte in Zukunft meine Anhtworten sofort abzuschicken und nicht vorher pinkeln gehen.


Raphael O. - Di 07.01.03 22:27

Linus hat folgendes geschrieben:
und wenn ja soll er ausgetauscht werden durch einen anderen buchstaben (anderen vokal), den man vorher eingibt (Edit2.Text:=x; )....


Du meinst wohlx:=edit2.textoder??

Fiji-Fighter


Linus - Di 07.01.03 22:29

ja stimmt wohl...

Quelltext
1:
x:=Edit2.Text;                    


hmh.....
was ist dnen jetzt hier falsch? :-(

muss x integer sein?
dann gibts aber immer noch inkompatible typen....


Anonymous - Di 07.01.03 22:32


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  vokale: set of char;
  x: Char;
  kette: string;
  i: Integer;
begin
  vokale:=['a','e','i','o','u'];
  if Length(Edit2.Text) < 1 then Exit else x:=Edit2.Text[1];

  kette:=Edit1.Text;
  for i:=1 to length(kette) do if kette[i] in vokale then kette[i]:=x;
  Edit1.Text:=kette;
end;


Raphael O. - Di 07.01.03 22:37

also...
mach das mal so:for i:=1 to length(kette) do if kette[i] in vokale then kette[i]:=x[1];

dann sollte es klappen, weil nur der erste buchstabe von x übergeben wird... 8)

das brauchst du aber nur wenn du nicht popov's methode nimmst in der x ein char ist ;)


@ popov: warum nicht so??

Quelltext
1:
 if not (Edit2.Text='') then x:=Edit2.Text[1];                    


Fiji-Fighter


Linus - Di 07.01.03 22:52

Danke danke danke :-)

Beides funktioniert (natürlich *ggg*)

Mein Quelltext sieht jetzt aus wie folgt...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var vokale: set of char;
    x, kette: string;
    i: Integer;
begin
vokale:=['a','e','i','o','u'];
x:=Edit2.Text;

kette:=Edit1.Text;
for i:=1 to length(kette) do
if kette[i] in vokale then kette[i]:=x[1];
Edit1.Text:=kette;

end;


also noch zwei fragen....

1.) Bei mir hat das jetzt nicht geklappt weil ich x als string deklariert hatte und ein string nie nur aus einem zeichen/buchstaben besteht?! sondern eine zeichenkette *g* (supi) ist?!

2.) Wie kann ich denn jetzt noch ausschließen, dass konsonanten eingegeben werden können. ich will also das x nur ein vokal sein kann....


Quelltext
1:
if not x[1] in vokale then exit;                    


wieso geht sowas denn nicht?? :-(
(Operator ist auf diesen Operandentyp nicht anwendbar)
Operator & Operandentyp? *bahnhof*


Linus - Di 07.01.03 23:00

und noch eine kleine frage :roll:

wie kann man denn ein Memo Feld (*noch nie benutzt habe*) in den Quelltext einbauen?

Also bei einem Editfeld muss man ja Edit1.Text
...bei einem Panel Panel1.Caption

und bei einem Memo Feld? :-)


Anonymous - Di 07.01.03 23:14

Fiji-Fighter hat folgendes geschrieben:
@ popov: warum nicht so??

Quelltext
1:
 if not (Edit2.Text='') then x:=Edit2.Text[1];                    


Ganz einfach:

1) zum Teil ist es das gleiche, nur in grün.
2) wenn Edit2 leer ist, dann fliegt ihm die ganze Sache um die Ohren.

x bleibt dann leer (es bricht mit einer Fehlermeldung ab) oder hat einen falschen Wert (das Ergebnis ist falsch). Und schon funktioniert der ganze Code nicht.

Der Code von Linus funktioniert jetzt solange, solange er keinen Fehler bei der Eingabe macht.


Raphael O. - Mi 08.01.03 09:13

hast schon recht...
dann halt so:

Quelltext
1:
2:
Code: 
if not (Edit2.Text='') then x:=Edit2.Text[1] else exit;


ist kürzer als dein Quelltext und daher zu bevorzugen :wink:

Fiji-Fighter


Anonymous - Mi 08.01.03 10:32

Willst du jetzt solange meine Codes verbessern bis du mal einen Glückstreffer landest ;)


Klabautermann - Mi 08.01.03 11:35

Hallo,
Linus hat folgendes geschrieben:
1.) Bei mir hat das jetzt nicht geklappt weil ich x als string deklariert hatte und ein string nie nur aus einem zeichen/buchstaben besteht?! sondern eine zeichenkette *g* (supi) ist?!

Das hast du richtig verstanden. Bei zuweisungen musst du immer drauf achten, das die Typen auch kompatibel sind.

Linus hat folgendes geschrieben:
2.) Wie kann ich denn jetzt noch ausschließen, dass konsonanten eingegeben werden können. ich will also das x nur ein vokal sein kann....

1. Bitte eröffne für neue Fragen auch ein neues Posting.
2. Diese Frage wurde hier schon oft beantwortet. Das Prinzib kannst du hier [http://www.auq.de/viewtopic.php?t=5471&highlight=edit+eingabe] sehen.

Linus hat folgendes geschrieben:

Quelltext
1:
if not x[1] in vokale then exit;                    

wieso geht sowas denn nicht?? :-(

Das geht schon, du musst nur richtig klammern:

Quelltext
1:
2:
if not (x[1] in vokale) then 
  exit;


Wenn du nicht Klammerst dann Versucht Delphi soetwas:

Quelltext
1:
2:
if (not x[1]) in vokale then 
  exit;

Und der Operator NOT lässt sich nicht auf Chars (X[1]) anwenden. Daher deine Fehlermeldung.

Linus hat folgendes geschrieben:
Also bei einem Editfeld muss man ja Edit1.Text

Beim Meno heißt die Eigenschft Linies und ist vom Typ tStrings. Dieser verwaltet mehrere Strings in einer Liste. Gucke dir diesen am besten mal in der Online-Hilfe an.

Gruß
Klabautermann


Raphael O. - Mi 08.01.03 14:18

Popov hat folgendes geschrieben:
Willst du jetzt solange meine Codes verbessern bis du mal einen Glückstreffer landest

Ja genau das will ich!! :twisted: :wink: :wink:

Ist doch eigentlich nur gut, wenn der Code verbessert wird...
da können alle dabei etwas lernen und das Programm läuft (wesentlich :wink: ) schneller... :wink:

Fiji-Fighter


Anonymous - Mi 08.01.03 15:21

Ob das Programm wesentlich schneller läuft? Das glaube ich nicht.

Das ganze ist wie "das Glas ist halb voll/ das Glas ist halb leer".

Mir ist wichtig, daß ich auch nach Monaten den Quelltext auch lesen kann:

Quelltext
1:
if Length(Edit2.Text) < 1 then Exit ...                    

Hier lese ich raus, daß der Text mindestens ein Zeichen lang sein müß. Nicht null, nicht zwei. Eins. Sofort weiß ich worum es geht. Ein Zeichen ist minimum. Ich hätte auch schreiben können:

Quelltext
1:
if Length(Edit2.Text) = 0 then Exit ...                    

Hier lese ich raus, daß der Text nicht leer sein darf. Warum? Hier weiß ich nur, daß der Text nicht leer sein darf. Bei dem anderen lese ich raus, daß die Länge mindestens eins sein muß.

Auch wenn das Ergebnis das gleiche ist, so lese ich hier unterschiedliches raus. Anderen ist sowas vielleicht egal. Mir nicht.