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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListBox и длительное действие, интересно узнать 
:(
    Опции темы
MacTep
Дата 21.5.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Есть ListBox. В немн несколько пунктов. При щелчке на каждый из этих пунктов, выполняется како-либо длительное действие. У меня такая фигня. При щелчке на один из них, действие начинает выполняться, но в этот момент, если случайно сдвинуть мушь на следующий пункт, то действие прерывается и выполняется уже второе, т.е. то, которое назначено на уже тот пункт, который в данный момент под мышью??? Как этого не допустить? 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Dynamic
Дата 21.5.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



заводишь флаг, типа InProcess: boolean, перед выполнением процесса проверяешь его на false 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
MacTep
Дата 21.5.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Делаю так:

Код

var process:boolean;

procedure TForm1.Create(Sender: TObject);
begin
      process:=false;
end;

procedure TForm1.lb1Click(Sender: TObject);
begin
  if (lb1.ItemIndex<>-1)and(not process) then
   begin
      process:=true;
      RefreshLB(lb1.ItemIndex);
      process:=false;
   end;
end;
Все равно не работает. Такое ощущение, как будто это действие (нажатие кнопки мыши и небольшое ее перемещение) не делится на составляющие. Как одно целое воспринимается... 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Dynamic
Дата 21.5.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот это 
Цитата(MacTep @  21.5.2006,  14:49 Найти цитируемый пост)
process:=false;

попробуй вставить в тело 
Цитата(MacTep @  21.5.2006,  14:49 Найти цитируемый пост)
RefreshLB(lb1.ItemIndex);

 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Демо
Дата 21.5.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

  public
    procedure onWM_USERP1(var Msg: TMessage); message WM_USER+1;

procedure TForm1.onWM_USERP1(var Msg: TMessage);
var
  s: String;
begin
  s := ListBox1.Items[Msg.lParam];
  ShowMessage(s);
  ListBox1.Tag := 0;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  if (ListBox1.ItemIndex<>-1) and (ListBox1.Tag=0) then
   begin
      ListBox1.Tag := 1;
      PostMessage(Form1.Handle,WM_USER+1,0,ListBox1.ItemIndex);
   end;
end;

 


--------------------
    
PM MAIL ICQ Skype   Вверх
MacTep
Дата 21.5.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Dynamic, Демо, ни один из перечисленных вами способов не дал результата.
А в примере Демо вообще странно все работает... Для чего, например, выводит окно с названием пункта ListBox? 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Демо
Дата 21.5.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MacTep @  21.5.2006,  15:41 Найти цитируемый пост)
 Для чего, например, выводит окно с названием пункта ListBox? 


Ну блин... Это пример. в обработчиеке сообщения нужно заменить вывод на твой код - то, что тебе нужно выполнить. 


--------------------
    
PM MAIL ICQ Skype   Вверх
Albinos_x
Дата 21.5.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(MacTep @  21.5.2006,  15:41 Найти цитируемый пост)
Dynamic, Демо, ни один из перечисленных вами способов не дал результата.

моё предположение... хотя может и не верное, т.к. не знаю содержание процедуры RefreshLB
видимо ты действие передаёшь в отдельный поток, а переменную не правильно устанавливаешь....
т.е. при выполнении:
Код

 if (lb1.ItemIndex<>-1)and(not process) then    
   begin    
      process:=true;    
      RefreshLB(lb1.ItemIndex);    
      process:=false;    
   end;

запускает поток, делает process:=false и выходит, а поток продолжает работать.... отсюда делаем вывод что установить process:=false надо в конце работы потока...
Цитата(MacTep @  21.5.2006,  15:41 Найти цитируемый пост)
А в примере Демо вообще странно все работает... Для чего, например, выводит окно с названием пункта ListBox?

это всего лишь пример... 


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Демо
Дата 21.5.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

procedure TForm1.onWM_USERP1(var Msg: TMessage);    
var    
  s: String;    
begin    
//  s := ListBox1.Items[Msg.lParam];    
  ЗДЕСЬ ДЕЛАЕШЬ ТО, ЧТО ТЕБЕ НУЖНО
//  ShowMessage(s);    
  ListBox1.Tag := 0;    
end;
 


--------------------
    
PM MAIL ICQ Skype   Вверх
MacTep
Дата 21.5.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



нет, так тоже не работает. Какое-то странное действие: как будто бы команда OnClick выполняется два раза. Сначала первый раз после того, как я нажал на пункт списка. Второй раз, после завершения действий по нажатию на первый пункт.

Добавлено @ 16:34 
вот содержимое процедуры:
Код

procedure RefreshLB(indx:integer);
var ext:string;
begin
  with MacTepWMForm do
    begin
      if (lb1.Count<>0)and
         (PrevItemLB<>indx)and
         (FileExists(groups[clb1.ItemIndex+1].Strings[indx]))then
        begin
          btnPreview.Enabled:=true;
          Screen.Cursor:=crHourGlass;
          // загрузка картинки
          Image4.Picture.LoadFromFile(groups[clb1.ItemIndex+1].Strings[indx]);
          // расположение картинки
          Label4.Caption:=groups[clb1.ItemIndex+1].Strings[indx];
          // выделяем расширение
          ext:=LowerCase(ExtractFileExt(groups[clb1.ItemIndex+1].Strings[indx]));
          // если картинка не BMP, а JPEG
          if ext<>'.bmp' then
            begin
              bm:=TBitMap.Create;
              JpegIm:=TJpegImage.Create;
              JpegIm.LoadFromFile(groups[clb1.ItemIndex+1].Strings[indx]);
              bm.Assign(JpegIm);
              // разрешение
              Label6.Caption:=IntToStr(bm.Width)+'x'+IntToStr(bm.Height);
              bm.Destroy;
              JpegIm.Destroy;
            end
          else
            Label6.Caption:=IntToStr(Image4.Picture.Bitmap.Width)+'x'+IntToStr(Image4.Picture.Bitmap.Height);
          Screen.Cursor:=crDefault;
          PrevItemLB:=indx;
        end;
    end;
end;
Думаю, что ничего криминального в этом коде нет. smile 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Демо
Дата 21.5.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MacTep @  21.5.2006,  16:29 Найти цитируемый пост)
 Какое-то странное действие: как будто бы команда OnClick выполняется два раза.


Значит, лшибка в другом месте. 


--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 21.5.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Может быть не в тему (так и не понял в чём проблема), но почему нельзя делать просто 
Код
Enable := False
 пока выполняется (длительное) действие? 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MacTep
Дата 21.5.2006, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Yanis, потому что это тоже, хотя странно, не привело к успеху. smile 


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Dynamic
Дата 22.5.2006, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



КАК вариант: запоминай значение ItemIndex в момент клика в листбоксе и процедуре RefreshLB работай с переменной, а не с ItemIndex....... 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Albinos_x
Дата 22.5.2006, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(MacTep @  21.5.2006,  23:47 Найти цитируемый пост)
, не привело к успеху

видимо всё таки:
Цитата(Демо @  21.5.2006,  16:35 Найти цитируемый пост)
Значит, лшибка в другом месте

 


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

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

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

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

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


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

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


 




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


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

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