Search the Community
Showing results for tags 'scrolling'.
Found 2 results
-
Specs: delphi xe7, vcl, win7 - TMemo components I've been searching to no avail on this topic. I can't find any example source code showing how to synchronize two memo's scrolling, via keyboard, mouse, and scrollbars. I see there are a few for TListBox examples but not for TMemo. I also tried one example (it was for tlistbox) and everything compiles except that TMemo does not have a .TopIndex so that source code does not compile up to that point. (link below). link to that resource -> https://stackoverflow.com/questions/24195857/synchronize-scrollbars-of-two-listboxes. source from stackexchange: To set the top line of a list box you use TopIndex. You can create a TListbox descendent that handles the WM_VSCROLL (and WM_HSCROLL if you want). You can then hook into this and update the second list box. Here is an example of this. I am only doing the hook one way so scrolling listbox2 won't scroll listbox1. You will need to add this TListBox override to your unit before the form declaration: TListBox = class(Vcl.StdCtrls.TListBox) private FOnScroll: TNotifyEvent; protected procedure ListBoxScroll(var Message: TMessage); message WM_VSCROLL; public property OnScroll: TNotifyEvent read FOnScroll write FOnScroll; end; This adds a OnScroll event to the listbox. The implementation for this class: procedure TListBox.ListBoxScroll(var Message: TMessage); begin inherited; if Assigned(FOnScroll) then FOnScroll(Self); end; You can then hook up the event in code: procedure TMyForm.FormCreate(Sender: TObject); begin listbox1.OnScroll := DoScrollListBox1; end; The code for DoScrollListBox1 is very simple: procedure TMyForm.DoScrollListBox1(Sender: TObject); begin listbox2.TopIndex := listbox1.TopIndex; end; This handles the scrolling by using the scroll bar. You will also need to add the following line to your OnClick of the listbox so keyboard actions will also trigger the scrolling. procedure TMyForm.ListBox1Click(Sender: TObject); begin ... listbox2.TopIndex := listbox1.TopIndex; ... end; My modified version of the above code: unit Unit1; interface TForm1 = class(TForm) memo1: TMemo; memo2: TMemo; procedure memo1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; implementation {$R *.dfm} procedure TMemo.MemoScroll(var Message: TMessage); begin inherited; if Assigned(FOnScroll) then FOnScroll(Self); end; procedure TForm1.FormCreate(Sender: TObject); begin memo1.OnScroll := DoScrollMemo; end; procedure tform1.DoScrollMemo(Sender: TObject); begin memo2.TopIndex := memo1.TopIndex; end; // This handles the scrolling by using the scroll bar. You will also need to // add the following line to your OnClick of the listbox so keyboard actions // will also trigger the scrolling. procedure tform1.memo1Click(Sender: TObject); begin //... //memo2.TopIndex := memo1.TopIndex; // <--- Does not compile at this point because there is no .TopIndex in TMemo. I learned this all to late. //... end; Does anyone have source code for synchronizing two TMemo's?
- 39 replies
-
- delphi xe7
- synchronize
-
(and 2 more)
Tagged with:
-
Hi Folks, I'm stuck with the problem that I want to prevent a grid to act on the mouse wheel events. The UI layout is the following: On a TFrame (created at runtime) I have a TCategoryPanelGroup. As the application is receiving data in different formats, for each data package a new TCategoryPanel is created at runtime and placed on the TCategoryPanelGroup. Each TCategoryPanel contains two grids who are adjusted to fit the data. The heights of the grids and the TCategoryPanel are adjusted so that in >90% of the cases the grids won't have a scrollbar. Now when I use the mouse wheel over a grid, the grid catches the wheel and happily acts on it, which is not what I want. If the grid has a scrollbar (rare case), the user shall use the scrollbar to scroll the grid. My goal is to always scroll the TCategroyPanelGroup when the mouse wheel is used over one of the grids or a TCategorypanel so the user can quickly flip through the categories. How can I make the grids and the TCategoryPanel "ignore" or "pass up" the mouse wheel events so that the TCategoryPanelGroup receives them and can act on them? Would a different structure of UI elements be a better approach? I'm actually quite happy with the category panels, because the data inside can be clearly identified via their header and they can be collapsed when I don't want to see all different data sets at the same time. I've attached a stripped example of the UI structure that just catches the mouse wheel events for the controls and outputs them in a memo. MouseScroll.zip