Pelaporan mudah dalam C / C ++

Jika Anda mengembangkan C / C ++ perangkat lunak apa pun untuk operator (administrator) rumah sakit, toko, layanan penyewaan skuter gyro, layanan perbaikan ponsel, maka Anda mungkin menghadapi tugas membuat laporan untuk mencetaknya di printer, atau setidaknya dalam PDF. Ada banyak paket pihak ketiga untuk Embarcadero RAD Studio yang memungkinkan Anda melakukan ini. Seperti FastReport, QuickReport, Crystal Reports, dll. Namun menurut saya, semua paket ini membutuhkan pemahaman yang mendalam tentang mekanisme dan antarmuka mereka. Diperlukan banyak waktu untuk mempelajarinya, dan yang paling penting, kode untuk menghasilkan bahkan laporan paling sederhana pun akan terdiri dari sejumlah besar baris. Ketika saya pertama kali menghadapi tugas menghasilkan laporan di bawah C / C ++, saya mulai dengan FastReport dan menyadari bahwa saya benar-benar tidak menyukai alat ini.

Pada saat itu, sebuah pemikiran indah muncul di benak saya: betapa kerennya mengambil file EXCEL sederhana, menambahkan informasi statis ke dalamnya dan memformatnya sesuai dengan kebutuhan Anda. Program hanya akan membuka file ini, mengisinya dengan data dinamis dan menyimpan atau mengirim untuk mencetak! Ini berfungsi sebagai titik awal untuk studi saya tentang mekanisme OLE untuk bekerja dengan file MS Office dari program yang dikembangkan di Embarcadero RAD Studio.

Dalam perjalanan pekerjaan saya, saya berhasil menggali topik dengan cukup dalam dan sekarang saya dapat mengatakan dengan yakin bahwa semua alat yang disediakan MS Office dan OLE menyediakan yang mencakup semua kebutuhan pelaporan saya. Nah, jika demikian, maka mungkin untuk pengembang lain itu akan menjadi alat mandiri, sederhana dan nyaman. Oleh karena itu, diputuskan untuk menulis DLL dan memasukkan ke dalamnya daftar semua fungsi MS Excel yang umum digunakan yang Anda temui selama pembuatan dokumen Excel. Ini sangat nyaman, karena untuk membuat laporan, Anda tidak perlu mempelajari banyak manual atau OLE. Yang diperlukan hanyalah memuat DLL dan fungsinya. Yah, banyak yang bisa bekerja dengan DLL.

Inilah situs proyek itu sendiri .

Di situs proyek, mekanisme untuk bekerja dengan DLL dijelaskan secara cukup terperinci, ada contoh dan deskripsi semua fungsi.

DLL datang tanpa file header dan tanpa perpustakaan LIB statis. Dengan demikian, DLL harus terhubung secara dinamis menggunakan fungsi LoadLibrary. Arsip ZIP dengan perpustakaan termasuk file-file berikut:

  • " light_report.dll " - pustaka DLL itu sendiri;
  • " DLLTest.cpp " - contoh menggunakan perpustakaan;
  • " LPDLL.h " - file header untuk contoh menggunakan perpustakaan (ini bukan file header DLL);
  • " Report.xlsx " - Dokumen MS EXCEL untuk contoh penggunaan perpustakaan.

File header untuk contoh penggunaan perpustakaan LPDLL.h berisi deklarasi berikut:

  • enumerasi yang digunakan sebagai argumen untuk fungsi DLL;
  • jenis fungsi DLL;
  • Instance fungsi DLL
  • Deskriptor unduhan DLL (" HINSTANCE DLL_Handle; ");
  • function LoadLightReportDLL , yang secara dinamis memuat DLL dan semua fungsinya;
  • Fungsi FreeLightReportDLL yang membongkar DLL.

File LPDLL.h sudah berisi semua yang Anda butuhkan untuk bekerja dengan DLL dan fungsinya. Tetapi Anda juga dapat mengeditnya atau hanya mengambil yang paling penting untuk proyek Anda.

Bayangkan Anda baru saja menghubungkan file header "LPDLL.h" ke proyek Anda.

