Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ComboBox: Angeklickten Eintrag optional hinzufügen (https://www.delphipraxis.net/120630-combobox-angeklickten-eintrag-optional-hinzufuegen.html)

PeterPanino 13. Sep 2008 23:38


ComboBox: Angeklickten Eintrag optional hinzufügen
 
Hallo, ich möchte eine ComboBox mit folgendem Verhalten:

Wenn beim Klick auf einen Eintrag der ComboBox-DropDown-Liste die Strg-Taste gehalten wird, so ersetzt der angeklickte Eintrag nicht einen im ComboBox-Feld bereits bestehenden Text, sondern wird zu diesem hinzugefügt (mit einem Leerzeichen dazwischen).

Dazu bräuchte ich das Ereignis, wenn auf die ComboBox-DropDown-Liste geklickt wird, das den geklickten Eintrag liefert - gibt es aber nicht. Oder ein Ereignis, das kurz vor dem Einfügen des angeklickten Eintrages auftritt.

Wer hat eine Idee? Vielen Dank im Voraus!

PeterPanino 14. Sep 2008 00:36

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Folgender Ansatz funktioniert leider nicht - weiß jemand warum:

Delphi-Quellcode:
var
  OldComboText: string;

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
  MessageDlg('OnCloseUp: ' + ComboBox1.Text, mtInformation, [mbOK], 0); // alter Text
  OldComboText := ComboBox1.Text;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  MessageDlg('OnSelect: ' + ComboBox1.Text, mtInformation, [mbOK], 0); // neuer Text
  ComboBox1.Text := OldComboText + ' ' + ComboBox1.Text; // funktioniert nicht!!
end;
Außerdem wird erstaunlicherweise bei der Aktivierung dieser beiden Ereignisse das OnChange-Ereignis deaktiviert!!!

Luckie 14. Sep 2008 02:23

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Ich habe ehrlich gesagt nicht ganz verstanden, was du eigentlich erreichen willst. Für eine Mehrfachauswahl ist eine Comobox nicht ausgelegt.

Dunkel 14. Sep 2008 02:34

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Zitat:

Zitat von Luckie
Ich habe ehrlich gesagt nicht ganz verstanden, was du eigentlich erreichen willst. Für eine Mehrfachauswahl ist eine Comobox nicht ausgelegt.

Ich habe es verstanden und habe auch versucht, das Problem zu lösen. Irgendwo in den Tiefen der VCL habe ich dann aufgegeben. Eine TComboBox ist nicht ohne tiefere Eingriffe dafür geeignet.

Luckie 14. Sep 2008 02:38

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Na da wird sich der Benutzer aber wundern. Also eine Mehrfachauswahl bei einer Combobox ist nicht sehr benutzer freundlich.

PeterPanino 14. Sep 2008 03:48

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Zitat:

Zitat von Luckie
Na da wird sich der Benutzer aber wundern. Also eine Mehrfachauswahl bei einer Combobox ist nicht sehr benutzer freundlich.

Es geht nicht um eine Mehrfachauswahl, sondern darum, dem Text im ComboBox-Feld den ausgewählten Eintrag hinzuzufügen. (ComboBox.Style ist csDropDown und nicht csDropDownList).

mkinzler 14. Sep 2008 09:03

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Das ist aber nicht vorgesehen, da musst du dir eine eigene Komponente basteln

toms 14. Sep 2008 09:29

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Hallo,

Die Schwierigkeit ist, dass im OnCloseUp Ereignis der ComboBox Text nicht verändert werden kann,
da sobald OnCloseUp abgearbeitet wurde, der Text gesetzt wird.
Mit einem kleinen Trick lässt sich dies umgehen.

Es wird eine benutzerdefinierte Nachricht (WM_AFTERCBCLOSEUP) nach dem OnCloseUp per PostMessage der Combobox geschickt.
Übergeben wird der alte Text der ComboBox und eine Referenz auf die Combobox.

Das könnte dann etwa so aussehen:

Delphi-Quellcode:
const
  WM_AFTERCBCLOSEUP = WM_USER + 123;
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure ComboBox1CloseUp(Sender: TObject);
  private
    { Private declarations }
    procedure WMAfterCBCloseUp(var Msg: TMessage); message WM_AFTERCBCLOSEUP;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CtrlDown: Boolean;
var
  State: TKeyboardState;
begin
  GetKeyboardState(State);
  Result := ((State[VK_CONTROL] and 128) <> 0);
end;

procedure TForm1.ComboBox1CloseUp(Sender: TObject);
var
  p: PChar;
begin
  if CtrlDown then // falls Ctrl gedrückt
  begin
    P := StrAlloc(Length((Sender as TComboBox).Text)+1);
    StrCopy(P, PChar((Sender as TComboBox).Text));
    PostMessage(Handle, WM_AFTERCBCLOSEUP, Integer(P), Integer(Sender));
  end;
end;

procedure TForm1.WMAfterCBCloseUp(var Msg: TMessage);
var
  s : string;
  p : PChar;
begin
  P := PChar(Msg.WParam);
  s := string(P);
  StrDispose(P);
  with TComboBox(Msg.LParam) do
    Text := s + ',' + Items[ItemIndex];
end;

PeterPanino 14. Sep 2008 13:42

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Hallo toms,

GENIAL - VIELEN DANK !!!!!!

In diese Message-Tricksereien muss ich mich noch einarbeiten ...

alzaimar 14. Sep 2008 13:49

Re: ComboBox: Angeklickten Eintrag optional hinzufügen
 
Goil :twisted:
Immer schön -NICHT- Windows-konform programmieren, damit wir auch garantiert lange Einarbeitungszeiten und überflüssige "Bei Programm XYZ geht das aber, wieso nicht hier?" oder ständige "Wie ging denn das nochmal mit der Mehrfachauswahl" Kundenanfragen bekommen. Dammich!

Verwende eine Checklistbox. Dann ist für den Anwender eindeutig klar, was zu tun ist. Und Windows-konform ist es auch.

Leute, ihr sollt keine Ctrl-Shift-Alt-Hinter-dem-Rücken-Gekreuzt-außer-Dienstags-Sonderfunktionen implementieren, sondern klare einfach zu verstehende Dialoge, die man ohne Nachfragen bedienen kann.

Obwohl die Lösung schon mal echt nett ist. @toms: :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 Uhr.
Seite 1 von 2  1 2      

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