ميزات العمل مع الواجهات في دلفي. إنشاء واجهة مستخدم وصف واجهة دلفي

19.06.2020

لدي مشكلة في استخدام فئة دلفي من كود C++. عرض دلفي دلل، الذي يصدر دالة تقوم بإرجاع كائن.
يبدو كود Delphi Dll الخاص بي كما يلي:

اختبار مكتبة دلفي؛ // يستخدم جزءًا.... اكتب IMyObject = إجراء الواجهة DoThis(n: Integer); وظيفة DoThat: PWideChar؛ نهاية؛ TMyObject = class(TInterfacedObject,IMyObject) الإجراء DoThis(n: Integer); وظيفة DoThat: PChar؛ نهاية؛ // تنفيذ TMyObject انتقل هنا ... الإجراء TMyObject.DoThis(n: Integer); begin showmessage("أنت تتصل بطريقة DoThis باستخدام "+intToStr(n) +"parameter"); نهاية؛ وظيفة TMyObject.DoThat: PChar؛ ابدأ showmessage("أنت تتصل بوظيفة DoThat"); النتيجة:= Pchar("Hello im Dothat"); نهاية؛

// تصدير وظيفة DLL:

وظيفة CreateMyObject: IMyObject؛ تصدير. فار النص: ملف نصي؛ begin AssignFile(txt,"C:\log.log"); إعادة تعيين(تكست); Writeln(txt,"hello"); النتيجة:= TMyObject.Create; نهاية؛ تصدير CreateMyObject؛

في مشروع C++ الخاص بي، أعلنت عن واجهة IMyObject مثل هذا:

Class IMyObject ( public: IMyObject(); virtual ~IMyObject(); virtual void DoThis(int n) = 0; virtual char* DoThat() = 0; );

ومهمتي الرئيسية هي مثل هذا:

