Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   einen Record-Array aus anderer Unit benutzen (https://www.delphipraxis.net/144694-einen-record-array-aus-anderer-unit-benutzen.html)

Vulthan 14. Dez 2009 19:04


einen Record-Array aus anderer Unit benutzen
 
Hallo Leute,
habe vor 2 jahren mal mehr schlecht als recht Delphi 5 gelernt und versuche nun nach eineiger Zeit Pause wieder einzusteigen.
Ich habe das Problem, dass ich einen applikationsfehler bekomme, ich aber nicht verstehe warum.

Hier der Quellcode:
__________________________________________________ _____

Unit Eingabemodul;

interface

uses
{Standart-units}, Rasse, Basis, Kultur, Profes;

Type
TForm1 = class(TForm)
{Die ganze Form halt}
procedure Beenden1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Formactivate(Sender: TObject);
PRIVATE
{private-Daklarationen}
PUBLIC
{public-Deklarationen}
end;

Rassen = TRasse;
var
Form1 : TForm1;
Rassena : ARRAY OF Rassen;
i : INTEGER;

implementation

{$R *.dfm}

procedure TForm1.Formactivate(Sender: TObject);
begin
i := 1;
end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Rassena[i].Name := Edit1.Text; {--> Dort passiert der Fehler!}
Rassena[i].Modi.Lep := STRTOINT(Edit2.Text);
Rassena[i].Modi.Aup := STRTOINT(Edit3.Text);
Rassena[i].Modi.Asp := STRTOINT(Edit4.Text);
Rassena[i].Modi.MR := STRTOINT(Edit5.Text);
Rassena[i].Gross.Min := STRTOINT(Edit6.Text);
Rassena[i].Gross.Zahl := STRTOINT(Edit7.Text);
Rassena[i].Gross.Wuerfel := STRTOINT(Edit8.Text);
Rassena[i].Alter.Min := STRTOINT(Edit9.Text);
Rassena[i].Alter.Zahl := STRTOINT(Edit10.Text);
Rassena[i].Alter.Wuerfel := STRTOINT(Edit11.Text);
Listbox1.Items.Add(Rassena[i].Name);
INC(i);
end;

end.
__________________________________________________ ____
Das war die eine Unit, jetzt folgt die andere


__________________________________________________ ___

unit Rasse;

interface

uses Basis, Kultur, Profes;

Type
TGross = RECORD
Min : INTEGER;
Zahl: INTEGER;
Wuerfel: INTEGER;
end;

TAlter = RECORD
Min : INTEGER;
Zahl: INTEGER;
Wuerfel : INTEGER;
end;

TRasse = RECORD
Name : STRING;
Modi : TModi; {--> ist in Unit Basis deklariert}
Gross : TGross;
Alter : TAlter;
SFS : ARRAY OF TSF; {--> ist in Unit Basis deklariert}
Talent : TTalent; {--> ist in Unit Basis deklariert}
EKultu : ARRAY OF TKultur; {--> ist in Unit Basis deklariert}
MKultu : ARRAY OF TKultur; {--> ist in Unit Basis deklariert}
end;

implementation

end.
__________________________________________________ __________________

Ich denke es ist ein simpler Verknüpfungsfehler zwischen den Unit, den Kompilieren tu er ja.
Vielleicht muss ich TRasse irgendwie public setzen??
Ich finde den Fehler einfach nicht.

Schon mal Danke an alle

rollstuhlfahrer 14. Dez 2009 19:09

Re: einen Record-Array aus anderer Unit benutzen
 
HI und herzlich willkommen in der DP :dp: :dp:

Zu Aller-erst: Es gibt Delphi-Tags für Delphi-Code, also bitte auch nutzen. Sonst wird es unübersichtlich.
2. gibt es irgendwelche Fehler bezüglich Syntak/Compilieren? Wenn nein, sollte eigentlich alles gehen
3. hast du dein Array gar nicht initialisiert. Es hat die Länge 0 also hat es keine Wertepaare. Du kannst also auch nix reinschreiben. Lösung: Array mit SetLength() eine Länge/Größe geben oder ein statisches Array definieren.

Bernhard

Vulthan 14. Dez 2009 19:25

Re: einen Record-Array aus anderer Unit benutzen
 
kann ich also einen dynamischen Array in so einem Fall nicht benutzen? wenn nich, warum nicht?
Bei Copilieren gibt es keine Fehlermeldung.
Schuldigung, wusste nicht dass es dafür ne spezielle Rubrik gibt.
und Danke für die schnelle Antwort

himitsu 14. Dez 2009 19:29

Re: einen Record-Array aus anderer Unit benutzen
 
Ein dynamisches Array hat erstmal eine Länge von 0 und bevor man da was reinmachen kann, muß man den nötigen Speicher reservieren.

Wenn man das nicht macht, dann greift man praktisch auf nicht existierenden Speicher zu und es knallt.
Außerdem hätte die "genaue" Fehlermeldung sehr geholfen, denn darauf erkannt man recht leicht, daß kein Speicher reserviert wurde. (Zugriffsverletzung bei Adresse $000000xx ... denn 0 = nil)

Delphi-Referenz durchsuchenSetLength


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz