[gelöst] ComboBox Dropdown und BeginDrag

Rund um die LCL und andere Komponenten
Antworten
petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

[gelöst] ComboBox Dropdown und BeginDrag

Beitrag von petwey »

Hallo Forum,

hab ein kleines Problem. Ich möchte den Textinhalt einer ComboBox auf ein SynEdit ziehen. Das klappt auch soweit. Ich hab dazu die Anweisungen aus:
https://wiki.freepascal.org/Drag_and_Dr ... _Formulars
benutzt.

Aber die Dropdown-Liste der ComboBox bleibt nicht offen, weil durch BeginDrag die ComboBox denkt ich wolle den Inhalt verschieben.

Wie lassen sich beide Funktionalitäten (Auswahl aus der Liste, Drag and Drop des Textes) realisieren?
Zuletzt geändert von petwey am Mo 24. Apr 2023, 08:26, insgesamt 1-mal geändert.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: ComboBox Dropdown und BeginDrag

Beitrag von petwey »

Hallo Forum,

vielleicht macht ein Beispiel den Sachverhalt klarer. Hier der Quellcode:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    Memo1: TMemo;
    procedure ComboBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.ComboBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
    ComboBox1.BeginDrag(False);
end;

procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source is TComboBox then
    Memo1.Lines.Add(TComboBox(Source).Text);
end;

procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if Source is TComboBox then
    Accept := True;
end;

end.
und im Anhang das gezippte Projekt.

Vielleicht hat ja jemand mal das gleiche Problem gehabt. Mir fehlt momentan die Idee wie man beides lösen kann.
Bitte um Hilfe.
Dateianhänge
project1.zip
(2.79 KiB) 58-mal heruntergeladen
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: ComboBox Dropdown und BeginDrag

Beitrag von petwey »

Hallo Forum,

ich hab eine Lösung gefunden mit der ich leben kann, allerdings wäre mir ein unauffälligeres Verhalten lieber gewesen.

Ich statte meine ComboBox mit einem Hint aus, der dem User sagt, dass er für drag 'n' drop die STRG gedrückt halten muss und wandle mein MouseDown-Event so um, dass drag 'n' drop nur dann anspringt wenn STRG gedrückt ist und die linke Maustaste gedrückt wird.

Code: Alles auswählen

procedure TForm1.ComboBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Button = mbLeft) and (ssCtrl in Shift) then
    ComboBox1.BeginDrag(False);
end;
Das wäre auch ein Lösungsansatz, wenn man aus einer Listbox mit Multiselect ein drag 'n' drop irgendwohin ausführen möchte.

Wie gesagt, vielleicht gibt es ja noch andere, elegantere Wege, deshalb lass ich den Beitrag noch offen.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

siro
Beiträge: 761
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ComboBox Dropdown und BeginDrag

Beitrag von siro »

Hallo petwey,
ich habe dein Problem verstanden
und auch grade deine Behelfslösung ausprobiert.
Schön ist das natürlich nicht, :roll:
aber ehrlich gesagt habe ich da jetzt auch keine andere Lösung für.
Man muss quasi vorher einen Eintrag auswählen und danach
mit gehaltener Control Taste den Eintrag rein ziehen.
Halte ich aber vorher die CTRL Taste fest, klappt die Combobox gleich wieder zu.
Ich kann aber auch händisch etwas in die Combobox eintragen und so
ins Fenster reinziehen. Das funktioniert auch mit CTRL
Hm.....
Da sollte es vermutlich noch etwas anderes geben.
Ich wollte zumindest, dass Du weisst, dass dein Beitrag auch gelesen wird. :wink:

Nach diversen Versuchen kam bei mir folgendes raus:

Code: Alles auswählen

procedure TForm1.ComboBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if (Button = mbLeft) and NOT ComboBox1.DroppedDown then
    ComboBox1.BeginDrag(FALSE);
end;   
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: ComboBox Dropdown und BeginDrag

Beitrag von wennerer »

Hallo petwey,
ich habe es zuerst nicht verstanden was du meinst, weil unter Linux kann ich das Verhalten so nicht feststellen. Jetzt hab ich es unter Win8 getestet und dort klappt die Combobox wie von dir bechrieben sofort wieder zu. So richtig weiß ich noch nicht was dein Ziel ist aber das angehängte Projekt funktioniert bei mir unter Win8. Vielleicht hilfts?

Viele Grüße
Bernd
Dateianhänge
DragDropCompobox.zip
(4.04 KiB) 61-mal heruntergeladen

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: ComboBox Dropdown und BeginDrag

Beitrag von petwey »

Hallo siro, hallo wennerer,

Danke für Eure Antworten.

@wennerer

Dieser Code-Schnipsel ist genau das was ich gesucht habe. Ich bin so frei die entsprechende Passage von dir hier zu posten:

Code: Alles auswählen

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
 ComboBox1.DragMode:= dmAutomatic;
end;

procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
 ComboBox1.DragMode:= dmManual;
end;

// Dieser Code hat dazu geführt, dass die Dropdown-Liste gleich wieder eingeklappt wurde,
// deshalb, ist er hier auskommentiert!!!!
//procedure TForm1.ComboBox1MouseDown(Sender: TObject; Button: TMouseButton;
//  Shift: TShiftState; X, Y: Integer);
//begin
//  if Button = mbLeft then
//    ComboBox1.BeginDrag(False);
//end;
Vielleicht sollte man das Beispiel mit in die Anleitung aufnehmen:
https://wiki.freepascal.org/Drag_and_Drop/de

Da Du nach dem Hintergrund gefragt hast:
1. Mein Beispiel diente nur zur Anschauung. Den Style der ComboBox kann man wenn gewünscht anpassen, so dass nur ausgewählt werden kann.
2. Stell Dir vor Du brauchst für was Spezielles ein paar Kommandos mit Parametern die individuell zusammengestellt werden und wie eine Batch abgearbeitet werden. Diese Anweisungen stehen zeilenweise in einem Memo oder SynEdit. Zum Editieren wäre es für den Anwender schön vorhandene Kommandos / Variablen aus einer Liste zu wählen und in den Editor zu ziehen. Das soll bei mir geschehen.

ACHTUNG: Nachdem ich den Code bei mir eingebaut habe, hat er prompt nicht funktioniert! Der Grund der Style der Combobox muss auf csDropDown stehen und bei mir war csDropDownList eingestellt.

Damit ist für mich das Problem gelöst.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

wennerer
Beiträge: 609
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: [gelöst] ComboBox Dropdown und BeginDrag

Beitrag von wennerer »

Hi,
schön das es geholfen hat. Ich war mir nämlich nicht sicher ob ich dein Anliegen richtig verstanden hatte.

Viele Grüße
Bernd

Antworten