Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zwei Memofelder gleichzeitig scrollen (https://www.delphipraxis.net/149077-zwei-memofelder-gleichzeitig-scrollen.html)

Ginko 13. Mär 2010 16:56


Zwei Memofelder gleichzeitig scrollen
 
Hallo ich versuche gerade zwei Memofelder gleichzeitig zu scrollen, allerdings scheitert es schon an einem :(
Irgendwie bekomme ich es nicht hin, dass das scrollen und der Text synchron laufen. Der Scrollbalken ist immer zu früh unten, obwohl die Max Position der Scrollbar genau die Zeilenanzahl des Textes besitzt.
Auch klappt das Scrollen nur wenn man auf die Pfeilbuttons der Scrollbar klickt oder vor und hinter den eigentlichen Scrollbalken.

Hier ist mal der Code:

Delphi-Quellcode:
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
  case ScrollCode of
    scLineUp:
      Memo1.Perform(EM_LINESCROLL, 0, -1);
    scLineDown:
      Memo1.Perform(EM_LINESCROLL, 0, 1);
    scPageUp:
      Memo1.Perform(EM_LINESCROLL, 0, -1);
    scPageDown:
      Memo1.Perform(EM_LINESCROLL, 0, 1);
    scTop:
      Memo1.Perform(EM_LINESCROLL, 0, -1);
    scBottom:
      Memo1.Perform(EM_LINESCROLL, 0, Memo1.Lines.Count);
    scEndScroll:
      Memo1.Perform(EM_LINESCROLL, 0, Memo1.Lines.Count-ScrollBar1.Position);
  end;
end;

Panthrax 14. Mär 2010 00:15

Re: Zwei Memofelder gleichzeitig scrollen
 
Delphi-Quellcode:
  object Memo1: TMemo
    Lines.Strings = (
      'Memo1'
      '2'
      '3'
      ...
      '29')
    ScrollBars = ssVertical
  end
  object ScrollBar1: TScrollBar
    Kind = sbVertical
    PageSize = 10 // im Programm anpassen
    Max = 100 // im Programm anpassen
    Min = 0 // im Programm anpassen
    OnScroll = ScrollBar1Scroll
  end
Delphi-Quellcode:
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
var
  TopLineIndex: Integer;
begin
  case ScrollCode of
    scLineUp:
      Memo1.Perform(EM_SCROLL, SB_LINEUP, 0);
    scLineDown:
      Memo1.Perform(EM_SCROLL, SB_LINEDOWN, 0);
    scPageUp:
      Memo1.Perform(EM_SCROLL, SB_PAGEUP, 0);
    scPageDown:
      Memo1.Perform(EM_SCROLL, SB_PAGEDOWN, 0);
    scTrack:
    begin
      TopLineIndex := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
      Memo1.Perform(EM_LINESCROLL, 0, ScrollPos - TopLineIndex);
    end;
  end;
end;

Ginko 14. Mär 2010 11:51

Re: Zwei Memofelder gleichzeitig scrollen
 
Hallo Panthrax,
danke für deine Antwort, der eigentliche Scrollbalken wird jetzt angesprochen.
Aber leider läuft es noch nicht synchron.
Wo genau im Prgramm muss ich die Werte:

PageSize = 10 // im Programm anpassen
Max = 100 // im Programm anpassen
Min = 0 // im Programm anpassen

anpassen? Und muss Memo1 zusätlich zur Scrollbar1noch eine eigene haben?

Panthrax 14. Mär 2010 17:36

Re: Zwei Memofelder gleichzeitig scrollen
 
Die Memos müssten doch synchron laufen, wenn die gezeigten Befehle für Memo 2 dupliziert werden!?

Der obere Kasten zeigt die Textdarstellung der Objekte, die darin enthaltenen Eigenschaften können im Objektinspektor geändert werden. Die Werte müssen entsprechend der synchron zu scrollenden Memos gesetzt werden. Sinnvollerweise gelten diese Einstellungen für beide Memos. Scrollen von Min (für die erste Zeile) bis Max (für die letzte Zeile), dabei sind jeweils PageSize Zeilen in jedem Memo sichtbar.

Ich denke, die (ersetzten) Scrollbalken der Memos sind nicht notwendig, hängt aber wiederum davon ab, was gewollt ist. Werden sie angezeigt, können die Memos wieder unabhängig voneinander gescrollt werden.

Ginko 14. Mär 2010 18:17

Re: Zwei Memofelder gleichzeitig scrollen
 
Hallo,
ich meinte mit synchron, dass der Scrollbalken genau mit dem Zeilenende unten ankommt. Bis jetzt teste ich nur an einem Memo, weil das wie gesagt noch nicht klappt. Also der Scrollbalken ist immer zu spät unten, also nach dem das Textende erreicht wurde.

Panthrax 14. Mär 2010 18:21

Re: Zwei Memofelder gleichzeitig scrollen
 
Schon Min, Max und PageSize eingestellt?

Ginko 15. Mär 2010 18:37

Re: Zwei Memofelder gleichzeitig scrollen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Panthrax,
ich hab das ganze mal als kleines Programm geschrieben und für die Pagesize einzustellen, die Formel geholt, die in de Hilfe angegeben war. Vielleicht werden meine Fehler so ersichtlicher.

Panthrax 16. Mär 2010 12:28

Re: Zwei Memofelder gleichzeitig scrollen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Projekt im Anhang zeigt, wie es gehen könnte. Es ist nicht perfekt, und um ehrlich zu sein, glaube ich, der Teufel steckt hier noch richtig im Detail. Diese Fehler sind bekannt:

* Kommunikation zwischen Memo und Laufleiste ist unvollständig. Es gibt keine Positionsanpassung, wenn im Memo am Ende geschrieben wird.
* Die Berechnung der Werte PageSize und Max stimmt nicht, wenn der Text das Memo nicht ausfüllt.
* Wenn im Memo geschrieben wird, verhält sich die Laufleiste seltsam.

Ginko 16. Mär 2010 18:34

Re: Zwei Memofelder gleichzeitig scrollen
 
Hallo Panthrax,
danke für die Mühe die du dir gemacht hast, das funktioniert ja schon ziemlich gut.
Ist es eigentlich auch möglich ein Memo abzuleiten und dann die eingebaute Scrollbar so zu verändern, dass sie 2 Memos anspricht?

Panthrax 17. Mär 2010 12:02

Re: Zwei Memofelder gleichzeitig scrollen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Argh, stimmt, dass mir die Idee nicht gekommen ist... Manchmal lässt man sich durch Fragesteller aber auch sowas von irritieren... :duck: :spin2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz