AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ListView+Pointer lässt Anwendung manchmal crashen

Ein Thema von dp_user · begonnen am 3. Jul 2007 · letzter Beitrag vom 4. Jul 2007
Antwort Antwort
dp_user

Registriert seit: 3. Jul 2007
1 Beiträge
 
#1

ListView+Pointer lässt Anwendung manchmal crashen

  Alt 3. Jul 2007, 21:45
Guten Abend,
bin neu hier in der DP und weiss noch nicht genau, in welches Forum ich meine Anfrage posten soll, da sie irgendwie nirgends richtig reinpasst.

Mein Problem ist folgendes:
Ich möchte bei einem ListView im "Data" Feld verschiedene Werte Speichern, um später beim "CustomDrawItem" darauf zugreifen zu können.
Das ganze funktioniert auch soweit ganz gut, in bestimmten Fällen treten jedoch massenweise "AccessViolations" auf - dies passiert z.B. IMMER dann
wenn ich den Windows Taskmanager aufrufe und die Prozessliste nach CPU- oder Speicherauslastung neu sortiere während das ListView sich noch aufbaut.

Habe das so gelöst:


Delphi-Quellcode:
PListViewData = ^TListViewData;
 TListViewData = Record
    Eintrag1: boolean;
    Eintrag2: string;
end;

var
ListDataEntry: PListViewData;
Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var
i:integer;
begin
New(ListDataEntry);
ListDataEntry.Eintrag1=true;

for i:=0 to 600 do begin
Listview1.Items.Insert(0);

[..]

Listview1.Items[0].Data:=ListDataEntry;
end;

end;

Delphi-Quellcode:

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin


  with Sender do begin

ListDataEntry:=Item.Data;
if ListDataEntry.Eintrag1=true then Canvas.Font.Style:=[fsbold];

end;
end;
  Mit Zitat antworten Zitat
4. Jul 2007, 07:09
Dieses Thema wurde von "Sharky" von "Klatsch und Tratsch" nach "VCL / WinForms / Controls" verschoben.
Ich verschiebe den Thread mal nach hier.
DelphiKlaus

Registriert seit: 18. Okt 2006
100 Beiträge
 
Delphi 6 Professional
 
#3

Re: ListView+Pointer lässt Anwendung manchmal crashen

  Alt 4. Jul 2007, 07:39
Hallo,

kann es sein, dass Du zuerst alle 600 Einträge in der Listview erzeugst, aber erst in einer weiteren Schleife die Zuweisung an Data machst? Wenn Du dann den Taskmanager aufrufst, wird dann vielleicht durch Hin- und Herschieben von Fenstern ein Teil der Listview mit Einträgen, denen noch nichts zugewiesen ist, sichtbar? Dann wird dir DrawItem-Methode aufgerufen und grift ins Leere?

Ist mal so'ne Vermutung.

Klaus
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: ListView+Pointer lässt Anwendung manchmal crashen

  Alt 4. Jul 2007, 07:40
Herzlich willkommen in der Delphi-PRAXiS, dp_user.

Ein Problem mit dem von dir gezeigten Code ist, dass du zwar 601 Items erzeugst, aber nur das erste Item hat einen gültigen Data-Pointer.

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  ListDataEntry: PListViewData;
begin
  with Sender do
  begin
    ListDataEntry := Item.Data;
    if Assigned(ListDataEntry) and ListDataEntry.Eintrag1
      then Canvas.Font.Style := [fsbold]
      else { ... };
    // ...
  end;
end;
Außerdem ist es besser, wenn du den typisierten Zeiger ListDataEntry lokal deklarierst. Und die Abfrage einer Variablen des Typs Boolean auf True ist bestenfalls ungeschickt - die Variable selbst ist schon ein perfekter "logischer Ausdruck".

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: ListView+Pointer lässt Anwendung manchmal crashen

  Alt 4. Jul 2007, 08:14
Auch von mir herzlich willkommen

so wie Marabu es schon gesagt hatte muß die Instanziierung deines Pointers in die Schleife.
Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
  for i:=0 to 600 do begin
    New(ListDataEntry);
    ListDataEntry.Eintrag1=true;
    Listview1.Items.Insert(0);

    [..]

    Listview1.Items[0].Data:=ListDataEntry;
  end;

end;
Mit der Prüfung, wie sie marabu angeboten hat bin ich mir aber nicht ganz sicher. bricht der Compiler nach der Prüfung mit Assign auf nil in der Abarbeitung ab, so dass die Prüfung auf and ListDataEntry.Eintrag1 nicht mehr ausgeführt wird, so ist alles o.k.
Da ich mir an der Stelle immer nicht ganz sicher bin mache ich es so:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  ListDataEntry: PListViewData;
begin
  with Sender do
  begin
    ListDataEntry := Item.Data;
    if Assigned(ListDataEntry) then
      if ListDataEntry.Eintrag1 then
        Canvas.Font.Style := [fsbold]
      else { ... };
    // ...
  end;
end;
gruß oki

[editki] Formatierung korrigiert. [/edit]
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 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