Kata pengantar
Dalam beberapa minggu terakhir bekerja, saya diganggu oleh masalah sakit kepala, yaitu kontrol ActiveX yang ditulis dalam VB6 memiliki banyak masalah aneh di lingkungan Delphi. , menemukan solusi untuk masalah yang terjadi pada versi Delphi yang berbeda.
Salah satu pengecualian fatal yang tidak bisa dijelaskan di Delphi5
Pertama, mari kita lihat perilaku aneh kontrol ActiveX yang ditulis dalam VB di bawah Delphi5.
Misalnya: Kami menggunakan VB untuk menulis kontrol UserTest (untuk kesederhanaan, kami hanya mengekspor satu kelas, kontrol pengguna), properti TestName, dan metode TestMethod. Kemudian kompilasi ke dalam kontrol ActiveX, daftarkan dan impor ke lingkungan pengembangan Delphi5 (jika ada yang kurang jelas pada langkah di atas, silakan periksa berbagai bahan referensi, pasti ada jawaban standarnya), sejauh ini semuanya tampak normal.
Kemudian, kita terbiasa menyeret dan melepaskan kontrol ke formulir, mengubah ukurannya, dan menetapkan nilai ke properti di jendela properti, atau kode yang sama. Ini sangat normal dan mudah digunakan. Namun, inilah masalahnya. Jika Anda memanggil TestMethod dengan antusias, Anda akan mendapatkan pengecualian aneh "OleError800a01a9", dan kemudian program akan keluar. Sayangnya, Anda tidak akan dapat melacak pengecualian ini di VB. Tentu saja, jika Anda pandai perakitan, Anda dapat mengikuti jendela debugging Delphi langkah demi langkah...
Ketika saya pertama kali mengalami masalah ini, saya hampir marah karena baik Microsoft maupun Borland tidak memiliki penjelasan atas kesalahan tersebut, atau informasi apa pun untuk ditemukan. Saya harus mengunjungi beberapa forum yang sering saya kunjungi, tentunya yang paling penting adalah CSDN, dan mencari pertanyaan serupa di versi VB dan versi Delphi. Sayangnya, hanya ada pertanyaan serupa tetapi tidak ada jawaban alat, setelah menguji hampir semua alat pengembangan dan lingkungan pengembangan di Windows (termasuk desktop dan WEB), saya lupa tentang Delphi.
Dalam dua hari tersisa, saya hampir berkeliling dunia, menelepon semua teman saya dan menanyakan apakah pakar Delphi mengetahui situasi ini , tapi saya mendapatkan metode yang hampir Ajaib (begitulah penemunya menyebutnya):
Metode memodifikasi secara manual file perpustakaan tipe proxy XXX_TLB.PAS (di mana XXX mengacu pada nama kelas kontrol) yang dihasilkan oleh Delphi setelah mengimpor kontrol VVBActiveX dapat memecahkan masalah ini. Contoh:
Ada kontrol UserControl1 yang ditulis dalam VB. Setelah mengimpornya di Delphi, dua file dihasilkan. Salah satunya, UserControl1_TLB.PAS, adalah file yang ingin kita modifikasi.
Temukan sesuatu seperti ini di file
FintF:_UserControl1;
FunctionGetControlInterface:_UserControl1;
Dan
PROpertyControlInterface:_UserControl1readGetControlInterface;
Dapatkan Antarmuka Kontrol;
maupun
procedureTUserControl1.CreateControl;
procedureDoCreate;
mulai
Finf:=ITidak Diketahui(OleObject)as_UserControl1;
Akhir;
Mulai
IfFinf=nilthenDoCreate;
Akhir;
FunctionTUserControl1.GetControl1Interface:_UserControl1;
Mulai
Buat Kontrol;
Hasil:=Akhir;
Akhir;
Harap diperhatikan: Semua _UserControl1 yang ditandai dengan warna merah di sini harus diganti dengan _UserControl1Disp. Jika kompilasi tidak berhasil, harap ganti semua _UserControl1 yang dilaporkan dalam peringatan kompilasi dengan _UserControl1Disp dan kompilasi dengan cara ini saat memanggil metode kontrol terjadi.
Terima kasih atas penemuan hebat ini, saya hanya dapat mendeskripsikannya seperti ini, jika tidak, saya mungkin masih terjebak dalam lingkaran ini, atau saya harus menggunakan alat lain untuk mengembangkan kembali kontrol ini (saya tidak dapat membayangkan berapa banyak pekerjaan yang akan dilakukan. , dan Atau mungkin ada masalah kompatibilitas lainnya).
Delphi5 pengecualian fatal yang tidak bisa dijelaskan 2
Namun, Delphi tidak membiarkan saya pergi setelah saya menghindari pembatasan ini. Segera, pelanggan menemukan masalah lain yang menyusahkan, pengecualian akan muncul setiap kali formulir yang berisi kontrol ditutup pada saat runtime tidak terjadi pada aplikasi yang dikompilasi. Meskipun tidak akan mempengaruhi penggunaan pengguna akhir, ini merupakan masalah besar bagi pengembang. Kemudian saya mencobanya menggunakan contoh di atas dan ternyata tidak terjadi. (Saya menjadi gila saat itu. Ini mungkin disebabkan oleh beberapa penggunaan kode yang tidak kompatibel. Sangat menakutkan untuk mengetahui apakah puluhan ribu baris kode teratur dalam sehari.) Karena marah, saya memblokir kontrol ada di kendali saya. Semua kode, hanya menyisakan antarmuka pengguna itu sendiri, dan kemudian sesuatu yang aneh terjadi, saya tidak menulis kode apa pun, tetapi Kesalahan ini masih terjadi saat memuat kontrol saya, yang membuat saya senang dan terkejut. Yang menyenangkan adalah masalah ini tidak ada hubungannya dengan kode saya, jadi akan lebih mudah untuk menemukannya menjatuhkan beberapa standar di VB. Kontrol sebenarnya dapat menyebabkan kesalahan yang mengerikan. Kontradiksi antara Delphi5 dan VB6 sebenarnya tidak terlalu dalam. Dalam 2 jam berikutnya, saya terus menghapus kontrol pada antarmuka untuk menguji siapa yang menyebabkan pengecualian fatal ini.
Setelah 2 jam, saya menghela nafas lega dan menemukan masalah mendasarnya adalah:
Jika Anda menggunakan kontrol kontainer seperti Frame dan PictureBox (yang dapat berisi kontrol lain di dalamnya) di kontrol pengguna VB, Anda tidak akan dapat menambahkan kontrol tanpa jendela seperti Label, Garis, dan Gambar ke kontrol ini (yaitu, tidak ada kontrol Jendela, mereka diambil oleh VB secara real time saat runtime), jika tidak, Anda akan mendapatkan laporan kesalahan seperti di atas.
Kontrol ActiveX tersembunyi di Delphi6 dan 7
Justru karena pengalaman buruk di Delphi5, saya merasa masih perlu untuk menguji apakah masalah yang sama terjadi di Delphi6 dan 7 (versi sebelumnya tidak lagi diperlukan karena penggunanya sangat sedikit, dan Delphi8 belum dirilis secara resmi, jadi itu tidak tersedia untuk saat ini tidak dipertimbangkan). Hasilnya adalah: ...tidak peduli berapa kali saya memuatnya, saya tidak pernah menemukan ikon kecil yang telah lama ditunggu-tunggu di bilah ActiveX. Hasil ini tentu sangat lucu, saya pun tidak bisa memuatnya, apalagi tesnya normal atau tidak.
Demikian pula, saya mencari di berbagai forum dan situs web, dan menemukan lebih banyak orang menanyakan pertanyaan serupa di CSDN, tetapi jawabannya masih nol. Dalam keputusasaan, saya harus menyesuaikan opsi di setiap Delphi6 dan 7...
Setelah 3 jam, 15 menit dan 54 detik, saya menemukan penyebab, atau solusi, dari masalah sialan ini (mohon maafkan saya karena menyebutnya demikian, saya tidak tahan), yang sebenarnya sangat sederhana.
Sekarang silakan ikuti saya: klik menu Tools->EnvironmentOptions->TypeLibrary halaman, kita harus menemukan item: IgnorespecialCoClassFlagsWhenImporting, pilih, lalu pilih item CanCreate, jadi sekarang, mari kita coba mengimpor kontrol ActiveX yang buruk itu (Seharusnya begitu dicatat di sini bahwa jika Anda telah mengimpornya sekali, harap hapus dua file yang dihasilkan, file .dcr dan .pas, jika tidak maka tidak akan di-refresh). Jika kali ini Anda masih tidak dapat menemukan kontrol di kolom ActiveX, maka Anda harus menghubungi Microsoft atau Borland dan menanyakan kapan mereka bisa menikah, haha!
(Juga, kesalahan di atas yang muncul di Delphi5 tidak ditemukan di Delphi6 dan 7)
Lingkungan pengujian saya adalah:
Menangkan2K
Delphi5Pembaruan1
Delphi6Pembaruan2
Delphi7