![]() |
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: |
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
@ alzaimar,
im allgemeinen gebe ich dir bei deinem obigen Argument recht, aber hier geht es um eine Zusatzfunktion, die normale Windows-Funktionalität nicht ersetzt sondern ergänzt (für Leute, die zusätzlichen Komfort schätzen). Wie ich weiter oben schon geschrieben habe, ist der ComboBox.Style csDropDown und nicht csDropDownList. Das bedeutet, dass der Anwender normalen Text in das ComboBox-Feld eingeben kann, ohne die DropDown-Liste aufzuklappen. Wenn dieser Style verwendet wird, ist die DropDown-Liste als zusätzliche Eingabemöglichkeit zur manuellen Eingabe zu verstehen. Die DropDown-Liste hat in diesem Fall die Funktion einer Option und nicht einer Auswahl. Der semantische Unterschied ist der gleiche wie zwischen "Können" und "Müssen". Dieser Unterschied betrifft auch die programmierte Zusatzfunktion mit der gedrückten Strg-Taste. Wenn diese für die Anwendungsfunktionalität erforderlich wäre, so wäre dies ein klarer Verstoß gegen die Richtlinien der Benutzerfreundlichkeit. So aber ist es eine nützliche Zugabe. |
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
So etwas in der Art wie die
![]() |
Re: ComboBox: Angeklickten Eintrag optional hinzufügen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 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