سؤال

أنا باستخدام Delpho 2006.السيناريو:

على وحدة البيانات لدي ActionList.واحدة من الإجراءات اختصار Ctrl+F4 و أريد أن ثانوي الاختصار Ctrl+W.حاولت كل من التالية:

مضيفا Ctrl+W الإجراءات SecondaryShortcut قائمة في IDE.

مضيفا أنه في DataModuleCreate الإجراء باستخدام إما

ActFileCloseFile.SecondaryShortCuts.Add('Ctrl+W');

أو

ActFileCloseFile.SecondaryShortCuts.AddObject('Ctrl+W',
  TObject(Menus.ShortCut(87, [ssCtrl])));

استخدام كل من هذه الأساليب في إنشاء أو FormShow الإجراء من شكل حيث سيتم استخدامها.

الرئيسية الاختصار يعمل دائما ، ولكن ليس في المرحلة الثانوية.

عندما أضع ActionList على النموذج الرئيسي بدلا من وحدة البيانات ، فإنه يعمل فقط عن طريق إضافة Ctrl+W في IDE.ماذا أفعل الخطأ ؟

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

المحلول

والحل الأكثر أناقة وجدت حتى الآن هو:

في النموذج الذي تريد للتعامل مع SecondaryShortCut، هذا إضافة إلى الحدث OnShortCut:

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := dmDataModule.ActionList1.IsShortCut(Msg);
end;

والبديل:

(وهذا ليس حلا حقيقيا، ولكن الحل).

ووضع لائحة العمل على النموذج الذي لديه عمل مماثلة لتلك التي على وحدة البيانات. فقط إلى الأمام أحداث في تنفيذ وتحديث الأحداث لعمل وحدة البيانات. القوائم على شكل استخدام العمل المحلي.

في هذه الحالة يكفي لإضافة مفتاح Ctrl + W إلى الخاصية SecondaryShortCuts باستخدام IDE.

من الواضح، عندما عمل على التغييرات وحدة البيانات، لا بد لي من تغيير جميع الإجراءات المحلية أيضا.

نصائح أخرى

وليس حلا حقيقيا، ولكن إذا قمت بإنشاء datamodule من داخل mainform يعمل:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FDataModule := TMyDataModule.Create(self);
  TMyButton.Action := FDataModule.TheAction;
end;


procedure TMyDataModule.DataModuleCreate(Sender: TObject);
begin
  TheAction.SecondaryShortCuts.Add('Ctrl+W');
end;

وأعتقد أن يتم التعامل مع اختصارات بواسطة النموذج الذي يحتوي على التركيز في الوقت الراهن. لذا يو سوف تحصل على الأرجح نفس المشاكل إذا كنت تستخدم لهم في شكل آخر.

الجواب القصير:إجراءات مختصرة لا تلقائيا النار عبر أشكال البيانات وحدات.

إذا كنت اتبع التعليمات الواردة في السؤال ، ستجد أن حتى ابتدائية قطع قصيرة الحرائق.لأن هذا هو خطوة رئيسية تم استبعاده من التعليمات.واحدة من شأنها أن تساعد على تفسير لماذا OP ذوي الخبرة الأولية قطع قصيرة النار و لا واحد الثانوي.

إذا كنت تشمل خطوات إضافية:

  • إضافة القائمة إلى النموذج.
  • و رابط القائمة البند إلى العمل.

ثم المرحلة الابتدائية قطع قصيرة سوف تكون قادرة على إطلاق العمل.وذلك لأن العمل عنصر يدفع به إعدادات عنصر القائمة (بما في ذلك ShortCut مكان الإقامة).ومع ذلك ، TMenuItem لا يطبق مفهوم الثانوية مختصرة.وهذا هو السبب واحد يعمل وليس غيرها.


وقفة للنظر في التطبيق مع العديد من أشكال البيانات وحدات ، و ضمنا إذا عمل مختصرة يمكن اطلاق النار على جميع من لهم.ينبغي أن يكون واضحا تماما أنه ينبغي أن لا يكون قادرا على تلقائيا النار دون صريحة البرمجية تسمح بذلك.كنت لا تريد خلفية تشكيل به مجموعة من الأشياء لأن تكوين مفاتيح الاختصار يحدث أن يكون الضغط في سياق آخر لا علاقة العمل.

على الوثائق ويشير الى الاستفادة من وضع قوائم العمل على البيانات وحدات.ولكن لا يبدو أن تقدم أي تفسير كيفية استخدام الإجراءات مع مختصرة على البيانات-وحدة صحيح.بالتأكيد لا شيء يذكر في الأماكن المتوقعة ، وهي: اختصار و SecondaryShortcuts.(سأكون بخيبة أمل, ولكن توقعاتي الكريم الوثائق وقد تم سحب منخفضة جدا.)

لذا...

ما يجب أن ينبغي القيام به للحصول على إجراءات التخفيضات القصير عبر أشكال البيانات وحدات?

لقد فعلت قليلا من التحقيق وجدت عدد قليل من الخيارات.كما هو الحال دائما, المفاضلة النسبي إلى ما كنت تحاول تحقيق.

  • عندما تسقط دعوى قائمة على (غير الرئيسية) شكل, جميع مختصرة يعمل كما هو متوقع.هذا هو السيناريو الأكثر شيوعا ويطبق عندما الإجراءات المحلية و شكل محدد.

  • عندما تسقط دعوى قائمة في النموذج الرئيسي ، كل تلك التخفيضات القصير سوف تكون قادرة على اطلاق النار من أي شكل آخر.هذا شيء عظيم بالنسبة تطبيق على نطاق مختصرة مثل فتح أشكال أخرى.

ملاحظة: هناك أولويات تسلسل إلى حيث قطع القصير هو أول اختبار.حتى إذا كان النموذج النشط لديه قطع قصيرة مطابقة واحدة في النموذج الرئيسي ، قطع قصيرة سيتم تجهيزها محليا.والنموذج الرئيسي المفهوم لن تحصل عليه.

  • عندما يكون نموذج اختبار لمعرفة ما إذا كان يتعامل مع قطع قصيرة, كل المملوكة من مكونات كما يتم فحص.(هذا هو في الواقع السبب في الأولين أعلاه العمل.) هذا يعني أن مجرد وضع Owner البيانات الخاصة بك-وحدة بشكل مناسب سوف تسمح مختصرة لتطبيق النموذج المختار.

أولا-هاء.بدلا من:

Application.CreateForm(TDataModule1, DataModule1);

يمكنك استخدام ما يلي:

DataModule1 := TDataModule1.Create(LocalForm);

ومع ذلك, لأن كل حالة من البيانات-وحدة يمكن أن يكون لها مالك واحد فقط:قد تضطر إلى إنشاء مثيلات متعددة للسماح أشكال متعددة حصة مختصرة.إذا كان هذا هو الخيار يعتمد على الظروف الخاصة بك.ومع ذلك ، يمكن أيضا جعل النموذج الرئيسي صاحب البيانات الخاصة بك-الوحدة التي من شأنها أن تكون إلى حد ما يعادل الخيار الثاني أعلاه.

  • الخيار النهائي الذي يوفر أكثر من التحكم هو المرجع نفسه الإجابة.أولا-هاء.أي النموذج الذي يحتاج إلى دعم "خارجي مختصرة" يمكن التعامل مع OnShortCut الحدث مع التعليمات البرمجية التالية:

كما يمكن أن يرى في نموذج التعليمات البرمجية يمكنك تفويض إلى عدة قوائم العمل في مواقع مختلفة حسب الأولوية التي تختارها.

procedure TMyForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := DataModule1.ActionList3.IsShortCut(Msg);
  Handled := Handled or DataModule2.ActionList1.IsShortCut(Msg);
  Handled := Handled or DataModule1.ActionList1.IsShortCut(Msg);
end;

ويتم الحصول على ابتلع الإجراءات التي شكل ... إذا كنت ترغب في الثانوية شكل / إطار / datamodule للتعامل مع العمل ... لديك لتعطيل Actionlist من الابتدائية الأولى ...

Form1.ActionList1.State: = asSuspended.

DataModule1.ActionList1.State: = asNormal؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top