قبل الانتقال إلى طرق موثقة لإنشاء سلاسل مركبة ، نحتاج إلى التعرف على كائن مثل فقرة. إنه كتلة منسقة تلقائيًا تتكون من عدة أسطر. في هذا الدرس ، سننظر في بناء فقرات بسيطة.

محتوى سلسلة الدروس "العمل مع KOMPAS-3D API"
- الأساسيات
- رسم التصميم
- الاتصال الصحيح ل KOMPAS
- النقش الرئيسي
- بدائية الرسم
- حفظ وثيقة في أشكال مختلفة
- التعرف على الإعدادات
- طرق الكتابة الأكثر تطوراً في كتلة العنوان
- قراءة خلايا التسمية التوضيحية
- شخصيات خاصة بما في ذلك سلسلة
- تسميات نصية بسيطة
- سلاسل مركب
- الفقرات
- نص متعدد الخطوط
معلمات الفقرة ( ksParagraphParam )
يتم وصف فقرة بواسطة واجهة
ksParagraphParam . للحصول عليها ، تحتاج إلى استخدام الأسلوب
GetParamStruct للواجهة
KompasObject ، لهذا تحتاج إلى تمرير ثابت
ko_ParagraphParam (
0x0000001B ) إليه. النظر في خصائص واجهة
ksParagraphParam .
ang - زاوية النص بالدرجات. يتم تأخيره من الخط الأفقي عكس اتجاه عقارب الساعة. تشبه المعلمة
ang للأسلوب
ksText .
ارتفاع - ارتفاع الفقرة في ملليمتر.
hFormat - تنسيق النص أفقيا. يتم استخدام هذه الخاصية عندما لا يتم احتواء النص في الفقرة في العرض. يتم سرد القيم الصالحة في الجدول أدناه.
النمط - نمط النص (الموضح في
الدرس 11 ).
vFormat - تنسيق النص عموديا. يتم استخدام هذه الخاصية عند عدم احتواء النص في الفقرة في الارتفاع. يتم سرد القيم الصالحة في الجدول أدناه.

هناك
شيئان يجب
مراعاتهما عند العمل مع خاصية
vFormat :
- وفقًا لوثائق KOMPAS ، فإن القيم الصحيحة لخاصية vFormat هي 0 و -1 ، لكن هذا ليس كذلك. القيم الصالحة هي 0 و 1 .
- لا يغير COMPASS ارتفاع الأحرف. يغير المسافة فقط بين السطور. إذا كان ارتفاع الخطوط أقل من ارتفاع الفقرة ، فيمكنها التداخل. مثال على هذا التراكب في الشكل أدناه.
العرض - عرض الفقرة بالملليمتر.
يسمح لنا
ارتفاع الخصائص و
hFormat و
vFormat والعرض بحل مشكلة وضع نص في مستطيل معين. هذه الطريقة أكثر موثوقية وكفاءة من طريقة
ksGetTextLength التي تمت مناقشتها في
الدرس 11 .
x و
y هما إحداثيات نقطة الربط. يتم ضبط موضع الفقرة بالنسبة إلى نقطة الربط على طول المحور الأفقي بواسطة طريقة
ksSetTextAlign للواجهة
ksDocument2D (على الرغم من أن هذا الاحتمال غير موثق). تطابق نقطة الربط الرأسية دائمًا أسفل السطر الأول من الفقرة. لا يمكن تغيير هذا السلوك.
واجهة
ksParagraphParam تحتوي على طريقة واحدة فقط:
Init () . يقوم بتهيئة قيم خاصية الواجهة. لا يوجد لديه معلمات الإدخال. إذا نجحت ، يعود
صحيح .
بناء الفقرة
يتكون تكوين فقرة من ثلاث خطوات متسلسلة.
- إعلان بداية الفقرة. للقيام بذلك ، يتم استدعاء أسلوب ksParagraph للواجهة ksDocument2D . كمعلمة فقط ، تقبل هذه الطريقة واجهة ksParagraphParam ، والتي تحدد معلمات الفقرة. إذا نجحت ، تُرجع طريقة ksParagraph واحداً ، وفي حالة حدوث خطأ ، تُرجع صفر .
- ملء الفقرة. لكل سطر معروض في فقرة ، يتم استدعاء طريقة ksTextLine للواجهة ksDocument2D . كمعلمة فقط ، فإنه يقبل واجهة ksTextItemParam أو ksTextLineParam (التي تمت مناقشتها في الدروس السابقة في الحلقة) التي تصف السلسلة. يرجى ملاحظة أن خطوط الإخراج يجب ألا تحتوي على الأحرف @ ، $ ، & ، ~ ، ^ و # ، لأنها حروف تحكم. سيتم النظر في العمل معهم في الدروس القادمة من الدورة.
- نهاية الفقرة. للقيام بذلك ، يتم استدعاء الأسلوب ksEndObj () للواجهة ksDocument2D . لا يحتوي على معلمات إدخال ، وإذا نجح ، يُرجع مؤشر عدد صحيح إلى الكائن الذي تم إنشاؤه (الفقرة). في حالة وجود خطأ ، تقوم بإرجاع صفر .
مثال أبسط فقرة
أدناه هو شفرة المصدر للبرنامج ، مما يدل على بناء فقرة بسيطة.// ksTextItemParam TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // ParagraphParamPtr paragraphParam; paragraphParam = static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); // BSTR str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); // Document2D->ksEndObj(); paragraphParam.Unbind(); textItemParam.Unbind();
كما هو الحال دائمًا ، هنا ، للبساطة ، تم حذف الكود المسؤول عن إنشاء المستند وتنفيذه (تمت مناقشة هذا الموضوع في الدروس السابقة).
في هذا المثال ، يحدد KOMPAS نفسه حجم الفقرة بناءً على محتوياتها. يوضح الشكل أدناه الفقرة الناتجة.

