Почему мой курсор не изменяется на Песочные часы в моем FindDialog в Delphi?

Я просто открываю свой 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.

5
задан lkessler 18 April 2010 в 01:55
поделиться

2 ответа

Я думаю, причина этого в том, что. чтобы сделать диалог поиска не формой, а диалогом (общим диалогом).

Вы можете попробовать установить курсор класса (не влияет на элементы управления диалогового окна);

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;
3
ответ дан 15 December 2019 в 06:20
поделиться

Попробуйте добавить приложение. ProcessMessages; после установки курсора.

Если это сработает, обязательно позвоните своей маме, помогите старушке перейти улицу или, может быть, посадите дерево. Иначе дьяволу будет принадлежать еще одна частичка вашей души.

0
ответ дан 15 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: