AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

cxCheckComboBox mit "Alle"

Ein Thema von Ron67 · begonnen am 18. Mai 2021 · letzter Beitrag vom 19. Mai 2021
Antwort Antwort
Ron67

Registriert seit: 10. Sep 2018
Ort: Großraum Nürnberg
13 Beiträge
 
Delphi 12 Athens
 
#1

cxCheckComboBox mit "Alle"

  Alt 18. Mai 2021, 14:44
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?
  Mit Zitat antworten Zitat
ioster

Registriert seit: 15. Aug 2008
84 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: cxCheckComboBox mit "Alle"

  Alt 18. Mai 2021, 16:32
Moin,

hast Du die Eigenschaft ImmediatePost auf true oder false eingestellt?

Wenn man die auf true setzt, sollte OnEditValueChanged anschlagen.

Viele Grüße
Ingo
  Mit Zitat antworten Zitat
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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#4

AW: cxCheckComboBox mit "Alle"

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

Geändert von Delphi.Narium (19. Mai 2021 um 10:36 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Ron67

Registriert seit: 10. Sep 2018
Ort: Großraum Nürnberg
13 Beiträge
 
Delphi 12 Athens
 
#5

AW: cxCheckComboBox mit "Alle"

  Alt 19. Mai 2021, 09:17
Vielen Dank für die schnellen Antworten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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