Dalam
pelajaran 12, kami memperkenalkan garis majemuk dan melihat cara yang tidak berdokumen untuk membuatnya. Dalam
pelajaran 13 , paragraf disajikan. Hari ini kita akan melihat bagaimana menggunakannya untuk membuat string majemuk. Pertama, mari kita ambil garis yang termasuk penyimpangan dan pecahan, dan berkenalan dengan komponen garis majemuk seperti superskrip, substring, dan karakter khusus.

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
- Label teks sederhana
- Senar majemuk
- Paragraf
- Teks multiline
- Baris Senyawa Berbasis Paragraf
Penyimpangan atas dan bawah
Berikut ini adalah fragmen dari program yang menunjukkan output dari sebuah garis dengan penyimpangan atas dan bawah menggunakan paragraf. Untuk mencapai ini, bendera
END_DEVIAT ,
LOWER_DEVIAT, dan
UPPER_DEVIAT , yang disebutkan dalam
pelajaran 12, digunakan .
Cuplikan kode program// DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(UPPER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(LOWER_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_DEVIAT); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Dibandingkan dengan contoh penyimpangan dari
pelajaran 12, program saat ini memiliki dua keuntungan penting:
- Ia menggunakan kemampuan yang didokumentasikan dari sistem COMPASS.
- Tidak perlu menghitung ulang posisi baris. KOMPAS sendiri menentukan semua offset yang diperlukan.
Perhatikan penggunaan bendera
END_DEVIAT . Ini menyelesaikan generasi penyimpangan dan membatalkan
bendera LOWER_DEVIAT dan
UPPER_DEVIAT . Jika kita belum menggunakannya, baris "Teks setelah penyimpangan" akan ditampilkan sebagai penyimpangan yang lebih rendah.
Bendera
LOWER_DEVIAT dan
UPPER_DEVIAT saling membatalkan. Ketika digunakan secara bersamaan, string adalah output karena akan ditampilkan tanpa menentukan flag-flag ini.
Karena flag
NEW_LINE tidak digunakan dalam contoh kami, semua baris dapat ditampilkan dengan satu panggilan ke metode
ksTextLine . Untuk melakukan ini, mereka dibentuk dalam bentuk antarmuka
ksTextLineParam .
Hasil program ditunjukkan pada gambar di bawah ini.

Pecahan
Berikut ini adalah contoh dari program yang menunjukkan output dari string yang menyertakan sebagian kecil.
Contoh program // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Konstruksi sebagian kecil berbeda dari konstruksi penyimpangan. Satu-satunya perbedaan adalah bendera yang digunakan. Bendera
END_FRACTION membatalkan bendera
NUMERATOR dan
DENOMINATOR dan bertindak sama dengan bendera
END_DEVIAT untuk penyimpangan.
Gambar di bawah ini menunjukkan hasil dari program ini.

Baris ini terlihat lebih rapi dibandingkan dengan teks yang sama dalam
pelajaran 12 .
Kontrol ukuran fraksi
Fraksi yang ditampilkan dapat memiliki ukuran yang berbeda, yang dikendalikan menggunakan antarmuka
ksTextItemParam . Jika properti
tipenya FRACTION_TYPE , maka antarmuka ini, antara lain, mengatur ukuran fraksi. Ukurannya sendiri ditentukan dalam properti
iSNumb . Nilai yang valid ditunjukkan pada tabel di bawah ini.

Jika properti
iSNumb menentukan nilai yang tidak valid, maka KOMPAS menggunakan ketinggian default.
Berikut ini adalah contoh penggunaan bendera
FRACTION_TYPE .
Contoh Penggunaan Flag // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(NUMERATOR); itemParam->set_type(FRACTION_TYPE); itemParam->set_iSNumb(3); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(DENOMINATOR); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(END_FRACTION); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Contoh ini berbeda dari yang sebelumnya hanya dengan menetapkan tipe
FRACTION_TYPE di properti
tipe dari antarmuka
ksTextItemParam saat mengeluarkan pembilang. Namun, ini cukup untuk mengubah ukuran fraksi. Gambar di bawah ini menunjukkan hasil dari program ini (bandingkan dengan hasil dari
contoh sebelumnya ).

Catatan: ukuran fraksi diatur ketika pembilang ditampilkan. Seperti yang diperlihatkan percobaan saya, ukuran fraksi yang ditentukan saat penyebut ditampilkan diabaikan.
Superscript dan Substring
Konstruksi substring dan substring dikendalikan oleh bendera yang tercantum dalam tabel di bawah ini.

Berikut ini adalah contoh program yang menunjukkan output dari string dengan substring dan substring.
Contoh program // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Gambar di bawah ini menunjukkan hasil dari program ini.
Anda tidak dapat membuat substring dan substring menggunakan metode
ksDocument2D :: ksText .
Kontrol ukuran baris utama
Baris utama dapat memiliki ukuran yang berbeda, yang dapat diubah menggunakan antarmuka
ksTextItemParam . Untuk ini, konstanta
SUM_TYPE ditentukan dalam
properti tipenya , dan ukuran yang diperlukan dari baris utama di properti
iSNumb . Nilai yang valid ditunjukkan pada tabel di bawah ini:

