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 1 von 2  1 2      
100nF

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

VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 20:46
Hallo,

Ich hab wiedermal ein VST-Problem

Also ich habe 2 VST auf einer Form. In der Rechten VST kann man nichts machen (Drag&Drop), man soll jedoch vom rechten VST markierte Einträge per Drag&Drop in den linken VST kopieren können. Ausserdem will ich im linken VST die Einträge innerhalb der Liste verschieben, also die Reihenfolge verändern können.
Beide Listen haben exakt die selben Eigenschaften, bis auf ein paar Ereignisse die der rechte VST zusätzlich besitzt.

Ich habe bei beiden Listen folgendes eingestellt:
Zitat:
ClipboardFormats: [Virtual Tree Data]
DragMode: dmAutomatic
DragType: dtOLE
Ich habe sehr lange rumprobiert, bis es shcliesslich (scheinbar) funktionierte:
Ach ja, Linke Liste = VST2, rechte Liste = VST1

Delphi-Quellcode:
type
  TArchiv = class(TComponent)
  private
    fFilename: String;
    fTitel: String;
    fInterpret: String;
    fAlbum: String;
    fGenre: String;
    fDauer: TTime;
    fBewertung: Integer;
    fCounter: Integer;
    fDatum: TDate;


    function getPlaylistname: String;
  published
    property Filename: String read fFilename write fFilename;
    property Titel: String read fTitel write fTitel;
    property Interpret: String read fInterpret write fInterpret;
    property Album: String read fAlbum write fAlbum;
    property Genre: String read fGenre write fGenre;
    property Dauer: TTime read fDauer write fDauer;
    property Bewertung: Integer read fBewertung write fBewertung;
    property Counter: Integer read fCounter write fCounter;
    property Datum: TDate read fDatum write fDatum;

    property Playlistname: String read getPlaylistname;

  public

end;
pArchiv = ^TArchiv;

//......

