Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Access Violation / Eigenschaften einer eigenen Komponente


Hatebreeder - Do 20.11.03 12:19
Titel: Access Violation / Eigenschaften einer eigenen Komponente
Hiho,

also ich habe ein Programm, dass aus einer Paradox Datenbank die Einträge ausliest und für jeden Eintrag eine Komponente vom Typ TGame erstellen soll:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TGCGMV2C.FormCreate(Sender: TObject);
begin
createobjects;
end;

procedure TGCGMV2C.createobjects;
var NewGame: TGame;
begin
  Table1.First;
  while not Table1.Eof do
  begin
    NewGame:=TGame.Create(GCGMV2C);
    NewGame.setDetails(Table1.FieldByName('Release Name').AsString,Table1.FieldByName('Name').AsString,Table1.FieldByName('Origin').AsString,Table1.FieldByName('Group').AsString,inttostr(Table1.FieldByName('Files').AsInteger),Table1.FieldByName('Filename').AsString,Table1.FieldByName('Release Date').AsString,Table1.FieldByName('Category').AsString);
    ListBox1.Items.Add(Table1.FieldByName('Release Name').AsString);
    Table1.Next;
  end;
end;


TGame sieht so aus:


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:
type
  TGame = class(TComponent)
  private
  protected
  public
    pReleaseName,pName,pOrigin,pGroup,pFiles,pFilename,pReleaseDate,pCategory: string;
    constructor create(AOwner: TComponent); virtual;
    function getReleaseName:string;
    procedure setDetails(ReleaseName,Name,Origin,Group,Files,Filename,ReleaseDate,Category: string);
  end;

constructor TGame.create;
begin
inherited;
end;

procedure TGame.setDetails(ReleaseName,Name,Origin,Group,Files,Filename,ReleaseDate,Category: string);
begin
pReleaseName:=ReleaseName;
pName:=Name;
pOrigin:=Origin;
pGroup:=Group;
pFiles:=Files;
pFilename:=Filename;
pReleaseDate:=ReleaseDate;
pCategory:=Category;
end;

function TGame.getReleaseName;
begin
getReleaseName:=pReleaseName;
end;


Nun soll per Click auf ein Element der ListBox in die verschiedenen EditFenster die jeweilige Eigenschaft geschrieben werden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TGCGMV2C.ListBox1Click(Sender: TObject);
var i: integer;
ReleaseName: string;
begin
i:=11;
while i < ComponentCount do
begin
if Components[i] is TGame then
if TGame(i).pReleaseName = ListBox1.Items[ListBox1.ItemIndex] then
ReleaseName:= TGame(i).pReleaseName
else inc(i)
else inc(i);
LabeledEdit1.Text:=ReleaseName;
end;
end;


i:=11 weil ich 10 andere Komponenten habe und Nummer 11 die erste vom Typ TGame ist.

Hier arbeite ich absichtlich nur mit ReleaseName um das erstma zu testen, die anderen Eigenschaften werde ich dann später noch reinschreiben sobald das hier erstma läuft...

Allerdings bekomme ich beim Click auf die ListBox immer eine AccesViolation =/

Kann mir irgendwer helfen und weiß, was ich meine??

Danke schonmal!


smiegel - Do 20.11.03 13:39

Hallo,

in der ListviewClick musst Du folgende Zeilen

Delphi-Quelltext
1:
2:
if TGame(i).pReleaseName = ListBox1.Items[ListBox1.ItemIndex] then 
ReleaseName:= TGame(i).pReleaseName


in


Delphi-Quelltext
1:
2:
if TGame(Controls[i]).pReleaseName = ListBox1.Items[ListBox1.ItemIndex] then 
ReleaseName:= TGame(Controls[i]).pReleaseName


ändern.


Hatebreeder - Do 20.11.03 14:41

hoi, das klappt schonma super, die procedure sieht nun so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TGCGMV2C.ListBox1Click(Sender: TObject);
var i: integer;
ReleaseName: string;
begin
i:=11;
//while i < ComponentCount do
begin
if Components[i] is TGame then
begin
if TGame(Controls[i]).pReleaseName = ListBox1.Items[ListBox1.ItemIndex] then
begin
showmessage('debug:true');
ReleaseName:= TGame(Controls[i]).pReleaseName;
end
else showmessage('debug:false');
end
else inc(i);
LabeledEdit1.Text:=ReleaseName;
end;
end;


allerdings ist seltsamerweise immer false angesagt =/, da die bedingung nicht erfüllt ist
ich kann allerdings nicht den fehler finden, WARUM diese nicht erfüllt ist :shock: