Почему Clipboard.HasFormat (CF_HDROP) возвращает false в FormCreate - PullRequest
0 голосов
/ 18 августа 2011

Почему Clipboard.HasFormat (CF_HDROP) возвращает false в FormCreate, даже если буфер обмена содержит форматы Shell?

Редактировать

procedure TFormMain.FormCreate( Sender: TObject );
begin
  if Clipboard.HasFormat( CF_HDROP ) then
    MessageDlg( 'true', mtInformation, [ mbOK ], 0 )
  else
    MessageDlg( 'false', mtInformation, [ mbOK ], 0 );
end;

Это возвращает false, но MyIdleHandler возвращает true:

Application.OnIdle := MyIdleHandler; 

procedure TFormMain.MyIdleHandler(Sender: TObject; var Done: Boolean); 
begin 
    Paste1.Enabled := Clipboard.HasFormat( CF_HDROP ); 
end;

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Возвращает истину.Я не знаю, можете ли вы / должны ли применить его к кнопке Paste1 (или к чему-либо еще), пока форма не будет создана, но это показывает, что она возвращает true, если в буфере обмена есть объект файла:

procedure TForm2.FormCreate(Sender: TObject);
begin
  if  Clipboard.HasFormat( CF_HDROP ) then
    MessageDlg('true', mtInformation, [mbOK], 0)
  else
    MessageDlg('false', mtInformation, [mbOK], 0);
end;

В моем случае отображается «true», если я сначала копирую файл в буфер обмена, в противном случае - false.

0 голосов
/ 18 августа 2011

Буфер обмена. Работает нормально. Ваша проблема лежит в другом месте.

0 голосов
/ 18 августа 2011

Скорее всего, проблема , а не та, о которой вы думаете.

Clipboard.HasFormat(CF_HDROP);

, вероятно, true даже в вашей FormCreate процедуре.Попробуйте это с

procedure TForm1.FormCreate(Sender: TObject);
begin
  if Clipboard.HasFormat(CF_HDROP) then
    ShowMessage('Yes, Rejbrand was right!');
end;

В остальной части моего ответа предполагается, что Paste1 - это TAction, что и должно быть.Но, скорее всего, это пункт меню, не так ли?Хороший совет - начать использовать TActionList и TAction s.

Скорее всего, проблема в том, что действие еще не выполнено повторно.

Послевсе операторы SomeAction.Enabled := <something> должны выполняться в событиях OnUpdate соответствующих действий.Например,

procedure TForm1.ActionPasteExecute(Sender: TObject);
begin
  RichEdit1.Paste;
end;

procedure TForm1.ActionPasteUpdate(Sender: TObject);
begin
  ActionPaste.Enabled := Clipboard.HasFormat(CF_TEXT);
end;

Событие OnUpdate выполняется точно , когда необходимо определить состояние действия , например , например, когда всплывающее меню содержитпункт меню с действием показан.

...