Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прокрутка при DragDrop [D5, Win95/98, Win2k, WinXP]


BorisM ©   (2002-01-23 07:24:00) 

Подскажите, как правильно сделать прокрутку в TreeView когда происходит Drag&Drop. Сама прокрутка у меня работает, но на дереве остается "мусор". Пробовал даже делать Repaint, все равно не помогает.

Код такой:

procedure TMainForm1.T1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if (Source is TLsFileListView28) or (Source is TDATreeView) then
Accept := true
else
begin
Accept := False;
exit;
end;
if Y > T1.Height - Sb1.Height - 10 then
T1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)
else
if Y < 10 then
T1.Perform(WM_VSCROLL, SB_LINEUP, 0);
T1.Repaint;
end;


T1: TDATreeView;
SB1: TScrollBar;
TDATreeView отличается от обычного TreeView только тем, что позволяет делать Drag&Drop внутри себя.

И попутно второй вопрос. Как узнать какая будет высота горизонтальной полосы прокрутки по умолчанию при текущем разрешении экрана? А то приходиться ставить невидимую полоску на форму и брать ее Height.

Спасибо.


BorisM   (2002-01-25 19:49:00) [1]

Кажется нашел где собака зарыта.
Скроллинг при внутреннем DragDrop в TreeView работает нормально, но когда я хочу сделать DragDrop из TLsFilelistView28, при скроллинге в TreeView появляется "мусор". Я попробовал перетащить Item из простого FileListbox в мой TreeView и скроллинг тоже работает нормально. Похоже проблема с компонентом TLsFilelistView28. К тому же, когда я делаю Drag из него, курсор бывает блеклым и почему-то имя перетаскиваемого файла оказывается на разном расстоянии от самого курсора. Короче напишу автору TLsFilelistView28, либо посмотрю код сам.

Спасибо всем, кто участвовал в обсуждении.
Удачи


DMN   (2002-01-25 11:19:00) [2]

Странно. А версия common controls у тебя правильная? А дерево не OwnerDraw? У меня твой код работает... На всякий случай - можно попробовать заменить Perform на

PostMessage(T1.Handle,WM_VSCROLL, SB_LINEDOWN, 0);


nikkie   (2002-01-25 09:44:00) [3]

ты лучше код пришли


BorisM   (2002-01-25 00:07:00) [4]

Перенес пример на Delphi один в один. Та же ерунда получается :(.
Могу прислать скриншот кому интересно. Придется не полениться и установить VB ради того, чтобы проверить этот HowTo в оригинале.


BorisM   (2002-01-24 07:38:00) [5]

Нет не Sleep. Пробовал привязать к таймеру как в этом примере. Попробую теперь просто перевести весь пример из VB в Delphi.


nikkie   (2002-01-23 19:18:00) [6]

причем здесь задержка? ты Sleep пытался делать что ли?

а если сделать просто как в этом примере на VB - на DragOver включаем таймер и скроллируем по событию от таймера?


BorisM   (2002-01-23 18:58:00) [7]

Задержка не помогает. Какие будут еще предложения?


BorisM   (2002-01-23 16:07:00) [8]

За GetSystemMetrics спасибо. Очень полезная функция - возьму на вооружение.
С T1.ScrollBy(DX,DY) еще хуже, чем с T1.Perform(..) Теперь программа просто размножает крайнюю верхнюю или нижнюю сторку при сдвиге.
Нашел вот этот пример http://support.microsoft.com/default.aspx?scid=kb;EN-US;q177743
Возможно нужно просто вставить задержку.


nikkie   (2002-01-23 09:48:00) [9]

а ты не пробовал делать T.ScrollBy(DX, DY)?

уточнение к sky3d - функция называется GetSystemMetrics, нужный параметр SM_CYHSCROLL


sky3d   (2002-01-23 09:25:00) [10]

По второму вопросу..
GetSystemMetrix SM_CXVSCROLL, SM_CYVSCROLL


Наверх

Титульная страница Поиск, карта сайта Написать письмо