دلفي: كيف تستخدم عناصر التحكم بدون نوافذ؟

StackOverflow https://stackoverflow.com/questions/2315906

  •  22-09-2019
  •  | 
  •  

سؤال

وأنا أعلم ذلك الضوابط بدون نوافذ ليست سحرية. يمكن أن يكون للسيطرة بدون نوافذ تركيز الإدخال (على سبيل المثال Internet Explorer). تركيز المدخلات ليس أكثر من الرسم أيضًا:

وعندما يبدأ المستخدم مفاتيح المهروسة ، يتفاعل بشكل مناسب. أنت أعرف تعني ضغطات المفاتيح الذي - التي السيطرة المركزة ، لأن هذا هو السيطرة لها التركيز.

في حالة نافذة (Windows®) ، يجب أن أعرف أن طفلي بدون نوافذ (دعنا يدّعي إنه سليل من TgraphicControl) يحصل على أحداث لوحة المفاتيح. لذلك خلال نشئتي OnKeyDown, OnChar, OnKeyUp, ، سأحتاج إلى التظاهر بأنهم ذاهبون إلى السيطرة على طفلي بدون نوافذ.

وهو ما يمكنني فعله ، لكنه ألم.

ولكن ربما يريد المستخدم استخدامه فاتورة غير مدفوعة التنقل ، وسأضطر إلى الاعتراض بطريقة أو بأخرى على معالجة ترتيب علامة التبويب Delphi العادية ، وربط نفسي لأقول ذلك هذا الشيء هو التالي (والسابق) في ترتيب علامة التبويب.

وهو ما يمكنني فعله ، لكنه ألم.

ثم هناك ActiveControl, ، الذي لا يفهم أي شيء إلا TWinControl'س. لذلك إذا حاولت Delphi معرفة من لديه التركيز ، فسيصبح الأمر مجنونًا. لذلك يجب أن يكون لدي تطبيق بديل لـ ActivEcontrol.

وهو ما يمكنني فعله ، لكنه ألم.

بعبارات أخرى: هل هذا مجرد عمل كثير؟ أنا أحارب كل شيء من هذا ، كلفي ، لذلك يمكنني الحصول على بضع عشرات عناصر التحكم بدون نوافذ يمكن الوصول إليها من خلال إدخال لوحة المفاتيح؟ لم يفكر مصممو Delphi أبدًا في استخدام عناصر تحكم تفاعلية بدون نوافذ ، وإذا حاولت الآن العمل فيها ، فسوف عالق في قافل القلب?

أعطاني دلفي فرصة مساعدة لي عن طيب خاطر ، لكنني انتخبت طريقة الألم.


بعض التفسير الإضافي ل ضوابط بدون نوافذ وهناك حاجة.

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

على سبيل المثال ، كل عنصر تحكم تقريبًا تراه في نافذة متصفح Internet Explorer هو عنصر تحكم بدون نوافذ. في لقطة الشاشة التالية ، يمكنك رؤية تعديل التحكم ، الذي يمكنك كتابته ، وزر يركز عليه (في لقطة الشاشة هذه):

alt text

يمكنك رؤية مستطيل التركيز المنقط ، والزر مزرق (والذي يشير على Windows إلى أنه يحتوي على تركيز).

لو كنت أضغط المسافة بينما ال Google Search الزر له التركيز ، كما هو الحال صحافة الزر. السبب في أن هذا يعمل هو أن Microsoft كتبت مكتبة عنصر واجهة مستخدم كاملة. تبدو هذه الضوابط وتشعر (تقريبًا) تمامًا مثل عناصر التحكم المشتركة العادية - فهي استنساخ دقيق للغاية لعناصر التحكم الشائعة في Windows ، وصولاً إلى الموضوعات التي يتم تطبيقها.

تستخدم Mozilla Firefox و Google Chrome أيضًا مكتبة عنصر واجهة المستخدم. لا يستخدمون عناصر التحكم المدمجة في Microsoft ، ولكن بدلاً من ذلك يستخدمون مكتبة من الرسوم البيانية والتفاعلية ، بدون نوافذ الحاجيات.

وإذا كان لديك بيئة تنمية مناسبة ، فإن أجهزة التشغيل بدون نوافذ تعمل تمامًا مثل عناصر التحكم "الطبيعية". GTK+ هي مكتبة عنصر واجهة مستخدم ، و Glade هي IDE التي تتيح لك تخطيط عناصر التحكم في مكتبة عنصر واجهة المستخدم هذه.

