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 am Aufklappen hindern (https://www.delphipraxis.net/27437-combobox-am-aufklappen-hindern.html)

Shaman 10. Aug 2004 10:00


ComboBox am Aufklappen hindern
 
Hallo zusammen

Wie kann ich verhindern, dass eine Combobox ihre Standardliste aufklappt? Stattdessen möchte ich nämlich eine eigene Komponente anzeigen lassen.

Gruss
Shaman

LeoDD 10. Aug 2004 10:34

Re: ComboBox am Aufklappen hindern
 
Bei der TCOmbobox gibts eine Eigenschaft DroppedDown

Code:
property DroppedDown: Boolean;
Im onDropDown Ereignis solltest du das auf false setzen können und die Liste wird nicht angezeigt.

Habs aber nicht getestet :)

Shaman 10. Aug 2004 10:59

Re: ComboBox am Aufklappen hindern
 
Hab ich auch schon probiert, funktioniert leider nicht... :(
Aber Danke trotzdem

AlphaBug 10. Aug 2004 11:08

Re: ComboBox am Aufklappen hindern
 
:hi: Mahlzeit !

Hallo Shaman,
So wie ich das verstehe wirst du nicht drumherum kommen, eine neue ComboBox zu entwickeln.
Ich hab' das schon mal gemacht. Wenn du einen Moment Zeit hast, suche ich mal den nötigen Code zusammen, um dir auf die Sprünge zu helfen.

Shaman 10. Aug 2004 11:34

Re: ComboBox am Aufklappen hindern
 
Hallo AlphaBug

Das wäre sehr nett :)

AlphaBug 10. Aug 2004 11:37

Re: ComboBox am Aufklappen hindern
 
Außer dem Ableiten einer eigenen ComboBox fällt mir nicht mehr viel ein.
(Vieleicht im DropDown-Event etwas basteln...)
Ich hoffe, diese Code-Schnipsel helfen dabei:

Delphi-Quellcode:
  TCustomCombo = class(TCustomListControl)
  private
    ...
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
    ...
  protected
    ...
    procedure AdjustDropDown; virtual;
    ...
  end;

  TCustomComboBox = class(TCustomCombo)
  ...

  TMyComboBox = class(TCustomComboBox)
  private
    ...
    procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
    ...
  protected
    ...
    procedure AdjustDropDown; override;
    ...
  end;

...

procedure TCustomCombo.CNCommand(var Message: TWMCommand);
begin
  case Message.NotifyCode of
    CBN_DBLCLK:
      DblClick;
    CBN_EDITCHANGE:
      Change;
    CBN_DROPDOWN:
      begin
        FFocusChanged := False;
        // DropDown-Event ausführen
        DropDown;
        // DropDown-Liste konfigurieren
        AdjustDropDown;
        if FFocusChanged then
        begin
          PostMessage(Handle, WM_CANCELMODE, 0, 0);
          if not FIsFocused then
            // DropDown-Liste anzeigen
            PostMessage(Handle, CB_SHOWDROPDOWN, 0, 0);
        end;
      end;
    CBN_SELCHANGE:
      begin
        Text := Items[ItemIndex];
        Click;
        Select;
      end;
    CBN_CLOSEUP:
      CloseUp;
    CBN_SETFOCUS:
      begin
        FIsFocused := True;
        FFocusChanged := True;
        SetIme;
      end;
    CBN_KILLFOCUS:
      begin
        FIsFocused := False;
        FFocusChanged := True;
        ResetIme;
      end;
  end;
end;


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_NOREDRAW or SWP_SHOWWINDOW);
end;

Shaman 10. Aug 2004 13:48

Re: ComboBox am Aufklappen hindern
 
Danke, soweit bin ich auch schon gekommen. Aber egal welche Message ich blockiere, die Liste wird trotzdem gezeichnet. Ich habs jetzt wenigstens soweit, dass sie nur noch ein schwarzer Strich ist. Aber das ist ein ziemlicher Murks... :?

LeoDD 10. Aug 2004 13:49

Re: ComboBox am Aufklappen hindern
 
Hm, dann würd ich da keine Combobox hinsetzen. Ein Editfeld und ein Button mit Pfeil nach unten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.

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