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?