AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VST: Drag/Drop funktioniert nicht ganz

Ein Thema von 100nF · begonnen am 14. Jul 2008 · letzter Beitrag vom 28. Nov 2009
Antwort Antwort
Seite 2 von 2     12   
100nF

Registriert seit: 7. Nov 2004
639 Beiträge
 
#11

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 20. Jul 2008, 13:38
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
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
  Mit Zitat antworten Zitat
Erich07

Registriert seit: 1. Mär 2007
4 Beiträge
 
#12

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 27. Nov 2009, 20:04
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
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#13

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 28. Nov 2009, 00:39
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Erich07

Registriert seit: 1. Mär 2007
4 Beiträge
 
#14

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 28. Nov 2009, 08:48
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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