سؤال

أملك

procedure TMainForm.FormCreate(Sender: TObject);
begin
DragAcceptFiles (Handle, True ) ; 
end ;

لكن النموذج لا يقبل الملفات التي تم سحبها - لا يوجد مؤشر إسقاط ، ولا إطلاق لرسالة WM_DropFiles.

كان لديّ البناء التالي في حدث FormShow الخاص بي (لسبب مختلف - كان هناك رمز أردت تنفيذه مرة واحدة فقط بعد إنشاء النموذج ، وكان Formshow يطلق النار أكثر من مرة أثناء التهيئة):

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 ;

DragacceptFiles (مقبض ، صحيح) في الموضع الموضح لا يزال لا يعمل. إذا قمت بنقلها إلى الجزء العلوي من الروتين (لذلك ينفذ مرتين) ، فإنه يعمل:

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 ;

يبدو أن كل رمز المثال الذي وجدته يطلق عليه DragAccept أثناء OnCreate. تشير تجاربي إلى أن هذا مبكر جدًا ، كما هو الحال في أول حريق من Onshow. أنا متأكد من أن هناك خطأ ما في الكود الخاص بي في مكان آخر ولكن ما الذي قد يسبب هذا؟

هل كانت مفيدة؟

المحلول

يمكن إنشاء أي Twincontrol's HWND وإعادة إنشائها عدة مرات خلال حياتها. أفضل مكان للاتصال بـ DragacceptFiles () هو في أساليب Overriden Createwnd () و DrideWnd () بحيث يمكنك (إعادة) التسجيل أثناء جميع الإبداعات (إعادة) وإلغاء التسجيل أثناء جميع التدمير ، على سبيل المثال:

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