Einzelnen Beitrag anzeigen

Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Multiselect mit Strg + Maus (wie?)

  Alt 25. Jun 2007, 19:10
Das Problem ist, das nur bei gedrückter Strg-Taste mit der Maus selektiert wird und das ist bei jedem mir bekannten
Programmen so. Aber egal.

Wenn ich also vereinfacht ausgedrückt mir ein Flag bastel welches beim ersten drücken der Maustaste, den Shiftstate auswertet und bei gedrückter Strg-Taste gesetzt wird.

Delphi-Quellcode:
...
    iMultiSelect : Boolean; // fortlaufene Merhfachauswahl 1-10
    mMultiSelect : Boolean; // manuelle Mehrfachauswahl 1, 3, 6, 12 usw.
    iButton : Boolean; // Auswahl mit linker Maustaste, wird zwischen gespeichert,
                             // da in MouseMove kein Button übergeben wird
...

procedure TCalendarControl.MouseDown(Button: TMouseButton;
                                       Shift: TShiftState;
                                       X, Y: Integer);
begin
  iButton := Button = mbLeft;
  if iButton and FOptions.MultiSelect and not mMultiSelect and (ssCtrl in Shift) then
   mMultiSelect := True;
  inherited;
end;
Damit weiß ich also, der User will etwas Mehrfach auswählen und kann in MouseUp entsprechend reagieren.

Delphi-Quellcode:
procedure TCalendarControl.MouseUp(Button: TMouseButton;
                                     Shift: TShiftState;
                                     X, Y: Integer);
var
  I, J, FMin : Integer;
begin
  iButton := False;
  if Button = mbLeft then
  begin
    if FWeekNumbers then FMin := 1
                    else FMin := 0;

    if iMultiSelect or mMultiSelect then
    begin
      if not (ssCtrl in Shift) and iMultiSelect then iMultiSelect := False;
      for J := 0 to FMaxWeeks do
      begin
        for I := FMin to FMax do
        begin
          if TCalenderEntry(FWeeks[J][I]).MouseInRect(X, Y) then
          begin
            if FMultiSelDates.IndexOf(TCalenderEntry(FWeeks[J][I])) = -1 then
            FMultiSelDates.Add(TCalenderEntry(FWeeks[J][I]));
          end;
        end;
      end;
      if iMultiSelect then DoMultiSelect(FMultiSelDates);
      Invalidate;
    end
...
Bis hierher funktioniert die Sache ja auch, die gewälten Elemente werden in die Liste FMultiSelect eingetragen.
Erfolgt jedoch die Auswahl mit zusätzlich gedrückter Strg+Taste wird jedesmal bei der Auswahl mit der Maus
KeyUP mitaufgerufen...

Delphi-Quellcode:
procedure TCalendarControl.KeyUp(var Key: Word; Shift: TShiftState);
begin
  if mMultiSelect and not (ssCtrl in Shift) then mMultiSelect := False;
  inherited KeyUp(Key, Shift);
end;
und das Flag mMultiSelect wird gelöscht, weil Shift(warum auch immer) kein ssCtrl mehr enthält.

Nun verstanden?
  Mit Zitat antworten Zitat