Delphi-PRAXiS

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-Liste anzeigen ohne ComboBox (https://www.delphipraxis.net/146552-combobox-liste-anzeigen-ohne-combobox.html)

ChrisE 22. Jan 2010 07:44


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:
ComboBox1.Perform(CB_SHOWDROPDOWN, Integer(True), 0);
// bzw.
ComboBox1.DropDown := TRUE;
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:

Weiß da jemand was?

THX, Chris

mkinzler 22. Jan 2010 07:45

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Du könntest die Liste auslesen und ein Popupmenü zur Anzeige verwenden

ChrisE 22. Jan 2010 07:46

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Hallo mkinzler,

Zitat:

Zitat von ChrisE
Ein Popup-Menü könnte zu groß / lang werden, daher wollte ich so ein DropDown-Liste einer ComboBox zur Auswahl verwenden

Sorry, aber das genau wollte ich verhindern, denn die Liste kann sehr groß werden :-(

Aber danke.

Greez, Chris

SnergleTheDwarf 22. Jan 2010 09:56

Re: ComboBox-Liste anzeigen ohne ComboBox
 
ist dann nicht eher TListBox was für dich ?

ChrisE 22. Jan 2010 11:17

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Hallo,
Zitat:

Zitat von SnergleTheDwarf
ist dann nicht eher TListBox was für dich ?

das ist nicht ganz falsch. Nur ist es so. Ich will die Oberfläche nicht zu sehr überladen. Also sollte diese Listbox nicht immer sichtbar sein.

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

Micha88 22. Jan 2010 12:03

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Zitat:

das man die Liste der ComboBox aufruft ohne die ComboBox an zu zeigen.
Ist das nicht ein Widerspruch?
Wie soll denn das bitte gehen??

ChrisE 22. Jan 2010 14:20

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Zitat:

Zitat von MichaelLinden
Ist das nicht ein Widerspruch?

Da hast du nicht ganz unrecht, aber ich habe ja in #5 versucht zu erklären wie ich es meine. Mir geht es nur um die Liste der ComboBox - also um die Darstellung der Liste und die Interaktionsmöglichkeiten. Es geht mir nicht zwingend darum, ein ComboBox zu verwenden. Der User muss/darf die ComboBox auch nicht sehen. Er soll nur die Möglichkeit haben, aus einer Liste aus zu wählen, wie er es bei einer ComboBox auch kann und kennt. Sprich: Knöpfchen drücken, Liste geht auf, Eintrag auswählen (mit Maus, Tastatusbefehlen), Auswahl abbrechen mit ESC etc. Eben so wie man es von einer Auswahlliste einer ComboBox kennt.

Zitat:

Zitat von MichaelLinden
Wie soll denn das bitte gehen??

Das würde ich auch gerne wissen :wink:

Greez, Chris

Alaitoc 22. Jan 2010 14:30

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

ChrisE 22. Jan 2010 14:43

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

Alaitoc 22. Jan 2010 14:59

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Dafür ist diese Komponente halt einfach nicht gedacht ;)

Delphi-Quellcode:
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;
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 ... )

Ne Listbox ist da im Endeffekt wohl einfach besser für geeignet :)

MfG Alaitoc

Tonic1024 22. Jan 2010 15:03

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

ChrisE 25. Jan 2010 07:09

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:
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;
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.

Danke an alle,

Greez, Chris

Alaitoc 26. Jan 2010 10:11

Re: ComboBox-Liste anzeigen ohne ComboBox
 
Hm habe doch noch was gefunden, vll hilft es dir ja noch:

http://www.swissdelphicenter.ch/de/showcode.php?id=639

MfG Alaitoc


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf