Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Data Pointer Fehler in ListView (https://www.delphipraxis.net/66344-data-pointer-fehler-listview.html)

wlfmario 28. Mär 2006 19:28


Data Pointer Fehler in ListView
 
Hallo zusammen,

ich versuche grade einen Pfad einer Datei in einen Data Object zu Speichern.
Leider tauchen immer Fehlermeldungen auf mit dem ich nichts anfangen kann.
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt MailClient.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004AC152 in Modul 'MailClient.exe'. Lesen von Adresse 00000004'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
ich habe ein Type TAttachPfad angelegt
Delphi-Quellcode:
 type
  TAttachPfadDaten = class(TObject)

  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
    Attachpfad: string;
  end;
und speichere die Adresse der Datei mit folgendem Code:

Delphi-Quellcode:
 procedure TMailSend.ButtonLadenClick(Sender: TObject);
var
  AttachPfadDaten: TAttachPfadDaten;
begin
  AttachPfadDaten := TAttachPfadDaten.Create;
  if (Opendialog1.Execute) then
  begin
    TiDAttachment.Create(MsgSend.MessageParts, Opendialog1.FileName);
    ListviewAnhang.Items.Add.Caption := ExtractFileName(Opendialog1.FileName);
    AttachPfadDaten.Attachpfad := opendialog1.FileName;
    itm.Data := AttachpfadDaten;
  end;
end;
Wenn ich jetzt in meiner ListView mehr als ein Eintrag habe, und einen davon Löschen möchte, versuche ich dies über diese
Procedure:
Delphi-Quellcode:
 procedure TMailSend.ButtonLoeschenClick(Sender: TObject);
var
  AttachPfadDaten: TAttachPfadDaten;
  i, x: integer;
begin
  if ListViewAnhang.Selected <> nil then
  begin
    with ListViewAnhang do
    begin
      for x := 0 to Items.Count - 1 do
        if (Items.Item[x].Selected) then
          AttachPfadDaten := TAttachPfadDaten(Items[x].data);
    end;
    for i := 0 to pred(MsgSend.MessageParts.Count - 1) do
    begin
      if (MsgSend.MessageParts.Items[i].StoredPathName =
        AttachPfadDaten.Attachpfad) then
        MsgSend.MessageParts.Items[i].Free;
    end;
    ListViewAnhang.DeleteSelected;
    {Anhang Löschen} 
  end
  else
    exit;
end;
Leider klappt das nicht so wie ich mir das dachte, kann mir jemand sagen was ich dort Falsch mache ?
Was den Fehler verursacht ?
Wenn ich die das alles richtig verstanden habe, kann ich doch für jeden eintrag in meiner Listview ein Data benutzen oder ?

Muetze1 28. Mär 2006 20:53

Re: Data Pointer Fehler in ListView
 
Frage:
Delphi-Quellcode:
    TiDAttachment.Create(MsgSend.MessageParts, Opendialog1.FileName);
    ListviewAnhang.Items.Add.Caption := ExtractFileName(Opendialog1.FileName);
    AttachPfadDaten.Attachpfad := opendialog1.FileName;
    itm.Data := AttachpfadDaten;
Ok, mit ListviewAnhang.Items.Add bekommst du eine neue Instanz zurück (der neue Eintrag). Nun erklär mir mal was "itm" ist am Ende der Procedure und warum du ...

a) "itm" nicht lokal deklariert hast
b) "itm" nicht den Rückgabewert von ListviewAnhang.Items.Add zugewiesen hast?

Theoretisch sollte das dann praktisch klappen...

Hawkeye219 28. Mär 2006 20:59

Re: Data Pointer Fehler in ListView
 
Du solltest die Schleife
Delphi-Quellcode:
for i := 0 to pred(MsgSend.MessageParts.Count - 1) do [...]
rückwärts laufen lassen.
Den Grund dafür findest Du in diesem Thread.

Gruß Hawkeye

Muetze1 28. Mär 2006 21:05

Re: Data Pointer Fehler in ListView
 
... und zusätzlich noch die Frage:

Delphi-Quellcode:
for i := 0 to pred(MsgSend.MessageParts.Count - 1) do
Warum nur bis Count-2 ??


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 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