Bereits in der 
4. Lektion unseres Zyklus haben wir Sonderzeichen kennengelernt. Dort wurde ihre einfachste Verwendung gezeigt. Wenn die 
ksTextItemParam- Schnittstelle sowohl ein Sonderzeichen als auch eine Zeichenfolge angibt, befindet sich die Zeichenfolge unmittelbar nach dem Sonderzeichen. Es gibt jedoch Sonderzeichen, die gegen diese Regel verstoßen. Wir werden heute darüber sprechen.

Der Inhalt der Unterrichtsreihe „Arbeiten mit der KOMPAS-3D-API“
- Die Grundlagen
- Zeichnungsentwurf
- Richtige Verbindung zu KOMPAS
- Hauptinschrift
- Grafische Grundelemente
- Speichern eines Dokuments in verschiedenen Formaten
- Einstellungen kennenlernen
- Anspruchsvollere Schreibmethoden im Schriftfeld
- Beschriftungszellen lesen
- Sonderzeichen einschließlich einer Zeichenfolge
Sonderzeichen einschließlich einer Zeichenfolge
 Die Tabelle der Sonderzeichen befindet sich in Anhang V der Haupthilfe von KOMPAS
Die Tabelle der Sonderzeichen befindet sich in Anhang V der Haupthilfe von KOMPASSonderzeichen mit den Nummern 
78-80 , 
83 , 
93-99 , 
171 und 
172 enthalten die Zeichenfolge. In diesem Fall befindet sich die Zeichenfolge 
s der Schnittstelle 
ksTextItemParam nicht nach dem Sonderzeichen, sondern darin. Beispielsweise zeigt ein Sonderzeichen mit der Nummer 
80 den Text im Rahmen an. Das Folgende ist ein Beispiel für ein Programm, das die Arbeit mit einem solchen Sonderzeichen demonstriert.
//    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(); 
In diesem Beispiel wird der Einfachheit halber der Code weggelassen, der für die Erstellung und Ausführung des Dokuments verantwortlich ist (dieses Thema wurde in früheren Lektionen des Zyklus behandelt). Die folgende Abbildung zeigt das von diesem Programm gebildete Hauptetikett.

Der Einfachheit halber füllen wir nur eine Zelle aus. Das Sonderzeichen mit der Nummer 
98 definiert das Vorzeichen der Quadratwurzel. Beachten Sie, dass der Wert der s-Eigenschaft der 
ksTextItemParam- Schnittstelle vollständig unter dem 
Stammzeichen liegt . Andere Sonderzeichen, einschließlich der Zeichenfolge, funktionieren genauso.
Sonderzeichen und ksTextLineParam
Die Aktion von Sonderzeichen ist nicht auf die Schnittstelle 
ksTextItemParam beschränkt. Betrachten Sie das folgende Beispiel.
 //     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(); 
In diesem Beispiel wird eine Zeile mit drei Komponenten in das Schriftfeld eingegeben. Die ersten beiden enthalten ein Sonderzeichen und eine Zeichenfolge. Die dritte Komponente enthält nur eine Zeichenfolge ohne Sonderzeichen. Schauen wir uns das Ergebnis des Programms an (die folgende Abbildung zeigt nur die generierte Zeile ohne die Hauptbeschriftung).

