Kami sudah berkenalan dengan karakter khusus dalam
pelajaran ke -
4 dari siklus kami. Penggunaan mereka yang paling sederhana ditunjukkan di sana. Ia juga mengatakan bahwa jika antarmuka
ksTextItemParam menentukan karakter khusus dan string, maka string tersebut terletak tepat setelah karakter khusus. Namun, ada karakter khusus yang melanggar aturan ini. Kami akan membicarakannya hari ini.

Isi seri pelajaran βBekerja dengan API KOMPAS-3Dβ
- Dasar-dasarnya
- Desain gambar
- Koneksi yang benar ke KOMPAS
- Prasasti utama
- Primitif grafis
- Menyimpan dokumen dalam berbagai format
- Mengenal pengaturan
- Metode penulisan yang lebih canggih di blok judul
- Membaca sel teks
- Karakter khusus termasuk string
Karakter khusus termasuk string
Tabel tanda-tanda khusus ada di Lampiran V dari bantuan utama KOMPASKarakter khusus dengan angka
78-80 ,
83 ,
93-99 ,
171 dan
172 termasuk string. Dalam hal ini, string
s dari antarmuka
ksTextItemParam tidak terletak setelah karakter khusus, tetapi di dalamnya. Misalnya, karakter khusus dengan angka
80 menampilkan teks dalam bingkai. Berikut ini adalah contoh dari program yang menunjukkan bekerja dengan karakter khusus.
// TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); // TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L""); TextItemParam->set_s(str); SysFreeString(str); // StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); // Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextItemParam); // Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); Document2D.Unbind(); // kompas->Visible = true; kompas.Unbind();
Untuk kesederhanaan, contoh ini menghilangkan kode yang bertanggung jawab untuk pembuatan dan pelaksanaan dokumen (topik ini dibahas dalam pelajaran siklus sebelumnya). Gambar di bawah ini menunjukkan label utama yang dibentuk oleh program ini.

Untuk kesederhanaan, kami hanya mengisi satu sel. Karakter khusus dengan nomor
98 mendefinisikan tanda akar kuadrat. Perhatikan bahwa nilai properti s dari antarmuka
ksTextItemParam sepenuhnya berada di bawah tanda root. Karakter khusus lainnya, termasuk string, bekerja dengan cara yang persis sama.
Karakter khusus dan ksTextLineParam
Tindakan karakter khusus tidak terbatas pada antarmuka
ksTextItemParam . Perhatikan contoh di bawah ini.
// TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); // DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); // TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemParam->Init(); TextItemParam->set_type(0); str = SysAllocString(L" 3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); // StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); // Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); // Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); // kompas->Visible = true; kompas.Unbind();
Dalam contoh ini, baris yang terdiri dari tiga komponen dimasukkan dalam blok judul. Dua yang pertama berisi karakter khusus dan string. Komponen ketiga hanya berisi string, tanpa karakter khusus. Mari kita lihat hasil program (gambar di bawah ini hanya menunjukkan baris yang dihasilkan tanpa tulisan utama).

