![]() |
Listbox mit Untermenüverhalten?
Hallo,
ich suche eine Art Listboxkomponente, die sich aber wie ein Untermenü verhält. Also Cursorsteuerung, Click, Enter und auch shortcuts (Alt+"unterstrichener Buchstabe") für die Listboxeinträge. (Evtl. auch das Überspringen bestimmter Einträge.) Kennt jemand so was? Oder muss ich das selber basteln? Gruß Matthias |
Re: Listbox mit Untermenüverhalten?
Hallo Matthias,
die normale ListBox erfüllt eigentlich schon alle deine Anforderungen. Statt über einen beliebigen Hotkey wird ein Eintrag durch zügiges Eintippen seiner ersten Zeichen lokalisiert. HotKeys wie im MenuItem fände ich eher irritierend, aber auch das ist über OnKeyPress() in Verbindung mit OnDrawItem() leicht machbar. Grüße vom marabu |
Re: Listbox mit Untermenüverhalten?
Hallo,
hmm, ja, teilweise geht es so. Das OwnerDraw habe ich gemacht. Wie kriegt man ihn denn dazu, die ganze Zeile zu markieren und keinen Markierungsrahmen um die ganze Zeile zu zeichnen und nur den Text mit einem anderen Hintergrund zu markieren? Und dann bleibt noch ein Problem mit dem Cursor- und Mausverhalten. Beim Menü klickt man den Punkt nur einmal an und er wird abgearbeitet. Mit den Pfeiltasten bewegt man sich im Menü und erst nach <Enter> wird der Punkt ausgeführt. Zuerst dachte ich (natürlich) an ObClick der Listbox. Aber das wird auch bei den Pfeiltasten ausgelöst - jedenfalls bei mir. So geht es also nicht. Schön wäre es aber! Was tun? Gruß Matthias |
Re: Listbox mit Untermenüverhalten?
Hallo,
den Hintergrund einer Zeile musst du mit FillRect() malen - schau mal hier: ![]() Falls deine Zeilen unterschiedliche Höhen brauchen, dann findest du hier ein Beispiel: ![]() Allgemein: MenuItems gehören zur Kategorie der Action-Controls, eine ListBox ist ein Data-Control. Natürlich lässt sich Code an den Wechsel des selektierten Items in der ListBox koppeln, aber wenn es dir mehr um die Auslösung einer Aktion geht, dann nimm besser ein Action-Control dazu: TMenuItem, TButton, ... alles woran du eine TAction knüpfen kannst. Freundliche Grüße |
Re: Listbox mit Untermenüverhalten?
Hallo,
vielen, vielen Dank! Ich hatte das gestern Abend noch hinbekommen. Das ist soein "interner Fehler" von mir. Ich denke immer, auch bei OwnerDraw malt der ales, was man nicht selber macht. Ein echter Irrtum! Da muss man ja wirklich alles selber machen. Auch das mit dem OnClick habe ich hinbekommen. Ich teste im On Click einfach mit GetAsyncKeyState auf die Tasten ab. Stellen sich natürlich auch wieder 2 Fragen: 1. Ist das nun Bug oder Feature, dass OnClick auf Tasten reagiert? 2. Kann man prinzipiell (nicht nur OnClick und spezielle Tasten) überprüfen, ob das Ereignis von der Tastatur oder der Maus ausgelöst wurde? (Es ist ziemlich mühsam, bei Bedarf alle Tasten neinzeln auszuschließen und dürfte auch ei Zeitproblem bei 50 Tasten werden!) Und, weil ich gerade dabei bin, noch 2 Fragen: 3. Welchen Font nimmt eigentlich ein Untermenü? Wenn man den Font vom Formular ändert, dann ändert sich die Schrift im horizontalen Hauptmenü. In den aufklappenden Untermenüs bleibt sie aber. 4. Wie kann man den Font in den Untermenüs ändern? (Will ich gar nicht, ist blosses Interesse, ob das geht.) Aber das hat schon nichts mehr mit der Listbox speziell zu tun. Mal sehen... Ich suche... Gruß Matthias |
Re: Listbox mit Untermenüverhalten?
Guten Morgen Matthias,
Zitat:
Zitat:
Delphi-Quellcode:
Deine beiden anderen Fragen kann man zusammenfassen:
type
TDemoForm = class(TForm) // ... private MouseIsDown: Boolean; ListBoxKey: Char; end; procedure TDemoForm.ListBoxMouseUpDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MouseIsDown := not MouseIsDown; end; procedure TDemoForm.ListBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin ListBoxKey := #0; end; procedure TDemoForm.ListBoxKeyPress(Sender: TObject; var Key: Char); begin ListBoxKey := Key; Key := #0; // roll your own hotkey end; procedure TDemoForm.ListBoxClick(Sender: TObject); begin if not MouseIsDown then case ListBoxKey of // ... end else ShowMessage('mouse click'); ListBoxKey := #0; end; Zitat:
Zitat:
Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 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