سؤال

لقد واجهت هذا بانتظام، وأنا فقط أبحث عن أفضل الممارسات / النهج. لدي تطبيق يحتوي على قاعدة بيانات / Datamodule، وترغب في إطلاق سراح قاعدة البيانات / مجموعات البيانات عند بدء تشغيل W / O بعد تعيين "نشط في وقت التشغيل" على True في وقت التصميم (يختلف موقع قاعدة البيانات). قم أيضا بتشغيل روتين "التحقق من التحديثات" عند بدء تشغيل التطبيق.

إعطاء تسلسل الحدث TFORM، والنتائج من تجربة وخطأ مختلفة، أنا أستخدم حاليا هذا النهج:

يمكنني استخدام سجل "Globals" الذي تم إعداده في النموذج الرئيسي لتخزين جميع المتفجارات العالمية، ولديك عنصر واحد يسمى Globals.Appinitialized (Boolean)، وقم بتعيينه على False في قسم التهيئة في النموذج الرئيسي.

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

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

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

المحلول

عادة ما أطفئ دائما إنشاء تلقائي لجميع الأشكال باستثناء النموذج الرئيسي وربما البيانات الرئيسية.

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

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

const
  wm_AppStarted = wm_User + 101;


type
  Form1 = class(tForm)
    :
    procedure wmAppStarted(var Msg:tMessage); message wm_AppStarted;
  end; 

// in your oncreate event add the following, which should result in your wmAppStarted event firing.
PostMessage(handle,wm_AppStarted,0,0);

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

نصائح أخرى

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

هذه هي الطريقة التي عادة ما تتعامل مع هذه الأشياء التهيئة:

...
Application.CreateForm(TMainForm, MainForm);    
...
MainForm.ApplicationLoaded; // loads options, etc..
Application.Run;
...

لا أعرف ما إذا كان هذا مفيدا، لكن بعض تطبيقاتي لا تملك أي شكل تلقائي تم إنشاؤه، أي ليس لديهم ما لا يدمون في IDE.

النموذج الأول الذي تم إنشاؤه مع كائن التطبيق كما سيصبح مالكه تلقائيا الرئيسي. وبالتالي، أنا فقط AutoCreate One DataModule ك محمل واترك هذا المرء يقرر إنشاء Datamodules عند النماذج التي يجب إنشاءها في أي ترتيب. تحتوي هذه Datamodule هذه على طريقة بدء التشغيل والإغلاق، والتي يتم استدعاؤها باسم "الأقواس" حول التطبيق. Run في DPR. توفر طريقة الإغلاق سيطرة أكثر قليلا على عملية الاغلاق.

قد يكون هذا مفيدا عند تصميم "Mainforms" مختلفة لحالات الاستخدام المختلفة للتطبيق الخاص بك أو يمكنك استخدام بعض ملفات التكوين لتحديد ما يقرعها.

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

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

بدلا من ذلك يمكنك:

  • اتصل به من شاشة البداية الخاصة بك.
  • تفعل ذلك أثناء تسجيل الدخول
  • قم بتشغيل "التحقق من التحديث" في مؤشر ترابط الخلفية - لا تجبرهم على التحديث الآن. وبعد هل هذا النوع من مثل فايرفوكس يفعل.

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

لذلك ربما تحتاج إلى الاعتقاد أولا لماذا تحتاجها فعليا.

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

Application.CreateForm(TDmMain, DmMain);

  if DmMain.isDBConnected then
    begin
      Application.CreateForm(TDmVisualUtils, DmVisualUtils);
      Application.CreateForm(TfrmMain, frmMain);
    end;

  Application.Run;

هناك خدعة واحدة أستخدمها هي وضع TTIMER على النموذج الرئيسي، واضبط الوقت على شيء مثل 300ms، وأداء أي تهيئة (تسجيل دخول DB، نسخ ملفات الشبكة، إلخ). بدء تشغيل التطبيق يطرح النموذج الرئيسي على الفور ويسمح بتحدث أي "أشياء". لا يقوم المستخدمون ببدء بدء تشغيل مثيلات متعددة "Oh..i لم نقر DBL ... سأفعل ذلك مرة أخرى .."

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