VST-Linux Drag&Drop benötigt ActiveX

Rund um die LCL und andere Komponenten
Antworten
hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

VST-Linux Drag&Drop benötigt ActiveX

Beitrag von hubblec4 »

Hallo Lazarusgemeinde

Ich möchte gerne ein VirtualStringTree(VST) unter Linux nutzen.
Dazu gibt es eine Funktion für das verschieben der Nodes mittels Drag&Drop (läuft unter Windoof bestens).
In der Procedure "OnDragDrop" im VST steckt ein Parameter

Code: Alles auswählen

DataObject: IDataObject;
Der Type "IDataObject" ist in der Unit ActiveX declariert, nur leider lässt sich diese Unit unter Linux nicht verwenden.

Was kann ich tun?

Gibt es eine Möglichkeit dieses ActiveX auch unter Linux zu aktivieren?
Oder müsste ich sonst für Linux das mit dem Drag&Drop anders angehen(andere Proceduren nutzen die kein ActiveX brauchen)?
Oder müsste ich dann ganz auf den Drag&Drop Support verzichten?

hubble
Zuletzt geändert von hubblec4 am Fr 8. Apr 2016, 23:14, insgesamt 2-mal geändert.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von hubblec4 »

Hab noch mal ein neues Projekt angelegt und da wird die unit

Code: Alles auswählen

FakeActiveX
eingebunden.

Sollte jetzt klappen.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von hubblec4 »

Doch etwas zufrüh gefreut.

Also das einbinden der FakeActiveX unit klappt und es kann die "OnDragDrop" procedure eingebunden werden.

Allerdings wird kein Drag&Drop ausgelöst.
Die procedure "OnDragAllowed" startet und dort wird Allowed auf true gesetzt.
Allerdings kann ich keinen node verschieben.
Ein Haltepunkt in der ersten Zeile der OnDragDrop procedure bringt mich leider nicht weiter, da dort beim debuggen nicht anhgehalten wird.
Ich vermute mal das diese procedure gar nicht aufgerufen wird. - Sollte sie aber, oder?
(gleicher code unter windows funktioniert)

Kennt sich einer mit Drag&Drop unter Linux aus? (Im netz bin ich nicht so recht fündig geworden)

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von theo »

Weiß nicht was du genau machst.
Ich habe im "demos" Verzeichins ein "dragdrop" Projekt und das läuft unter Linux einwandfrei.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von wp_xyz »

theo hat geschrieben:Ich habe im "demos" Verzeichins ein "dragdrop" Projekt und das läuft unter Linux einwandfrei.
Dieses Demo-Projekt hat, falls man die 4.8-Version verwendet, übrigens ein Speicherleck, weil die im NodeData-Record verwendeten Strings nicht freigegeben werden.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von hubblec4 »

Also ich mache eingentlich nichts weiter als mit der Maus einen Node auswählen, welcher dann verschoben werden kann.

Das VST wird erst zur Laufzeit und bei bestimmten aktionen erzeugt.
(Macht es einen unterschied ob im RAD hinzugefügt oder zur Laufzeit erstellt) Wie gesagt unter windows kein ding.
Ich habe gedacht es könnte vll an dem DragType liegen und habe den im Quellcode für Linux auf "dtVCL" umgestellt und siehe da es funktioniert.

Weis aber jetzt noch nicht ob ich mir damit irgendwelche späteren Drag&Drop operationen verbaue?

In meiner onDragDrop procedure steht eigentlich nichts wildes drinne

Code: Alles auswählen

// onDragDrop
procedure TOGGTab.VST_DragDrop(Sender: TBaseVirtualTree; Source: TObject;
 DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
 const Pt: TPoint; var Effect: LongWord; Mode: TDropMode);
var
  node_Source, node_Target: PVirtualNode;
  attMode: TVTNodeAttachMode;
  i : Integer;
begin
(* Ablaufplan
 - Source Node = NodeFocused , Target Node = DropTargetNode
 - Abbruch wenn Source und Target gleich sind
 - DropMode auswerten - attach Mode ermitteln
 - Node verschieben
 *)
  node_Source:=(Source as TVirtualStringTree).FocusedNode;
  node_Target:=Sender.DropTargetNode;
 
  if node_Source = node_Target then    // Abbruch wenn beide gleich sind
  Exit;
 
 
  case Mode of    // DropMode auswerten
    dmNowhere:    // nirgendwo = target node = nil
     begin// im VST-code wird bei target_node=nil immer attMode=amAddChildFirst
      // ausgelöst. Daher wird der letzte Node genommen  und attMode=amInsertAfter
      node_Target:=Sender.GetLast(); // letzten Node im VST zuweisen
      attMode:=amInsertAfter;
     end;
 
    dmAbove: attMode := amInsertBefore;
    dmBelow: attMode := amInsertAfter;
 
    dmOnNode:         // Drop direkt auf einen node - kein nested node erzeugen
     begin
      if node_Source^.Index > node_Target^.Index then
      attMode:=amInsertBefore
      else
      attMode:=amInsertAfter;
     end;
 
  end;
 
  Sender.MoveTo(node_Source, node_Target, attMode, False); // Node verschieben
end;
Unter Linux ruft er mir die procedure nicht auf (Linux ist frisch aufgesetzt neustes FPC und Lazarus)

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von hubblec4 »

Ich frage mich eben ob ich ein neues Thema aufmachen soll, denn ich habe weitere unklarheiten zwischen Linux(Ubuntu) und windows gefunden.

Ich habe da zwei normale Popupmenus für das VST, eines ist für den Header(ich nutze nicht das VST-Header-Popupmenu).

Unter Windows funktioniert alles so wie erwartet.
Beim Header-rechtsklick kommt das Headerpopup und im VST das andere. Es sieht für mich auch so aus als ob die Popups beim MouseUP erst angezeigt werden)
Unter Ubuntu wird mir als erstes nur das VST-Popup angezeigt auch wenn ich auf den Header klicke.
Das ganze sieht dort für mich so aus als wenn das Popup beim MouseDown ausgelöst wird.
(Wenn ich das VST-popup auf nil setze kann ich auch das Header-popup benutzen)
Weiterhin wird beim VST-Popup-Aufruf die Drag&Drop Events ausgelöst -> was ja auch irgendwie stimmt, denn diese werden mit dem MouseDOwn aktiviert.

Alles sehr eigenartig.

hubblec4
Beiträge: 347
Registriert: Sa 25. Jan 2014, 17:50

Re: VST-Linux Drag&Drop benötigt ActiveX

Beitrag von hubblec4 »

theo hat geschrieben:Weiß nicht was du genau machst.
Ich habe im "demos" Verzeichins ein "dragdrop" Projekt und das läuft unter Linux einwandfrei.

Habe mir eben mal dieses Demo zur Brust genommen.
Dort ist auch der DragType auf dtVCL eingestellt, stellt man ihn auf dtOLE hat man ebenfalls kein DragDrop mehr. Zusätzlih ist DragMode auf dmAutomatic eingestellt (bei mir rot dargestellt (im Objektinspetor), also nicht standard)

Weiterhin ist mein VST bei den SelectOption "toRightClickSelected" auf true gesetzt.
Auch im Demo wird beim aufpoppen des Popups das DragDrop ausgelöst (wenn man im Popup was anklickt hat man plötzlich den FocusedNode in der hand und kann ihn verschieben)

Ebenso ist im Demo nur das VST-Popup aufrufbar, das Header-Popup erscheint nie.

Antworten