![]() |
ComboBox-Liste anzeigen ohne ComboBox
Hallo,
irgendwo hatte ich es mal gesehen, das man die DropDownListe einer ComboBox aufrufen konnte ohne das die ComboBox sichtbar war / wurde. Es gibt ja das hier:
Delphi-Quellcode:
Beides macht aber die ComboBox selber sichtbar. Ich brauche aber nur die AuswahlListe der ComboBox an der Stelle an der User klickt. Ein Popup-Menü könnte zu groß / lang werden, daher wollte ich so ein DropDown-Liste einer ComboBox zur Auswahl verwenden. Aber ich finde das nicht mehr :wall:
ComboBox1.Perform(CB_SHOWDROPDOWN, Integer(True), 0);
// bzw. ComboBox1.DropDown := TRUE; Weiß da jemand was? THX, Chris |
Re: ComboBox-Liste anzeigen ohne ComboBox
Du könntest die Liste auslesen und ein Popupmenü zur Anzeige verwenden
|
Re: ComboBox-Liste anzeigen ohne ComboBox
Hallo mkinzler,
Zitat:
Aber danke. Greez, Chris |
Re: ComboBox-Liste anzeigen ohne ComboBox
ist dann nicht eher TListBox was für dich ?
|
Re: ComboBox-Liste anzeigen ohne ComboBox
Hallo,
Zitat:
Bei meinem Problem gibt viele Einträge - wie bei einer Liste.Diese Einträge erzeuge ich derzeit über Frames. Bei diesen Einträge soll man die Möglichkeit haben diese anzupassen. Hier soll aber keine Freitext-Eingabe erstellt werden sondern eine Auswahl verschiedener vordefinierter Elemente. Dies können nur 2 sein aber eben auch sehr viele. Ein Beispiel wie ich mir es Wünsche ist z.B. die ShortCut-Liste im OI. Da geht so eine ComboBox-Liste auf, man wählt aus und dann steht der Text des ShortCuts in dem Feld drinne. Bei mir ist es ein Button der eine Caption hat und den Wert anzeigt. Drücke ich den Button, wird die entsprechend eingestellte Aktion ausgelöst. Neben dran ist ein Kleiner Button (Pfeil nach unten) zum ändern der Aktion des Buttons. Wird dieser gedrückt, soll der Nutzer die entsprechende Aktion auswählen können aus einer solchen Liste. Nun, ich werde mir Wohl durch ein rahmenloses Fenster mit einer Listbox behelfen und dem Fenster noch ein bisschen Funktionalität mit geben, damit es sich so verhält wie eine Liste von ner ComboBox. Aber mich würde das trotzdem interessieren wie das ging, das man die Liste der ComboBox aufruft ohne die ComboBox an zu zeigen. Da gab es was - ich finde es nur nicht mehr :evil: Greez, Chris |
Re: ComboBox-Liste anzeigen ohne ComboBox
Zitat:
Wie soll denn das bitte gehen?? |
Re: ComboBox-Liste anzeigen ohne ComboBox
Zitat:
Zitat:
Greez, Chris |
Re: ComboBox-Liste anzeigen ohne ComboBox
Ich behaupte einfach mal es geht nicht, da die Box zum Ausklappen ja ein Teil der Komponente ist
und halt mitgezeichnet wird. Wenn also die Komponente nicht sichtbar ist, kann auch die Box zum Ausklappen nicht angezeigt werden. Bei meiner Komponente wo ich ein Fenster zum Darstellen des Treeviews meiner Combobox nutze, würde es theorethisch gehen...da es halt in gewisser Weise eine eigenständige Komponente ist und nicht ein Bestandteil der Komponente. Hoffe es war annährend verständlich ^_° MfG Alaitoc |
Re: ComboBox-Liste anzeigen ohne ComboBox
Nun ja,
ich gehe eigentlich davon aus, dass diese Liste die da angezeigt wird ein eigenen Fensterhandle hat. Den will ich irgendwie bekommen und dann nur dieses "Fenster" anzeigen. Und ich hatte die Hoffnung, dass dieses Fenster wie von alleine verschwindet wie man es kennt bei einer ComboBox und ich dann die Combobox nur noch "Fragen" muss welcher Eintrag Selektiert ist :-( Das war die Idee. Greez, Chris |
Re: ComboBox-Liste anzeigen ohne ComboBox
Dafür ist diese Komponente halt einfach nicht gedacht ;)
Delphi-Quellcode:
Hier sieht man das das Handle vom Canvas der Combox genommen wird. ( Bzw das Handle wird benutzt das dem Canvas zugewiesen wird, aber läuft ja im Endeffekt auf das gleiche hinaus ... )
procedure TCustomComboBox.CNDrawItem(var Message: TWMDrawItem);
var State: TOwnerDrawState; begin with Message.DrawItemStruct^ do begin State := TOwnerDrawState(LongRec(itemState).Lo); if itemState and ODS_COMBOBOXEDIT <> 0 then Include(State, odComboBoxEdit); if itemState and ODS_DEFAULT <> 0 then Include(State, odDefault); FCanvas.Handle := hDC; // <----------------------- Handle FCanvas.Font := Font; FCanvas.Brush := Brush; if (Integer(itemID) >= 0) and (odSelected in State) then begin FCanvas.Brush.Color := clHighlight; FCanvas.Font.Color := clHighlightText end; if Integer(itemID) >= 0 then DrawItem(itemID, rcItem, State) else FCanvas.FillRect(rcItem); if odFocused in State then DrawFocusRect(hDC, rcItem); FCanvas.Handle := 0; end; end; Ne Listbox ist da im Endeffekt wohl einfach besser für geeignet :) MfG Alaitoc |
Re: ComboBox-Liste anzeigen ohne ComboBox
Nimm ne Listbox und fülle sie mit deinen Daten. Mach sie unsichtbar.
Bei Rechtsklick positionierst du sie unter der Maus (X und Y auf Left und Top - auf den Screen umrechnen nicht vergessen) und machst sie sichtbar. Unsichtbar machen kannst du sie auf ItemChange. Fertig. Alternativ plazierst du sie auf einem Form. Dem Form nimmst du die Titelleiste weg. Dann hast du den selben effekt wie oben, kannst die Listbox aber auf dem ganzen Desktop anzeigen. Über das Form-Objekt kannst du dann von deiner App mit deinem Konstrukt interagieren und notfalls hat sie auch noch ein Handle. Wie? Das ist unsauber? Stimmt vielleicht... Alle anderen Lösungen auch. ;) Gruß, Toni |
Re: ComboBox-Liste anzeigen ohne ComboBox
@Alaitoc:
zunächst einmal danke für Deine Anteilnahme. Nur denke ich, das ein Handle einer Canvas (HDC) doch etwas anders ist als ein Handle eines Fensters (HWND). Und ich dachte da eigentlich daran, das man an diesen Handle ran kommt, der auch intern hier verwendet wird:
Delphi-Quellcode:
Hier wird wohl irgendwie ein Handle verwendet für ein DropDownWindow (FDropHandle). Aber ich weiß auch nicht ob es die richtige Stelle ist und zum zweiten ist der Handle im Protected bereich deklariert. Aber egal, denn ich gehe zunächst den Weg des geringsten Widerstandes wie ich es schon beschrieben hatte und ähnlich wie es Tonic1024 auch meinte -> selber nachbauen was machen braucht.
procedure TCustomCombo.AdjustDropDown;
var Count: Integer; begin Count := ItemCount; if Count > DropDownCount then Count := DropDownCount; if Count < 1 then Count := 1; FDroppingDown := True; try SetWindowPos(FDropHandle, 0, 0, 0, Width, ItemHeight * Count + Height + 2, SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_NOREDRAW or SWP_HIDEWINDOW); finally FDroppingDown := False; end; SetWindowPos(FDropHandle, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_SHOWWINDOW); end; Danke an alle, Greez, Chris |
Re: ComboBox-Liste anzeigen ohne ComboBox
Hm habe doch noch was gefunden, vll hilft es dir ja noch:
![]() MfG Alaitoc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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