Autor Beitrag
TimKellner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 73

Win XP Pro
Delphi 7 Enterprise, RAD Studio
BeitragVerfasst: Sa 02.02.08 14:09 
Hallo,

ich möchte gerne an ein ListView Item ein Objekt anhängen.

Objekt Deklaration
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  TNews = class(TObject)
  private
    FID: Integer;
    procedure SetID(const Value: Integer);
  public
    property ID: Integer read FID write SetID;
  end;


Objekt erzeugen
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:
23:
24:
25:
26:
27:
28:
procedure TFM_News.LoadNewsList;
var
  oDataSet: TZQuery;
  oItem: TListItem;
  FNews : TNews;
begin
  oDataSet := nil;
  try
    oDataSet := TZQuery.Create(nil);
    oDataSet.Connection := HPControl.MySQLConnection;
    oDataSet.SQL.Text := 'SELECT * FROM news INNER JOIN user ON news.nautor = user.uid ORDER BY ntimestamp DESC';
    oDataSet.Open;
    while not oDataSet.Eof do
    begin
      FNews := TNews.Create;
      FNews.ID := oDataSet.FieldByName('nid').AsInteger;
      oItem := lvNews.Items.Add;
      oItem.Data := FNews;
      oItem.Caption := oDataSet.FieldByName('ntitel').AsString;
      oItem.SubItems.Add(oDataSet.FieldByName('uname').AsString);
      oItem.SubItems.Add(oDataSet.FieldByName('ntimestamp').AsString);
      oDataSet.Next;
    end;
    oDataSet.Close;
  finally
    FreeAndNil(oDataSet);
  end;
end;


Objekt auslesen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TFM_News.lvNewsSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  showmessage(IntToStr(TNews(lvNews.Selected.Data).ID));
end;


Beim auslesen wird mir erst die richtige ID angezeigt danach erhalte ich jedoch eine Zugriffsverletzung.

Ich kann mir nicht erklären warum.

Gruß
Tim
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Sa 02.02.08 15:39 
user profile iconTimKellner hat folgendes geschrieben:
Objekt erzeugen
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:
23:
24:
25:
26:
27:
28:
procedure TFM_News.LoadNewsList;
var
  oDataSet: TZQuery;
  oItem: TListItem;
  FNews : TNews;
begin
  oDataSet := nil;
  try
    oDataSet := TZQuery.Create(nil);
    oDataSet.Connection := HPControl.MySQLConnection;
    oDataSet.SQL.Text := 'SELECT * FROM news INNER JOIN user ON news.nautor = user.uid ORDER BY ntimestamp DESC';
    oDataSet.Open;
    while not oDataSet.Eof do
    begin
      FNews := TNews.Create;
      FNews.ID := oDataSet.FieldByName('nid').AsInteger;
      oItem := lvNews.Items.Add;
      oItem.Data := FNews;
      oItem.Caption := oDataSet.FieldByName('ntitel').AsString;
      oItem.SubItems.Add(oDataSet.FieldByName('uname').AsString);
      oItem.SubItems.Add(oDataSet.FieldByName('ntimestamp').AsString);
      oDataSet.Next;
    end;
    oDataSet.Close;
  finally
    FreeAndNil(oDataSet);
  end;
end;


Objekt auslesen
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TFM_News.lvNewsSelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
begin
  showmessage(IntToStr(TNews(lvNews.Selected.Data).ID));
end;


Beim auslesen wird mir erst die richtige ID angezeigt danach erhalte ich jedoch eine Zugriffsverletzung.

Ich kann mir nicht erklären warum.


Ich mir auch nicht, Du hast alles korrekt gemacht, soweit ich das sehen kann. Sicher, dass das Problem in diesem Code liegt? Wann gibst Du denn die TNews-Objekte wieder frei? Evtl. passiert das ja zu frueh?

twm
TimKellner Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 73

Win XP Pro
Delphi 7 Enterprise, RAD Studio
BeitragVerfasst: So 03.02.08 09:07 
Moin,

ganz ehrlich gebe ich es bis jetzt noch gar nicht frei.

Mir ist noch aufgefallen. Den ersten den ich anklicke gibt mir die richtige ID und keine Fehlermeldung. Ab dem 2ten gibt er die richtige ID und die Excepzion.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 03.02.08 10:10 
Hallo

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFM_News.lvNewsSelectItem(Sender: TObject; Item: TListItem;  
  Selected: Boolean);  
begin  
  if lvNews.Selected<>Nil then 
    showmessage(IntToStr(TNews(lvNews.Selected.Data).ID));  
end;


selectitem wird beim auswählen 2xausgelöst, als erstes erhälst du das event für das alte, ausgewählte item mit selected=false. Selectitem ist dann aber nil und führt zum fehler. Erst danach bekommst du für das neu ausgewählte wieder das onselectitem ausgelöst.

Entweder du prüfst selected auf nil oder nimmst das mit übergebene Item, muß dort dann aber auch selected prüfen.

Gruß Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)