![]() |
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; |
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; |
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? |
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. |
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. |
Re: Zwei Memofelder gleichzeitig scrollen
Schon Min, Max und PageSize eingestellt?
|
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. |
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. |
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? |
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:
|
Re: Zwei Memofelder gleichzeitig scrollen
da fehlen die units, nur das dpr drin ^^
|
Re: Zwei Memofelder gleichzeitig scrollen
Liste der Anhänge anzeigen (Anzahl: 1)
:wiejetzt: Junge, junge, so langsam glaube ich, das Thema ist verhext...
|
Re: Zwei Memofelder gleichzeitig scrollen
Hallo Panthrax, so klappt das natürlich noch besser :thumb: danke.
Ich habe mal die Scrollbar des Partner Memos rausgeholt und die MouseWheel Prozedur hinzugefügt, welche auch auf das Mausrad reagieren zu scheint, wenn nur die Scrollbar des TMyMemo vorhanden ist. Allerdings weiß ich nicht wie ich jetzt dem Partner Memo mitteilen kann, dass es das selbe macht wie das Hauptmemo. So wie ich es gemacht habe klappt es jedenfalls nicht, man sieht aber, dass das andere Memo reagiert. Hier mal der erweiterte Quelltext:
Delphi-Quellcode:
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyMemo = class(TMemo) private FPartner: TWinControl; public property Partner: TWinControl read FPartner write FPartner; procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL; procedure MouseWheelHandler(var Message: TMessage); reintroduce; message WM_MouseWheel; end; TForm3 = class(TForm) Memo1: TMemo; StaticText1: TStaticText; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form3: TForm3; implementation {$R *.dfm} { TMyMemo } procedure TMyMemo.WMVScroll(var Message: TWMVScroll); begin inherited; if Assigned(FPartner) then FPartner.Dispatch(Message); end; procedure TMyMemo.MouseWheelHandler(var Message: TMessage); begin inherited; SendMessage(FPartner.Handle,WM_VSCROLL,SB_VERT,0); end; { TForm3 } procedure TForm3.FormCreate(Sender: TObject); var Memo: TMyMemo; begin with TMyMemo.Create(Self) do begin Parent := Self; Left := 3; Top := 8; Width := 185; Height := 89; ScrollBars := ssVertical; Lines.Text := Memo1.Lines.Text; Partner := Memo1; end; end; end. |
Re: Zwei Memofelder gleichzeitig scrollen
So geht's:
Delphi-Quellcode:
Die Nachrichten möglichst originär weiterreichen. Und die Methode MouseWheelHandler besser nicht verwenden. Die geerbte Implementierung wird nämlich auch von der Methode TControl.WMMouseWheel aufgerufen, der ursprünglichen Empfängerin der Nachricht. Also besser dort ansetzen, dann ist die Nachrichtenverarbeitung für beide Memos gleich.
type
TMyMemo = class(TMemo) public procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL; end; { TMyMemo } procedure TMyMemo.WMMouseWheel(var Message: TWMMouseWheel); begin inherited; if Assigned(FPartner) and (Message.Result = 1) then begin Message.Result := 0; FPartner.Dispatch(Message); end; end; |
Re: Zwei Memofelder gleichzeitig scrollen
Leider klappt es nur wenn beide Felder eine Scrollbar haben, merkwürdig.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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