Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST: Drag/Drop funktioniert nicht ganz (https://www.delphipraxis.net/117242-vst-drag-drop-funktioniert-nicht-ganz.html)

100nF 20. Jul 2008 13:38

Re: VST: Drag/Drop funktioniert nicht ganz
 
hmm okay dann werde ich wahrscheinlich auf "DragOperations" = [doCopy] umsteigen und danndie änderungen an einem Node "von Hand" den anderen Nodes mitteilen...

Ich denke das gibt nicht allzu viel Arbeit, und eigentlich dürfte ich dann bei onFreeNode wirklich ALLE Nodes freigeben oder?!
Sind ja dann alle Nodes sozusagen eigenständig...
Werde mich gleich dransetzen und ausprobieren!

Jetzt habe ich aber schon wieder ein Problem :D
Ich will per Button-Klick ALLE Nodes in einem VST per Zufall anordnen, also wild durcheinander mischen.
Sollte ja irgendwie mit Random() möglich sein, aber ich kriegs einfach nicht hin!
Also so hab ich mal begonnen:
Delphi-Quellcode:
procedure TForm1.ShufflePlaylist;
var
  node: pVirtualNode;
  i: integer;
begin
  node := VST2.GetFirst;
  while assigned(node) do
  begin
    randomize;
    vst2.MoveTo(node, was jetzt???);
    node := VST2.GetNext(node);
  end;  
end;
Jedoch geht das schonmal theoretishc nicht, da sich "Node" ja dann selber verschieben würde, und bei GetNext(node) ein Node an einem ganz anderen ort aufgerufen wird, sprich: die schlaufe bearbeitet nicht ein Node nach dem anderen ab!

Ausserdem will ich ja Nodes verschieben, doch bei MoveTo() brauch ich ja das "TargetNode" welches ich nicht habe. Und ein VST.GetNodeAtIndex(25) gibts ja leider nicht.

Habt Ihr mir da vielleicht irgendwelche Lösungsansätzt :?:

Erich07 27. Nov 2009 20:04

Re: VST: Drag/Drop funktioniert nicht ganz
 
Hab ein ähnliches Problem. Verwende die OLE-Demo als Vorlage und arbeite mit Objects und nicht mit Records.
Verschieben per DragDrop funktioniert bestens, beim kopieren sind die Daten weg.

Delphi-Quellcode:
  PNodeDataBasic = ^TNodeDataBasic;
  TNodeDataBasic = class
    Caption : string;
  end;

  NodeDataGroup = ^TNodeDataGroup;
  TNodeDataGroup = class(TNodeDataBasic)
    Filename : string;
  end;

  NodeDataFile = ^TNodeDataFile;
  TNodeDataFile = class(TNodeDataGroup)
    Status : integer;
    List   : TStringList;
  end;

  NodeDataTest = ^TNodeDataTest;
  TNodeDataTest = class(TNodeDataBasic)
    Nr    : integer;
    Count : integer;
    List  : TStringList;
  end;
Auch bei Rocords mit Objects besteht dieses Problem.

Delphi-Quellcode:
  PNodeData = ^TNodeData;
  TNodeData = record
    Caption: String;
    List: TStringList;
    Daten:string;
  end;
Wie werden die einzelen Knoten mit den Daten kopiert? Muss ich da LoadNode und SaveNode oder sonst noch was füttern.

Erich

generic 28. Nov 2009 00:39

Re: VST: Drag/Drop funktioniert nicht ganz
 
Die Daten sind weg (oder es kann zu Problemen kommen) wenn du in deinen Records Dinge ablegst, welche Zeiger nutzen.
z.B. lange Strings, Objekte, Zeigertypen etc.

Erich07 28. Nov 2009 08:48

Re: VST: Drag/Drop funktioniert nicht ganz
 
Zitat:

Die Daten sind weg (oder es kann zu Problemen kommen) wenn du in deinen Records Dinge ablegst, welche Zeiger nutzen.
z.B. lange Strings, Objekte, Zeigertypen etc.
Auf die Schnelle hab ich <List:TStringList> durch <List:string> ersetzt und muss nun jedesmal das entsprechende Element innerhalb des strings suchen.
Das Kopieren bei Drag and Drop funktioniert jetzt.
Die Daten musste ich allerdings streamen.
Delphi-Quellcode:
// Stream ----------------------------------------------------------------------
procedure TMainForm.vstLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Data: PNodeData;
  Len: Integer;
begin
 Data := Sender.GetNodeData(Node);
 if not assigned(Data) then exit;
 MemoMsg('LoadNode:'+Data^.Caption);

 Stream.Read(Data^.ID, SizeOf(Data^.ID) );                 //ID
 Stream.Read(Data^.ImageIndex, SizeOf(Data^.ImageIndex) ); //ImageIndex
 Stream.Read(Data^.NodeType, SizeOf(Data^.NodeType) );     //NodeType
 Stream.Read(Data^.Status, SizeOf(Data^.Status) );         //Status
 Stream.Read(Data^.Nr, SizeOf(Data^.Nr) );                 //Nr

 Stream.Read(Len, SizeOf(Len));                            //Caption
 SetLength(Data^.Caption, Len div 2);
 Stream.Read(Data^.Caption[1], Len);

 Stream.Read(Len, SizeOf(Len));                            //Data
 SetLength(Data^.Data, Len div 2);
 Stream.Read(Data^.Data[1], Len);

end;

procedure TMainForm.vstSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Data: PNodeData;
  Len: Integer;
begin
 Data := Sender.GetNodeData(Node);
 if not assigned(Data) then exit;
 MemoMsg('SaveNode:'+Data^.Caption);

 Stream.Write(Data^.ID, SizeOf(Data^.ID) );                //ID
 Stream.Write(Data^.ImageIndex, SizeOf(Data^.ImageIndex) ); //ImageIndex
 Stream.Write(Data^.NodeType, SizeOf(Data^.NodeType) );    //NodeType
 Stream.Write(Data^.Status, SizeOf(Data^.Status) );        //Status
 Stream.Write(Data^.Nr, SizeOf(Data^.Nr) );                //Nr

 Len := Length(Data^.Caption) * 2;                         //Caption
 Stream.Write(Len, SizeOf(Len) );
 Stream.Write(Data^.Caption[1], Len);

 Len := Length(Data^.Data) * 2;                            //Data
 Stream.Write(Len, SizeOf(Len) );
 Stream.Write(Data^.Data[1], Len);

end;
Das kann es doch nicht sein! Es gibt bestimmt einen eleganten Weg.
Bei "OnDragDrop" gibt es doch "DataObject: IDataObject". Mit diesem müsste sich doch was machen lassen.
Ich hab keine Ahnung wie das geht.

Erich


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

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