Вопрос

У меня есть

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top