procedure TForm1.VST2DragDrop(Sender: TBaseVirtualTree; Source: TObject;
  DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
  Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  selnode: PVirtualNode;
  Archiv: TArchiv;
begin
  with Sender as TVirtualStringTree do
  begin
    selnode := VST1.GetFirstSelected;
    while Assigned(selnode) do
    begin
      Archiv := TArchiv(VST1.GetNodeData(selnode)^);
      VST2.AddChild(nil, Archiv); // Kann der Fehler vielleicht an dieser Zeile liegen?!?! Nur so ein Verdacht^^
      selnode := VST1.GetNextSelected(selnode);
    end;
  end;
end;

procedure TForm1.VST2DragOver(Sender: TBaseVirtualTree; Source: TObject;
  Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
  var Effect: Integer; var Accept: Boolean);
begin
  if source = VST1 then
    if Assigned(VST1.FocusedNode) then accept := true;
end;
Ich kann vom VST1 Einträge in den VST2 kopieren, so wie es sein soll. Jedoch gibt es beim Beenden des Programms eine Fehlermeldung.
Zitat:
Invalid pointer operation
NodeDataSize habe ich bei beiden VSTs gesetzt.

Was ist an meinem Code falsch, bzw. warum erscheint dieser Fehler?

Ausserdem habe ich keine Ahnung wie ich das rumschieben ermöglichen kann, könnt ihr mir da bisschen auf die Sprünge helfen?
Also eigentlich kann ich schon FAST Einträge rumschieben, es kommt einfach sofort ein "Invalid pointer operation"^^

Wäre echt dankbar für Antworten!

P.S. habe übrigens lange gesucht, das problem ist nur dass viele ein anderes Vorhaben haben oder dass es völlig andere Lösungsansätze gibt, wobei meiner am besten gefällt

MFG
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#2

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:20
Du kopierst den Eintrag - aber nicht die Daten.
Du hängst also den Pointer des exakt gleichen Objektes in beide Trees.

Wahrscheinlich rufen aber beide Trees in ihrem Event das die Knoten aufräumt Free auf dem Objekt auf. Das heisst Du rufst bei Kopierten Einträgen auf dem selben Objekt zweimal free auf - einmal via Tree1 und einmal über den zweiten. Beim zweiten Zugriff knallt es dann.

Du solltest entweder das Objekt kopieren, oder vorher abprüfen dass das Objekt definitiv noch existiert bevor Du es aufräumst.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#3

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:20
Schau dir mal die Demos zum VST an.
Speziell das OLE-Demo-Projekt.
Dort solltest Du fündig werden.
  Mit Zitat antworten Zitat
100nF

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

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:23
ach soo, verstehe!

Zitat:
Du solltest entweder das Objekt kopieren, oder vorher abprüfen dass das Objekt definitiv noch existiert bevor Du es aufräumst.
was wäre die bessere lösung?
ich tendiere zur zweiten weils wohl einfacher ist, aber hat es auch nachteile?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#5

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:26
Eigentlich hat Zweiteres eher Vorteile. Wenn es dasselbe Objekt ist, und Du z.B. den Text veränderst, dann betrifft das sofort beide Bäume. Ansonsten müsstest Du die Änderung zwischen beiden Objekten synchronisieren.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
100nF

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

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:35
ok das wäre natürlich sehr gut!

hab es jetzt mal so probiert:
Delphi-Quellcode:
procedure TForm1.VST1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Archiv: TArchiv;
begin
  if assigned(node) then
  begin
    Archiv := TArchiv(Sender.getnodedata(node)^);
    Archiv.free;
  end;
end;
Beiden VSTs ist dieses Ereignis zugeteilt.

Funktioniert jedoch nicht, kommt immernoch der selbe Fehler.
Wenn ich den gesamten code ausklammere, dann funktionierts!
Warum das?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#7

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:38
Der Node ist immer assigned. Aber das NodeData Objekt nicht:

Delphi-Quellcode:
procedure TForm1.VST1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Archiv: TArchiv;
begin
  if assigned(node) then
  begin
    Archiv := TArchiv(Sender.getnodedata(node)^);
    if Assigned(Archiv) then
      FreeAndNil(Archiv);
  end;
end;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
100nF

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

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 14. Jul 2008, 21:39
hmm funktioniert aber auch nicht, kommt immernoch die selbe fehlermeldung

EDIT:
ach soo, kann es sein dass wenn das erste mal freeandnil() aufgerufen wurde, dass danach dieses objekt eigentlich nicht mehr bestehen dürfte, sich jedoch noch in der zweiten liste befindet?
dann könnte ich einfach das onFreeNode Ereignis der VST2 weglassen, oder? habs getestet, funktioniert wunderbar.
Doch was würde Passieren wenn sich im VST2 noch Objekte befinden, die im VST1 nicht enthalten sind?

Ausserdem wäre ich noch froh wenn ihr mir tipps geben könnt wie ich das mit dem verschieben innerhalb von VST2 machen kann werde aber morgen nochmal daran arbeiten...
  Mit Zitat antworten Zitat
100nF

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

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 20. Jul 2008, 11:32
also ich habe es soweis mal zum laufen gebracht, ein kleines problem habe ich aber noch...

beim VST1 habe ich "DragOperations" auf [doLink] gestellt. Wenn ich also Nodes vom VST1 in den VST2 ziehe erstellt es mir im VST2 die Verknüpfungen der markierten Nodes vom VST1.
das funktioniert einwandfrai.
nun speichere ich aber beide VSTs beim beenden des Programms ab, und lade Sie beim nächsten Start wieder.
Dazu verwende ich folgende Prozeduren:
Delphi-Quellcode:
procedure TForm1.VST1SaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Archiv: TArchiv;
begin
  Archiv:=TArchiv(Sender.GetNodeData(node)^);
  Stream.WriteComponent(Archiv);
end;

procedure TForm1.VST1LoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Stream: TStream);
var
  Archiv: TArchiv;
  p: pArchiv;
begin
  Archiv:=Stream.ReadComponent(nil) as TArchiv;
  p:=sender.GetNodeData(node);
  p^:=Archiv;
end;

//zum Laden:
VST1.LoadFromFile('blabla1.bla');
VST2.LoadFromFile('blabla2.bla');
// und zum speichern:
VST1.SaveToFile('blabla1.bla');
VST2.SaveToFile('blabla2.bla');
Funktioniert auch - nur das Problem ist jetzt dass die Verknüpfungen vom VST2 zum VST1 nicht mehr vorhanden sind! Wenn ich also im VST1 ein Node verändere, dann wird es im VST2 nicht angepasst.

Und nochwas habe ich gemerkt: Wenn ich ein Node vom VST1 in den VST2 "kopiere" (doLink!) und danach diesen Node im VST1 lösche, gibts kurz darauf eine Acces violation weil ein Link dieses Nodes sich noch im VST2 befindet. Im VST2 soll dieser Node aber weiterhin bestehen bleiben!!

Also was meint Ihr, soll ich besser "DragOperations" auf [doCopy] stellen und dann "von Hand" anpassen wenn Änderungen gemacht wurden? oder gibts da eine Lösung für mein problem?

mfg

EDIT: und übrigens, es befinden sich NICHT AUSSCHLIESSLICH verknüpfungen vom VST1 im VST2! Es können sich auch "eigenständige" Nodes im VST2 befinden!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: VST: Drag/Drop funktioniert nicht ganz

  Alt 20. Jul 2008, 13:37
Hallo,

ja, ist scon doof

ich löse sowas, indem ich die Objekte in eine eigene Liste (z.B. TObjectList) eintrage.
OnFreeNode macht gar nix.

Beim Beenden des Forms wird die ObjectList "gefreed" und
löscht dann auch die Objekte.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:51 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