Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#3

AW: cxCheckComboBox mit "Alle"

  Alt 18. Mai 2021, 17:05
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

Geändert von mytbo (18. Mai 2021 um 17:15 Uhr)
  Mit Zitat antworten Zitat