إذا كنت تقوم بتطوير في C / C ++ أي برنامج لمشغلي (المسؤولين) في المستشفيات والمحلات التجارية وخدمات تأجير الدراجات البخارية الدورانية وخدمات إصلاح الهواتف المحمولة ، فمن المحتمل أنك واجهت مهمة إنشاء تقارير لطباعتها على طابعة أو في PDF على الأقل. هناك العديد من حزم الطرف الثالث لـ Embarcadero RAD Studio التي تتيح لك القيام بذلك. مثل FastReport ، QuickReport ، تقارير Crystal ، إلخ. ولكن في رأيي ، كل هذه الحزم تتطلب فهمًا عميقًا لآليتها وواجهة الاتصال. يستغرق الأمر الكثير من الوقت لدراستها ، والأهم من ذلك ، أن الكود لإنشاء أبسط تقرير سيتألف من عدد كبير من الأسطر. عندما واجهت لأول مرة مهمة إنشاء تقارير تحت C / C ++ ، بدأت مع FastReport وأدركت أنني لا أحب هذه الأداة مطلقًا.
في هذه اللحظة بالذات ، برزت فكرة رائعة: كم سيكون رائعًا أن تأخذ ملف EXCEL بسيطًا ، وإضافة معلومات ثابتة إليه وتنسيقه ليناسب احتياجاتك. سيقوم البرنامج بفتح هذا الملف فقط ، وملؤه ببيانات ديناميكية وحفظه أو إرساله للطباعة! كان هذا بمثابة نقطة انطلاق لدراستي لآلية OLE للعمل مع ملفات MS Office من البرامج التي تم تطويرها في Embarcadero RAD Studio.
خلال نشاطي ، تمكنت من الخوض في الموضوع بعمق كافٍ والآن يمكنني أن أقول بثقة أن جميع الأدوات التي يوفرها MS Office و OLE توفر جميع احتياجاتي لإعداد التقارير. حسنًا ، إذا كان الأمر كذلك ، فمن المحتمل للمطورين الآخرين أن تكون أداة مكتفية ذاتيًا وبسيطة ومريحة. لذلك ، تقرر كتابة مكتبة الارتباط الحيوي (DLL) وحزم قائمة بجميع وظائف MS Excel شائعة الاستخدام التي تواجهها أثناء إنشاء مستندات Excel. هذا مناسب للغاية ، لأنه لإنشاء تقرير ، لا تحتاج إلى دراسة مجموعة من الأدلة أو OLE. كل ما هو مطلوب هو فقط لتحميل DLL وظائفها. حسنًا ، العديد منهم قادرون على العمل مع DLL.
هنا هو موقع المشروع نفسه .
في موقع المشروع ، يتم وصف آلية العمل مع DLLs بتفاصيل كافية ؛ يوجد مثال ووصف لكل الوظائف.
يأتي DLL بدون ملف رأس وبدون مكتبة LIB ثابتة. وبالتالي ، يجب أن تكون متصلاً DLL بشكل حيوي باستخدام الدالة LoadLibrary. يتضمن أرشيف ZIP مع المكتبة الملفات التالية:
- " light_report.dll " - مكتبة DLL نفسها ؛
- " DLLTest.cpp " - مثال على استخدام المكتبة ؛
- " LPDLL.h " - ملف الرأس للحصول على مثال لاستخدام المكتبة (هذا ليس ملف رأس DLL) ؛
- " Report.xlsx " - مستند MS EXCEL للحصول على مثال عن استخدام المكتبة.
يحتوي ملف الرأس
لمثال استخدام مكتبة
LPDLL.h على التعريفات التالية:
- التعدادات المستخدمة كوسيطات لوظائف DLL؛
- أنواع وظائف DLL ؛
- مثيلات دالة DLL
- واصف تنزيل DLL (" HINSTANCE DLL_Handle؛ ")؛
- وظيفة LoadLightReportDLL ، والتي تقوم بشكل ديناميكي بتحميل DLL وجميع وظائفها ؛
- وظيفة FreeLightReportDLL التي تقوم بإلغاء تحميل DLL.
يحتوي ملف
LPDLL.h بالفعل على كل ما تحتاجه للعمل مع DLL ووظائفه. ولكن يمكنك أيضًا تعديله أو أخذ فقط الأكثر ضرورة لمشروعك.
تخيل أنك قمت للتو بتوصيل ملف الرأس
"LPDLL.h" بمشروعك .
ثم في المشروع نفسه تحتاج فقط إلى:
1) قم بتعريف مؤشر متغير لتقريرك:
Variant report;
2) بشكل حيوي تحميل DLL وجميع وظائفها:
if(!LoadLightReportDLL("C:\\LightReport\\light_report.dll"))return;
3) بعد ذلك ، في بنية try-catch ، افتح قالب التقرير المعد (ملف MS Excel):
report=OpenReport("C:\\LightReport\\Report.xlsx",0);
4) إضافة بعض البيانات إلى التقرير:
WriteCell(report, "Sheet1", 9, 1, "Hello world!");
...
5) احفظ الملف أو قم بطباعته:
Save(report); SaveAs(report, "C:\\LightReport\\Report copy.xlsx"); ExportToPDF(report, "C:\\LightReport\\Report.pdf", false); PrintOut(report);
6) أغلق الملف:
CloseReport(report);
7) تفريغ مكتبة DLL:
FreeLightReportDLL();
وهذا كل شيء! لا شيء على الإطلاق! يوجد تحذير واحد فقط ، لكن حتى ذلك ، يظهر فقط أثناء تصحيح الأخطاء. في تطبيق العمل ، كل شيء سوف يعمل بشكل جيد. أعني حالة يكون فيها هناك نوع من الخطأ عند العمل مع تقرير. الحقيقة هي أن آلية OLE للعمل مع المستندات تتضمن فقط رمي استثناءات عند حدوث أخطاء. لهذا السبب عند العمل مع وظائف DLL ، يجب عليك استخدام إنشاء try-catch. في كتلة catch ، يجب إغلاق التقرير دون حفظ:
catch(...){CloseReport(report);}
.
عند تصحيح الأخطاء ، عند حدوث خطأ ، يمكنك إيقاف البرنامج. في هذه الحالة ، ستبقى عملية MS Excel قيد التشغيل ، وسيكون من الممكن إغلاقها فقط من خلال مدير المهام. لذلك ، عند تصحيح التطبيق عدة مرات ، قد يتم إطلاق عدة مثيلات لعملية MS Excel ، اعتمادًا على عدد مرات تعليق البرنامج عند حدوث خطأ ، دون انتظار تنفيذ التعليمات البرمجية في الاستيلاء. هذا يجب مراقبته.
في الإصدار ، في حالة حدوث خطأ ، ستعمل بالتأكيد الشفرة المحددة في كتلة catch ، وسيتم إغلاق التقرير ، وستكتمل عملية MS Excel. لن يتم ملاحظة أي عمليات MS Excel معلقة في النظام. ولكن ما زالوا يحاولون كتابة تعليمات برمجية خالية من الأخطاء ، لذلك آمل ألا يكون لديك هذا الموقف في تطبيق قيد التشغيل.
أخيرًا ، تحتاج إلى إضافة:
- تستخدم مكتبة الارتباط الحيوي (DLL) أنواع بيانات مستقلة عن النظام الأساسي ، مثل long قصيرة ، غير موقعة ، و char . هذا مفهوم لماذا.
- يتم كتابة المثال في بيئة Embarcadero Builder C ++ 10. وفقًا لذلك ، تتوافق جميع التعليمات البرمجية مع هذه البيئة ، وربما ستحتاج إلى إجراء بعض التغييرات على رمز المثال لجعل كل شيء يعمل في بيئتك.
- عنق الزجاجة في DLL هذا هو استخدام واصف ملف التقرير بتنسيق متغير . هذا تنسيق محدد إلى حد ما وأظن أنه قد يكون من الصعب استخدام المكتبة خارج Embarcadero RAD Studio. بصراحة ، أنا لم تحقق.
لذلك ، من المخطط للمستقبل أن يحزم جميع الوظائف في فصل ما وأن يخفي تنسيق
المتغير هذا داخل الفصل بحيث يتم توفير تنسيقات C / C ++ المقبولة للمستخدم فقط. لم أحاول أبدًا تعبئة الفئات في DLL ، قرأت أن الصعوبات ستنشأ بالضرورة مع هذا. ومع ذلك ، سوف نفهم! في غضون ذلك ، شكرًا لك على اهتمامك ، وسأكون سعيدًا جدًا إذا ساعدت هذه المقالة و DLL في مساعدة شخص ما.
رابط للمشروع .