Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Inkompatible Typen: Integer und String
Dude566 - Di 03.03.09 22:11
Titel: Inkompatible Typen: Integer und String
Ich habe zwei verschiedene Methoden um Dezimalzahlen in Römische umzuwandeln.
Es kommt bei beiden immer die selbe Fehlermeldung.
Irgendwas beachte ich nicht bei den Dateitypen, aber was? :autsch:
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: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87:
| Function roemisch(n: integer):string; begin result := ''; while n >= 1000 do Begin result := result +'M'; n := n-1000; End; if n >= 900 then Begin result := result +'CM'; n := n-900; End; if n >= 500 then Begin result := result +'D'; n := n-500; End; if n >= 400 then Begin result := result +'CD'; n := n-400; End; while n >= 100 do Begin result := result +'C'; n := n-100; End; if n >= 90 then Begin result := result +'XC'; n := n-90; End; if n >= 50 then Begin result := result +'L'; n := n-50; End; if n >= 40 then Begin result := result +'XL'; n := n-40; End; while n >= 10 do Begin result := result +'X'; n := n-10; End; if n >= 9 then Begin result := result +'IX'; n := n-9; End; if n >= 5 then Begin result := result +'V'; n := n-5; End; if n >= 4 then Begin result := result +'IV'; n := n-4; End; while n >= 1 do Begin result := result +'I'; n := n-1; End; end;
function DecToRoman(Decimal: Longint): String; const Romans: Array[1..16] of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M', '(M)', '[M]', '{M}'); Arabics: Array[1..16] of Integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 10000, 100000, 1000000); var iFor: Integer; begin Result := ''; for iFor := 16 downto 1 do begin while(Decimal >= Arabics[iFor]) do begin Decimal := Decimal - Arabics[iFor]; Result := Result + Romans[iFor]; end; end; end;
procedure TForm1.Button2Click(Sender: TObject); begin Edit4.Text := roemisch(Edit3.Text); Edit4.Text := (DecToRoman(Edit3.Text)); end; |
Gruß Dude566
Moderiert von
Narses: Titel geändert.
LexXis - Di 03.03.09 22:18
Delphi-Quelltext
1: 2:
| Edit4.Text := roemisch(Edit3.Text); Edit4.Text := (DecToRoman(Edit3.Text)); |
Du weist den Funktionen Strings zu, die erwarten aber Integer als Parameter!
StrToInt sollte da weiterhelfen.
Dude566 - Di 03.03.09 22:22
Hatte ich auch schon probier dann kommt:
[Fehler] Unit1.pas(32): Ungenügende Forward- oder External-Deklaration: 'TForm1.roemisch'
[Fehler] Unit1.pas(34): Ungenügende Forward- oder External-Deklaration: 'TForm1.DecToRoman'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
Edit:
Habe ich hier auch gesucht, aber nicht gefunden. :gruebel:
jaenicke - Di 03.03.09 22:27
Es gibt zwei Möglichkeiten. Entweder du deklarierst die Methoden oben als Methoden von TForm1, dann musst du das unten bei der Implementierung aber auch dazu schreiben, woher soll Delphi das sonst wissen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| TForm1 = class(TForm) Button2: TButton; procedure Button2Click(Sender: TObject); private function DecToRoman(iDecimal: longint): string; end;
...
implementation
...
function TForm1.DecToRoman (iDecimal: longint): string; begin ... end;
procedure TForm1.Button2Click(Sender: TObject); begin Edit4.Text := DecToRoman(... end; |
Oder du schreibst du Funktion einfach
oberhalb der Verwendungsstelle hin. Denn wenn du das erst hinter den ButtonClick schreibst, dann kennt Delphi die Funktion an der Stelle ja noch nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| TForm1 = class(TForm) Button2: TButton; procedure Button2Click(Sender: TObject); private end;
...
implementation
...
function DecToRoman (iDecimal: longint): string; begin ... end;
procedure TForm1.Button2Click(Sender: TObject); begin Edit4.Text := DecToRoman(... end; |
Dude566 - Di 03.03.09 22:39
Das habe ich auch gemacht. Trotzdem. Ich muss morgen nochmal drüber gucken
Hier mal der komplette Code:
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: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; Label2: TLabel; Edit2: TEdit; Edit3: TEdit; Label3: TLabel; Button2: TButton; Edit4: TEdit; Label4: TLabel; Edit5: TEdit; Edit6: TEdit; Button3: TButton; Label5: TLabel; Label6: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private public Function roemisch(n: integer):string; function dual(x:integer) : string; function DecToRoman(Decimal: Longint): String; end;
var Form1: TForm1;
implementation
{$R *.DFM}
Function roemisch(n: integer):string; begin result := ''; while n >= 1000 do Begin result := result +'M'; n := n-1000; End; if n >= 900 then Begin result := result +'CM'; n := n-900; End; if n >= 500 then Begin result := result +'D'; n := n-500; End; if n >= 400 then Begin result := result +'CD'; n := n-400; End; while n >= 100 do Begin result := result +'C'; n := n-100; End; if n >= 90 then Begin result := result +'XC'; n := n-90; End; if n >= 50 then Begin result := result +'L'; n := n-50; End; if n >= 40 then Begin result := result +'XL'; n := n-40; End; while n >= 10 do Begin result := result +'X'; n := n-10; End; if n >= 9 then Begin result := result +'IX'; n := n-9; End; if n >= 5 then Begin result := result +'V'; n := n-5; End; if n >= 4 then Begin result := result +'IV'; n := n-4; End; while n >= 1 do Begin result := result +'I'; n := n-1; End; end;
function dual(x:integer) : string; var b : string; begin b:=''; repeat if x mod 2=0 then b:='0'+b else b:='1'+b; x:=x div 2; until x=0; result:=b; end;
function DecToRoman(Decimal: Longint): String; const Romans: Array[1..16] of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M', '(M)', '[M]', '{M}'); Arabics: Array[1..16] of Integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 10000, 100000, 1000000); var iFor: Integer; begin Result := ''; for iFor := 16 downto 1 do begin while(Decimal >= Arabics[iFor]) do begin Decimal := Decimal - Arabics[iFor]; Result := Result + Romans[iFor]; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := IntToHex (StrToInt(Edit1.Text), 1); end;
procedure TForm1.Button2Click(Sender: TObject); begin Edit4.Text := roemisch(StrToInt(Edit3.Text)); end;
procedure TForm1.Button3Click(Sender: TObject); begin Edit6.Text := dual(StrToInt(Edit5.Text)); end;
end. |
jaenicke - Di 03.03.09 23:17
Dude566 hat folgendes geschrieben : |
Das habe ich auch gemacht. Trotzdem. |
Hast du nicht...
jaenicke hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| function TForm1.DecToRoman (iDecimal: longint): string; begin | |
Das hast du in deinem Quelltext herausgelassen...
Und deshalb findet Delphi keine Implementierung zu roemisch etc. als zu TForm1 gehörig. Denn deine Funktion unten gehört nicht zu TForm1, das hast du ja nicht dazugeschrieben.
Zorro - Mi 04.03.09 14:23
Die allererste Antwort beschreibt den Fehler bereits völlig korrekt:
Du deklarierst 2 Prozeduren/Funktionen mit jeweils einem Parameter:
roemisch(n:integer):string und
DecToRoman(Decimal:Longint):string
und übergibst jedoch beim Aufruf jeweils einen falschen Datentyp (nämlich string statt des erwarteten integer/longint:
Edit4.Text := roemisch(Edit3.Text);
Edit4.Text := (DecToRoman(Edit3.Text));
Greetz Zorro
jaenicke - Mi 04.03.09 16:03
Das ist aber nur der eine der beiden Fehler. Der andere ist eben wie gesagt der mit der fehlenden Forwarddeklaration, weil er es oben unter TForm1 deklariert, unten aber nicht als zu TForm1 gehörig geschrieben hat.
Dude566 - Mi 04.03.09 17:42
jaenicke hat folgendes geschrieben : |
Das ist aber nur der eine der beiden Fehler. Der andere ist eben wie gesagt der mit der fehlenden Forwarddeklaration, weil er es oben unter TForm1 deklariert, unten aber nicht als zu TForm1 gehörig geschrieben hat. |
Das war bisher nie mein Problem ich hatte auch schon Programme mit mehr als einer Form und da hat Delphi nicht gemeckert, deshalb habe ich es garnicht erst gemacht.
Ich verstehe nicht wovon das abhängt.
jaenicke - Mi 04.03.09 17:51
Dude566 hat folgendes geschrieben : |
Das war bisher nie mein Problem ich hatte auch schon Programme mit mehr als einer Form und da hat Delphi nicht gemeckert, deshalb habe ich es garnicht erst gemacht.
Ich verstehe nicht wovon das abhängt. |
Das habe ich doch oben schon einmal geschrieben. Du musst Delphi, wenn du eine Funktion oben in TForm1 deklarierst, auch sagen, dass unten deine Funktion dazu gehört...
http://www.delphi-forum.de/viewtopic.php?p=552070#552070
Und dein anderes Problem liegt eben wie auch schon gesagt wurde an der fehlenden Umwandlung deiner Strings in den Edits in Integer mit StrToInt.
Dude566 - Mi 04.03.09 18:22
Ich habe das Tform1 aber auch schon weg gelassen und es ging ohne, das ist das was ich nicht verstehe. ;)
jaenicke - Mi 04.03.09 18:30
Dann hast du deine Funktion auch nicht oben in die Deklaration von TForm1 geschrieben, das ist die zweite Variante gewesen.
Delete - Mi 04.03.09 18:39
Es existiert ein eklatanter Unterschied zwischen einer regulären Prozedur/Funktion und einer Methode. Eine Methode gehört zu einer Klasse und muss deshalb auch in der Klassendefinition deklariert werden.
Beispiel für eine reguläre Funktion:
Delphi-Quelltext
1: 2: 3: 4:
| function haelfte(iEin: integer): integer; begin Result := iEin div 2; end; |
Beispiel für eine Methode:
Delphi-Quelltext
1: 2: 3: 4:
| function TMyClass.haelfte(iEin: integer): integer; begin Result := iEin div 2; end; |
Damit die Methode bekannt ist, muss sie wie gesagt deklariert werden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type TMyClass = class ... function haelfte(iEin: integer): integer; ... end; |
Innerhalb einer Methode kannst Du auch auf alle Felder der Klasse zugreifen, was innerhalb einer regulären Prozedur oder Funktion nicht (immer) geht.
jaenicke - Mi 04.03.09 18:42
Um die verschiedenen Möglichkeiten noch einmal aufzuzeigen einmal eine komplette Unit. Die beiden gehighlighteten Zeilen gehören zusammen, dies ist die Methode der Klasse:
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: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public function GetValue: Integer; end;
var Form1: TForm1;
implementation
{$R *.dfm}
function GetValue: Integer; begin Result := 30; end;
function GetValueX: Integer; begin Result := 40; end;
function TForm1.GetValue: Integer; begin Result := 20; end;
procedure TForm1.Button1Click(Sender: TObject);
function GetValue: Integer; begin Result := 10; end;
begin ShowMessage(IntToStr(GetValue)); ShowMessage(IntToStr(Self.GetValue)); ShowMessage(IntToStr(Unit1.GetValue)); ShowMessage(IntToStr(GetValueX)); end;
end. |
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!