Windows: Markieren mit der Maus bei D&D

Rund um die LCL und andere Komponenten
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 370
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Windows: Markieren mit der Maus bei D&D

Beitrag von Ich934 »

Hallo,

folgendes Problem tritt nur unter Windows auf. Unter Linux geht es ohne Probleme und auch in Wine.

- Projekt erstellt und einfach eine TEdit rein gezogen (ggf. Text angepasst damit man etwas zum testen hat)
- Programm starten und dann mit der Maus Text markieren
=> funktioniert

DragMode vom TEdit auf dmAutomatic stellen und das gleiche nochmals versuchen.
=> es wird hier sofort in den D&D Modus gegangen
=> gewünscht ist erst mal ein markieren und nur wenn ich das rüber in ein anderes Feld ziehe D&D

Wie gesagt geht das unter Linux (GTK und QT6) sowie in Wine problemlos und wie gewünscht. Jemand hier eine Idee, wie ich das lösen kann?
Tipp für PostgreSQL: www.pg-forum.de

Mathias
Beiträge: 6927
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Windows: Markieren mit der Maus bei D&D

Beitrag von Mathias »

Wie ist deine Window Version von deinem Programm kompiliert ?
WinAPI, GTK2 oder QT6 ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Ich934
Lazarusforum e. V.
Beiträge: 370
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Windows: Markieren mit der Maus bei D&D

Beitrag von Ich934 »

Windows ist direkt Windows. Kein anderes Widget-Set.
Dateianhänge
project1.zip
(94.71 KiB) 103-mal heruntergeladen
Tipp für PostgreSQL: www.pg-forum.de

Soner
Beiträge: 732
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Windows: Markieren mit der Maus bei D&D

Beitrag von Soner »

Was willst du denn d&d, den Text von TEdit oder TEdit selber?
Win32-UI unterstützt kein Text d&d von TEdit und und TMemo.
Der Erffekt den du gesehen hast ist ganz normal für Win32-UI.
Suche für Text-d&d nach drag-n-drop
Komponente bei OPM. Ich weiß aber nicht, ob die auch mit portiert wurden.

Ich934
Lazarusforum e. V.
Beiträge: 370
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Windows: Markieren mit der Maus bei D&D

Beitrag von Ich934 »

Ich möchte

a) D&D zwischen verschiedenen Komponenten (funktioniert)
b) Die Möglichkeit, den Text auch mit der Maus zu markieren (funktioniert unter Linux und in Wine)

Die Frage ist, geht das auch, muss ich hier ggf. etwas auf eine andere Art und Weise umsetzen etc.

Ich habe hier ein Programm, das mit Delphi geschrieben ist. Leider hab ich keine Sourcen, um das nachzuschauen. Da funktioniert beides. Es kann aber sein, dass hier D&D manuell realilsiert wurde. Deswegen meine Frage.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 375
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Windows: Markieren mit der Maus bei D&D

Beitrag von Jorg3000 »

Hi!
Ich habe ein bisschen experimentiert und es hinbekommen. :)
Das Dragging muss mit der rechten Maustaste gemacht werden, weil der Linksklick sofort die Textmarkierung zunichte macht.

In der TForm-Definition müssen folgende Variable und Prozeduren deklariert werden ...

Code: Alles auswählen

TForm1 = class(TForm)
   private
    DraggedText: String;
    procedure SrcControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure DestControlDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
    procedure DestControlDragDrop(Sender, Source: TObject; X, Y: Integer);
  end;
... die wie folgt ausprogrammiert sind ...

Code: Alles auswählen

procedure TForm1.SrcControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Sender is TCustomEdit then               // TEdit & TMemo => TCustomEdit
    if TCustomEdit(Sender).SelLength>0 then
      begin
       self.DraggedText:=TCustomEdit(Sender).SelText;
       TCustomEdit(Sender).BeginDrag(false);
      end;
end;

procedure TForm1.DestControlDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  {var} Accept := self.DraggedText <> '';
end;

procedure TForm1.DestControlDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if self.DraggedText <> '' then
    begin
     if Sender is TCustomEdit then
       begin
        TCustomEdit(Sender).Text := DraggedText;
        // TCustomEdit(Sender).SelText := '';  // optional: Ausschneiden
       end;
     DraggedText := '';
    end;
end;
Und letztlich müssen bei den betroffenen Edit/Memo-Feldern die Event-Handler zugewiesen werden.
Hier Edit1 als Quelle (Feld dessen Inhalt gezogen werden kann) und Edit2 als Ziel.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.OnMouseDown := @self.SrcControlMouseDown;

  Edit2.OnDragOver := @self.DestControlDragOver;
  Edit2.OnDragDrop := @self.DestControlDragDrop;
end;
Grüße, Jörg

Soner
Beiträge: 732
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Windows: Markieren mit der Maus bei D&D

Beitrag von Soner »

Ich934 hat geschrieben: Di 20. Mai 2025, 07:42 Ich möchte

a) D&D zwischen verschiedenen Komponenten (funktioniert)
b) Die Möglichkeit, den Text auch mit der Maus zu markieren (funktioniert unter Linux und in Wine)

Die Frage ist, geht das auch, muss ich hier ggf. etwas auf eine andere Art und Weise umsetzen etc.

Ich habe hier ein Programm, das mit Delphi geschrieben ist. Leider hab ich keine Sourcen, um das nachzuschauen. Da funktioniert beides. Es kann aber sein, dass hier D&D manuell realilsiert wurde. Deswegen meine Frage.
Dann würde ich D&D unter Windows nicht automatisch sondern manuell machen, weil du sonst nur Probleme bekommst. Du kannst D&D manuell starten sobald Mauszeiger von TEdit x/y-Koordinaten weiter bewegt hat, so hatte ich damals bei TreeView-Knoten gemacht.

Antworten