Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 Uhr.
Seite 1 von 2  1 2      

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