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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Scroll'ы на TForm 
:(
    Опции темы
Delphist
Дата 2.11.2005, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



У TForm'ы ставлю AutoScroll = true, на форме есть компоненты, которые можно перемещать по форме, когда они заходят за края формы появляются scroll'ы. SсrollInView позволяет отобразить компонент в нужном месте. При зашкаливании компонента за форму Scroll'ы очень быстро растут как их притармозить. И как сделать так, чтобы при клике на стрелке Scroll'а мышкой когда он находитяс на конце, чтобы Scroll продолжал двигаться дальше.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Alexeis
Дата 2.11.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Не очень понятна фраза:
Цитата
При зашкаливании компонента за форму Scroll'ы очень быстро растут как их притармозить



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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Delphist
Дата 2.11.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(alexeis1 @ 2.11.2005, 10:29)
Не очень понятна фраза:
Цитата
При зашкаливании компонента за форму Scroll'ы очень быстро растут как их притармозить

Объясняю. Есть у нас форма на форме компоненты, которые мы можем двигать мышкой. Когда компонент заходит за правый и нижний край формы у нее появляются Scroll'ы. После этого при вызове ScrollInView перемещаемый компонент постоянно отображается, и при этом очень большая скорость роста Position у scroll'a. Поэтому появляется неприятный эффект: слегка двинули компонент за край формы и растояние от первоначально положения компонента резко возрастает, поэтому как сделать, чтобы прирост Position был поплавней. Ещё один момент как сделать так, чтобы при нажатии мышкой на scroll, когда scroll находится внизу объект двигался вниз(см рисунок).

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  obj.JPG 10,82 Kb


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Случайный посетитель
Дата 2.11.2005, 17:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Delphist @ 2.11.2005, 14:13)
После этого при вызове ScrollInView перемещаемый компонент постоянно отображается


Наверное стоит ScrollInView вызывать только один раз - при окончании перетаскивания визуального объекта.
  Вверх
Delphist
  Дата 2.11.2005, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата
Цитата(Delphist @ 2.11.2005, 14:13)
После этого при вызове ScrollInView перемещаемый компонент постоянно отображается


Наверное стоит ScrollInView вызывать только один раз - при окончании перетаскивания визуального объекта.

Примером бы не мог отобразить.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Случайный посетитель
Дата 2.11.2005, 19:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Delphist @ 2.11.2005, 18:59)
Примером бы не мог отобразить.


Так для этого еще надо Drag&Drop реализовать сначала.

Для простоты я реализовал вручную перетаскивание рисунка и на событие OnMouseUp выполняю:

Код

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isDrag := False;
  Form1.ScrollInView(Image1);
end;

  Вверх
Delphist
Дата 3.11.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  isDrag := False;
  Form1.ScrollInView(Image1);
end;
[/code]

Зачем сюда нужен isDrag := False;



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Alexeis
Дата 3.11.2005, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата
Поэтому появляется неприятный эффект: слегка двинули компонент за край формы и растояние от первоначально положения компонента резко возрастает, поэтому как сделать, чтобы прирост Position был поплавней

Придется отлавливать WM_HSCROLL и WM_VSCROLL формы
и производить некоторые действия вручную

редактировано

возможно устроит вариант с таймером
таймер на 200мс изначально enabled = false

Код

var
  x1, y1 : Integer;
  b      : boolean = false;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  x1 := x;
  y1 := y;
  b  := true;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if b
  then
    Begin
      button1.Left := button1.Left  + x - x1;
      button1.top  := button1.top   + y - y1;
      Timer1.Enabled := true;
    end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  b := false;
  Timer1.Enabled := false;
  form1.ScrollInView(button1);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  form1.ScrollInView(button1);
end;


Это сообщение отредактировал(а) alexeis1 - 3.11.2005, 13:45


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RaIDeR
Дата 4.11.2005, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помнится Я когда-то тоже искал ответ на этот вопрос, ну и вот что нашёл:
Код

function ClientWindowProc( wnd: HWND; msg: Cardinal; wparam, lparam: Integer ): Integer; stdcall;
var
f: Pointer;
begin
f := Pointer( GetWindowLong( wnd, GWL_USERDATA ));
case msg of
WM_NCCALCSIZE:
 if ( GetWindowLong( wnd, GWL_STYLE ) and
          (WS_HSCROLL or WS_VSCROLL)) <> 0 then
  SetWindowLong( wnd, GWL_STYLE, GetWindowLong( wnd, GWL_STYLE )
                and not (WS_HSCROLL or WS_VSCROLL));
end;
Result := CallWindowProc( f, wnd, msg, wparam, lparam );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if ClientHandle <> 0 then
  begin
    if GetWindowLong( ClientHandle, GWL_USERDATA ) <> 0 then
         Exit;  {cannot subclass client window, userdata already in use}
    SetWindowLong(ClientHandle, GWL_USERDATA, SetWindowLong( ClientHandle,
               GWL_WNDPROC, integer( @ClientWindowProc)));
  end;
end;



------------------------
Упс ... извиняюсь, тут оказывается надо чтоб "прирост Position был поплавней. ", а Я чёт подумал что Scroll'ы надо совсем убрать ... smile

Это сообщение отредактировал(а) RaIDeR - 4.11.2005, 01:25
PM MAIL   Вверх
Delphist
  Дата 7.11.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата
Придется отлавливать WM_HSCROLL и WM_VSCROLL формы
и производить некоторые действия вручную


А где бы пример кода посмотреть?

Это сообщение отредактировал(а) Delphist - 7.11.2005, 17:19


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Alexeis
Дата 8.11.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Имелось в виду пример кода отлова сообщений smile

если да то можно посмотреть в
Delphi Russian Knowlage Base

Это сообщение отредактировал(а) alexeis1 - 8.11.2005, 13:59


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Delphist
  Дата 9.11.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(alexeis1 @ 8.11.2005, 13:55)
Имелось в виду пример кода отлова сообщений smile

если да то можно посмотреть в
Delphi Russian Knowlage Base

Прямую ссылку дать не мог бы.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Alexeis
Дата 10.11.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Delphi Russian Knowlage Base
раздел
-Системные функции и WinApi
подраздел
-Windows
подраздел
-Сообщения Windows

Как обрабатывать сообщения
Системные сообщения (сокращения)
Что такое сообщения Windows?

Это сообщение отредактировал(а) alexeis1 - 10.11.2005, 12:38


--------------------
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.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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