![]() |
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 |
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... ![]() ...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: |
Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
Noch ein Hinweis zum Code von Muetze:
Zitat:
|
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:
muss das jetzt so machen :oops:
var PicInfo: PPictureInfo;
... New(PicInfo); PicInfo:=Picture[I]; // geht nicht! Array ist von typ TPictureInfo ...
Delphi-Quellcode:
Oder gibt es da auch ne andere Lösung?
Procedure FillPicInfo(var pInfo: PPictureInfo;tInfo: TPictureInfo);
Begin pInfo.Picture:=tInfo.Picture; pInfo.Text:=tInfo.Text; ... End; 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 |
Re: Was stimmt hier nicht ? Probleme mit Pointer und dyn. Ar
Moin!
Warum du auch immer noch das Array behälst? Ansonsten:
Delphi-Quellcode:
MfG
var PicInfo: PPictureInfo;
... New(PicInfo); PicInfo^ := Picture[I]; // geht nicht! Array ist von typ TPictureInfo ... Muetze1 |
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:10 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