AGB  ·  Datenschutz  ·  Impressum  







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

Multiselect mit Strg + Maus (wie?)

Ein Thema von Alter Mann · begonnen am 25. Jun 2007 · letzter Beitrag vom 26. Jun 2007
Antwort Antwort
Alter Mann

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

Re: Multiselect mit Strg + Maus (wie?)

  Alt 25. Jun 2007, 18: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
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 06:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz