Autor |
Beitrag |
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 03.03.09 22:11
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?
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.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
LexXis
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: 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.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 03.03.09 22:22
Dass es das hier schon fertig in den FAQ gibt, hast du aber gesehen?
www.delphi-library.de/viewtopic.php?p=325
Oder wolltest du das als Übung selbst machen?
|
|
Dude566 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Di 03.03.09 22:39
Das habe ich auch gemacht. Trotzdem. Ich muss morgen nochmal drüber gucken
Hier mal der komplette Code:
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. |
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 03.03.09 23:17
|
|
Zorro
      
Beiträge: 76
Win 2000, Win XP Pro
Delphi 7 Architect
|
Verfasst: 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
_________________ Real programmers confuse Xmas and Halloween because DEC 25 = OCT 31
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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.
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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...
www.delphi-forum.de/....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 
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: 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. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: 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. |
|
|
|