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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Измение курсора у Virtual TreeView после BeginUpda, после BeginUpdate 
:(
    Опции темы
GogaM
Дата 8.9.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не могу изменить курсор у Virtual TreeView.
Когда выполняю операции которые занимают много времени выставляю у дерева свойство Cursor := crHourGlass, 
но визуально курсор на дереве не меняется, хотя свойство Cursor = crHourGlass. 
Курсор меняется только в том случае если я перед началом  цикла не выполняю BeginUpdate, 
но в этом случае дерево работе очень медленно.
Можно ли после BeginUpdate поменять курсор?

PM MAIL   Вверх
morpheyushka
Дата 8.9.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


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

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



Я в подобных случаях пользуюсь RxLib'ом.
Делаю это так:
Код

StartWait;
try
//код
finally
  StopWait;
end;


пока выполняется код в try...finally - пользователь наблюдает часикиsmile
и вставлять можно когда хочешь...


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
GogaM
Дата 8.9.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я так понимаю, что StartWait показывает часики на всем приложении а не на конкретном дереве.
Если это так, то этот вариан не подходит так же как и вариант Screen.Cursor := crHourGlass.
Поскольку оперции с деревом выполняются в потоке, остальные модули (формы) проекта должны нормально работать,
а при наведении мыши на контрол дерева курсор должен измениться.
PM MAIL   Вверх
Poseidon
Дата 8.9.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Я не пойму в чем проблема? Меняй курсор, делай BeginUpdate и начинай цикл...


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
GogaM
Дата 9.9.2008, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё раз.
Перед началом цикла делаю 
Virtual TreeView.Cursor := crHourGlass
Virtual TreeView.BeginUpdate
Цикл
Virtual TreeView.EndUpdate
Virtual TreeView.Cursor := crDefault
Во время цикла водим мышом над деревом курсор crDefault.
Как поменять на crHourGlass.
PM MAIL   Вверх
Poseidon
Дата 9.9.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



В общем, как показали эксперементы с BeginUpdate, этот метод запрещает вообще все сообщения контролу. Поэтому и получается, что курсор как бы не знает что он находится над деревом и не меняется. На скорую руку я бы это все обошел так:

Код
type
  TTestThread = class(TThread)
  private
    VT: TVirtualStringTree;
  protected
    procedure Execute; override;
    procedure UpdVT;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var TestThread: TTestThread;
begin
  VirtualStringTree1.Cursor := crHourGlass;

  TestThread:= TTestThread.Create(True);
  TestThread.FreeOnTerminate:= True;
  TestThread.Resume;
end;


{ TTestThread }
procedure TTestThread.Execute;
var i: integer;
begin
  VT:= TVirtualStringTree.Create(nil);

  for i:= 0 to 50000 do VT.AddChild(nil); // < -- цикл заполнения

  Synchronize(UpdVT);
  VT.Free;
end;

procedure TTestThread.UpdVT;
begin
  with Form1 do
  begin
    VirtualStringTree1.Assign(VT);
    VirtualStringTree1.Cursor := crDefault;
  end
end;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
GogaM
Дата 9.9.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Про "скорую руку" согласен.
Только Assign придётся делать 2 раза, чтоб деревья не отличались.
В добавок  Assign происходит в основной нити и 2 Assign-а тож не мнгновенно отрабатывают.
Количество нод у мну в проекте примерно такое как в примере, да не по одному разу.
PM MAIL   Вверх
Poseidon
Дата 9.9.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(GogaM @  9.9.2008,  09:42 Найти цитируемый пост)
В добавок  Assign происходит в основной нити и 2 Assign-а тож не мнгновенно отрабатывают.
Кто сказал? Assign в потоке. А то, что не мгновенно, так это спорно smile Assign - это присвоение данных которые в памяти. Такое присвоение обычно очень быстрое. Оно конечно медленнее чем если бы мы сразу заполняли дерево, но не ощутимо. Тем более пользователь видет в это время "часики". 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
GogaM
Дата 9.9.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В примере Assign вызывается через Synchronize.
Это означает что весь код выполняется в основной нити.
PM MAIL   Вверх
Poseidon
Дата 9.9.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Ну верно и что? У нас есть пустое дерево в памяти и заполненное дерево в памяти. Мы берем данные из заполненного и копируем в пустое. Все это в основной нити и..? Ведь само заполнение данными, сама "тяжелая операция" проходит в потоке. А копирование память-память потом "общей кучей" пройдет за миллисекунды.


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

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

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

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

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


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

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


 




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


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

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