يرجى ملاحظة: يتم عرض النص كسطر واحد. لم نحدد عرض الفقرة ، وبالتالي فإن KOMPAS يزيدها تلقائيًا حسب الضرورة. إذا تم تعيين العرض ، فسيتم تحديد سلوك COMPASS بقيمة الخاصية
hFormat لواجهة
ksParagraphParam .
لتكوين نص متعدد الأسطر والمركب ، تحتاج إلى استخدام ميزات الرسم التي تمت مناقشتها جزئيًا في الدرس السابق.
مثال نص متعدد الخطوط
للالتفاف بوضوح على سطر جديد ، استخدم علامة
NEW_LINE (
0x1000 ).
فيما يلي برنامج مثال يوضح إنشاء فقرة متعددة الأسطر باستخدام هذه العلامة. // ksTextItemParam TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // ParagraphParamPtr paragraphParam; paragraphParam = static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); // BSTR str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); TextItemFontPtr textItemFont; textItemFont = static_cast<TextItemFontPtr>(textItemParam->GetItemFont()); textItemFont->SetBitVectorValue(NEW_LINE, true); str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); textItemFont.Unbind(); str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); // Document2D->ksEndObj(); paragraphParam.Unbind(); textItemParam.Unbind();
في هذا المثال ، يتم إنشاء فقرة ثلاثية الأسطر. يتم عرض السطر الأول كالمعتاد. للمرة الثانية ، تم
تعيين علامة
NEW_LINE . يتحدث عن بداية سطر جديد. يتم عرض العلامة الثالثة كالمعتاد ، لكن علامة
NEW_LINE لا تزال نشطة لها ، حيث أننا نعمل مع نفس مثيل واجهة
ksTextItemParam . يوضح الشكل أدناه الفقرة الناتجة عن هذا البرنامج.

الآن يتم عرض الخطوط بشكل صحيح.
تحديات العمل مع الفقرات
محاذاة النص
يتم تعيين محاذاة النص بواسطة الأسلوب
ksSetTextLineAlign للواجهة
ksDocument2D . لديها محاذاة عدد صحيح واحد فقط - ضبط المحاذاة. يتم سرد قيمها الصالحة في الجدول أدناه.

