Delphi - когда позвонить DragAceptfiles
-
30-09-2019 - |
Вопрос
У меня есть
procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles (Handle, True ) ;
end ;
Но форма не принимает перетаскиваемые файлы - без капля курсора, без обжига WM_DROPFILES.
У меня была следующая конструкция в моем событии Formshow (по другой причине - был код, который я хотел выполнить только один раз после создания формы, и FORMSHWOW стрельба более одного раза во время инициализации):
procedure TMainForm.FormShow(Sender: TObject);
begin
if (not FRunOnce) then // as FormShow can be called twice - if Form.Position assigned to
begin
DragAcceptFiles (Handle, True ) ;
FRunOnce := True ;
end ;
end ;
DRAGACPECTFILES (ручка, правда) в положении, показанном до сих пор не работает. Если я перемещу его на вершину рутины (так что он выполняет дважды), он работает:
procedure TMainForm.FormShow(Sender: TObject);
begin
DragAcceptFiles (Handle, True ) ;
if (not FRunOnce) then // as FormShow can be called twice - if Form.Position assigned to
begin
FRunOnce := True ;
end ;
end ;
Весь пример код, который я обнаружил, кажется, называет драгакос во время OnCreate. Мои эксперименты предполагают, что это слишком рано, как и первый огонь на охвате. Я уверен, что что-то не так с моим кодом в другом месте, но что может заставить это?
Решение
Любой HWND Twincontrol может быть создан и воссоздан несколько раз во время жизни. Лучшее место для вызова DragAceptFiles () находится в переопределении методах Createwnd () и Disurnwnd (), чтобы вы могли (Re) регистрироваться во время всех (Re) Creations и отменить регистрацию во время всех разрушений, например:
procedure TMainForm.CreateWnd;
begin
inherited;
DragAcceptFiles(Handle, True);
end;
procedure TMainForm.DestroyWnd;
begin
DragAcceptFiles(Handle, False);
inherited;
end;
Другие советы
То FormShow
Сжигание событий более одного раза в вашем приложении является признаком того, что ручка формы разрушена и воссоздана, по крайней мере, раз, скорее всего, потому что вы изменяете одно из свойств, которые требуют воссоздания ручки окна. Изменение пребывания наверху является одним из примеров.
Если ручка воссоздана, то новая, конечно, не получит никаких сообщений, которую должен быть зарегистрирован предыдущая обработка.
Что вам нужно сделать, это позвонить DragAcceptFiles()
После того, как окончательная ручка была создана, или (как это может быть трудно сделать) действительно несколько раз.
Я обнаружил, что такие проблемы легко обрабатывают пользовательское сообщение, которое вы публикуете для себя в FormCreate. Например:
CONST
wm_FirstRun = WM_USER + 101;
TYPE
TForm1 = class(TForm)
:
Procedure wmFirstRun(var Msg:tMessage); message wm_FirstRun;
procedure FormCreate(Sender: TObject);
:
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// other initialization code
PostMessage(handle,wm_FirstRun,0,0);
end;
Procedure TForm1.wmFirstRun(var Msg:tMessage);
begin
// handle the code here that will run once the form is processing messages
end;
Триггерный механизм является PostMessage
, Поэтому, когда вы вызываете эту команду, это призовит вашу собственную рутину сообщений. Конечно, если это так, то я бы назвал это чем-то, кроме WMFIRSTRUN.