Autor |
Beitrag |
Matty92
      
Beiträge: 34
|
Verfasst: 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  ):
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); 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:
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); 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:
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
      

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)
|
Verfasst: Do 13.05.10 17:53
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 
      
Beiträge: 34
|
Verfasst: 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
|
|
|