Bitte beachten Sie, dass die Zeile 
„Seite 2“ und die Zeile 
„Seite 3“ im zweiten Sonderzeichen enthalten waren, das außerhalb des Sonderzeichens angezeigt werden sollte. Darüber hinaus waren beide Zeilen im ersten Sonderzeichen enthalten (wir haben dies auch nicht geplant). Dieses Beispiel zeigt zwei wichtige Punkte:
- Sonderzeichen können andere Sonderzeichen enthalten;
- Die Aktion des Sonderzeichens erstreckt sich auf alle Komponenten, aus denen die ksTextLineParam- Schnittstelle besteht.
Es stellt sich eine vernünftige Frage: Gibt es eine Möglichkeit, die Wirkung des Sonderzeichens einzuschränken? Ja, das gibt es. Um dies zu verstehen, müssen Sie sich zunächst mit der 
ksTextItemFont- Schnittstelle vertraut 
machen .
Schriftoptionen für Textkomponenten ( ksTextItemFont )
Gemäß der Dokumentation beschreibt die Schnittstelle 
ksTextItemFont die Schriftparameter der Textkomponente. Tatsächlich gehen seine Fähigkeiten jedoch über die einfache Beschreibung der verwendeten Schriftart hinaus. Über diese Schnittstelle können Sie zusammengesetzte Linien erstellen (darüber - in den nächsten Lektionen des Zyklus).
Sie können es auf verschiedene Arten bekommen. Verwenden Sie zunächst die 
GetParamStruct- Methode der 
KompasObject- Schnittstelle: Dazu sollte die Konstante 
ko_TextItemFont als einziger Parameter an diese Methode übergeben werden. Zweitens mit der 
GetItemFont- Methode der 
ksTextItemParam- Schnittstelle. Diese Methode hat keine Eingabeparameter und gibt die 
ksTextItemFont- Schnittstelle zurück, die bereits der Textkomponente zugeordnet ist.
Berücksichtigen Sie die Eigenschaften der Schnittstelle 
ksTextItemFont .
Bitvektor - Ein Bitvektor, der die Eigenschaften des Textes definiert (diese werden in den nächsten Lektionen des Zyklus ausführlich erläutert).
Farbe - Farbe der Zeichen im RGB-Format.
fontName - eine Zeichenfolge mit dem Schriftnamen.
Höhe - Schrifthöhe in Millimetern.
ksu ist der 
Textdehnungsfaktor .
Es 
gibt nur drei Methoden für die 
ksTextItemFont- Schnittstelle.
Init () setzt alle Schnittstelleneigenschaften zurück. Es hat keine Eingabeparameter. Wenn erfolgreich, wird 
TRUE zurückgegeben und im Fehlerfall 
FALSE .
GetBitVectorValue gibt den Wert eines einzelnen Flags aus dem 
Bitvektorsatz zurück . Als einzigen Parameter wird ein Flag verwendet, dessen Wert wir bestimmen möchten. Wenn es gesetzt ist, gibt die Methode 
TRUE zurück , wenn es zurückgesetzt wird, 
FALSE .
SetBitVectorValue ändert den Wert eines einzelnen Flags. Das Folgende ist ein Prototyp dieser Methode:
 BOOL SetBitVectorValue ( long bitVector,  
Wenn der 
Statusparameterwert TRUE ist , wird das 
BitVector- Flag gespannt, andernfalls wird es zurückgesetzt.
Bei Erfolg gibt die 
SetBitVectorValue- Methode 
TRUE und im Fehlerfall 
FALSE zurück .
Mit den 
Methoden GetBitVectorValue und 
SetBitVectorValue können Sie mit der Eigenschaft 
bitvector arbeiten, ohne direkt darauf zuzugreifen.
Sonderzeichenbeschränkung
Zwei Flags steuern Sonderzeichen. Sie sind in der folgenden Tabelle aufgeführt.

Das Flag 
SPECIAL_SYMBOL haben wir bereits bei der Beschreibung der Schnittstelle 
ksTextItemParam berücksichtigt . Es wird benötigt, um anzuzeigen, dass ein Sonderzeichen angezeigt wird. Das gleiche Flag wird in der 
bitVector- Eigenschaft der 
ksTextItemFont- Schnittstelle 
dupliziert (wie meine Experimente zeigen, ist diese Duplizierung optional).
Das zweite Flag ( 
SPECIAL_SYMBOL_END ) ist nur für Sonderzeichen sinnvoll, die eine Zeichenfolge enthalten. Es bricht die Aktion des Sonderzeichens ab. Nach diesem Flag angezeigte Zeilen sind nicht im Sonderzeichen enthalten.
Die kombinierte Aktion beider Flags hebt die Aktion des Sonderzeichens auf. In diesem Fall wird das Sonderzeichen nicht im Dokument angezeigt.
Beispiel
Unten finden Sie den Quellcode des geänderten Programms. Mit den oben beschriebenen Flags wird die korrekte Ausgabe von Komponenten implementiert.
 //     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(); 
Der einzige Unterschied zwischen diesem und dem vorherigen Beispiel besteht darin, dass nach jedem Sonderzeichen eine Komponente angezeigt wird, für die das 
SPECIAL_SYMBOL_END- Flag in der Schnittstelle 
ksTextItemFont gesetzt ist . Ihr einziger Zweck ist es, die Aktion des Sonderzeichens abzubrechen. Im ersten Fall enthält es keine Daten (außer natürlich das Flag). Und im zweiten Fall enthält es die Zeichenfolge 
„Seite 3“ .
Sie können das Flag 
SPECIAL_SYMBOL_END nicht mit der Ausgabe des zweiten Sonderzeichens kombinieren. Da in diesem Fall dieses Flag die Aktion beider Sonderzeichen abbricht. Die Zeile 
"Seite 2" wird ohne Durchstreichen angezeigt.
Die folgende Abbildung zeigt die vom Programm im Schriftfeld angezeigte Zeile.

Wie Sie sehen können, gilt die Aktion von Sonderzeichen jetzt nur für "Ihre" Komponente.
Verschachtelte spezielle Symbole
Das erste Beispiel unserer heutigen Lektion zeigt deutlich, dass Sonderzeichen ineinander eingebettet werden können. Das Flag 
SPECIAL_SYMBOL_END bricht die Aktion eines (letzten) Sonderzeichens ab. Auf diese Weise können Sie komplexe Linien mit eingebetteten Sonderzeichen erstellen.
Unten finden Sie den Quellcode des geänderten Beispiels, in dem der Teilstring 
„Seite 2“ auch im Ausdruck unter dem Quadratwurzelzeichen enthalten ist.
 //     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(); 
Bitte beachten Sie, dass wir nach dem Ersetzen der Zeichenfolge 
"Seite 2" die Komponente mit dem Flag 
SPECIAL_SYMBOL_END doppelt ausgeben (das erste Mal - als Teil einer leeren Komponente, das zweite Mal - zusammen mit der Zeichenfolge 
"Seite 3" ). Dies ist erforderlich, um die Aktion von Sonderzeichen abzubrechen. Das erste Mal löschen wir das Sonderzeichen 
169 (durchgestrichen), das zweite Mal - 
98 (Quadratwurzel). Wenn wir nur eine Komponente mit dem Flag 
SPECIAL_SYMBOL_END anzeigen würden , würde dies nur das Sonderzeichen 
169 , aber nicht 
98 aufheben. In diesem Fall würde die Zeile 
„Seite 3“ nicht durchgestrichen, sondern in den Ausdruck unter dem Wurzelzeichen aufgenommen.
Die folgende Abbildung zeigt das Ergebnis dieses Programms.
 Fazit
FazitIm Rahmen dieser Lektion haben wir Sonderzeichen kennengelernt, die eine Zeichenfolge enthalten. Wie Sie gesehen haben, unterscheiden sie sich erheblich von einfachen Sonderzeichen (z. B. Buchstaben des griechischen Alphabets). Obwohl wir sie am Beispiel der Hauptinschrift gezeigt haben, sollte dies Sie nicht verwirren. Diese Zeichen können in anderen Textausgabemethoden verwendet werden. Wir werden eine dieser Methoden in der nächsten Lektion betrachten.
Um fortzufahren, folgen Sie den Nachrichten des Blogs.
 Sergey Norseev, Ph.D., Autor des Buches "Anwendungsentwicklung für COMPAS in Delphi".