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