إذا نجحت ، تُرجع طريقة
ksSetTextLineAlign إشارة المحاذاة السابقة ، وفي حالة حدوث خطأ ، تُرجع
-1 .
لاحظ أنه لا يمكن استخدام طريقة
ksSetTextLineAlign إلا داخل الكتلة (في حالتنا ، يتم استخدامها داخل الفقرة). هذا يعني أنه لا يمكن استخدامه لتعيين محاذاة لإخراج النص بطريقة
ksText . يرجع هذا القيد إلى حقيقة أن KOMPAS في هذه الحالة لا يعرف فيما يتعلق بالحدود التي يحتاج النص إلى محاذاتها.
تتعلق نقطة مهمة أخرى بنطاق أسلوب
ksSetTextLineAlign - والذي ينتج عنه خطوط الإخراج. فكر في مثال (يستخدم بناء الجملة المبسطة للغاية هنا مقارنةً بأصوله الأصلية):
ksSetTextLineAlign(1); ksTextLine(“ ”); ksSetTextLineAlign(2); ksTextLine(“ ”);
كيف سيتم محاذاة الخطوط؟ على عكس توقعاتنا ، سيتم محاذاة كلا الخطين إلى اليمين. لماذا؟ الحقيقة هي أن الأسلوب
ksSetTextLineAlign أولاً وقبل كل شيء يغير محاذاة خط الإخراج الأخير. إليك ما يحدث في مثالنا: السطر الأول يحدد محاذاة الوسط. نظرًا لعدم وجود خط إخراج سابق ، فإن هذه المكالمة تغير المحاذاة الافتراضية (يسار).
ثم نطبع خط "المركز". في البداية ، يستخدم المحاذاة المركزية المحددة مسبقًا.
في السطر الثالث ، نغير المحاذاة مرة أخرى. أولاً وقبل كل شيء ، تقوم الطريقة بتغيير محاذاة السطر السابق ("الوسط"). لذلك ، يتم محاذاته إلى اليمين وليس إلى الوسط ، كما خططنا. نفس المحاذاة تصبح محاذاة بشكل افتراضي.
نعرض الخط "يمين". نظرًا لأن أسلوب
ksSetTextLineAlign لم يعد يسمى ، فإنه يستخدم المحاذاة المحددة مسبقًا (إلى اليمين).
وبالتالي ، يتم محاذاة كلا الخطين إلى اليمين. الآن دعنا نغير المثال قليلاً:
ksSetTextLineAlign(1); ksTextLine(“ ”); ksTextLine(“”); ksSetTextLineAlign(2); ksTextLine(“ ”);
كل ما قمنا بتغييره هو إضافة ناتج سلسلة فارغة دون تغيير المحاذاة. الآن يتم عرض الخطوط بشكل صحيح. يحدث هذا بسبب إخراج سلسلة فارغة "تمتص" المحاذاة الصحيحة المحددة. الاستدعاء الثاني لأسلوب
ksSetTextLineAlign يؤثر على سطر فارغ ولا يؤثر على خط الوسط بأي طريقة.
يوضح المثال التالي المحاذاة الصحيحة دون عرض سلسلة فارغة.
ksTextLine(“ ”); ksSetTextLineAlign(1); ksTextLine(“ ”); ksSetTextLineAlign(2);
يتم تبادل المكالمات
ksTextLine و
ksSetTextLineAlign . نظرًا لأن طريقة
ksSetTextLineAlign تؤثر بشكل أساسي على آخر سطر معروض ، يتم تعيين المحاذاة بشكل صحيح ، ويتم عرض الخطوط كما أردنا.
مثال
فيما يلي شفرة المصدر لبرنامج يوضح محاذاة النص في فقرة. // ksTextItemParam TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // 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); // Document2D->ksParagraph(paragraphParam); // BSTR str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); TextItemFontPtr textItemFont; textItemFont = static_cast<TextItemFontPtr>(textItemParam->GetItemFont()); textItemFont->SetBitVectorValue(NEW_LINE, true); str = SysAllocString(L""); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); textItemFont.Unbind(); str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); Document2D->ksSetTextLineAlign(1); str = SysAllocString(L""); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); Document2D->ksSetTextLineAlign(3); // Document2D->ksEndObj(); paragraphParam.Unbind(); textItemParam.Unbind();
في هذا المثال ، بالإضافة إلى محاذاة النص ، يتم توضيح استخدام خصائص
العرض و
hFormat لواجهة
ksParagraphParam . يتم استخدامها للحد من عرضها. إذا لم نغيرها ، فستقوم KOMPAS بزيادة عرض الفقرة ، ولن نرى المحاذاة إلى اليسار والعرض.
يتم عرض خطوط فارغة لتحسين قابلية قراءة الفقرة. أنها لا تؤثر على المحاذاة الصحيحة.
يوضح الشكل أدناه الفقرة الناتجة عن هذا البرنامج.

