[gelöst] ComboBox Dropdown und BeginDrag
-
- 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
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?
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
Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
-
- 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
Hallo Forum,
vielleicht macht ein Beispiel den Sachverhalt klarer. Hier der Quellcode:
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.
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.
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
Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
-
- 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
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.
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.
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;
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)
petwey
Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
-
- 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
Hallo petwey,
ich habe dein Problem verstanden
und auch grade deine Behelfslösung ausprobiert.
Schön ist das natürlich nicht,
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.
Nach diversen Versuchen kam bei mir folgendes raus:
ich habe dein Problem verstanden
und auch grade deine Behelfslösung ausprobiert.
Schön ist das natürlich nicht,

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.

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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- 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
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
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
-
- 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
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:
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.
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;
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)
petwey
Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
-
- 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
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
schön das es geholfen hat. Ich war mir nämlich nicht sicher ob ich dein Anliegen richtig verstanden hatte.
Viele Grüße
Bernd