لا أعرف في بيئة التنمية التي تم إنشاؤها في بيئة Firefox أو Chrome أو Blender ، لكن عناصر واجهة المستخدمة تدعم الضوابط بدون نوافذ.


حتى الآن على سؤالي.

ما لم أكن مخطئًا ، يبدو لي أنه على الرغم من أن دلفي تدعم قاعدة TControl, ، (الذي له عرض ، ارتفاع ، ويمكن أن يرسم نفسه) ، لا يمكن أن يتلقى تركيز لوحة المفاتيح. يبدو لي أن بورلاند لم تصمم أبدًا VCL's Delphi كمكتبة عنصر واجهة مستخدم عام. الدليل الوحيد الذي يجب علي دعمه هو أن النموذج ActiveControl هو twincontrol:

property ActiveControl: TWinControl;

هذا لا يعني أن دلفي يمكن أن يكون ، أو يجب أن يكون ، يقتصر على الضوابط النافذة. يمكن توسيع مكتبة مصغرة VCL لدعم التركيز على الضوابط بدون نوافذ.

لكن ربما دلفي تدعم بالفعل عناصر التحكم بدون نوافذ, ، وأنا فقط لا أدرك ذلك؟ هل هناك بالفعل آلية راسخة في دلفي لدعم التركيز على TControl'س؟ لكنني رجل ذكي بشكل معقول ، وأنا متأكد من أن VCL من Delphi لا يمكنه فعل ما يمكن أن تفعله مكتبات واجهة المستخدم الأخرى.

الذي يؤدي بعد ذلك إلى سؤال آخر: ما مقدار العمل لأشكال الفئات الفرعية ومثل هذا لدعمها؟ هل هناك شخص آخر هناك ، ربما شخص ما في Teamb ، أكثر ذكاءً مني ، والذي جربه بالفعل ، وتوصل إلى استنتاج مفاده أنه غير ممكن?

أنا أسأل الآن ، في المقدمة ، إذا كانت محاولة إضافة دعم التحكم بدون نوافذ شبه مستحيل (أي عقيمة) - حتى لا أقضي أسابيع عليها مقابل لا شيء. أحاول الاعتماد على معرفة مجتمع من مطوري دلفي.

أنا أطرح سؤالاً.

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

المحلول

من غير المجدي بناء عناصر تحكم بدون نوافذ و قم بتناسبهم في إطار VCL's Delphi.

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

عندما تضغط على علامة التبويب ، فإنه يتطلع إلى نظام التشغيل كما لو أن المتصفح قد استهلك ببساطة حرف علامة تبويب ، تمامًا مثل تحرير عناصر التحكم. تحرير عناصر التحكم تحرك المؤشر على عدد قليل من المساحات وأضف أحرف TAB إلى المخازن المؤقتة الداخلية ؛ تحريك أدوات التحكم في المتصفح المؤشر إلى منطقة أخرى من الشاشة.

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

يمكن أن تكون الحاوية الخاصة بك عنصر تحكم VCL ، لكن الأشياء التي تضعها عليها ربما لا يمكن أن تتوقع استخدام قواعد معالجة Focive- ووحة المفاتيح VCL. لاحظ كيف لا يمكنك وضع عناصر تحكم Windows العادية في Internet Explorer ، أيضًا. أي شيء تضعه هناك يحتاج إلى الذهاب من خلال واجهات ActiveX محددة. ربما ستحتاج إلى واجهات أيضًا ، أو ربما يمكنك فقط إنشاء مجموعة من فصول التحكم الخاصة بك التي تنحدر من بعض فصول الأجداد الخاصة التي تصممها للعمل مع الحاوية الخاصة بك. لا تبدأ TGraphicControl; ؛ إنه أمر راسخ للغاية في VCL ليكون قابلاً للاستخدام كأساس لمكتبة التحكم في فروقك.

سيكون الكثير من العمل ، ولكن مرة أخرى ، كان Internet Explorer.

نصائح أخرى

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

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

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

