![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Танцы PopupMenu. с Потоком. [D7, XP]
Задачник © (2006-09-07 17:04:00)Произвожу поиск в выбранной папке (урезанный вариант) :
type
MyScanThreader = class(TThread)
private
FItem : TMenuItem;
FDirectory : String;
protected
procedure Execute; override;
public
constructor Create(Item : TMenuItem; Directory : String);
end;
constructor MyScanThreader.Create(Item: TMenuItem; Directory: String);
begin
inherited Create(false); //После создания потока сразу запускаем метод Execute.
FItem := Item;
FDirectory := Directory;
end;
procedure MyScanThreader.Execute;
var
it : TMenuItem ;
res : Integer ;
SearchRec : TSearchRec ;
begin
inherited;
FreeOnTerminate := True; //После выполнения метода Execute освобождаем поток.
SetPriorityClass(Self.Handle, REALTIME_PRIORITY_CLASS);//Устанавливаем максимальный приоритет
//////////////////////// Ну и собственно ищем.
if (FDirectory <> '') and (FDirectory[Length(FDirectory)] <> '\') then
FDirectory := FDirectory + '\';
res := FindFirst(FDirectory + '*.*', faAnyFile, SearchRec);
while res = 0 do begin
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin
it := TMenuItem.Create(FItem);
it.Caption := SearchRec.Name;
it.Hint := FDirectory + SearchRec.Name;
FItem.Add(it);
end;
res := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
it: TMenuItem;
begin
it := TMenuItem.Create(PopupMenu1);
with it do
begin
Enabled := False;
Caption := 'Пусто';
end;
PopupMenu1.Items.Add(it);
end;
И вот после щелчка по кнопке собственно и начинается танец:
procedure TForm1.Button1Click(Sender: TObject);
var
Scan : MyScanThreader ;
begin
Scan := MyScanThreader.Create(PopupMenu1.Items, 'C:\Program Files');
PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.y)
end;
Возможно, нужно установить задержку, или иную конструкцию для того, чтобы дождется пока поток не отработает, а уже потом показывать меню?
P.S. Да еще компилятор ругается: Value assigned to 'Scan' never used указывая на эту строку
Scan := MyScanThreader.Create(PopupMenu1.Items, 'C:\Program Files');
Задачник (2006-09-09 10:27:00) [1]
> Пусик © (07.09.06 22:59) [5]
У меня представлен урезанный вариант, в полной версии в процедуре определяется, что найдено, если папка на OnClick указывается одна процедура, если файл другой. Программа представляет из себя проводник, только состоящий из меню. При выборе меню папки вызывается опять эта же самая процедура поиска только с другими параметрами.
> Mike Petrichenko (07.09.06 23:16) [6]
Спасибо, попробую.
> Fay © (08.09.06 02:56) [7]
Ща проверю, вот только доделаю.
Fay (2006-09-08 02:56:00) [2]2 Задачник (07.09.06 19:03) [3]
> Думал, возможно, скорость поиска увеличится.
Не вижу оснований для такого предположения
Mike Petrichenko (2006-09-07 23:16:00) [3]1. Поток нафиг не нужен. Нет от него здесь толку.
2. Для работы с VCL пользуй метод Synchronize.
3. Вот это кусок:
> procedure TForm1.Button1Click(Sender: TObject);
> var
> Scan : MyScanThreader ;
> begin
> Scan := MyScanThreader.Create(PopupMenu1.Items, 'C:\Program
> Files');
> PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.y)
> end;
должен выглядеть вот так:
with MyScanThreader.Create(PopupMenu1.Items, 'C:\Program Files') do
WaitFor;
Free;
end;
PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.y);
4. В конструкторе потока FreeOnTerminate := False;
Пусик (2006-09-07 22:59:00) [4]
> Задачник (07.09.06 19:03) [4]
> > Пусик ©Нет это не то.
Ну что ж.
Будем вопросы задавать.
Первый - почему не подходит OnTerminate?
Задачник (2006-09-07 19:03:00) [5]
> Здесь точно нужен поток?
Думал, возможно, скорость поиска увеличится.
Задачник (2006-09-07 19:03:00) [6]
> Пусик ©
Нет это не то.
Fay (2006-09-07 18:55:00) [7]Здесь точно нужен поток?
Пусик (2006-09-07 17:12:00) [8]Перекрой OnTerminate и в нем выполняй PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.y)