Scrollbox

Rund um die LCL und andere Komponenten
Antworten
leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Scrollbox

Beitrag von leveltwo »

Moin

Ich habe ein Problem mit meiner Scroll box ich kann in dieser nur scrollen wenn sich mein Mauszeiger über der Scrollbar befindet

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Scrollbox

Beitrag von compmgmt »

Welche Elemente befinden sich denn in der Scrollbox? Wenn du Containerelemente (TPanel, TScrollBox, usw.) in einer ScrollBox hat musst du für jedes Containerelement die Scrollroutine in die OnMouseWheelDown bzw OnMouseWheelUp schreiben.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: Scrollbox

Beitrag von leveltwo »

compmgmt hat geschrieben:Welche Elemente befinden sich denn in der Scrollbox? Wenn du Containerelemente (TPanel, TScrollBox, usw.) in einer ScrollBox hat musst du für jedes Containerelement die Scrollroutine in die OnMouseWheelDown bzw OnMouseWheelUp schreiben.

ist ja mies aber danke für den Hinweis ich habe nämlöich panel in meiner Scrollbox

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: Scrollbox

Beitrag von leveltwo »

compmgmt hat geschrieben:Welche Elemente befinden sich denn in der Scrollbox? Wenn du Containerelemente (TPanel, TScrollBox, usw.) in einer ScrollBox hat musst du für jedes Containerelement die Scrollroutine in die OnMouseWheelDown bzw OnMouseWheelUp schreiben.

Wär mega nice wenn ihr mir auch noch ein gutes Beispiel für eine solche scrollroutine geben könntet danke schonmal

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: Scrollbox

Beitrag von KenntKeinSchwein AG »

Beim MouseWheelDown:

Code: Alles auswählen

ScrollBox1.VertScrollBar.Postion := ScrollBox1.VertScrollBar.Position + ScrollBox1.VertScrollBar.Increment;

Beim WheelUp dann eben minus statt plus.

Und so geht es noch eleganter:

Code: Alles auswählen

var
  s: TScrollBar;
begin
  s := ScrollBox1.VertScrollBar;
  s.Position := s.Position + s.Increment;
end;


EDIT: "ScrollBox1.VerstScrollBar" verbessert zu "ScrollBox1.VertScrollBar"

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: Scrollbox

Beitrag von leveltwo »

KenntKeinSchwein AG hat geschrieben:Beim MouseWheelDown:

Code: Alles auswählen

ScrollBox1.VertScrollBar.Postion := ScrollBox1.VertScrollBar.Position + ScrollBox1.VertScrollBar.Increment;

Beim WheelUp dann eben minus statt plus.

Und so geht es noch eleganter:

Code: Alles auswählen

var
  s: TScrollBar;
begin
  s := ScrollBox1.VertScrollBar;
  s.Position := s.Position + s.Increment;
end;
"

bekomme leider fehlermeldungen beim kompilieren: Projekt kompilieren, Ziel: DokuSoftware.exe: Exit code 1, Fehler: 2
unitdynform.pas(261,18) Error: Incompatible types: got "TControlScrollBar" expected "TScrollBar"
unitdynform.pas(262,32) Error: identifier idents no member "Increment"

Vielleicht kannst du mir da weiter helfen

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: Scrollbox

Beitrag von KenntKeinSchwein AG »

Ah ja, es ist natürlich TControlScrollBar statt TScrollBar.
Bei der Increment eigenschaft schau ich heute abend nochmal wenn ich zuhause bin. Nutz solange notfalls "8" statt "s.Increment". 8 ist nämlich der standardwert

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: Scrollbox

Beitrag von leveltwo »

KenntKeinSchwein AG hat geschrieben:Ah ja, es ist natürlich TControlScrollBar statt TScrollBar.
Bei der Increment eigenschaft schau ich heute abend nochmal wenn ich zuhause bin. Nutz solange notfalls "8" statt "s.Increment". 8 ist nämlich der standardwert

Danke für die schnelle gute hilfe

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Scrollbox

Beitrag von Michl »

Alternativ könntest du auch jeder auf dem Formular liegenden Komponente den OnMouseWheel-Handler zuweisen:

Code: Alles auswählen

procedure TForm1.ScrollBox1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - Sign(WheelDelta) * ScrollBox1.VertScrollBar.Increment;
  Handled := true;
end;
Einfaches Testprj anbei (Windows 7 getestet).
Dateianhänge
TestScrollBox.zip
(2.29 KiB) 83-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: Scrollbox

Beitrag von KenntKeinSchwein AG »

So, ich hab nochmal nachgeschaut. TControlScrollBar.Increment ist korrekt, nur TScrollBar.Increment existiert nicht. Also müsste sich Fehler 2 durch Behebung von Fehler 1 auflösen.

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: Scrollbox

Beitrag von leveltwo »

KenntKeinSchwein AG hat geschrieben:So, ich hab nochmal nachgeschaut. TControlScrollBar.Increment ist korrekt, nur TScrollBar.Increment existiert nicht. Also müsste sich Fehler 2 durch Behebung von Fehler 1 auflösen.

Habe ich auch festgestellt habe aber das problem das es bei mir dennoch nicht läuft vielleicht liegt es daran, dass das panel während der runtime erstellt wird.


Code: Alles auswählen