كانت إحدى التقنيات التي استخدمتها بنجاح كبير لتقليل كمية مقابض النوافذ المستخدمة في تطبيق المعقد (إعداد الضرائب) هو رسم النص على قماش ، ونقل جهاز Tcustomedit واحد إلى الموضع الذي تم تحريره للمستخدم. كان من التافهة التقاط مفاتيح علامة التبويب/لأعلى/لأسفل ونقل التحرير إلى الموضع المناسب. كان التحدي الذي اكتشفناه في رسم مستطيل ساخن حول حقل تحوم الماوس. لقد انتهى الأمر بمجموعة من الشبكة من Tooject ، حيث سيكون عنصر المصفوفة لا شيء (بدون حقل) ، أو مقبل (تحتوي الشبكة على حقول متعددة) أو فئة AA التي تحتوي على واصف الحقل لدينا. هذا ما قلل من كمية عمليات فحص النطاق التي كان علينا القيام بها لأنه من المرجح أن يحتوي المربع على حقل واحد فقط ، أو على الأكثر 4 حقول.

مجموعة أدوات FPGUI هو مثال على ما تريد. يعتمد أحدث رمز FPGUI في مستودع التعليمات البرمجية المصدر على تصميم متعدد النوافذ. هذه البسيطة تعني أن كل عنصر واجهة مستخدم/مكون يحتوي على مقبض نافذة ، لكن Windows أو Linux لا يفعل شيئًا مع تلك النافذة ، وهي رسائل الإخطار الأساسية (Mouseenter ، Mouseexit ، إلخ). لا يزال لدى FPGUI سيطرة كاملة على المكان الذي يذهب إليه كل مكون ، إذا كان قابلاً للتركيز ، وكيف تبدو وما إلى ذلك ، وما إلى ذلك. بعض المكونات/المكونات في FPGUI هي مكونات غير مدعومة أيضًا. على سبيل المثال: TFPGSCRORLBAR ، TFPGMAINMENU ، الزر في combobox إلخ.

إذا كنت تريد إصدارًا حقيقيًا غير مدرج ، فهذا يعني أن هناك نافذة واحدة فقط على مستوى أعلى تحتوي على مقبض نافذة ، جميع الأدوات/المكونات الأخرى داخل تلك النافذة غير موجودة بالفعل لنظام التشغيل (ليس لديهم مقابض نافذة) ، ثم يمكن أن يساعد FPGUI أيضًا. استند التصميم الأولي لمجموعة أدوات FPGUI إلى مثل هذا التصميم. مرة أخرى ، انظر في مستودع التعليمات البرمجية المصدر لفرع V0.4 من التعليمات البرمجية. أنا هذا التصميم ، كان على fpgui التعامل مع كل شيء على الإطلاق ، وإنشاء أحداث mouseenter/mouseLeave ، وترجمة أنظمة التنسيقات لمكونات الحاويات ، وحالات تركيز المكونات (المزيفة) ، إلخ ... نعم ، التصميم الأولي كثير من العمل ، ولكن بعد ذلك أنت احصل على إطار محمول للغاية يمكن تطبيقه بسهولة على أنظمة أخرى أيضًا.

ونعم ، يتم تنفيذ FPGUI بالكامل في لغة Pascal الكائن باستخدام برنامج التحويل البرمجي المجاني لـ Pascal لإعطائي دعمًا عبر المنصات. يعمل FPGUI حاليًا على أجهزة Windows و Linux (32 و 64 بت) و Windows Mobile و Linux (ARM) المدمجة.

ليس لدي أي فكرة عما هي مشكلتك حقًا ، هنا ، لكنني أعتقد أن هذا التاريخ الصغير قد يكون ذا صلة ...

لدينا تطبيق يملأ عشرات النماذج. يجوز للمستخدم ملء نماذج إضافية ، وكذلك تغيير القيم التي يتم ملؤها بواسطة التطبيق الذي يتصدره.

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

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

مرة أخرى - ليس لدي أي فكرة عما تريد إدارته حقًا. Twincontrol هو Twincontrol لسبب ما ، ولكن قد يكون هناك حل لما تريد ، وما سيكون عليه ...

أظن fggui قد تساعدك.

هل تحقق من ذلك ويكي أول.

أعتقد أنه يمكنك استخدام هذا الإطار لتطبيقك في Delphi لأنه مكتوب تمامًا في Pascal. في الواقع يعتمد على فريباسكال ؛)

HTH

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