الخلق واجهةيتم تقليل المستخدم إلى الاختيار من لوحة المكونات مكونات دلفي اللازمة لتشغيل البرنامج وتقديمه واجهةالإدارة، وكذلك واجهةعرض المعلومات، ونقلها إلى النموذج مع التخطيط اللاحق.
يجب أن تستخدم واجهة المستخدم التي تقوم بإنشائها عناصر قياسية مألوفة للمستخدمين وتوفر أقصى قدر من الراحة. يتم تحديد كل هذا في النهاية من خلال معيار مثل فعالية الواجهة - أقصى النتائج بأقل جهد.
مبادئ إنشاء واجهة سهلة الاستخدام معروفة. كأكثر المبادئ العامةعند الإنشاء واجهات المستخدمويمكن النظر في ثلاث نقاط رئيسية:
المبدأ الثانيهو إهمال القدرات الفكرية للمستخدمين. من تجربتي الخاصة، أعلم أن المستخدمين في كثير من الأحيان لا يعرفون كيفية العمل على جهاز كمبيوتر فحسب، بل يخشون ببساطة القيام بأي شيء بمفردهم. ولذلك، يجب أن تكون واجهة المستخدم ودية قدر الإمكان.
علاوة على ذلك، فإن مخاوف المستخدمين غالبا ما تكون مبررة، لأن تكلفة البرنامج، وحتى الكمبيوتر نفسه، لا يمكن مقارنتها بتكلفة قاعدة بيانات تم إنشاؤها على مدى سنوات عديدة من الجهد، على سبيل المثال. ولهذا السبب، عند إنشاء واجهة مستخدم، يجب على المبرمج دائمًا إنشاء "حماية مضمونة" في البرنامج - ضد الإجراءات غير الصحيحة وإدخال المستخدم للبيانات غير الصحيحة. لكن بعض المبرمجين يبالغون في هذه الحماية، ويجعلونها تطفلية للغاية، ونتيجة لذلك فإن عمل البرنامج يشبه العبارة الشهيرة "خطوة إلى اليسار، خطوة إلى اليمين تعتبر هروبًا"! وما يخلقه المبرمج كحل لمشكلة يبدأ في خلق المشاكل بنفسه.
للامتثال المبدأ الثانيليست هناك حاجة للسماح للبرنامج "بتصحيح" تصرفات المستخدم والإشارة بالضبط إلى الطريقة التي يجب أن يتصرف بها، مما يجبره على الانخراط في إطار ضيق. كما يجب ألا تبالغ في عرض الرسائل الإعلامية، خاصة رسائل الحوار، لأن ذلك يشتت انتباه المستخدم عن العمل. سيكون من الأفضل توفير القدرة على تعطيل التلميحات تمامًا.
المبدأ الثالثهو إنشاء برنامج يتمتع بأعلى القدرات "العقلية" الممكنة. بالرغم من التطور السريعتكنولوجيا الكمبيوتر، حتى البرامج المستخدمة على نطاق واسع لا يمكن أن يطلق عليها إلا بشكل مشروط وجود ذكاء اصطناعي. أنها تتداخل مع تجربة المستخدم من خلال العرض مربعات الحواربأسئلة غبية تسبب الحيرة حتى في أبسط المواقف. ونتيجة لذلك، يهتف المستخدمون في قلوبهم: "يا لها من آلة غبية!"
أنا شخصيا منزعج من الأسئلة المستمرة من الجميع تقريبا محرري النصوصحول ما إذا كان سيتم حفظ النص الذي تم تغييره، على الرغم من أن النص الأصلي والحالي لا يختلفان في أي رمز. نعم، لقد كتبت شيئا ما، ولكن بعد ذلك أعدت كل شيء مرة أخرى، هل من المستحيل حقا معرفة ذلك! يجب أن أتحقق مما إذا كنت لم أفسد أي شيء بعد كل شيء.
حاول الالتزام بالقواعد التالية:
لترتيب المكونات بالنسبة لبعضها البعض بالترتيب الصحيح أولا فمن الضروري تسليط الضوء عليها. يمكنك ببساطة وضع دائرة حول المنطقة الموجودة في النموذج الذي يحتوي على المكونات المحددة. أو بالضغط على " يحول"، استخدم نفس الماوس للإشارة إلى كل مكون سيتم تحديده. انقر بالماوس مرة أخرى على المكون المحدد (أثناء الضغط على " يحول") يلغي تحديده.
يمكن إدارة المكونات المحددة ككل - نقلها حول النموذج، وتعيين قيم لنفس الخصائص، ونسخها (للتثبيت، على سبيل المثال، في نموذج آخر)، وحتى حذفها.
الآن انقر بزر الماوس الأيمن على أحد المكونات واختر من القائمة المنبثقة الموضع -> محاذاة...سيظهر مربع حوار يسمح لك بضبط الوضع الأفقي والرأسي للمكونات في المجموعة. على سبيل المثال، نحتاج إلى محاذاة الأزرار الأربعة إلى اليسار والتأكد من وجود مسافة رأسية متساوية بينها. للقيام بذلك، حدد أزرار الاختيار أفقي: الجوانب اليسرىو عمودي: الفضاء على قدم المساواة.
عن طريق اختيار العنصر مركز، سنقوم بترتيب المكونات بحيث تقع مراكزها على نفس الخط أفقيا أو رأسيا، والعنصر المركز في النافذةينقل المكونات إلى منتصف النافذة، أفقيًا أو رأسيًا أيضًا.
في نفس سطر القائمة فاتورة غير مدفوعة ياردر...يؤدي إلى ظهور مربع حوار يتحكم في كيفية تحرك المؤشر عبر عناصر الواجهة عند الضغط على المفتاح فاتورة غير مدفوعة. عندما يظهر النموذج على الشاشة، سيكون المؤشر بطبيعة الحال على المكون الموجود في السطر الأول من مربع الحوار. وبعد ذلك سوف ينتقل إلى أسفل القائمة. في مربع الحوار، يتحكم سهمان باللون الأزرق لأعلى ولأسفل في موضع المكون المحدد. حدد المكون المطلوب، واستخدم الأسهم لنقله إلى السطر المطلوب في القائمة، وهكذا.
عند اختيار عنصر القائمة التحكم ->تظهر قائمة فرعية تتكون من عنصرين:
لدي مشكلة في استخدام فئة دلفي من كود 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 يعمل بشكل جيد هنا لأن تنفيذك يُرجع قيمة حرفية. ولكن من المحتمل أن ترغب التعليمات البرمجية الأكثر جدية في استخدام سلسلة مخصصة ديناميكيًا، وعند هذه النقطة يكون تصميمك معيبًا.
يرجى ملاحظة أنه لإنشاء ملف في الجذر قرص النظاميجب أن تكون مسؤولاً يتمتع بحقوق مرتفعة. لذا فهذه نقطة فشل محتملة أخرى.
أتوقع أن يكون هناك أخطاء أخرى، ولكن هذا هو كل ما وجدته حتى الآن.
تمت كتابة المقال بناءً على نتائج تحليلات البرامج التي كتبها المطورون الشباب في مجموعتنا.
لدى العديد من المستخدمين، وخاصة أولئك الذين عملوا سابقا في 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، قم بتعيين الخاصية Cancel إلى true. هذا كل شيء.
يجب أن تكون جميع مربعات الحوار التي تطالب المستخدم باتخاذ إجراء موجودة على الأقل، زرين: تأكيد الإجراء ورفض الإجراء (نعم/لا، حفظ/إلغاء، وما إلى ذلك). يمكن إلغاء الإجراء عن طريق إغلاق النافذة باستخدام الزر [X] الموجود في عنوان النافذة. من غير المقبول إذا كان هناك زر واحد فقط لتأكيد الإجراء، وللرفض يفترض إغلاق النافذة بالزر [X] في العنوان، أو لا توجد إمكانية للرفض على الإطلاق. وهذا يربك المستخدم ويثير سؤالاً منطقياً: كيف ترفض؟
ولا تنس أيضًا ما قيل أعلاه في فقرة "الأزرار الافتراضية".
في المنتصف، وليس في المكان الذي تم إنشاؤه فيه في وضع التصميم. أولاً، إنه أكثر وضوحًا، وثانيًا، فهو يزيل تلقائيًا مشكلة دقة الشاشة المختلفة لمستخدمين مختلفين.
يتم إجراء استثناء إذا كان مربع الحوار غير مشروط، ونتيجة لعمل المستخدم في هذه النافذة، تحدث التغييرات على الفور في النافذة الرئيسية (على سبيل المثال، تصفية مجموعة البيانات، وإعادة رسم الرسوم البيانية، وما إلى ذلك).
مستحيل. إنه عار عندما يمتد جزء من النافذة إلى ما وراء الشاشة. لا يعتمد هذا المتطلب على دقة شاشة المستخدم، أي. أعذار مثل "دعهم يضبطون دقة أعلى" لا تجدي نفعًا.
يجب تغيير حجم عناصر النافذة أو تحريكها بشكل صحيح عند تغيير حجم النافذة، وعند تكبير النافذة، وعند استعادة النافذة بعد التكبير.
لا ينبغي أن يؤدي تقليل حجم النافذة إلى اختفاء عناصر النافذة، ويفضل ألا يؤدي إلى ظهور أشرطة التمرير (شريط التمرير) للنافذة نفسها. يمكنك تحديد الحد الأدنى لأحجام النوافذ بحيث تكون جميع العناصر مرئية ويمكن الوصول إليها. إذا لم يكن من الممكن وضع المكونات بحيث تكون جميعها مرئية في النافذة، فيمكنك استخدام الإشارات المرجعية (مثل PageControl) لتقسيم المكونات إلى مجموعات. كما أننا لا نتجاهل الأعذار المتعلقة بدقة الشاشة.
بالنسبة للأزرار، خاصة على أشرطة الأدوات (مثل شريط الأدوات)، يجب تحديد التلميحات بحيث يكون من الواضح دائمًا سبب الحاجة إلى هذا الزر أو ذاك.
لا يجب أن ترسم المكونات الموجودة في النموذج بجميع ألوان قوس قزح. وهذا يتعب العين ويشتت انتباه المستخدم. لا يبدو "رائعاً". يتم استخدام التمييز عندما يكون من الضروري لفت انتباه المستخدم إلى عنصر معين أو جزء معين من النافذة. على سبيل المثال، سجلات الألوان التي تحتوي على أخطاء باللون الأحمر الفاتح، أو على العكس من ذلك، تسجيل السجلات التي تم فحصها بنجاح باللون الأخضر الفاتح.
هناك طريقة جيدة جدًا تتيح لك العثور على العيوب في البرنامج بشكل عام والواجهة بشكل خاص. الأمر بسيط: تخيل نفسك مكان المستخدم وحاول لمدة نصف ساعة العمل بالطريقة التي يعمل بها. ومن الأفضل أن يكون المستخدم ضمن النطاق (على سبيل المثال، يعمل في نفس المؤسسة). وفي هذه الحالة اجلس بجانبه، أو الأفضل بدلاً منه، وحاول القيام بعمله. إدخال البيانات وتغييرها وعرض التقارير وما إلى ذلك. إذا كنت لا تعرف كيفية القيام بذلك بشكل صحيح، اسأل المستخدم الخاص بك. لا تقم فقط بإجراء عملية واحدة أو عمليتين من نفس النوع، كما هو الحال في وضع تصحيح الأخطاء، ولكن 20-30، أو حتى أكثر من عمليات مختلفة، بترتيبات مختلفة. ننسى إدخال شيء ما أو إدخاله بشكل غير صحيح وانظر كيف يتفاعل البرنامج معه. سترى بسرعة نقاط الضعف في برنامجك.
كاتب المقال أتمت عمل لجنة القبول في الجامعة، وفي السنة الأولى من طرح البرنامج كان يقضي 3-4 ساعات يوميا في لجنة القبول، يسجل المتقدمين ويملأ بياناتهم الشخصية ويصدرها تقارير عن اجتياز الامتحانات. وفي ساعات العمل المتبقية قام بتصحيح الأخطاء والنواقص. صدقوني، في العام المقبل لن يكون هناك أي مشاكل عمليا. حدث الشيء نفسه عند تقديم وحدة شؤون الموظفين.
وبالتالي، ضع تجربة المستخدم في الاعتبار. اجعل من السهل والممتع بالنسبة لهم العمل مع برامجك.
هذه مقالة مبنية على أسئلة في المنتديات: "كيف يمكنني إرجاع سلسلة من ملف DLL؟"، "كيفية تمرير وإرجاع مجموعة من السجلات؟"، "كيفية تمرير نموذج إلى ملف DLL؟".وحتى لا تقضي نصف حياتك في اكتشاف ذلك، في هذه المقالة سأقدم لك كل شيء على طبق من ذهب.
لقد تم التطرق لمواضيع هذه المقالة أكثر من مرة في هذه المدونة بدرجات متفاوتة، إلا أنها في هذه المقالة مجمعة ومبررة. باختصار، يمكنك إرسال رابط لهذه المقالة إلى أولئك الذين يقومون بتطوير ملفات DLL.
ملاحظة هامة: يجب قراءة المقال بالتتابع. يتم توفير أمثلة التعليمات البرمجية فقط كـ أمثلة، في كل خطوة (نقطة) من المقالة، يتم إضافة كود المثال بتفاصيل جديدة. على سبيل المثال، في بداية المقالة لا توجد معالجة للأخطاء؛ تمت الإشارة إلى الطرق "الكلاسيكية" (مثل استخدام GetLastError، واتفاقية sdtcall، وما إلى ذلك)، والتي يتم استبدالها بطرق أكثر ملاءمة مع تقدم المقالة. وقد تم ذلك حتى لا تثير التصاميم "الجديدة" ("غير العادية") تساؤلات. بخلاف ذلك، سيكون من الضروري إدراج ملاحظة لكل مثال مثل: "هذا ما تمت مناقشته في تلك الفقرة أدناه، وهذا ما تمت مناقشته في هذه الفقرة". على أية حال، يوجد في نهاية المقالة رابط للكود الجاهز، مكتوب مع مراعاة كل ما ورد في المقالة. يمكنك فقط أخذها واستخدامها. ويشرح المقال لماذا ولماذا. إذا لم تكن مهتماً بـ "لماذا ولماذا"، انتقل إلى النهاية إلى الخاتمة والرابط لتحميل المثال.
فقط من أجل النتيجة
الالتزام الصارم بالمواعيد النهائية
الشفافية
تنفيذ المشروع
الدعم الفني كهدية
1. نناقش المشكلة عبر الهاتف. رهناً بالتوافر الوصول عن بعد- اعرض على شاشة جهاز الكمبيوتر الخاص بك.
2. نقدر العمل بالروبل إذا كان المشروع كبيرًا، وإذا لم يكن كذلك، فالعدد التقريبي للساعات.
3. ننجز المهمة.
4. تقبل العمل في برنامجك، وإذا كان هناك أي قصور، فإننا نقوم بتصحيحه.
5. نحن نصدر فاتورة، أنت تدفع.
1. يتم تقسيم جميع الأعمال إلى 3 فئات: الاستشارة، وتحديث التكوين القياسي، وتطوير أو برمجة تقرير جديد، والمعالجة، والأزرار، وما إلى ذلك.
3. يجب تحضير العمل الذي يزيد عن 10 ساعات مسبقًا. الاختصاصاتمع الوصف وتكلفة العمل. يبدأ العمل بعد الاتفاق على المواصفات الفنية معك.
1. إذا وجدت أي أخطاء في الأعمال المقبولة مسبقاً خلال 3 أشهر، نقوم بتصحيحها مجاناً.
2. للعملاء العادييننقوم بتصحيح أي قصور في عملنا مجاناً خلال عام.
شراء 1C: المؤسسة
نحن الوكيل الرسمي لشركة 1C، ويمكنك شراء العديد من المنتجات منتجات البرمجياتوالتراخيص. بالإضافة إلى شراء "الصندوق"، سنساعدك في إعداد البرنامج وتقديم النصائح وإجراء الإعدادات الأساسية.
1ج: المحاسبة | 1ج: إدارة التجارة | 1ج: البيع بالتجزئة | 1ج: إدارة الرواتب وشؤون الموظفين |
من 3300 فرك. | من 6700 فرك. | من 3300 فرك. | من 7400 فرك. |
الإعداد الفوري للخادم + 1C.
لا يوجد خادم؟ لا توجد مشكلة، سوف نقوم باختيار خادم في السحابة وإعداده بسرعة. مقابل رسوم رمزية تحصل على حل موثوق للغاية.
هل تريد أن يعرف عملاؤك العروض الترويجية والخصومات؟ هل العملاء لا يعودون؟ قم بإعداد إرسال الرسائل القصيرة مباشرة من 1C!
شركتنا سوف تكون قادرة على شروط قصيرةقم بإعداد إرسال الرسائل القصيرة إلى عملائك مباشرة من 1C. أمثلة على الأحداث التي يمكن أتمتتها:
يمكن إجراء الإعداد في 1C بواسطة المتخصصين لدينا أو موظفيك. يمكنك عرض التعريفات على صفحة تعريفات الرسائل القصيرة.