Typedef IMyObject* (__stdcall *CreateFn)(); int main() ( HMODULE hLib; hLib = LoadLibrary(L"DelphiTest.dll"); تأكيد(hLib != NULL); // تمرير !! CreateFn pfnCreate; pfnCreate = (CreateFn)GetProcAddress((HINSTANCE)hLib, "CreateMyObject "); if (pfnCreate == NULL) ( DWORD errc = GetLastError(); printf("%u\n", errc); // يحصل على الخطأ 127 ) else( printf("success Load\n"); ) IMyObject* objptr = pfnCreate(); objptr->DoThis(5);

في هذا المثال، حصلت على خطأ أثناء التشغيل عندما أحاول الوصول إلى الوظيفة المُصدَّرة. الأخطاء في السطر:
IMyObject* objptr = pfnCreate();

هل يمكن أن تخبرني ما هو الخطأ في المثال الخاص بي.
وإذا أمكن، أي مثال عملي للوصول إلى فئة دلفي (في ملف DLL) من كود C++.

حل

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

المشكلة التالية هي في C++. يجب أن تكون واجهة C++ الخاصة بك مشتقة من IUnknown، بالإضافة إلى ذلك، يجب ألا تعلن عن منشئ أو مدمر.

وبصرف النظر عن هذا، يتم تصدير كود دلفي الخاص بك عن طريق PWideChar الذي لم يتم تعيينه إلى char* ولكن تم تعيينه إلى wchar_t* .

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

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

أتوقع أن يكون هناك أخطاء أخرى، ولكن هذا هو كل ما وجدته حتى الآن.

هذه مقالة مبنية على أسئلة في المنتديات: "كيف يمكنني إرجاع سلسلة من ملف DLL؟"، "كيفية تمرير وإرجاع مجموعة من السجلات؟"، "كيفية تمرير نموذج إلى ملف DLL؟".

وحتى لا تقضي نصف حياتك في اكتشاف ذلك، في هذه المقالة سأقدم لك كل شيء على طبق من ذهب.

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

ملاحظة مهمة: يجب قراءة المقال بالتتابع. يتم توفير أمثلة التعليمات البرمجية فقط كـ أمثلة، في كل خطوة (نقطة) من المقالة، يتم إضافة كود المثال بتفاصيل جديدة. على سبيل المثال، في بداية المقالة لا توجد معالجة للأخطاء؛ تمت الإشارة إلى الطرق "الكلاسيكية" (مثل استخدام GetLastError، واتفاقية sdtcall، وما إلى ذلك)، والتي يتم استبدالها بطرق أكثر ملاءمة مع تقدم المقالة. وقد تم ذلك حتى لا تثير التصاميم "الجديدة" ("غير العادية") تساؤلات. بخلاف ذلك، سيكون من الضروري إدراج ملاحظة لكل مثال مثل: "هذا ما تمت مناقشته في تلك الفقرة أدناه، والذي تمت مناقشته في هذه الفقرة". على أية حال، يوجد في نهاية المقالة رابط للكود الجاهز، مكتوب مع مراعاة كل ما ورد في المقالة. يمكنك فقط أخذها واستخدامها. ويشرح المقال لماذا ولماذا. إذا لم تكن مهتماً بـ "لماذا ولماذا"، انتقل إلى النهاية إلى الخاتمة والرابط لتحميل المثال.

فقط من أجل النتيجة

الالتزام الصارم بالمواعيد النهائية

الشفافية

تنفيذ المشروع

الدعم الفني كهدية

البرمجة والتعديلات والمشاورات بشأن 1C

كيف نعمل

1. نناقش المشكلة عبر الهاتف. إذا كان لديك إمكانية الوصول عن بعد، فاعرضه على شاشة جهاز الكمبيوتر الخاص بك.

2. نقدر العمل بالروبل إذا كان المشروع كبيرًا، وإذا لم يكن كذلك، فالعدد التقريبي للساعات.

3. ننجز المهمة.

4. تقبل العمل في برنامجك إذا كان هناك أي قصور نقوم بتصحيحه.

5. نحن نصدر فاتورة، أنت تدفع.

تكلفة العمل

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

3. بالنسبة للعمل الذي تزيد مدته عن 10 ساعات، يجب إعداد المواصفات الفنية مع وصف وتكلفة العمل مسبقًا. يبدأ العمل بعد الاتفاق على المواصفات الفنية معك.

دعم فني

1. إذا وجدت أي أخطاء في الأعمال المقبولة مسبقاً خلال 3 أشهر، نقوم بتصحيحها مجاناً.

2. بالنسبة للعملاء المنتظمين، نقوم بتصحيح أي قصور في عملنا مجانًا خلال عام.

برنامج لإدارة عملك.

شراء 1C: المؤسسة

نحن الوكيل الرسمي لشركة 1C، ويمكنك شراء العديد من منتجات البرامج والتراخيص منا. بالإضافة إلى شراء "الصندوق"، سنساعدك في إعداد البرنامج وتقديم النصائح وإجراء الإعدادات الأساسية.

  • محاسبة
  • أتمتة المتجر
  • بالجملة
  • يتم تضمين التثبيت والمساعدة في الإعداد الأولي في الحزمة!
  • ضبط التكوينات حسب احتياجات العملاء، وتطوير وحدات جديدة في حالة عدم وجود الوظائف الضرورية في التكوين القياسي.
1 ج المحاسبة 1ج: إدارة التجارة 1ج: البيع بالتجزئة 1ج: إدارة الرواتب وشؤون الموظفين
من 3300 فرك. من 6700 فرك. من 3300 فرك. من 7400 فرك.

توفير الخادم.

الإعداد الفوري للخادم + 1C.

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

  • التوفر 24\7
  • ليست هناك حاجة إلى أن يكون لديك مسؤول النظام الخاص بك (ستغطي المدخرات تكلفة الخادم الخاص بك).
  • الإعداد السريع وتثبيت 1C على الخادم، في 3 أيام سيكون لديك بالفعل نظام يعمل بكامل طاقته.
  • يمكنك الانتقال إلى خادم محلي في أي وقت إذا لم تكن راضيًا عن الحل.

الرسائل القصيرة من 1C الخاص بك

هل تريد أن يعرف عملاؤك العروض الترويجية والخصومات؟ هل العملاء لا يعودون؟ قم بإعداد إرسال الرسائل القصيرة مباشرة من 1C!

ستكون شركتنا قادرة على إعداد إرسال الرسائل القصيرة إلى عملائك بسرعة مباشرة من 1C. أمثلة على الأحداث التي يمكن أتمتتها:

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

يمكن إجراء الإعداد في 1C بواسطة المتخصصين لدينا أو موظفيك. يمكنك عرض التعريفات على صفحة تعريفات الرسائل القصيرة.

  • تسليم مضمون للرسائل النصية القصيرة، يتم تحصيل الأموال فقط مقابل الرسائل النصية القصيرة التي تم تسليمها.
  • تسعير منفصل لكل رسالة نصية قصيرة.
  • قم بتعبئة رصيدك بطرق مختلفة.
  • عرض سجل جميع الرسائل القصيرة المرسلة في أي وقت.
  • اسم المرسل بدلاً من الرقم الرقمي في هاتف مستلم الرسالة.

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

هذه المقالة مخصصة لواجهات دلفي المفتوحة وتقدم نظرة عامة على الإمكانيات التي توفرها. تحدد دلفي ست واجهات مفتوحة: واجهة الأدوات، وواجهة التصميم، وواجهة الخبراء، وواجهة الملفات، وواجهة التحرير، وواجهة التحكم في الإصدار. ومن غير المرجح أن نتمكن في إطار هذه المقالة من تغطية وتوضيح قدرات كل منهم بالتفصيل. ستساعدك النصوص المصدرية لدلفي على فهم المشكلات قيد النظر بشكل أكثر دقة؛ ولحسن الحظ، زودهم المطورون بتعليقات مفصلة. توجد إعلانات الفئات التي تمثل الواجهات العامة في الوحدات النمطية المقابلة في الدليل...\Delphi\Source\ToolsAPI. توفر واجهة التصميم (الوحدة النمطية DsgnIntf.pas) أدوات لإنشاء محررات الخصائص ومحررات المكونات.

يعد محررو الخصائص والمكونات موضوعًا يستحق مناقشة منفصلة، ​​لذلك دعونا نتذكر فقط أن محرر الخاصية يتحكم في سلوك Object Inspector عند محاولة تغيير قيمة الخاصية المقابلة، ويتم تنشيط محرر المكون عن طريق النقر المزدوج زر الفأرة الأيسر على صورة المكون الموجود في النموذج. واجهة التحكم في الإصدار (وحدة VCSIntf.pas) مخصصة لإنشاء أنظمة التحكم في الإصدار. منذ الإصدار 2.0، تدعم دلفي نظام التحكم في الإصدار المتكامل Intersolv PVCS، لذلك في معظم الحالات ليست هناك حاجة لتطوير النظام الخاص بك. لهذا السبب، سنتجاهل أيضًا واجهة التحكم في الإصدار. تسمح لك واجهة الملفات (وحدة FileIntf.pas) بتجاوز نظام ملفات العمل الخاص بـ IDE، مما يجعل من الممكن اختيار طريقتك الخاصة لتخزين الملفات (في حقول المذكرة على خادم قاعدة البيانات، على سبيل المثال). توفر واجهة التحرير (الوحدة النمطية EditIntf.pas) إمكانية الوصول إلى المخزن المؤقت للنص المصدر، مما يسمح لك بتحليل وإنشاء التعليمات البرمجية، وتحديد موضع المؤشر وتغييره في نافذة محرر التعليمات البرمجية، وكذلك التحكم في التمييز النحوي للنص المصدر.

توفر الفئات الخاصة واجهات للمكونات الموضوعة في النموذج (تحديد نوع المكون، والحصول على مراجع للمكونات الأصلية والفرعية، والوصول إلى الخصائص، ونقل التركيز، والحذف، وما إلى ذلك)، والنموذج نفسه، وملف مورد المشروع. تتيح لك واجهة التحرير أيضًا تحديد ما يسمى بالمنبهات المعيارية التي تحدد رد الفعل على الأحداث مثل تغيير النص المصدر لوحدة نمطية، أو تعديل نموذج، أو إعادة تسمية مكون، أو حفظ وحدة نمطية أو إعادة تسميتها أو حذفها، أو تغيير ملف مورد المشروع، إلخ. توفر واجهة الأداة (ToolIntf Module.pas) وسيلة للمطورين للحصول على معلومات عامة حول حالة IDE وتنفيذ إجراءات مثل فتح وحفظ وإغلاق المشاريع والملفات الفردية، وإنشاء وحدة نمطية، والحصول على معلومات حول المشروع الحالي (عدد الوحدات والنماذج، وأسمائها، وما إلى ذلك)، وتسجيل نظام الملفات، وتنظيم الواجهات للوحدات الفردية، وما إلى ذلك. بالإضافة إلى الإعلامات المعيارية، تحدد واجهة الأداة إشعارات الوظائف الإضافية التي تخطر حول أحداث مثل فتح/إغلاق الملفات والمشاريع، وتحميل وحفظ ملف مشروع سطح المكتب، وإضافة/استبعاد وحدات المشروع، وتثبيت/إلغاء تثبيت الحزم، وتجميع المشروع، و على عكس أجهزة الإعلام المعيارية، تسمح لك أجهزة الإعلام الإضافية بإلغاء تنفيذ بعض الأحداث.

بالإضافة إلى ذلك، توفر واجهة الأداة وسيلة للوصول إلى القائمة الرئيسية لـ Delphi IDE، مما يسمح لك بتضمين عناصر إضافية فيها. تعد واجهة الخبراء (وحدة ExtIntf.pas) هي الأساس لإنشاء خبراء - وحدات برمجية مدمجة في IDE لتوسيع وظائفها. مثال على الخبير هو معالج نموذج قاعدة بيانات دلفي، الذي يقوم بإنشاء نموذج لعرض وتغيير محتويات جدول قاعدة البيانات. بعد تحديد فئة الخبراء، نحتاج إلى التأكد من أن دلفي "تتعلم" عن خبيرنا. للقيام بذلك، تحتاج إلى تسجيله عن طريق استدعاء إجراء RegisterLibraryExpert، وتمريره إلى مثيل فئة الخبراء كمعلمة. كمثال توضيحي، لنقم بإنشاء خبير بسيط في النمط esStandard، والذي، عند تحديد عنصر قائمة دلفي المقابل، يعرض رسالة تفيد بأنه قيد التشغيل. كما ترون من الجدول أعلاه، يتطلب النمط esStandard تجاوز ست طرق:

لكي يتم "وضع الخبير موضع التنفيذ"، يجب عليك تحديد عنصر القائمة Component/Install Component...، وتحديد الوحدة النمطية التي تحتوي على الخبير (في حالتنا exmpl_01.pas) في مربع الحوار Browse، ثم النقر فوق OK، ثم بعد تجميع حزمة dclusr30.dpk في قائمة دلفي الرئيسية، في قسم المساعدة، يجب أن يظهر عنصر Simple Expert 1، عند تحديده، تظهر رسالة المعلومات "بدأ Standard Expert!". يظل سبب وضع دلفي لعنصر قائمة الخبراء في قسم المساعدة لغزًا. إذا كنت لا تحب حقيقة أن عنصر القائمة يظهر أينما تريد دلفي، وليس حيث تريد، فإن الخيار التالي ممكن: إنشاء خبير في نمط الوظيفة الإضافية، مما يلغي الإنشاء التلقائي لعنصر القائمة، و أضف عنصر القائمة "يدويًا" باستخدام واجهة الأداة. سيسمح لك ذلك بتعيين موقع العنصر الجديد في القائمة الرئيسية بطريقة تعسفية.

لإضافة عنصر قائمة، استخدم فئة TIToolServices - أساس واجهة الأداة - وفئات TIMainMenuIntf وTIMenuItemIntf، التي تنفذ واجهات لقائمة IDE الرئيسية وعناصرها. يتم إنشاء مثيل لفئة ToolServices TIToolServices بواسطة IDE نفسه عند تهيئته. يرجى ملاحظة أن مسؤولية إطلاق الواجهات إلى قائمة دلفي الرئيسية وعناصرها تقع بالكامل على عاتق المطور. على طول الطريق، دعونا نعقد العبء الوظيفي للخبير قليلاً: عند تنشيط عنصر القائمة الخاص به، سيصدر شهادة حول اسم المشروع المفتوح حاليًا في البيئة: في هذا المثال، تشغل الوظيفة AddIDEMenuItem المكان المركزي ، الذي يضيف عنصر قائمة إلى القائمة الرئيسية لـ IDE Delphi. كمعلمات، فإنه يتلقى نص عنصر القائمة الجديد، ومعرفه، ومعرف العنصر الذي تم إدراج العنصر الجديد قبله، وتمثيل رمزي للمفتاح الذي يمكن استخدامه مع مفتاح Ctrl للوصول بسرعة إلى عنصر جديد ومعالج حدث يتوافق مع تحديد العنصر الجديد. لقد أضفنا عنصر قائمة جديدًا في قسم العرض قبل عنصر الساعات.

الآن دعونا نتعرف على المخطرين. دعونا نحدد مُخطر الوظيفة الإضافية الذي يتتبع إغلاق/فتح المشاريع ويضبط الحقل الذي يخزن اسم المشروع النشط وفقًا لذلك (سنحذف تنفيذ الأساليب التي لم تخضع للتغييرات مقارنة بالمثال السابق للإيجاز): عند تنفيذ المخطر، قمنا بتحديد فئة TAddInNotifier، وهي فئة تابعة لـ TIAddInNotifier، وتجاوزنا طريقة FileNotification. سوف يستدعي IDE هذا الأسلوب في كل مرة يحدث فيها حدث يمكن لمعلم الوظيفة الإضافية الاستجابة له (تتم الإشارة إلى كل حدث من هذا القبيل بواسطة ثابت مطابق من النوع TFileNotification). يتم استخدام حقل الخبير في فئة TAddInNotifier لتقديم الملاحظات إلى الخبير (طريقة TAddInNotifier.FileNotification). في أداة إتلاف الخبير، يكون المخطر غير مسجل ويتم إتلاف المخطر. الآن دعونا نوضح استخدام أجهزة الإخطار المعيارية. لنقم بإنشاء خبير الوظيفة الإضافية الذي يصدر رسائل حول كل عملية حفظ ملف مشروع (من أجل الإيجاز، لا نقدم تنفيذ الأساليب المألوفة لدينا بالفعل): في هذا المثال، يقوم خبير الوظيفة الإضافية بمراقبة الأحداث المقابلة لفتح / إغلاق المشاريع.

في كل مرة يتم فيها فتح مشروع، يتم تسجيل إشعار معياري يتوافق مع ملف المشروع. من حيث التنفيذ، تشبه المنبهات المعيارية مخطرات الوظائف الإضافية: نحدد فئة TModuleNotifier، وهي سليل TIModuleNotifier، ونتجاوز أساليب Notify وComponentRenamed الخاصة بها. يستدعي IDE طريقة الإخطار عند حدوث أحداث معينة تتعلق بهذه الوحدة؛ ضمن هذه الطريقة يتم تحديد رد الفعل تجاه حدث معين. يتم استدعاء الأسلوب ComponentRenamed عند تغيير اسم المكون في نموذج الوحدة النمطية. يرجى ملاحظة أننا لا نستخدم هذه الطريقة، ولكن يجب علينا تجاوزها، وإلا عندما يتغير اسم المكون، سيتم استدعاء طريقة مجردة للفئة الأساسية، مما يؤدي إلى عواقب غير متوقعة.

يعد تسجيل مُخطر معياري عملية أكثر تعقيدًا قليلاً مقارنة بتسجيل مُخطر الوظيفة الإضافية: أولاً نحصل على واجهة الوحدة النمطية (TIModuleInterface)، ثم نقوم بتسجيل المُخطر باستخدام واجهة الوحدة النمطية. عند إغلاق المشروع، يتم إلغاء تسجيل المخطر المعياري (مرة أخرى باستخدام TIModuleInterface) ويتم إتلاف المخطر. في الختام، سنوضح كيف يمكنك تحديد موضع المؤشر في نافذة محرر التعليمات البرمجية. لنقم بإنشاء خبير، عند تحديد عنصر القائمة المناسب، سيعرض رسالة تحتوي على اسم الملف النشط وموضع المؤشر فيه (يتم عرض تنفيذ الطرق الأساسية فقط في هذا المثال): لتحديد موضع المؤشر، يجب أن نحصل على التسلسل التالي من الواجهات: الواجهة المعيارية (TIModuleInterface)؛ واجهة محرر التعليمات البرمجية (TIEditorInterface)؛ واجهة عرض الوحدة النمطية في نافذة المحرر (TIEditView).

إذا كان الملف النصي المصدر (*.pas) نشطًا عند تحديد عنصر قائمة خبير، فسيتم عرض رسالة تحتوي على اسم الملف النشط وموضع المؤشر الحالي فيه. إذا لم يكن الملف النشط ملف pas، فلن يتم إصدار الرسالة. للحصول على اسم الملف النشط، استخدم أسلوب GetCurrentFile لفئة TIToolServices. وبهذا نختتم نظرنا في طرق استخدام الواجهات المفتوحة. يحتوي القرص المضغوط على الكود المصدري لكافة الأمثلة المقدمة. يحتوي القرص المضغوط أيضًا على مثال أكثر تعقيدًا وتفصيلاً، يحتوي على خبير إضافي يسمح للمستخدم بوضع إشارة مرجعية على النص المصدر لوحدات دلفي. يوجد دليل موجز لتثبيت واستخدام Bookmarks Expert في الملف bkmrks97.htm. لذلك، تقدم هذه المقالة نظرة عامة على الواجهات المفتوحة وتقدم أمثلة على استخدامها. دعونا نكرر مرة أخرى: بفضل توفر أكواد المصدر للواجهات المفتوحة، يمكنك بسهولة فهم التفاصيل التي تهمك. نأمل أن تمنحك الإمكانيات المتنوعة التي توفرها الواجهات المفتوحة أكثر من فكرة جريئة ومفيدة.

تمت كتابة المقال بناءً على نتائج تحليلات البرامج التي كتبها المطورون الشباب في مجموعتنا.

نقوم بترتيب تسلسل تبديل المكونات بشكل صحيح

لدى العديد من المستخدمين، وخاصة أولئك الذين عملوا سابقا في DOS، عادة التبديل بين حقول الإدخال ليس باستخدام الماوس، ولكن باستخدام لوحة المفاتيح مع مفتاح Tab. بالإضافة إلى ذلك، فهو أسرع بكثير من تحديد كل حقل باستخدام الماوس. لذلك، يجب ضبط ترتيب تبديل المكونات بشكل صحيح. ينطبق هذا على المكونات الموجودة داخل جميع مكونات الحاوية (اللوحات وGroupBoxes وما شابه ذلك)، وعلى مكونات الحاوية نفسها، إذا كان هناك العديد منها في النموذج.

يتم تحديد ترتيب تبديل المكونات داخل الحاوية بواسطة خاصية TabOrder. المكون الأول الذي يصبح نشطًا هو المكون الذي يساوي TabOrder 0، والثاني الذي يساوي 1، وما إلى ذلك، حتى يتم تعداد كافة المكونات. بالإضافة إلى ذلك، يحتوي المكون على خاصية TabStop، والتي تشير إلى ما إذا كان المكون سيتلقى التركيز عند التبديل باستخدام مفتاح Tab. إذا كنت بحاجة إلى حظر التبديل إلى أي مكون، فاضبط TabStop الخاص به = false. في هذه الحالة، يمكنك فقط التبديل إلى هذا المكون باستخدام الماوس.

هناك حالات عندما يستمر المستخدمون الذين اعتادوا على التبديل بمفتاح معين في برنامج ما، في العادة، في استخدامه في برامج أخرى. يحدث هذا غالبًا مع مستخدمي 1C، حيث يمكن استخدام مفتاح Enter للتنقل عبر حقول الإدخال. حسنًا، سنمنحهم مثل هذه الفرصة في برامجنا إذا طلبوا ذلك. قم بتعيين خاصية KeyPreview الخاصة بالنموذج إلى true واكتب معالج الأحداث OnKeyPress:

الإجراء TForm1.FormKeyPress(Sender: TObject; var Key: Char);
يبدأ
إذا ord(key)=vk_Return إذن
Form1.SelectNext(PriemForm.ActiveControl, true, true);
نهاية؛

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

الأزرار الافتراضية

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

نعم أو لا

يجب أن تحتوي جميع مربعات الحوار التي تطلب إجراءات المستخدم على زرين على الأقل: تأكيد الإجراء ورفض الإجراء (نعم/لا، حفظ/إلغاء، وما إلى ذلك). يمكن إلغاء الإجراء عن طريق إغلاق النافذة باستخدام الزر [X] الموجود في عنوان النافذة. من غير المقبول إذا كان هناك زر واحد فقط لتأكيد الإجراء، وللرفض يفترض إغلاق النافذة بالزر [X] في العنوان، أو لا توجد إمكانية للرفض على الإطلاق. وهذا يربك المستخدم ويثير سؤالاً منطقياً: كيف ترفض؟

ولا تنس أيضًا ما قيل أعلاه في فقرة "الأزرار الافتراضية".

يجب أن تفتح كافة مربعات الحوار في وسط الشاشة

في المنتصف، وليس في مكان إنشائها في وضع التصميم. أولاً، إنه أكثر وضوحًا، وثانيًا، فهو يزيل تلقائيًا مشكلة دقة الشاشة المختلفة لمستخدمين مختلفين.

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

يجب ألا تتجاوز أحجام النوافذ حجم الشاشة

بأي حال من الأحوال. إنه عار عندما يمتد جزء من النافذة إلى ما وراء الشاشة. لا يعتمد هذا المتطلب على دقة شاشة المستخدم، أي. أعذار مثل "دعهم يضبطون دقة أعلى" لا تجدي نفعًا.

تغيير الحجم الصحيح لعناصر النافذة

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

كل شيء مرئي دائما

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

تلميحات في كل مكان، تلميحات دائما

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

طيف الألوان

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

خاتمة

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

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

وبالتالي، ضع تجربة المستخدم في الاعتبار. اجعل من السهل والممتع بالنسبة لهم العمل مع برامجك.