Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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? :autsch:


ausblenden volle Höhe 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 := '';
  {——————— Tausender —————————}
  while n >= 1000 do Begin //kann mehrmals vorkommen
    result := result +'M';
    n := n-1000;
  End;
  if n >= 900 then Begin   //kann nur einmal vorkommen
    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;
  {————————— Hunderter ——————————— }
  while n >= 100 do Begin //kann mehrmals vorkommen
    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;
  {——————— Zehner ———————————}
  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;
  { ——————————— Einer ——————————— }
  while n >= 1 do Begin //kann mehrmals vorkommen
    result := result +'I';
    n := n-1;
  End;
end;

function DecToRoman(Decimal: Longint): String;
const
  Romans: Array[1..16of String = ('I''IV''V''IX''X''XL',
                                    'L''XC''C''CD''D''CM',
                                    'M''(M)''[M]''{M}');
  Arabics: Array[1..16of Integer = (145910405090100,
                                      4005009001000100001000001000000);
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 user profile iconNarses: Titel geändert.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Di 03.03.09 22:18 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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:

Zitat:

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?


Habe ich hier auch gesucht, aber nicht gefunden. :gruebel:

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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?
ausblenden 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Di 03.03.09 22:39 
Das habe ich auch gemacht. Trotzdem. Ich muss morgen nochmal drüber gucken

Hier mal der komplette Code:
ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
  Function roemisch(n: integer):string;
  function dual(x:integer) : string;
  function DecToRoman(Decimal: Longint): String;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

Function roemisch(n: integer):string;
begin
  result := '';
  {——————— Tausender —————————}
  while n >= 1000 do Begin //kann mehrmals vorkommen
    result := result +'M';
    n := n-1000;
  End;
  if n >= 900 then Begin   //kann nur einmal vorkommen
    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;
  {————————— Hunderter ——————————— }
  while n >= 100 do Begin //kann mehrmals vorkommen
    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;
  {——————— Zehner ———————————}
  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;
  { ——————————— Einer ——————————— }
  while n >= 1 do Begin //kann mehrmals vorkommen
    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..16of String = ('I''IV''V''IX''X''XL',
                                    'L''XC''C''CD''D''CM',
                                    'M''(M)''[M]''{M}');
  Arabics: Array[1..16of Integer = (145910405090100,
                                      4005009001000100001000001000000);
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));
   //Edit4.Text := (DecToRoman(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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 03.03.09 23:17 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Das habe ich auch gemacht. Trotzdem.
Hast du nicht...
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 04.03.09 17:42 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.03.09 17:51 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function haelfte(iEin: integer): integer;
begin
  Result := iEin div 2;
end;

Beispiel für eine Methode:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden volle Höhe 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
    { Private declarations }
  public
    { Public declarations }
    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)); // ergibt 10
  ShowMessage(IntToStr(Self.GetValue)); // ergibt 20
  ShowMessage(IntToStr(Unit1.GetValue)); // ergibt 30
  ShowMessage(IntToStr(GetValueX)); // ergibt 40
end;

end.