Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: So 01.06.14 11:28 
Hallo.


Auf meiner Form setze ich im Moment eine TScrollBox ein, um darin etliche andere Komponenten darzustellen. Nun ist es aber so, dass durch die ScrollBox nicht nativ (in Form von Mausrad z.B.) navigiert werden kann.


Diese Möglichkeiten gebe ich dem Anwender:

1. Alle Komponenten nebeneinander (TScrollBox optional)
2. Alle Komponenten untereinander (TScrollBox optional)
3. Registrierkarten (TPageControl)

Hat jemand von euch eine Idee, wie bei (1 und 2) die Navigation besser und benutzerfreundlicher gelöst werden kann?

Im Anhang Screenshots und eine Skizze.

Danke, liebe Grüße und einen schönen Kindertag :)
Einloggen, um Attachments anzusehen!
_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.06.14 16:27 
Hi,

Du könntest bei Klick auf ein Control der ScrollBox den Focus geben:
ausblenden Delphi-Quelltext
1:
2:
if ScrollBox.CanFocus then
  ScrollBox.SetFocus;


Anschließend könntest Du folgenden Code von Peter Below nehmen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
   WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
 Var
   msg: Cardinal;
   code: Cardinal;
   i, n: Integer;
 begin
   If WindowFromPoint( mouse.Cursorpos ) = scrollbox1.Handle Then Begin
     Handled := true;
     If ssShift In Shift Then
       msg := WM_HSCROLL
     Else
       msg := WM_VSCROLL;
 
    If WheelDelta < 0 Then
       code := SB_LINEUP
     Else
       code := SB_LINEDOWN;
 
    n:= Mouse.WheelScrollLines;
     For i:= 1 to n Do
       scrollbox1.Perform( msg, code, 0 );
     scrollbox1.Perform( msg, SB_ENDSCROLL, 0 );
   End;
 end;

Quelle: borland.newsgroups.a...0707/0707124919.html

Benutze ich auch und funzt einwandfrei...

Ich habe allerdings das Scrollen entgegengesetzt gemacht...

Gruß
rd3

Für diesen Beitrag haben gedankt: trm
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 04.06.14 22:08 
Ganz herzlichen Dank.

Mit ein paar nebensächlichen Änderungen habe ich es nun so implementiert, dass ich nur die STRG - Tase für beide Richtungen abfragen muss. Hier mein Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  msg: Cardinal;
  code: Cardinal;
  i, n: Integer;
begin

  { Scrollbox scrollen wenn die STRG - Taste gedrückt wurde und die Scrollbox auch den Focus hat }
  if Self.ActiveControl = ScrollBox1 then
    if ssCTRL in Shift then
    begin
      case GSetupClass.Setup_AussehenMain.F_int_Setup_MainAnordnung of
        0{ Horizontale Anordnung der Controls }
          begin
            msg := WM_HSCROLL;
          end;
        1{ Vertikale Anordnung der Controls }
          begin
            msg := WM_VSCROLL;
          end
      else
        begin
          exit;
        end;
      end;

      Handled := True;

      if WheelDelta < 0 then
        code := SB_LINEDOWN
      Else
        code := SB_LINEUP;

      n := GSetupClass.Setup_AussehenMain.F_int_Setup_Rooms_Anordnung_UseScrollBox_ScrollLines;
      // eigener Wert statt der Wert vom Betriebssystem
      for i := 1 to n do
        ScrollBox1.Perform(msg, code, 0);
      ScrollBox1.Perform(msg, SB_ENDSCROLL, 0);
    end;

end;


Das ganze funktioniert auch wenn ich auf einen freien Bereich in meinen StringGrids drücke, hier habe ich einfach im OnMouseUp der StringGrids abgefragt, ob die angeklickte Zelle einen Index -1/-1 hat. Falls ja, bekommt die Scrollbox den Focus.

Da jedoch außer den Scrollleisten nichts von der Scrollbox an sich anklickbar ist oder sich die Maus direkt über der Scrollbox befinden kann, weil andere Controls diese überdecken, kommt meine Abfrage if Self.ActiveControl = ScrollBox1 zum Einsatz, welches auch perfekt funktioniert.


Einfach genial. Vielen Dank.


Liebe Grüße
Mathias




Edit:

Mit einer kleinen Abfrage kann man sogar das PageControl überreden die Reiter mit dem Rad durchzuscrollen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  if WindowFromPoint(mouse.Cursorpos) = PageControl1.Handle then
  begin
    if WheelDelta < 0 then
      if PageControl1.ActivePageIndex > 0 then // weglassen, falls man durchscrollen will
        PageControl1.SelectNextPage(False);
    if WheelDelta > 0 then
      if PageControl1.ActivePageIndex < PageControl1.PageCount-1 then // weglassen, falls man durchscrollen will
        PageControl1.SelectNextPage(True);
    Handled := True;
  end;


:)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 05.06.14 12:01 
Cool, danke auch für deinen Tipp!