Autor Beitrag
Matty92
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Do 13.05.10 17:40 
Hi,
ich habe einen Konstruktor an den ich dynamische Arrays übergebe. Das Problem ist, dass Delphi nörgelt, es gäbe keinen überladenen Konstruktor dieser Art, obwohl ich ihn in einer anderen Unit ohne Probleme aufrufen kann.
Die Unit wo es klappt (wo ihr mir mit dem Aufrufproblem geholfen habt :)):
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:
unit planetendaten;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,umehrkoerper, ExtCtrls;

type
  TForm5 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    planetfest: TCheckBox;
    Label3: TLabel;
    Label4: TLabel;
    x: TLabeledEdit;
    y: TLabeledEdit;
    Vx: TLabeledEdit;
    Vy: TLabeledEdit;
    Masse: TLabeledEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    i:integer;
  public
    anzahlaufruf:boolean;
    vxarray,vyarray,xarray,yarray,massearray:zahlenarray;
    festarray:boolarray;
  end;

var
  Form5: TForm5;

implementation

uses Zeichenfenster, konstanten;

{$R *.dfm}

type
  zahlenarray = array of double;
  boolarray = array of boolean;

procedure TForm5.Button2Click(Sender: TObject);
begin
  setlength(vxarray,0);
  setlength(vyarray,0);
  setlength(xarray,0);
  setlength(yarray,0);
  setlength(massearray,0);
  setlength(festarray,0);
  i:=0;
  vx.text:='';
  vy.text:='';
  x.text:='';
  y.text:='';
  masse.text:='';
  planetfest.Checked:=false;
  close;
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
  vxarray[i] := StrToFloat(vx.Text);
  vyarray[i] := StrToFloat(vy.Text);
  xarray[i] := StrToFloat(x.Text);
  yarray[i] := StrToFloat(y.Text);
  massearray[i] := Abs(StrToFloat(masse.Text));
  festarray[i] := Planetfest.Checked;
  if i = form1.anzahl - 1 then
  begin
    Form1.mk:=TMehrkoerper.Create(vxarray, vyarray, xarray, yarray, massearray, festarray); //hier ist der Konstruktor der ohne Probleme klappt
    Form1.Visible:=true;
    Close;
  end;
  vx.Text:='';
  vy.Text:='';
  x.Text:='';
  y.Text:='';
  masse.Text:='';
  planetfest.Checked:=false;
  i:=i+1;
end;


procedure TForm5.FormShow(Sender: TObject);
begin
  if anzahlaufruf then begin
    setlength(vxarray,form1.anzahl);
    setlength(vyarray,form1.anzahl);
    setlength(xarray,form1.anzahl);
    setlength(yarray,form1.anzahl);
    setlength(massearray,form1.anzahl);
    setlength(festarray,form1.anzahl);
    i:=0;
    anzahlaufruf:=false;      
  end;
end;

[...]

end.


Und hier die Unit wo es nicht klappt, in einer Prozedur die die gespeicherten Daten der Planeten ausliest:

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:
unit Zeichenfenster;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, StdCtrls, ComCtrls, IniFiles, umehrkoerper, uplanet;


type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    N1: TMenuItem;
    ber1: TMenuItem;
    Hilfe1: TMenuItem;
    Datenladen1: TMenuItem;
    Datenspeichern1: TMenuItem;
    Optionen1: TMenuItem;
    Farbe1: TMenuItem;
    Neu1: TMenuItem;
    Button1: TButton;
    Button3: TButton;
    Beenden1: TMenuItem;
    Ansicht1: TMenuItem;
    Planeten1: TMenuItem;
    Koordinatensystem1: TMenuItem;
    CheckBox1: TCheckBox;
    Button4: TButton;
    geschwindigkeit: TTrackBar;
    UniversaleKonstanten1: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Abbildspeichern1: TMenuItem;
    Button2: TButton;
    procedure geschwindigkeitChange(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Datenspeichern1Click(Sender: TObject);
    procedure Datenladen1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure UniversaleKonstanten1Click(Sender: TObject);
    procedure Farbe1Click(Sender: TObject);
    procedure Neu1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure zeichnen;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure achsenzeichnen;
    procedure PaintBox1Paint(Sender: TObject);
    procedure rasterzeichnen;
    procedure Abbildspeichern1Click(Sender: TObject);
  private
    bmp:tbitmap;
    ini:tinifile;
  public
    resetet,gestartet,pausiert,achsen,raster:boolean;
    mk:tmehrkoerper;
    anzahl,pause:integer;
    massstab,xmax,ymax,g,smoothing,zeitschritt:double;
    alleplaneten,allespuren,rasterfarbe,achsenfarbe:tcolor;
    procedure destruktor;
  end;

var
  Form1: TForm1;


implementation

uses start, planetendaten, koord, konstanten;

{$R *.dfm}

[...]

procedure TForm1.Datenladen1Click(Sender: TObject);
type
  zahlenarray = array of extended;
  boolarray = array of boolean;
var vxarray,vyarray,xarray,yarray,massearray:zahlenarray;
    festarray:boolarray;
    i:integer;
begin
  opendialog1.Title:='Startwerte laden :)';
  opendialog1.InitialDir:=GetCurrentDir;
  opendialog1.Filter:='Ini-Datei|*.ini';
  opendialog1.DefaultExt:='ini';
  opendialog1.FilterIndex:=1;
  if opendialog1.Execute then
     ini:=tinifile.create(opendialog1.filename);
  try
  begin
    g:=ini.readfloat('Allgemeine Zahlen','Gravitationskonstante',6.67428e-11);
    zeitschritt:=ini.readFloat('Allgemeine Zahlen','Zeitschritt',0.01);
    smoothing:=ini.readfloat('Allgemeine Zahlen','Smoothing',0.1);
    anzahl:=ini.readInteger('Zahl der Planeten''Anzahl', mk.gethigh+1);
    setlength(vxarray,anzahl);
    setlength(vyarray,anzahl);
    setlength(xarray,anzahl);
    setlength(yarray,anzahl);
    setlength(massearray,anzahl);
    setlength(festarray,anzahl);
    for i:=0 to mk.gethigh do begin
      vxarray[i]:=ini.readfloat('Startwerte: Planet '+inttostr(i),'Vxstart',mk.getplanet(i).getvstart.getx);
      vyarray[i]:=ini.readfloat('Startwerte: Planet '+inttostr(i),'Vystart',mk.getplanet(i).getvstart.gety);
      xarray[i]:=ini.readfloat('Startwerte: Planet '+inttostr(i),'Ortxstart',mk.getplanet(i).getortstart.getx);
      yarray[i]:=ini.readfloat('Startwerte: Planet '+inttostr(i),'Ortystart',mk.getplanet(i).getortstart.gety);
      massearray[i]:=ini.readfloat('Startwerte: Planet '+inttostr(i),'Masse',mk.getplanet(i).getmasse);
      festarray[i]:=ini.readbool('Startwerte: Planet '+inttostr(i),'Sitzt fest?',mk.getplanet(i).planetfest);
    end;
    massstab:=ini.readFloat('Einstellungen: Allgemein','Massstab',1);
    if massstab>1 then begin
        form5.anzahlaufruf:=true;
        form5.Visible:=true;
    end;
    pause:=ini.readinteger('Einstellungen: Allgemein','Pause',30);
    achsen:=ini.readbool('Einstellungen: Farben','Raster?',true);
    achsenfarbe:=stringtocolor(ini.readstring('Einstellungen: Farben','Achsenfarbe','clblack'));
    raster:=ini.readbool('Einstellungen: Farben','Raster?',raster);
    rasterfarbe:=stringtocolor(ini.readstring('Einstellungen: Farben','Rasterfarbe','clblack'));
    checkbox1.checked:=ini.readbool('Einstellungen','Planetenspuren?',true);
    allespuren:=stringtocolor(ini.readString('Einstellungen: Farben','Spurenfarbe','clblack'));
    alleplaneten:=stringtocolor(ini.readString('Einstellungen: Farben','Planetenfarbe','clblack'));
    end;
   mk:=TMehrkoerper.Create(vxarray, vyarray, xarray, yarray, massearray, festarray); //hier ist der konstruktor der rumnörgelt
   form2.farbenspur:=allespuren;
   form2.planetfarbe:=alleplaneten;
   form2.achsenfarbe:=achsenfarbe;
   form2.rasterfarbe:=rasterfarbe;
   form6.g:=g;
   form6.smoothing:=smoothing;
   form6.zeitschritt:=zeitschritt;
   mk.setg(g);
   mk.setzeitschritt(zeitschritt);
   mk.setsmoothing(smoothing);
   form6.edit1.text:=floattostr(g);
   form6.edit2.text:=floattostr(zeitschritt);
   form6.edit3.text:=floattostr(smoothing);
   setlength(vxarray,0);
   setlength(vyarray,0);
   setlength(xarray,0);
   setlength(yarray,0);
   setlength(massearray,0);
   setlength(festarray,0);
   finally ini.free;
   end;
end;

[...]

end.


Und das ist der Konstruktor selbst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
constructor tmehrkoerper.create(vx,vy,x,y,masse:zahlenarray;fest:boolarray);
var i:integer;
begin
  Setlength(Planeten,length(vx));
  for i:=0 to high(vx) do begin
    planeten[i]:=tplanet.create(vx[i],vy[i],x[i],y[i],masse[i],fest[i]);
  end;
  self.G:=form6.g;
  self.zeitschritt:=form6.zeitschritt;
  self.e:=form6.smoothing;
  zeit:=0;
end;



In der Unit wo der funktionierende Aufruf ist, gab es auch dieses Problem, dass es einen überladenen Konstruktor den man mit diesen Argumenten aufrufen könne nicht gibt, aber der ist nach einiger Zeit von selbst verschwunden.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 13.05.10 17:53 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
[...]
    i:integer;
  public
    anzahlaufruf:boolean;
    vxarray,vyarray,xarray,yarray,massearray:zahlenarray;
    festarray:boolarray;
  end;
[...]

type
  zahlenarray = array of double;
  boolarray = array of boolean;


Mich wundert dass das hier klappt, da du zahlenarray erst verwendest und dann definierst. Eventuell hast du das 2x definiert, dann gibts Ärger, weil es verschiedene Sachen sind (mit gleichem Namen)

Edit: Achja, jetzt seh ichs auch, bei dem andren hast dus in der Funktion definiert. Das gehts so nicht. Du musst immer wenn du das zahlenarray verwendest die selbe (nicht die gleiche ;) ) Definition verwenden.

Edit2: Das machst du so, indem du die types in der Unit ganz oben definierst, wo auch der Constructor drinne steht.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Matty92 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Do 13.05.10 18:24 
Hi Xion,
ok, danke, jetzt klappt es ohne Probleme :). Ich wusste nicht, dass es so einen Unterschied macht wo die Types stehen, naja, ich weiß noch mehr nicht, dafür weiß ich wer meine Nichtwissen und Fehler findet :).
Dafür klappt jetzt aber das Programm zu 95%. Nur noch das Planetenfenster fehlt.


Viele Grüße,
Matty