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 KOMPAS
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.
 Kesimpulan
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."