Maka dalam proyek itu sendiri Anda hanya perlu:

1) Nyatakan pegangan variabel ke laporan Anda:

Variant report; 

2) Secara dinamis memuat DLL dan semua fungsinya:

 if(!LoadLightReportDLL("C:\\LightReport\\light_report.dll"))return; 

3) Selanjutnya, dalam konstruk coba-coba, buka templat laporan yang disiapkan (file MS Excel):

 report=OpenReport("C:\\LightReport\\Report.xlsx",0); 

4) Tambahkan beberapa data ke laporan:

 WriteCell(report, "Sheet1", 9, 1, "Hello world!"); 

...
5) Simpan file atau cetak:

 Save(report); SaveAs(report, "C:\\LightReport\\Report copy.xlsx"); ExportToPDF(report, "C:\\LightReport\\Report.pdf", false); PrintOut(report); 

6) Tutup file:

 CloseReport(report); 

7) Bongkar pustaka DLL:

 FreeLightReportDLL(); 

Dan itu dia! Sama sekali tidak lebih! Hanya ada satu peringatan, tetapi bahkan itu, itu muncul hanya selama debugging. Dalam aplikasi yang berfungsi, semuanya akan bekerja dengan baik. Maksud saya situasi di mana ada beberapa jenis kesalahan saat bekerja dengan laporan. Faktanya adalah bahwa mekanisme OLE untuk bekerja dengan dokumen hanya melibatkan melempar pengecualian ketika kesalahan terjadi. Itu sebabnya ketika bekerja dengan fungsi DLL, Anda harus menggunakan konstruk try-catch. Di blok tangkap, Anda harus menutup laporan tanpa menyimpan:

 catch(...){CloseReport(report);} 
.
Saat debugging, ketika kesalahan terjadi, Anda dapat menghentikan program. Dalam hal ini, proses MS Excel akan tetap berjalan, dan akan mungkin untuk menutupnya hanya melalui task manager. Oleh karena itu, ketika debugging aplikasi beberapa kali, beberapa contoh proses MS Excel dapat diluncurkan, tergantung pada seberapa sering Anda menangguhkan program ketika kesalahan terjadi, tanpa menunggu kode untuk dieksekusi dalam tangkapan. Ini harus dipantau.

Dalam rilis, jika terjadi kesalahan, kode yang ditentukan dalam blok tangkap pasti akan berfungsi, laporan akan ditutup, dan proses MS Excel akan selesai. Tidak ada proses MS Excel yang tergantung pada sistem yang akan diamati. Tapi tetap saja mereka mencoba menulis kode bebas kesalahan, jadi saya harap Anda tidak mengalami situasi ini dalam aplikasi yang sedang berjalan.

Akhirnya, Anda perlu menambahkan:

  1. DLL menggunakan tipe data platform-independen, seperti pendek unsigned , unsigned long, dan char . Ini bisa dimengerti kenapa.
  2. Contoh ini ditulis dalam lingkungan Embarcadero Builder C ++ 10. Dengan demikian, semua kode terkait dengan lingkungan ini dan, mungkin, Anda perlu membuat beberapa perubahan pada kode contoh untuk membuat semuanya berfungsi di lingkungan Anda.
  3. Hambatan DLL ini adalah penggunaan deskriptor file laporan dalam format Variant . Ini adalah format yang agak spesifik dan saya menduga mungkin sulit untuk menggunakan perpustakaan di luar Embarcadero RAD Studio. Jujur, saya tidak memeriksa.

Oleh karena itu, untuk masa depan direncanakan untuk mengemas semua fungsionalitas ke dalam kelas dan menyembunyikan format Varian ini di dalam kelas sehingga hanya format C / C ++ yang diterima secara umum yang diberikan kepada pengguna. Saya belum pernah mencoba mengemas kelas menjadi DLL, saya membaca bahwa kesulitan akan muncul dengan ini. Namun demikian, kami akan mengerti! Sementara itu, terima kasih atas perhatian Anda, saya akan sangat senang jika artikel ini dan DLL membantu seseorang.

Tautan ke proyek .

Source: https://habr.com/ru/post/id456102/


All Articles