Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was stimmt hier nicht ? Probleme mit Pointer und dyn. Arrays (https://www.delphipraxis.net/41642-stimmt-hier-nicht-probleme-mit-pointer-und-dyn-arrays.html)

TeTSuO 6. Mär 2005 12:33


Was stimmt hier nicht ? Probleme mit Pointer und dyn. Arrays
 
Hallo Leute ich hab ein Problem!
Ich habe eine Treeview in der mehrere Elemente sind und ein dyn. Array welches für jeden Eintrag die daten enthalt diese werden mittels

Delphi-Quellcode:
TreeNode.Data := @Array[Index]
and das TreeNode gehängt
Wenn ich nun ein Element auswähle und dieses mit

Delphi-Quellcode:
DeletePicture(TreeView.Selected.Data);
TreeView.Selected.Delete;
löschen will verschwindet es zwar in dem TreeView
wenn ich aber nun das letzte Element im TreeView auswähle
kommt ne Fehlermeldung

Meine Löschprozedur hab ich so programmiert

Delphi-Quellcode:
Function DeletePicture(PicInfo:Pointer): Boolean;
Var I,Index: Integer;
    ptr2: ^TPictureInfo;
Begin
 Result:=False;Index:=-1;
 For I:=0 to Count-1 do Begin
   ptr2:=@Picture[I];
   if PicInfo = ptr2 Then Index:=I;
 End;ptr2:=nil;
 if Index <> -1 Then Begin
   For I:=Index to high(Picture)-1 do
     Picture[I]:=Picture[I+1];
   SetLength(Picture,Count-1);
   Result:=True;
 End;
End;

Khabarakh 6. Mär 2005 13:04

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Dein Codestil ist schrecklich unübersichtlich :roteyes: .
Ich weiß zwar nicht, was für ein Array Picture ist, aber könnte es sein, dass hier nur die Pointer zugewiesen werden?
Delphi-Quellcode:
Picture[I]:=Picture[I+1];

TeTSuO 6. Mär 2005 13:18

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Wieso schrecklich was gefällt dir an dem Code nicht?
Oder wie würdest du sowas schreiben ?

Delphi-Quellcode:
Function DeletePicture(PicInfo:Pointer): Boolean;
Var I,Index: Integer;
    ptr2: ^TPictureInfo; // Addresse auf Eintrag im Dyn. Array Picture
Begin
  Result:=False;Index:=-1;
  For I:=0 to Count-1 do Begin // Array durchlaufen
     ptr2:=@Picture[I];        // Addresse des Eintrags holen
     // wenn übergebende Addresse = Addresse des Eintrags speichere Index
     if PicInfo = ptr2 Then Index:=I;
  End;ptr2:=nil; //Pointer nicht mehr benötigt
  if Index <> -1 Then Begin    
     //"Lücke" im Array mit nachfolgenden Füllen
     For I:=Index to high(Picture)-1 do
     Picture[I]:=Picture[I+1];  
     SetLength(Picture,Count-1); //Array um eins kürzen
     Result:=True;
  End;
End;
Vielleicht jetzt verständlicher !

Khabarakh 6. Mär 2005 13:25

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Ja, schon besser, aber in einer Zeile sollte eigentlich nur eine Anweisung stehen.
Delphi-Quellcode:
function DeletePicture(PicInfo:Pointer): Boolean;
var I,Index: Integer;
    ptr2: ^TPictureInfo; // Addresse auf Eintrag im Dyn. Array Picture
begin
  Result:=False;
  Index:=-1;
  for I:=0 to Count-1 do // Array durchlaufen
  begin
     ptr2:=@Picture[I];        // Addresse des Eintrags holen
     // wenn übergebende Addresse = Addresse des Eintrags speichere Index
     if PicInfo = ptr2 then
       Index:=I;
  end;
  ptr2:=nil; //Pointer nicht mehr benötigt
  if Index <> -1 then
  begin    
     //"Lücke" im Array mit nachfolgenden Füllen
     for I:=Index to high(Picture)-1 do
       Picture[I]:=Picture[I+1];  
     SetLength(Picture,Count-1); //Array um eins kürzen
     Result:=True;
  end;
end;
(Wie man die reservierten Wörter schreibt, ist mir eigentlich egal)

Mich würde aber eher interessieren, ob meine Vermutung stimmt :wink: .

TeTSuO 6. Mär 2005 13:58

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Wenn ich im debugger schaue

Delphi-Quellcode:
Picture[I] := Picture[I+1];
ist picture[I] gefüllt mit den werten von Picture[I+1].
kann es sein das das Treeview beim löschen eines Nodes irgendwas mit der
Data-Eigenschaft macht

Muetze1 6. Mär 2005 16:11

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Moin!

Der TTreeNode macht garantiert nix mit der Data Eigenschaft. Dein Problem ist, das du in der Data Eigenschaft einen Zeiger auf einen Zeiger hinterlegst und das dynamische Array die Zeiger automatisch verschiebt/verkürzt und damit dein Zeiger auf ein anderes Element zeigt.

MfG
Muetze1

TeTSuO 6. Mär 2005 16:26

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Ich habe das Problem jetzt anders gelöst
Ich benutze die Index Eigenschaft der TreeNodes für mein Array
Dieses muss ich halt genau so ändern wie sich die TreeView-Nodes ändern
Heist beim verschieben, kopieren und löschen Array anpassen
Ist zwar blöd aber es Funzt
Wenn einer ne andere Lösung hat kann er sie ja Posten

Muetze1 6. Mär 2005 20:51

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Moin!

Klar, leg kein extra Array an sondern pack die TPictureInfo direkt in die Data Eigenschaft...

MfG
Muetze1

TeTSuO 6. Mär 2005 21:52

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Zitat:

Zitat von Muetze1
Moin!

Klar, leg kein extra Array an sondern pack die TPictureInfo direkt in die Data Eigenschaft...

MfG
Muetze1

Wie soll das gehen? Data kann nur Pointer enthalten also müssen doch die Daten auch irgendwo gespeichert sein. Aber wo

Muetze1 6. Mär 2005 22:45

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Moin!

Na im Speicher...

Der Pointer kann doch auf einen Speicherbereich mit den Daten zeigen - was ist das Problem?

Zum Beispiel wenn dein TPictureInfo ein Record wäre:

Delphi-Quellcode:
Type
  PPictureInfo = ^TPictureInfo;
  TPictureInfo = Record
    FileName : String;
    WasAuchImmer: Integer;
  End;

....

Procedure TForm1.AddKnoten(Const AFileName, ACaption : String);
Var
  lInfo : PPictureInfo;
  lNode : TTreeNode;
Begin
  New(lInfo);
  lInfo.FileName := AFileName;
 
  lNode := Treeview1.Items.Add;
  lNode.Data := lInfo;
  lNode.Caption := ACaption;
End;

...

Procedure TForm1.FormDestroy;
Var
  lInfo : PPictureInfo;
Begin
  While ( TreeView1.Items.Count > 0 ) Do
  Begin
    lInfo := TreeView1.Items[0].Data;
    TreeView1.Items.[0].Delete;
    Dispose(lInfo);
  End;
End;
Der Code ist so mal schnell hingeklatscht, aber sollte das wichtige und wesentliche darlegen...

MfG
Muetze1

maximov 7. Mär 2005 10:14

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Moin,

oder du verpackst die den data-pointer in eine typisierte property, wie ich es hier vorführe...

http://www.delphipraxis.net/internal...enode&start=15

...das ist im wesentlichen, das, was Muetze vorschlägt, nur die funktionalität wird dahin verlagert wo sie nicht die hauptanwendung verstopft.

..nur als anregung :wink:

UweR 7. Mär 2005 11:48

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Noch ein Hinweis zum Code von Muetze:

Zitat:

Delphi-Quellcode:

Procedure TForm1.FormDestroy;
Var
  lInfo : PPictureInfo;
Begin
  While ( TreeView1.Items.Count > 0 ) Do
  Begin
    lInfo := TreeView1.Items[0].Data;
    TreeView1.Items.[0].Delete;
    Dispose(lInfo);
  End;
End;

Jeder TreeView hat das Ereignis OnDeletion was aufgerufen wird wenn ein Knoten gelöscht wird. Das ist ein wunderbarer Ort um Dispose aufzurufen. Das sorgt 1. dafür das auch keine Leichen entstehen wenn zwischendurch mal ein Knoten gelöscht wird und man kann sich die Schleife im FormDestroy sparen.

TeTSuO 7. Mär 2005 18:19

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Liste der Anhänge anzeigen (Anzahl: 1)
Klappt wunderbar! Bin echt beeindruckt :-D
Das mit dem OnDeletion funktioniert auch wunderbar.
Das einzige ist ich kann mein TPictureInfo nicht direkt auf PPictureInfo zuweisen;

Delphi-Quellcode:
   var PicInfo: PPictureInfo;
   ...
   New(PicInfo);
   PicInfo:=Picture[I];   // geht nicht! Array ist von typ TPictureInfo
   ...
muss das jetzt so machen :oops:

Delphi-Quellcode:
Procedure FillPicInfo(var pInfo: PPictureInfo;tInfo: TPictureInfo);
Begin
 pInfo.Picture:=tInfo.Picture;
 pInfo.Text:=tInfo.Text;
 ...
End;
Oder gibt es da auch ne andere Lösung?
Ist mein erstes Projekt mit dem Ich ausfühlich mit Pointern und dyn. Arrays arbeite
Ihr könnt es euch ja mal anschauen! Ist ein Editor für ein Diashow Programm was ich schon damals programiert hab

Muetze1 7. Mär 2005 18:49

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
Moin!

Warum du auch immer noch das Array behälst?

Ansonsten:
Delphi-Quellcode:
var PicInfo: PPictureInfo;
   ...
   New(PicInfo);
   PicInfo^ := Picture[I];   // geht nicht! Array ist von typ TPictureInfo
   ...
MfG
Muetze1

TeTSuO 7. Mär 2005 19:29

Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
 
hab ich dann auch rausgefunden. Trotzdem Danke!

Ich habe das jetzt anders gemacht. :thumb:

Ich habe jetzt eine Class TPicFile, dyn. Array gelöscht dafür als Eigenschaft TreeView.
Nun wird über die Class alles gemacht. neue Einträge hinzugefügt Daten an die Nodes gehängt usw.
Funktioniert problemlos und ist absolut übersichtlich im Quellcode.

Danke für eure Hilfe und Interesse


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