قم بتشغيل أو إيقاف تشغيل النمط
في
الدرس الحادي عشر من الدورة ، درسنا العلامات التي تتحكم في النمط (
ITALIC_ON و
ITALIC_OFF و
BOLD_ON و
UNDERLINE_ON و
UNDERLINE_OFF ). ثم قمنا بفحصها فيما يتعلق بطريقة
ksText . الفرق المهم بين استخدامها في فقرة هو أن الإجراء لا يقتصر على استدعاء الأسلوب
ksTextLine ، بل يمتد إلى الفقرة بأكملها. دعونا نلقي نظرة على بعض الأمثلة.
TextItemFont->SetBitVectorValue(BOLD_ON, true); TextItemParam->s = SysAllocString(L” ”); Document2D->ksTextLine(TextItemParam); TextItemFont->Init(); TextItemParam->s = SysAllocString(L” ”); Document2D->ksTextLine(TextItemParam);
سيتم عرض السطر الأول بالخط العريض. لا توجد أسئلة مع هذا. ولكن كيف سيتم عرض السطر الثاني؟
تمت إعادة تعيين العلامة
BOLD_ON لها. لذلك ، يمكننا أن نفترض أنه سيتم عرضه بالخط العادي. لكن هذا ليس كذلك. بعد تلبية علامة
BOLD_ON ، يفهم KOMPAS الأمر كما يلي: يتم عرض جميع الأسطر التالية من هذه الفقرة بالخط العريض. لذلك ، يتم عرض جميع الأسطر اللاحقة بالخط العريض حتى تكتمل الفقرة أو تواجه KOMPAS علامة
BOLD_OFF المقترنة بها . النظر في مثال:
TextItemFont.SetBitVectorValue(BOLD_ON, true); TextItemParam.s = SysAllocString(L” ”); Document2D.ksTextLine(TextItemParam); TextItemFont.Init(); TextItemFont.SetBitVectorValue(BOLD_OFF, true); TextItemParam.s = SysAllocString(L“ ”); Document2D.ksTextLine(TextItemParam); TextItemFont.Init(); TextItemParam.s = SysAllocString(L” ”); Document2D.ksTextLine(TextItemParam);
يتم عرض السطر الأول بالخط العريض. بالنسبة للسطر الثاني ، نقوم
بمسح علامة BOLD_ON وصياغة علامة BOLD_OFF
المقترنة بها ، والتي تلغي النمط الغامق. نتيجة لهذا ، يتم عرض الخطين الثاني والثالث بدون غامق.
ينطبق هذا السلوك على الإشارات
ITALIC_ON و
ITALIC_OFF و
UNDERLINE_ON و
UNDERLINE_OFF ، ولكنه لا ينطبق على علامة
NEW_LINE ، لأنه لا يحتوي على زوج من العلامات المتجاوزة.
مثال
فيما يلي الكود المصدري للبرنامج ، والذي يعرض مخرجات النص مع أنماط مختلفة باستخدام الفقرات. // ksTextItemParam TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // ParagraphParamPtr paragraphParam; paragraphParam = static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); // BSTR str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); TextItemFontPtr textItemFont; textItemFont = static_cast<TextItemFontPtr>(textItemParam->GetItemFont()); textItemFont->set_bitVector(NEW_LINE | ITALIC_OFF); // str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); textItemFont->set_bitVector(NEW_LINE | ITALIC_ON | BOLD_ON); // str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); textItemFont->set_bitVector(NEW_LINE | BOLD_OFF | UNDERLINE_ON); // str = SysAllocString(L" "); textItemParam->set_s(str); Document2D->ksTextLine(textItemParam); SysFreeString(str); // Document2D->ksEndObj(); paragraphParam.Unbind(); textItemFont.Unbind(); textItemParam.Unbind();
الجزء الأكثر أهمية من هذا البرنامج هو الإعداد الصحيح للأعلام لخطوط الإخراج. دعنا نحللها بمزيد من التفصيل (يتم تمييز الأسطر المقابلة من البرنامج بزوج من الأحرف "
// ").
يتم عرض السطر الأول دون أي تغييرات. لذلك ، لم يتم تعيين أعلام لذلك.
يجب أن يتم عرض السطر الثاني بدون ميل وبسطر جديد. لذلك ، يتم تعيين العلامات لذلك:
NEW_LINE (البدء في سطر جديد) و
ITALIC_OFF (تعطيل
المائل ).
يجب أن يظهر السطر الثالث بخط مائل وجريء. للقيام بذلك ، نقوم
بنزع الأعلام:
NEW_LINE و
ITALIC_ON (
تمكين المائل) و
BOLD_ON (
تمكين الوجوه
العريضة ). يتم إعادة تعيين جميع الأعلام الأخرى.
يجب طباعة السطر الرابع بخط مائل ، مسطرًا وليس غامقًا. للقيام بذلك ، نقوم
بنزع الأعلام:
NEW_LINE ،
BOLD_OFF (تعطيل الغامق ، اليسار من السطر السابق) و
UNDERLINE_ON (تمكين تسطير).
إذا كان هناك المزيد من الأسطر في الفقرة ، فسيتم عرضها بخط مائل تحته خط. لتعطيل النمط المسطر ، يجب عليك مسح علامة
UNDERLINE_ON وصياغة علامة
UNDERLINE_OFF .
يوضح الشكل أدناه نتيجة هذا البرنامج.

فصل المعلومات عن العرض
إذا اتبعت بنية برامجك ، فمن المحتمل أنك لاحظت عيبًا خطيرًا في المثال السابق: يتم خلط الكود المسؤول عن إنشاء الإخراج مع الكود المسؤول عن تنفيذ مخرجاته. من خلال أسلوب برمجة جيد ، من المعتاد فصل المعلومات عن العرض التقديمي.
إذا كانت معلومات الإخراج تتكون من عدة أسطر من
ksTextItemParam ، فيمكن دمجها في واجهة واحدة
ksTextLineParam . يمكن للأسلوب
ksTextLine معالجة كل من هذه الواجهات. ولكن هذا النهج له قيود غير سارة: إذا
قبلت طريقة
ksTextLine واجهة
ksTextLineParam ،
فسيتم تجاهل إشارات
NEW_LINE (و
SPECIAL_SYMBOL_END ). أي ، سيتم عرض جميع المعلومات في سطر واحد ، حتى إذا تم
تعيين علامة
NEW_LINE لبعض
مثيلات ksTextItemParam . لحل هذا القيد ، يجب عليك استدعاء
ksTextLine يدويًا لكل سطر.
فيما يلي الكود المصدري لمثال يوضح هذه التقنية. // DynamicArrayPtr dynamicArray; dynamicArray = static_cast<DynamicArrayPtr>(kompas->GetDynamicArray(TEXT_ITEM_ARR)); dynamicArray->ksClearArray(); // ksTextItemParam TextItemParamPtr textItemParam; textItemParam = static_cast<TextItemParamPtr>(kompas->GetParamStruct(ko_TextItemParam)); // BSTR str = SysAllocString(L" "); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); TextItemFontPtr textItemFont; textItemFont = static_cast<TextItemFontPtr>(textItemParam->GetItemFont()); textItemFont->set_bitVector(NEW_LINE | ITALIC_OFF); str = SysAllocString(L" "); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); textItemFont->set_bitVector(NEW_LINE | ITALIC_ON | BOLD_ON); str = SysAllocString(L" "); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); textItemFont->set_bitVector(NEW_LINE | BOLD_OFF | UNDERLINE_ON); str = SysAllocString(L" "); textItemParam->set_s(str); dynamicArray->ksAddArrayItem(-1, textItemParam); SysFreeString(str); // ParagraphParamPtr paragraphParam; paragraphParam = static_cast<ParagraphParamPtr>(kompas->GetParamStruct(ko_ParagraphParam)); paragraphParam->Init(); paragraphParam->set_x(100.0); paragraphParam->set_y(100.0); // Document2D->ksParagraph(paragraphParam); // for(unsigned int i = 0; i < dynamicArray->ksGetArrayCount(); ++i) { dynamicArray->ksGetArrayItem(i, textItemParam); Document2D->ksTextLine(textItemParam); } // Document2D->ksEndObj(); // textItemFont.Unbind(); textItemParam.Unbind(); paragraphParam.Unbind(); dynamicArray->ksDeleteArray(); dynamicArray.Unbind();
في هذا المثال ، تتم كتابة خطوط الإخراج أولاً إلى
DynamicArray ، وعندها فقط يتم إخراجها إلى الفقرة. هذا يسمح لك بفصل المعلومات من العرض التقديمي. إذا لم يتم استخدام علامة
NEW_LINE في مثالنا ، فيمكننا أن ننتقل عبر مكالمة واحدة إلى طريقة
ksTextLine .
تشبه نتيجة هذا البرنامج نتيجة المثال السابق.
الخاتمةفي هذا الدرس ، نظرنا في كيفية إنشاء فقرة وكيفية استخدامها لعرض نص متعدد الأسطر. لقد تعلمنا أيضًا فصل المعلومات عن عرضها. لسوء الحظ ، يتطلب الإخراج الصحيح للنص متعدد الأسطر اجتياز يدوي لمجموعة من السلاسل. هذه ليست مريحة للغاية. سأعرض في الدرس التالي كيفية حل هذه المشكلة.
للاستمرار ، تابع أخبار المدونة.
سيرجي نورسيف ، مؤلف كتاب "تطوير التطبيقات لـ COMPAS في دلفي".