Jika properti
iSNumb berisi nilai yang tidak valid, maka KOMPAS menggunakan nilai default.
Berikut ini adalah cuplikan dari program yang menunjukkan penggunaan konstanta
SUM_TYPE .
Cuplikan program // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont; itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_BASE); itemParam->set_type(SUM_TYPE); itemParam->set_iSNumb(2); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_UPPER_INDEX); itemParam->set_type(0); itemParam->set_iSNumb(0); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_LOWER_INDEX); str = SysAllocString(OLESTR("")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); itemFont->set_bitVector(S_END); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); // , itemFont.Unbind(); itemParam.Unbind(); // ksTextLineParam TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); lineParam->SetTextItemArr(items); // ksParagraphParam ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(30.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); Document2D->ksTextLine(lineParam); Document2D->ksEndObj(); // items->ksDeleteArray(); items.Unbind(); lineParam.Unbind(); paragraphParam.Unbind();
Konstanta SUM_TYPE dimasukkan dalam properti
jenis antarmuka
ksTextItemParam ketika garis utama
ditampilkan . Sebelum output dari
add- in, antarmuka
ksTextItemParam dikembalikan ke keadaan awal. Ini adalah satu-satunya perbedaan antara contoh ini dan yang sebelumnya.
Gambar di bawah ini menunjukkan hasil program (bandingkan dengan hasil dari contoh sebelumnya).
Konstanta SUM_TYPE memungkinkan Anda untuk mengubah ukuran string utama, tetapi bukan substring dan substring. Mengubah ukuran mereka di KOMPAS tidak disediakan.
Karakter khusus termasuk substring
Paragraf dapat menangani karakter khusus yang menyertakan string (mereka dibahas dalam
pelajaran 10 siklus). Berikut ini adalah bagian dari program yang menunjukkan penggunaannya dalam paragraf.
Cuplikan program // DynamicArrayPtr items; items = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); items->ksClearArray(); DynamicArrayPtr lines; lines = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_LINE_ARR)); lines->ksClearArray(); // TextLineParamPtr lineParam; lineParam = static_cast<TextLineParamPtr>(kompas->GetParamStruct(ko_TextLineParam)); lineParam->Init(); TextItemParamPtr itemParam; itemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); itemParam->Init(); TextItemFontPtr itemFont = static_cast<TextItemFontPtr>(itemParam->GetItemFont()); // BSTR str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; // itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(169); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; // itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); // itemFont->set_bitVector(NEW_LINE | SPECIAL_SYMBOL); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(SPECIAL_SYMBOL); itemParam->set_iSNumb(96); items->ksAddArrayItem(-1, itemParam); SysFreeString(str); str = NULL; // itemFont->set_bitVector(SPECIAL_SYMBOL_END); itemParam->set_s(NULL); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); // itemFont->set_bitVector(NEW_LINE); str = SysAllocString(OLESTR(" ")); itemParam->set_s(str); itemParam->set_type(0); itemParam->set_iSNumb(0); items->ksAddArrayItem(-1, itemParam); lineParam->SetTextItemArr(items); lines->ksAddArrayItem(-1, lineParam); lineParam->Init(); SysFreeString(str); str = NULL; itemParam.Unbind(); lineParam.Unbind(); itemFont.Unbind(); items.Unbind(); // ParagraphParamPtr paragraphParam; paragraphParam= static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); paragraphParam->set_width(60.0); paragraphParam->set_hFormat(2); // TextParamPtr textParam = static_cast<TextParamPtr>(kompas->GetParamStruct(ko_TextParam)); textParam->SetParagraphParam(paragraphParam); textParam->SetTextLineArr(lines); // Document2D->ksTextEx(textParam, 1); lines->ksDeleteArray(); lines.Unbind(); paragraphParam.Unbind(); textParam.Unbind();
Contohnya terlihat sangat rumit, tetapi jika Anda perhatikan dengan seksama, Anda dapat melihat bahwa itu terdiri dari potongan berulang. Di dalamnya, dengan bantuan karakter khusus, dicoret dan digarisbawahi teks ditampilkan. Setelah setiap blok demikian, baris kosong dengan bendera
SPECIAL_SYMBOL_END ditampilkan . Tugasnya adalah untuk membatalkan aksi karakter khusus. Jika tidak ditampilkan, maka paragraf mungkin tidak dibangun dengan benar. Tindakan karakter khusus meluas ke seluruh blok
ksTextLineParam , ke seluruh panjangnya terlepas dari isi sebenarnya (tesis ini diilustrasikan pada gambar di bawah).

Baris pembatalan harus menjadi bagian dari blok
ksTextLineParam . Kalau tidak, paragraf mungkin tidak dibangun dengan benar. Blok
ksTextLineParam dapat berisi beberapa karakter kontrol. Masing-masing dari mereka harus memiliki garis pembatalan sendiri.
Bendera
SPECIAL_SYMBOL_END hanya digunakan untuk karakter khusus yang memiliki substring. Untuk karakter khusus biasa, itu tidak diperlukan.
Gambar di bawah ini menunjukkan hasil dari contoh kita.
KesimpulanDalam pelajaran ini, kami belajar bagaimana menggunakan paragraf untuk membuat garis majemuk, termasuk penyimpangan dan fraksi, dan memeriksa cara-cara yang terdokumentasi untuk membuat garis majemuk berdasarkan pada paragraf. Ini bukan satu-satunya dan jauh dari cara termudah untuk membuatnya. Cara lain yang lebih sederhana, akan kita bahas dalam pelajaran selanjutnya.
Untuk dilanjutkan, ikuti berita blog.
Sergey Norseev, Ph.D., penulis buku "Pengembangan Aplikasi untuk COMPAS di Delphi."