procedure TfrmDyn.creatButtonLinkEntry(_dbCaption, _linkTable, _linkField: String);
var
  dbButton: TButton;
  panel: TPanel;
  scrollbar: TControlScrollBar;
begin
  scrollbar:= ScrollBox1.VertScrollBar;
  // Create Items
  panel:= TPanel.Create(ScrollBox1);
  panel.Parent:= ScrollBox1;
  panel.BorderSpacing.Right:=10;
  panel.BorderSpacing.Left:=10;
  panel.OnMouseWheelUp:= scrollbar.Position:= scrollbar.Increment;
  panel.OnMouseWheelUp:= scrollbar.Position:= scrollbar.Increment;


Fehlermeldung: unitdynform.pas(228,35) Error: Incompatible types: got "untyped" expected "<procedure variable type of procedure(TObject;TShiftState;POINT;var Boolean) of object;Register>"

KenntKeinSchwein AG
Beiträge: 26
Registriert: So 4. Dez 2016, 13:35

Re: Scrollbox

Beitrag von KenntKeinSchwein AG »

Du musst eine eigene Methode dafür erstellen.

Code: Alles auswählen

...
 
interface
 
...
 
// Das hier wird oben im interface-Teil reingeschrieben, um dem Programm zu zeigen, dass diese Funktionen existieren (Normalerweise sieht man ja nur die Funktionen, die über einem sind).
private
  procedure WheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); // Mausrad nach unten
  procedure WheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); // Mausrad nach oben
 
...
 
// Im implementation-Teil kommt dann der eigentliche Quellcode zu den Funktionen.
implementation
 
...
 
// Mausrad nach unten
procedure TfrmDyn.WheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  scrollbar: TControlScrollBar;
begin
  scrollbar:= ScrollBox1.VertScrollBar;
  scrollbar.Position:= scrollbar.Position + scrollbar.Increment
end;
 
// Mausrad nach oben
procedure TfrmDyn.WheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  scrollbar: TControlScrollBar;
begin
  scrollbar:= ScrollBox1.VertScrollBar;
  scrollbar.Position:= scrollbar.Position - scrollbar.Increment
end;
 
// Hier deine Create Routine
procedure TfrmDyn.creatButtonLinkEntry(_dbCaption, _linkTable, _linkField: String);
var
  dbButton: TButton;
  panel: TPanel;
  //scrollbar: TControlScrollBar; // Brauchst du hier nicht
begin
  //scrollbar:= ScrollBox1.VertScrollBar; // Brauchst du hier nicht
  // Create Items
  panel:= TPanel.Create(ScrollBox1);
  panel.Parent:= ScrollBox1;
  panel.BorderSpacing.Right:=10;
  panel.BorderSpacing.Left:=10;
  panel.OnMouseWheelDown:= @WheelDown; // Mausrad nach unten (Hier einen Pointer auf die Methode übergeben)
  panel.OnMouseWheelUp:= @WheelUp; // Mausrad nach oben (Hier auch einen Pointer auf die Methode übergeben)
end;
 
... 

leveltwo
Beiträge: 34
Registriert: Mi 14. Okt 2015, 09:58

Re: Scrollbox

Beitrag von leveltwo »

KenntKeinSchwein AG hat geschrieben:Du musst eine eigene Methode dafür erstellen.

Code: Alles auswählen

...
 
interface
 
...
 
// Das hier wird oben im interface-Teil reingeschrieben, um dem Programm zu zeigen, dass diese Funktionen existieren (Normalerweise sieht man ja nur die Funktionen, die über einem sind).
private
  procedure WheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); // Mausrad nach unten
  procedure WheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); // Mausrad nach oben
 
...
 
// Im implementation-Teil kommt dann der eigentliche Quellcode zu den Funktionen.
implementation
 
...
 
// Mausrad nach unten
procedure TfrmDyn.WheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  scrollbar: TControlScrollBar;
begin
  scrollbar:= ScrollBox1.VertScrollBar;
  scrollbar.Position:= scrollbar.Position + scrollbar.Increment
end;
 
// Mausrad nach oben
procedure TfrmDyn.WheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
var
  scrollbar: TControlScrollBar;
begin
  scrollbar:= ScrollBox1.VertScrollBar;
  scrollbar.Position:= scrollbar.Position - scrollbar.Increment
end;
 
// Hier deine Create Routine
procedure TfrmDyn.creatButtonLinkEntry(_dbCaption, _linkTable, _linkField: String);
var
  dbButton: TButton;
  panel: TPanel;
  //scrollbar: TControlScrollBar; // Brauchst du hier nicht
begin
  //scrollbar:= ScrollBox1.VertScrollBar; // Brauchst du hier nicht
  // Create Items
  panel:= TPanel.Create(ScrollBox1);
  panel.Parent:= ScrollBox1;
  panel.BorderSpacing.Right:=10;
  panel.BorderSpacing.Left:=10;
  panel.OnMouseWheelDown:= @WheelDown; // Mausrad nach unten (Hier einen Pointer auf die Methode übergeben)
  panel.OnMouseWheelUp:= @WheelUp; // Mausrad nach oben (Hier auch einen Pointer auf die Methode übergeben)
end;
 
... 


Super danke für deine Mühe möchte das Lob von meinem chef an dich weiter geben :D

Antworten