Harap dicatat bahwa baris
"Halaman 2" dan baris
"Halaman 3" termasuk dalam karakter khusus kedua, yang kami rencanakan untuk ditampilkan di luar karakter khusus. Selain itu, kedua baris ini termasuk dalam karakter khusus pertama (kami tidak merencanakan ini juga). Contoh ini menunjukkan dua poin penting:
- karakter khusus dapat mencakup karakter khusus lainnya;
- aksi karakter khusus meluas ke semua komponen yang membentuk antarmuka ksTextLineParam .
Muncul pertanyaan yang masuk akal - adakah cara untuk membatasi tindakan karakter khusus? Ya ada. Tetapi untuk memahaminya, Anda harus terlebih dahulu berkenalan dengan antarmuka
ksTextItemFont .
Opsi Font Komponen Teks ( ksTextItemFont )
Menurut dokumentasi, antarmuka
ksTextItemFont menjelaskan parameter font komponen teks. Namun pada kenyataannya, kemampuannya melebihi deskripsi sederhana dari font yang digunakan. Antarmuka ini memungkinkan Anda untuk membuat garis komposit (tentang mereka - dalam pelajaran siklus berikutnya).
Anda bisa mendapatkannya dengan beberapa cara. Pertama, menggunakan metode
GetParamStruct dari antarmuka
KompasObject : untuk ini,
ko_TextItemFont konstan harus diteruskan ke metode ini sebagai satu-satunya parameter. Kedua, menggunakan metode
GetItemFont dari antarmuka
ksTextItemParam . Metode ini tidak memiliki parameter input dan mengembalikan antarmuka
ksTextItemFont yang sudah dikaitkan dengan komponen teks.
Pertimbangkan properti dari antarmuka
ksTextItemFont .
bitvector - vektor bit yang mendefinisikan karakteristik teks (mereka akan dibahas secara rinci dalam pelajaran siklus berikutnya).
warna - warna karakter dalam format RGB.
fontName - string dengan nama font.
tinggi -
tinggi font dalam milimeter.
ksu adalah faktor peregangan teks.
Hanya
ada tiga metode untuk antarmuka
ksTextItemFont .
Init () me-reset semua properti antarmuka. Tidak memiliki parameter input. Jika berhasil, mengembalikan
TRUE , dan dalam hal kesalahan -
SALAH .
GetBitVectorValue mengembalikan nilai setiap flag dari set
bitvector . Dibutuhkan bendera sebagai satu-satunya parameter, nilai yang ingin kita tentukan. Jika disetel, metode mengembalikan
TRUE ; jika diatur ulang,
SALAH .
SetBitVectorValue mengubah nilai satu flag. Berikut ini adalah prototipe dari metode ini:
BOOL SetBitVectorValue ( long bitVector,
Jika nilai parameter
status BENAR , maka bendera
bitVector dikokang, jika tidak diatur ulang.
Jika berhasil, metode
SetBitVectorValue mengembalikan
TRUE , dan jika terjadi kesalahan,
FALSE .
Metode
GetBitVectorValue dan
SetBitVectorValue memungkinkan Anda untuk bekerja dengan properti
bitvector tanpa mengaksesnya secara langsung.
Keterbatasan karakter khusus
Dua bendera dirancang untuk mengontrol karakter khusus. Mereka tercantum dalam tabel di bawah ini.

Bendera
SPECIAL_SYMBOL sudah kami pertimbangkan ketika kami mendeskripsikan antarmuka
ksTextItemParam . Diperlukan untuk menunjukkan - karakter khusus ditampilkan. Bendera yang sama digandakan dalam properti
bitVector dari antarmuka
ksTextItemFont (seperti yang diperlihatkan percobaan saya, duplikasi ini opsional).
Bendera kedua (
SPECIAL_SYMBOL_END ) hanya masuk akal untuk karakter khusus yang menyertakan string. Itu membatalkan aksi karakter khusus. Garis yang ditampilkan setelah bendera ini tidak termasuk dalam karakter khusus.
Aksi gabungan kedua bendera membatalkan aksi karakter khusus. Dalam hal ini, karakter khusus tidak akan ditampilkan dalam dokumen.
Contoh
Di bawah ini adalah kode sumber dari program yang dimodifikasi. Dengan menggunakan flag yang dijelaskan di atas, flag ini mengimplementasikan output komponen yang benar.
// TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); // DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); // TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont->Init(); TextItemFont.Unbind(); // TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); TextItemParam->set_type(0); str = SysAllocString(L" 3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); // ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); // StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); // Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); // Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); // kompas->Visible = true; kompas.Unbind();
Satu-satunya perbedaan antara contoh ini dan yang sebelumnya adalah bahwa setelah setiap karakter khusus komponen ditampilkan yang bendera
SPECIAL_SYMBOL_END diatur di antarmuka
ksTextItemFont . Satu-satunya tujuan adalah untuk membatalkan aksi karakter khusus. Dalam kasus pertama, itu tidak mengandung data apa pun (kecuali untuk bendera, tentu saja). Dan dalam kasus kedua, ini berisi string
"Halaman 3" .
Anda tidak dapat menggabungkan flag
SPECIAL_SYMBOL_END dengan output dari karakter spesial kedua. Karena dalam kasus ini bendera ini akan membatalkan aksi kedua karakter khusus. Baris
"Halaman 2" akan ditampilkan tanpa dicoret.
Gambar di bawah ini menunjukkan garis yang ditampilkan oleh program di blok judul.

Seperti yang Anda lihat, aksi karakter khusus hanya berlaku untuk komponen "Anda".
Simbol Khusus Bersarang
Contoh pertama dari pelajaran hari ini menunjukkan dengan jelas - karakter khusus dapat saling melekat. Bendera
SPECIAL_SYMBOL_END membatalkan tindakan satu (terakhir) karakter khusus. Ini memungkinkan Anda untuk membangun garis yang rumit dengan karakter khusus yang tertanam.
Di bawah ini adalah kode sumber dari contoh yang dimodifikasi, di mana substring
"Halaman 2" juga termasuk dalam ekspresi di bawah tanda root kuadrat.
// TextItemParamPtr TextItemParam; TextItemParam=(TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); // DynamicArrayPtr DynamicArray; DynamicArray=(DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); // TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(98); BSTR str = SysAllocString(L"1 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(169); str = SysAllocString(L"2 "); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemFontPtr TextItemFont; TextItemParam->Init(); TextItemFont=(TextItemFontPtr)TextItemParam->GetItemFont(); TextItemFont->set_bitVector(SPECIAL_SYMBOL_END); DynamicArray->ksAddArrayItem(-1, TextItemParam); // TextItemParam->set_type(0); str = SysAllocString(L" 3"); TextItemParam->set_s(str); SysFreeString(str); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextItemFont.Unbind(); // ksTextLineParam TextLineParamPtr TextLineParam; TextLineParam=(TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); TextLineParam->SetTextItemArr(DynamicArray); // StampPtr Stamp; Stamp=(StampPtr)Document2D->GetStamp(); // Stamp->ksOpenStamp(); Stamp->ksColumnNumber(1); Stamp->ksTextLine(TextLineParam); // Stamp->ksCloseStamp(); Stamp.Unbind(); TextItemParam.Unbind(); TextLineParam.Unbind(); DynamicArray->ksDeleteArray(); DynamicArray.Unbind(); Document2D.Unbind(); // kompas->Visible = true; kompas.Unbind();
Harap perhatikan bahwa setelah penggantian string
"Halaman 2", kami membuat output ganda komponen dengan bendera
SPECIAL_SYMBOL_END (pertama kali - sebagai bagian dari komponen kosong, yang kedua - bersama dengan string
"Halaman 3" ). Ini diperlukan untuk membatalkan aksi karakter khusus. Pertama kali kami membatalkan karakter khusus
169 (dicoret), yang kedua -
98 (akar kuadrat). Jika kami hanya
menampilkan satu komponen dengan bendera
SPECIAL_SYMBOL_END , ini hanya akan membatalkan karakter khusus
169 , tetapi tidak
98 . Dalam hal ini, baris
"Halaman 3" tidak akan dicoret, tetapi akan dimasukkan dalam ekspresi di bawah tanda root.
Gambar di bawah ini menunjukkan hasil dari program ini.
KesimpulanSebagai bagian dari pelajaran ini, kami bertemu dengan karakter khusus yang menyertakan string. Seperti yang Anda lihat, mereka sangat berbeda dari karakter khusus yang sederhana (misalnya, huruf alfabet Yunani). Meskipun kami menunjukkannya pada contoh tulisan utama, ini seharusnya tidak membingungkan Anda. Karakter-karakter ini dapat digunakan dalam metode output teks lainnya. Kami akan mempertimbangkan salah satu metode ini dalam pelajaran berikutnya.
Untuk dilanjutkan, ikuti berita blog.
Sergey Norseev, Ph.D., penulis buku "Pengembangan Aplikasi untuk COMPAS di Delphi."