![]() |
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! |
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
Folgender Ansatz funktioniert leider nicht - weiß jemand warum:
Delphi-Quellcode:
Außerdem wird erstaunlicherweise bei der Aktivierung dieser beiden Ereignisse das OnChange-Ereignis deaktiviert!!!
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; |
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.
|
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
Zitat:
|
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.
|
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
Zitat:
|
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
Das ist aber nicht vorgesehen, da musst du dir eine eigene Komponente basteln
|
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; |
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
Hallo toms,
GENIAL - VIELEN DANK !!!!!! In diese Message-Tricksereien muss ich mich noch einarbeiten ... |
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 20:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz