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/)
-   -   cxCheckComboBox mit "Alle" (https://www.delphipraxis.net/207935-cxcheckcombobox-mit-alle.html)

Ron67 18. Mai 2021 13:44

cxCheckComboBox mit "Alle"
 
Hallo Zusammen,

Ich habe ein Ribbon mit einer cxCheckComboBox. Die Items werden dynamisch erzeugt, manchmal sind es viele.
Der Benutzer soll nun die Möglichkeit haben, Alles auszuwählen bzw. Alles auf unchecked zu setzen, wie das auch zum Beispiel in Excel möglich ist.

Meine Idee war, "Alle" als erstes Item hinzuzufügen, und wenn der Benutzer dieses Häkchen setzt, alle Items auf Checked zu setzen (StatesString := '1111111111').
Das OnChange-Event nehme ich dafür nicht, denn das tritt erst dann ein, wenn die Box verlassen wird.
OnCurChange oder onPropertiesChange oder onPropertiesClickCheck macht es aber auch nicht bzw liefert mir einen Fehler beim Zuweisen des StatesStrings.

Meine Suche bei DevExpress liefert mir zwei mehr schlechte als rechte Lösungen.
1) Ein Extrabutton außerhalb der CheckComboBox
2) Statt CheckComboBox ein cxPopupEdit mit einem Panel als PopupControl, welches dann eine CheckListBox und ein Label "Select All" enthält.
Hmm

Hat jemand eine Idee?

ioster 18. Mai 2021 15:32

AW: cxCheckComboBox mit "Alle"
 
Moin,

hast Du die Eigenschaft ImmediatePost auf true oder false eingestellt?

Wenn man die auf true setzt, sollte OnEditValueChanged anschlagen.

Viele Grüße
Ingo

mytbo 18. Mai 2021 16:05

AW: cxCheckComboBox mit "Alle"
 
Zitat:

Zitat von Ron67 (Beitrag 1489665)
Hat jemand eine Idee?

Ich erstelle in der CheckComboBox einen extra Button der ein PopupMenü mit den Einträgen "Alle Einträge markieren" und "Markierung(en) aufheben" anzeigt. Für die Umsetzung habe ich ein paar Hilfsfunktionen geschrieben.
Delphi-Quellcode:
function AddMarkItemsButton(pmCheckComboBox: TcxCheckComboBox; pmOnButtonClick: TcxEditButtonClickEvent = Nil): TcxEditButton;
function CheckComboBoxCheckedCount(pmCheckComboBox: TcxCheckComboBox): Integer;
procedure CheckComboBoxMarkAllItems(pmCheckComboBox: TcxCheckComboBox);
procedure CheckComboBoxUnmarkAllItems(pmCheckComboBox: TcxCheckComboBox);
Der Quelltext für die Funktion AddMarkItemsButton() sieht dann wie folgt aus:
Delphi-Quellcode:
type
  TcxCheckComboBoxPropertiesAccess = class(TcxCheckComboBoxProperties);

function AddMarkItemsButton(pmCheckComboBox: TcxCheckComboBox; pmOnButtonClick: TcxEditButtonClickEvent): TcxEditButton;
begin
  Result := Nil;
  if Assigned(pmCheckComboBox) then
  begin
    with TcxCheckComboBoxPropertiesAccess(pmCheckComboBox.ActiveProperties) do
    begin
      Result := Buttons.Add;
      Result.Kind := bkGlyph;
      Result.Glyph.LoadFromResourceName(HInstance, 'IDS_MARK_ITEMS');
      Result.Glyph.Width := Result.Glyph.Height;
      OnButtonClick := pmOnButtonClick;
    end;
  end;
end;
Im FormShow schreibst du dann:
Delphi-Quellcode:
begin
  AddMarkItemsButton(ccb..., DoButtonClick);
  with TcxCheckComboBoxAccess(ccb...) do
    (LookupData.ActiveControl as TcxCustomCheckComboBoxListBox).PopupMenu := ...PopupMenu;
end
Für das Ereignis DoButtonClick folgendes:
Delphi-Quellcode:
procedure ...DoButtonClick(pmSender: TObject; pmButtonIndex: Integer);
var
  pos: TPoint;
begin
  if Assigned(pmSender) then
  begin
    if pmButtonIndex = 1 then
    begin
      pos.X := TcxCheckComboBox(pmSender).Left;
      pos.Y := TcxCheckComboBox(pmSender).Top + TcxCheckComboBox(pmSender).Height;
      pos := TcxCheckComboBox(pmSender).Parent.ClientToScreen(pos);
      ...PopupMenu.Popup(pos.X, pos.Y);
    end;
  end;
end;
Die Funktionen CheckComboBoxCheckedCount(), CheckComboBoxMarkAllItems() und CheckComboBoxUnmarkAllItems() werden in den Action Funktionen Execute() und Update() verwendet.
Delphi-Quellcode:
procedure ...actMarkAllItemsExecute(Sender: TObject);
begin
  BeginUpdate;
  try
    CheckComboBoxMarkAllItems(ccb...);
  finally
    EndUpdate(ccb...);
  end;
end;

procedure ...actMarkAllItemsUpdate(Sender: TObject);
var
  count: Integer;
begin
  count := CheckComboBoxCheckedCount(ccb...);
  if Sender is TCustomAction then
    TCustomAction(Sender).Enabled := ...;
end;
Und wenn du diese Funktionalität öfter benötigst, dann baust du dir einen Mediator, der das alles für dich in einem Rutsch erledigt. Anmerkung: Der Quelltext ist für eine ältere DevExpress Version.

Bis bald...
Thomas

Delphi.Narium 18. Mai 2021 16:14

AW: cxCheckComboBox mit "Alle"
 
Oder ein onKeyEvent nutzen:

+ auf dem Numblock checked alles
- auf dem Numblock unchecked alles
* auf dem Numblock invertiert den aktuellen Zustand

Analog zu Windows-Commander u. ä. bei der Dateiauswahl.

Ron67 19. Mai 2021 08:17

AW: cxCheckComboBox mit "Alle"
 
Vielen Dank für die schnellen Antworten.
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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