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