Я просто открываю свой FindDialog с:
FindDialog.Execute;
В моем FindDialog. Событие OnFind, я хочу измениться, курсор к песочным часам для перерывает большие файлы, которые могут занять несколько секунд. Таким образом в событии OnFind я делаю это:
Screen.Cursor := crHourglass;
(code that searches for the text and displays it) ...
Screen.Cursor := crDefault;
То, что происходит, при поиске текста, курсор правильно изменяется на песочные часы (или вращающийся круг в Vista) и затем обратно к указателю, когда поиск завершается.
Однако это только происходит на основной форме. Этого не происходит на самом FindDialog. Курсор по умолчанию остается на FindDialog во время поиска. В то время как поиск происходит, если я перемещаю курсор через FindDialog, он изменяется на значение по умолчанию, и если я перемещаю его прочь, и по основной форме это становится песочными часами.
Это не походит на то, что, как предполагается, происходит. Я делаю что-то не так или делаю что-то специальная потребность, которая будет сделана, чтобы заставить курсор быть песочными часами на всех формах?
Для ссылки я использую Delphi 2009.
Я думаю, причина этого в том, что. чтобы сделать диалог поиска не формой, а диалогом (общим диалогом).
Вы можете попробовать установить курсор класса (не влияет на элементы управления диалогового окна);
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
SetClassLong(TFindDialog(Sender).Handle, GCL_HCURSOR, Screen.Cursors[crHourGlass]);
try
Screen.Cursor := crHourglass;
try
// (code that searches for the text and displays it) ...
finally
Screen.Cursor := crDefault;
end;
finally
SetClassLong(TFindDialog(Sender).Handle, GCL_HCURSOR, Screen.Cursors[crDefault]);
end;
end;
Альтернативой может быть создание подкласса FindDialog во время поиска и ответ на сообщения WM_SETCURSOR с помощью " SetCursor ". Если мы предотвратим дальнейшую обработку сообщения, элементы управления в диалоговом окне не будут устанавливать свои собственные курсоры.
type
TForm1 = class(TForm)
FindDialog1: TFindDialog;
...
private
FSaveWndProc, FWndProc: Pointer;
procedure FindDlgProc(var Message: TMessage);
...
end;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
FWndProc := classes.MakeObjectInstance(FindDlgProc);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
classes.FreeObjectInstance(FWndProc);
end;
procedure TForm1.FindDialog1Find(Sender: TObject);
begin
FSaveWndProc := Pointer(SetWindowLong(FindDialog1.Handle, GWL_WNDPROC,
Longint(FWndProc)));
try
Screen.Cursor := crHourGlass;
try
// (code that searches for the text and displays it) ...
finally
Screen.Cursor := crDefault;
end;
finally
if Assigned(FWndProc) then
SetWindowLong(FindDialog1.Handle, GWL_WNDPROC, Longint(FSaveWndProc));
// SendMessage(FindDialog1.Handle, WM_SETCURSOR, FindDialog1.Handle,
// MakeLong(HTNOWHERE, WM_MOUSEMOVE));
SetCursor(Screen.Cursors[crDefault]);
end;
end;
procedure TForm1.FindDlgProc(var Message: TMessage);
begin
if Message.Msg = WM_SETCURSOR then begin
SetCursor(Screen.Cursors[crHourGlass]);
Message.Result := 1;
Exit;
end;
Message.Result := CallWindowProc(FSaveWndProc, FindDialog1.Handle,
Message.Msg, Message.WParam, Message.LParam);
end;
Попробуйте добавить приложение. ProcessMessages; после установки курсора.
Если это сработает, обязательно позвоните своей маме, помогите старушке перейти улицу или, может быть, посадите дерево. Иначе дьяволу будет принадлежать еще одна частичка вашей души.