Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокрутка, трех TMemo одновременно 
:(
    Опции темы
kindDevil
Дата 22.2.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 10.10.2005

Репутация: нет
Всего: нет



есть три штуки TMemo и один Tscrollbar.
как с его помрщью организовать прокрутку мемошек?  smile 

PM MAIL ICQ   Вверх
gambit
Дата 22.2.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Работает криво но лучше чем ничего.
Код

procedure TForm1.ScrollBar1Change(Sender: TObject);
var i:integer;
begin
if i<scrollbar1.Position then
begin
memo1.Perform(WM_VScroll, SB_LINEUP,0);
memo2.Perform(WM_VScroll, SB_LINEUP,0);
memo3.Perform(WM_VScroll, SB_LINEUP,0);
end
else
begin
memo1.Perform(WM_VScroll, SB_LINEDOWN,0);
memo2.Perform(WM_VScroll, SB_LINEDOWN,0);
memo3.Perform(WM_VScroll, SB_LINEDOWN,0);
end;
i:=scrollbar1.Position;
end;

PM MAIL ICQ Skype   Вверх
Pakshin A. S.
Дата 22.2.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



По-моему не работает предложенный вариант... Хотя бы по причине определения переменной i

Код

var
  i:integer;

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  if i > scrollbar1.Position then
    begin
      memo1.Perform(WM_VScroll, SB_LINEUP, 0);
      memo2.Perform(WM_VScroll, SB_LINEUP, 0);
      memo3.Perform(WM_VScroll, SB_LINEUP, 0)
    end
  else
    begin
      memo1.Perform(WM_VScroll, SB_LINEDOWN, 0);
      memo2.Perform(WM_VScroll, SB_LINEDOWN, 0);
      memo3.Perform(WM_VScroll, SB_LINEDOWN, 0)
    end;
  i:=scrollbar1.Position
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  scrollBar1.Max:=memo1.Lines.Count; // если везде одинаковая инфа по строкам
  i:=scrollbar1.Position
end;




PM   Вверх
gambit
Дата 22.2.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Pakshin A. S., у тебя тоже самое.
  • Врятли колво строк одинаково.
  • Он не поэтому неработает. А не работает он если передвигать scroll за сам ползунок.

PM MAIL ICQ Skype   Вверх
Pakshin A. S.
Дата 22.2.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



gambit, 
Вот ты определяешь переменную i внутри процедуры. При входе в процедуру переменная создается, т. е. выделяется место в стеке. После завершения процедуры переменная i выталкивается из стека, т. е. уничтожается, т. е. независимо от того, что мы делаем с прокруткой, выполняется оно и то же действие, а именно прокрутка всех трех Memo вниз.

Мой код работает. Могу предоставить exe...

Добавлено @ 23:39 
Цитата(gambit @  22.2.2007,  22:44 Найти цитируемый пост)
Врятли колво строк одинаково.

Так введем коэффициенты и будем двигать каждую Memo отдельно...
PM   Вверх
Pakshin A. S.
Дата 23.2.2007, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Нечто типа этого, наверное:

Код

var
 i: integer;
 Memo: array [1..3] of TMemo;
 Lengths: array [1..3] of integer;
 k1, k2: real;

procedure TForm1.ScrollBar1Change(Sender: TObject);
var
  j: integer;
begin
  if i > scrollbar1.Position then
    begin
      Memo[1].Perform(WM_VScroll, SB_LINEUP, 0);
      for j:=1 to Round(k1) do
        Memo[2].Perform(WM_VScroll, SB_LINEUP, 0);
      for j:=1 to Round(k2) do
        Memo[3].Perform(WM_VScroll, SB_LINEUP, 0)
    end
  else
    begin
      Memo[1].Perform(WM_VScroll, SB_LINEDOWN, 0);
      for j:=1 to Round(k1) do
        Memo[2].Perform(WM_VScroll, SB_LINEDOWN, 0);
      for j:=1 to Round(k2) do
        Memo[3].Perform(WM_VScroll, SB_LINEDOWN, 0)
    end;
  i:=ScrollBar1.Position
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: integer;
  b1: TMemo;
  b2: integer;
begin
  Memo[1]:=Memo1;
  Memo[2]:=Memo2;
  Memo[3]:=Memo3;
  Lengths[1]:=Memo1.Lines.Count;
  Lengths[2]:=Memo2.Lines.Count;
  Lengths[3]:=Memo3.Lines.Count;
  for i:=1 to 3 do
    for j:=1 to 3 do
      if Lengths[i] < Lengths[j] then
        begin
          b1:=Memo[i];
          Memo[i]:=Memo[j];
          Memo[j]:=b1;
          b2:=Lengths[i];
          Lengths[i]:=Lengths[j];
          Lengths[j]:=b2
        end;
  k1:=Lengths[2]/Lengths[1];
  k2:=Lengths[3]/Lengths[1];
  ScrollBar1.Max:=Lengths[1]
end;

PM   Вверх
Sunvas
Дата 23.2.2007, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Ничего лучше пока предложить не могу, но ИМХО реализация корявая. Она-то работает, но при условии что мы будем двигать ползунок только на одну позицию. Если в скроллбаре сделать пару резких движений ползунком, то код совершенно перестает работать.
Тут надо делать привязку к позиции скроллбара.. smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Pakshin A. S.
Дата 23.2.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Sunvas @  23.2.2007,  00:08 Найти цитируемый пост)
Ничего лучше пока предложить не могу, но ИМХО реализация корявая. Она-то работает, но при условии что мы будем двигать ползунок только на одну позицию. Если в скроллбаре сделать пару резких движений ползунком, то код совершенно перестает работать.

Поставить for на резкий скачок...

if ...
begin
for 
   ...
end
else
begin
for
   ...
end;
PM   Вверх
Alexeis
Дата 23.2.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(kindDevil @  22.2.2007,  18:51 Найти цитируемый пост)
есть три штуки TMemo и один Tscrollbar.
как с его помрщью организовать прокрутку мемошек? 


  Нужна только прокрутка или еще и полная их синхронизация?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.