![]() |
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:
and das TreeNode gehängt
TreeNode.Data := @Array[Index]
Wenn ich nun ein Element auswähle und dieses mit
Delphi-Quellcode:
löschen will verschwindet es zwar in dem TreeView
DeletePicture(TreeView.Selected.Data);
TreeView.Selected.Delete; 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; |
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];
|
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:
Vielleicht jetzt verständlicher !
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; |
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:
(Wie man die reservierten Wörter schreibt, ist mir eigentlich egal)
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; Mich würde aber eher interessieren, ob meine Vermutung stimmt :wink: . |
Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
Wenn ich im debugger schaue
Delphi-Quellcode:
ist picture[I] gefüllt mit den werten von Picture[I+1].
Picture[I] := Picture[I+1];
kann es sein das das Treeview beim löschen eines Nodes irgendwas mit der Data-Eigenschaft macht |
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 |
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 |
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 |
Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
Zitat:
|
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:
Der Code ist so mal schnell hingeklatscht, aber sollte das wichtige und wesentliche darlegen...
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; MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz