Kitabı oxu: «Die SIGAMOS-DLLs – Band 1: Textverarbeitung»
Eine Standard-Schnittstelle zu unterschiedlichen Office-Systemen
Vorwort
Die SIGAMOS-DLLs sind eine Standard-Schnittstelle zu unterschiedlichen Office-Systemen. Haben Sie einmal den Zugriff auf ein Office-System mithilfe der von SIGAMOS bereitgestellten Funktionen programmiert, dann können die Nutzer Ihrer Anwendung(en) aus über 10 Office-Paketen wählen. Geben Sie Ihren Programmnutzern dieses kleine Stück Software-Freiheit mehr und zwingen Sie diese nicht, nur das bisher einzige von Ihnen unterstützte Office-System zu nutzen!
Die SIGAMOS-DLLs sind Freeware für den privaten und kommerziellen Gebrauch. Weitere Informationen dazu erhalten Sie über die URL „www.inntalsoftware.de/sigamos.html“. Sie können sich von dieser URL auch die Dateien herunterladen.
Eine Beschreibung der Installation, eine Kurzübersicht der verfügbaren Funktionen und Anwendungen sowie aller unterstützter Office-Systeme finden Sie im QuickStart-Dokument, das zusammen mit den DLLs ausgeliefert wird bzw. von der Webseite extra heruntergeladen werden kann.
Zu den SIGAMOS-DLLs gibt es vier E-Books (Stand November 2019, Software-Release 2.0), die in deutscher, englischer und spanischer Sprache in den Formaten ePub und Kindle verfügbar sind. Diese E-Books sind Bestandteil der von mir ersonnenen Reihe „edeus“ – eine Erklärung dieses Begriffes finden Sie hier. In diesen E-Books werden alle verfügbaren Funktionen mit jedem Parameter beschrieben. Es gibt folgende Ausgaben (die vorliegende Ausgabe ist fett gedruckt):
1. Gesamtausgabe (Textverarbeitung, Tabellenkalkulation, Präsentation).
2. Band 1: Textverarbeitung.
3. Band 2: Tabellenkalkulation.
4. Band 3: Präsentation.
Welche Vorteile bietet Ihnen der Kauf eines dieser E-Books?
· Eine detaillierte Beschreibung jeder einzelnen Funktion.
· Hinweise auf Besonderheiten, Einschränkungen und so weiter.
· Zusätzliche Codebeispiele in Delphi und C++.
Mit dem Kauf dieses E-Books unterstützen Sie die Weiterentwicklung dieser Software bzw. die Neuentwicklung anderer Freeware-Programme von mir und erhalten im Gegensatz zu einem „Spenden“-Button noch einen echten Gegenwert.
Sollten Sie schon irgend eine Auflage dieses E-Books erworben haben, können Sie alle weiteren neuen Auflagen kostenlos erhalten. Für weitere Informationen klicken Sie bitte hier.
Informationen zu Fehlern bzw. Vorschläge für neue oder geänderte Funktionen sind immer willkommen! Bitte senden Sie mir eine E-Mail an support@inntalsoftware.de mit dem Betreff „SIGAMOS“.
Mit der 2. Auflage (zu Software-Release 2.0) werden nicht nur die neuen Funktionen und die neue Compact-DLL beschrieben. Hier finden Sie jetzt alle Codebeispiele in Delphi und C++. Dazu gibt es eine genaue Anleitung zur Nutzung der in Delphi, Free Pascal und C++ vorliegenden DLL-Wrapper, welche die Nutzung der DLL-Funktionen für den Entwickler deutlich vereinfachen.
Hinweis: Die Codebeispiele in Delphi nutzen keinen DLL-Wrapper, die in C++ nutzen diesen.
1. Einarbeitung
1.1 Allgemeines
Bitte lesen Sie sich zuerst das QuickStart-Dokument zu SIGAMOS aufmerksam durch. Das vorliegende E-Book basiert auf den dort enthaltenen Informationen.
Nutzen Sie zur Einarbeitung die Möglichkeiten, die Ihnen die Anwendungen „Information & Demo Center“ (sigamos_idc.exe) und „Function-Tester“ (sigamos_ft32.exe, sigamos_ft32cc.exe, sigamos_ft64.exe, sigamos_ft64cc.exe) bieten. Darüber hinaus empfehle ich Ihnen, sich den Quelltext der mitgelieferten Demos anzuschauen. Dieser ist an den wichtigsten Stellen kommentiert. Bei Fragen, Hinweisen oder Problemen kontaktieren Sie mich bitte per E-Mail unter support@inntalsoftware.de mit dem Betreff „SIGAMOS“.
Hinweis: Alle DLL-Funktionen wurden entsprechend den Standard-Aufrufkonventionen („_stdcall“) erstellt und müssen dementsprechend auch aufgerufen werden. Durch den Verzicht auf Nutzung des Typs „String“ als Parameter sollte es damit keine Probleme bei der Verwendung der DLLs mit anderen Programmiersprachen als Delphi geben. Notfalls müssen Sie Parameter mit Vorgabewerten auch übergeben (eben mit dem Vorgabewert) und können diese nicht weglassen. Dies halte ich sowieso für die sicherere Methode.
Ebenso habe ich auf die Verwendung von Boolean-Werten verzichtet und diese durch Byte-Werte ersetzt. Dabei bedeuten 1 = Wahr und 0 = Falsch.
Zur Unterscheidung beginnen alle Funktionen mit zwei Buchstaben und einem Unterstrich:
– WP_ – Textverarbeitung (Wordprocessing)
– SC_ – Tabellenkalkulation (Spreadsheet <Calculation>)
– PT_ – Präsentation (Presentation)
Jede dieser drei DLLs enthält mit den Indexen 1 – 6 sechs Hilfsfunktionen, die Ihnen die Arbeit etwas erleichtern sollen.
Hinweis: Diese Aussage trifft NICHT auf die Compact-DLL zu!
1.2. Der Function-Tester
Es gibt vier Function-Tester-Programme:
1. Die drei DLLs für Textverarbeitung, Tabellenkalkulation und Präsentation 32 Bit.
2. Die drei DLLs für Textverarbeitung, Tabellenkalkulation und Präsentation 64 Bit.
3. Die Compact-DLL 32 Bit.
4. Die Compact-DLL 64 Bit.
Die weiteren Beschreibungen gelten analog für alle der vier oben genannten Programme. Wenn Sie im Function-Tester Ihre Tätigkeiten protokollieren möchten, gibt es dafür zwei Möglichkeiten:
1. Protokollierung der gewählten Funktionen und Aufrufe im Function-Tester.
2. Protokollierung des Aufrufes der DLL-Funktionen.
Zu 1.: Nutzen Sie dazu die im folgenden Bild gezeigte Checkbox sowie die beiden Schaltflächen „Clear Log“ und „Copy Log“:

Die Ausgabe erfolgt im untersten Feld:

Zu 2.: Wählen Sie nach Auswahl einer Office-Gruppe (außer „None“) das Objekt „Helper-Functions“ und dort die Funktion „WP_LoggingStart“ (bei Textverarbeitung). Klicken Sie dann auf die Schaltfläche „Start Function“. Die Protokollierung läuft solange, bis Sie die Funktion „WP_LoggingStop“ starten, die Office-Gruppe wechseln oder das Programm beenden. Zur Einsicht des Protokolls öffnen Sie die Datei (siehe Bemerkung dazu bei der Funktionsbeschreibung). Diese könnte etwa so aussehen:
25.10.2018 19:50:18 Start Logging
25.10.2018 19:50:23 Function _DoFunc_WPAppCreate: Start – Libre Office
25.10.2018 19:50:24 Function _DoFunc_WPAppCreate: End – Libre Office
25.10.2018 19:50:42 Function _DoFunc_WPDocOpen: Start – Libre Office
25.10.2018 19:50:43 Function _DoFunc_WPDocOpen: End – Libre Office
25.10.2018 19:51:11 Function _DoFunc_WPDocExportToPDF: Start – Libre Office
25.10.2018 19:51:22 Function _DoFunc_WPDocExportToPDF: End – Libre Office
25.10.2018 20:02:01 Function _DoFunc_WPDocIsSaved: Start – Libre Office
25.10.2018 20:02:01 Function _DoFunc_WPDocIsSaved: End – Libre Office
25.10.2018 20:02:21 Function _DoFunc_WPDocInsertTable: Start – Libre Office
25.10.2018 20:02:21 Function _DoFunc_WPDocInsertTable: End – Libre Office
25.10.2018 20:03:08 Function _DoFunc_WPDocNewSaved: Start – Libre Office
25.10.2018 20:03:09 Function _DoFunc_WPDocNewSaved: Document created – Libre Office
25.10.2018 20:03:09 Function _DoFunc_WPDocSaveAs: Start – Libre Office
25.10.2018 20:03:09 Function _DoFunc_WPDocSaveAs: End – Libre Office
25.10.2018 20:03:09 Function _DoFunc_WPDocSaveAs: End – Libre Office
25.10.2018 20:03:25 Function _DoFunc_WPDocActivate: Start – Libre Office
25.10.2018 20:03:25 Function _DoFunc_WPDocActivate: Error:
[automation bridge] unexpected exception in UnoConversionUtilities<T>::variantToAny!
25.10.2018 20:03:25 Function _DoFunc_WPDocActivate: End – Libre Office
25.10.2018 20:03:36 Function _DoFunc_WPParagraphsGetCollection: Start – Libre Office
25.10.2018 20:03:36 Function _DoFunc_WPParagraphsGetCollection: Error:
[automation bridge] unexpected exception in UnoConversionUtilities<T>::variantToAny!
25.10.2018 20:03:36 Function _DoFunc_WPParagraphsGetCollection: End – Libre Office
25.10.2018 20:04:22 Function _DoFunc_WPSelectionFromDocument: Start – Libre Office
25.10.2018 20:04:22 Function _DoFunc_WPSelectionFromDocument: Error:
[automation bridge] unexpected exception in UnoConversionUtilities<T>::variantToAny!
25.10.2018 20:04:22 Function _DoFunc_WPSelectionFromDocument: End – Libre Office
25.10.2018 20:04:52 Function _DoFunc_WPRangeFromDocument: Start – Libre Office
25.10.2018 20:04:52 Function _DoFunc_WPRangeFromDocument: End – Libre Office
25.10.2018 20:05:47 Function _DoFunc_WPAppClose: Start – Libre Office
25.10.2018 20:05:51 Function _DoFunc_WPAppClose: End – Libre Office
25.10.2018 20:05:59 End Logging
Bitte berücksichtigen Sie bei Ihren Tests das Folgende:
1. Wurden mehrere Office-Systeme derselben Office-Gruppe installiert, wird immer nur das zuletzt installierte Office-System starten.
2. Das Gleiche gilt auch die die beiden Office-Gruppen OpenOffice und LibreOffice!
3. Es können keine Office-Systeme getestet oder genutzt werden, die keine COM-Aufrufe unterstützen (z. B. WPS Office in der Home- oder Free-Version).
4. Für Fehler, die durch eine falsche Aufrufreihenfolge entstehen, kann ich keinen Support leisten. Beispiel: Sie erstellen ein Application-Objekt. Danach rufen Sie als Nächstes die Funktion „Dokument schließen“ auf, ohne dass ein Document-Objekt existiert. Sie können nur die Objekte nutzen, die bereits erzeugt wurden. Dazu dient die Anzeige der verfügbaren Objekte oberhalb der Comboboxen für Objekte und Funktionen.
1.3 Fehlerbehandlung
Wenn ein Fehler innerhalb der DLL-Funktion auftritt, kann er mittels der
LoggingStart-Methode protokolliert werden. Doch es gibt noch ein paar Variablen, um Funktionen auf Fehler prüfen zu können. Jede der drei DLLs hat dazu zwei eigene Variablen, die vom Typ String sind (Deklaration in SIGAMOS_Common):
Textverarbeitung: sErrorWP und sAllErrorsWP
Tabellenkalkulation: sErrorSC und sAllErrorsSC
Präsentation: sErrorPT und sAllErrorsPT
Ich erläutere das Ganze anhand der Textverarbeitung, also mit sErrorWP und sAllErrorsWP. Bei Aufruf jeder Textverarbeitungs-DLL-Funktion (mit Ausnahme der Helper-Functions) wird sErrorWP geleert. Nach Beendigung dieser Funktion kann geprüft werden, ob sErrorWP leer ist (kein Fehler) oder ob die Variable einen Text (die Fehlermeldung) enthält. Dies wäre auf alle Fälle ratsam, wenn der Rückgabewert der aufgerufenen Funktion einen Fehler meldet. Am Ende einer jeden DLL-Funktion wird, wenn sErrorWP nicht leer ist, dieser Wert zu sAllErrorsWP als eigene Zeile hinzugefügt. sAllErrorsWP wird bis zum Ende Ihrer Anwendung bzw. bis Sie die DLL entladen haben, verfügbar sein und enthält alle Fehlermeldungen der aktuellen Sitzung.
Als Beispiel der Delphi-Quelltext aus der Funktion WP_ParagraphsItem. Diese ruft die interne Funktion _DoFunc_WPParagraphsItem auf. Hier können Sie das Leeren und Zuweisen von Werten zu sErrorWP erkennen:
<code>
function _DoFunc_WPParagraphsItem(vDoc: Variant; const iItemNumber: Integer; const ofTmpKind: TEnumOffice = enNoDefined): Variant;
var
iTmpItem: Integer;
begin
sFuncName := '_DoFunc_WPParagraphsItem';
if bLogging_WP then _WP_WriteLog('Function ' + sFuncName + ': Start', ofTmpKind);
//_ClearError add sErrorWP to sAllErrorsWP and then clear the value of sErrorWP
_ClearError;
Result := UnAssigned;
if VarIsEmpty(vDoc) then begin
if bLogging_WP then _WP_WriteLog('Function ' + sFuncName + ': ERROR – no Document Object', ofTmpKind);
Exit;
end;
try
case ofTmpKind of
enAB:
begin
Result := vDoc.Paragraphs.Item(iItemNumber);
end;
enKS:
begin
Result := vDoc.Paragraphs.Item(iItemNumber);
end;
enMS:
begin
Result := vDoc.Paragraphs.Item(iItemNumber);
end;
enOO:
begin
iTmpItem := 0;
vooEnum := vDoc.Text.createEnumeration;
while (vooEnum.hasMoreElements) do begin
vooParagraph := vooEnum.nextElement;
//ATTENTION: vooParagraph is a „normal“ paragraph or a table
if vooParagraph.supportsService('com.sun.star.text.Paragraph') then begin
Inc(iTmpItem);
if iTmpItem = iItemNumber then begin
Result := vooParagraph;
Break;
end;
end;
end;
vooEnum := UnAssigned;
end;
enSM:
begin
Result := vDoc.Paragraphs.Item[iItemNumber];
end;
enLO:
begin
iTmpItem := 0;
vooEnum := vDoc.Text.createEnumeration;
while (vooEnum.hasMoreElements) do begin
vooParagraph := vooEnum.nextElement;
//ATTENTION: vooParagraph is a „normal“ paragraph or a table
if vooParagraph.supportsService('com.sun.star.text.Paragraph') then begin
Inc(iTmpItem);
if iTmpItem = iItemNumber then begin
Result := vooParagraph;
Break;
end;
end;
end;
vooEnum := UnAssigned;
end;
end;
except
on e: Exception do begin
if bLogging_WP then _WP_WriteLog('Function ' + sFuncName + ': Error:' + CRLF + ' ' + e.Message);
sErrorWP := 'Function ' + sFuncName + ': Error:' + e.Message;
end;
end;
if bLogging_WP then _WP_WriteLog('Function ' + sFuncName + ': End', ofTmpKind);
end;
</code>
1.4. Beispiele zur Nutzung der Helper-Functions
In den folgenden beiden Unterkapiteln finden Sie einen Vorschlag, wie Sie die Helper-Functions sinnvoll einsetzen können. Doch ob und wie Sie dies realisieren, bleibt Ihnen überlassen.
1.4.1. Protokollierung
Wir benötigen drei Checkboxen, um damit die Protokollierung für Textverarbeitung, Tabellenkalkulation undPräsentation zu steuern und nennen diese ckbLogWP, ckbLogSC und ckbLogPT. Dazu benötigen wir noch ein paar der DLL-Funktionen:

Delphi-Code:
<code>
type
ckbLogWP: TCheckBox;
ckbLogSC: TCheckBox;
ckbLogPT: TCheckBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure ckbLogWPClick(Sender: TObject);
procedure ckbLogSCClick(Sender: TObject);
procedure ckbLogPTClick(Sender: TObject);
private
{ Private-Deklarationen }
bLogPT: Boolean;
bLogSC: Boolean;
bLogWP: Boolean;
sLoggingPath: String;
const
//in this program we need the word processing DLL:
SIGAMOSLibWP = '..\bin\32bit\SIGAMOS_WP32.dll';
//all DLL-Functions for word processing included in the SIGAMOS_WP32.dll:
//1. Helper-Functions
function WP_LoggingStart(const spcPath: PChar = nil): Byte; stdcall; external SIGAMOSLibWP name 'WP_LoggingStart';
function WP_LoggingStop: Byte; stdcall; external SIGAMOSLibWP name 'WP_LoggingStop';
//all DLL-Functions for spreadsheet calculation included in the SIGAMOS_SC32.dll:
//1. Helper-Functions
function SC_LoggingStart(const spcPath: PChar = nil): Byte; stdcall; external SIGAMOSLibSC name 'SC_LoggingStart';
function SC_LoggingStop: Byte; stdcall; external SIGAMOSLibSC name 'SC_LoggingStop';
//all DLL-Functions for presentation included in the SIGAMOS_PT32.dll:
//1. Helper-Functions
function PT_LoggingStart(const spcPath: PChar = nil): Byte; stdcall; external SIGAMOSLibPT name 'PT_LoggingStart';
function PT_LoggingStop: Byte; stdcall; external SIGAMOSLibPT name 'PT_LoggingStop';
</code>
C++-Code:
<code>
// the h.-file:
//–
class TfMainEBK : public TForm
{
__published: // Von der IDE verwaltete Komponenten
TPanel *pnTop;
TComboBox *cbOfficeGroup;
TPageControl *pcMain;
TTabSheet *tbsC141;
TGroupBox *gbLogging;
TCheckBox *ckbLogWP;
TCheckBox *ckbLogSC;
TCheckBox *ckbLogPT;
void __fastcall ckbLogWPClick(TObject *Sender);
void __fastcall ckbLogSCClick(TObject *Sender);
void __fastcall ckbLogPTClick(TObject *Sender);
private: // Benutzer-Deklarationen – user declarations
TenumOffice enTmp;
Variant vWPApp;
Variant vWPDoc;
Variant vSCApp;
Variant vSCWB;
Variant vSCWS;
Variant vPTApp;
Variant vPTPT;
UnicodeString sLoggingPath;
void __fastcall _CheckFunctionGeneral(const UnicodeString sFunctionName, TenumOffice enOG);
public: // Benutzer-Deklarationen – user declarations
wchar_t* sLibNameWP; //complete path to the WP-DLL
wchar_t* sLibNameSC; //complete path to the SC-DLL
wchar_t* sLibNamePT; //complete path to the PT-DLL
UnicodeString sucText1WP;
UnicodeString sucText2WP;
UnicodeString sucText4WP;
UnicodeString sucText5WP;
UnicodeString sucText1SC;
UnicodeString sucText2SC;
UnicodeString sucText4SC;
UnicodeString sucText5SC;
UnicodeString sucText1PT;
UnicodeString sucText2PT;
UnicodeString sucText4PT;
UnicodeString sucText5PT;
bool bLogWP; //logging WP
bool bLogSC; //logging SC
bool bLogPT; //logging PT
bool bPTPT; //PT-Presentation
bool bSCWB; //SC-Workbook
bool bWPDoc; //WP-Document
__fastcall TfMainEBK(TComponent* Owner);
};
//–
extern PACKAGE TfMainEBK *fMainEBK;
//–
#endif
//the cpp-file:
//–
#include <vcl.h>
#pragma hdrstop
#include <string>
#include <exception>
#include "frmMainEBK.h"
//this file you MUST include because we need the TenumOffice-Enumeration and some constants
#include <SIGAMOS_Common.hpp>
//–
//the wrapper files for the DLLs:
#include <sigamos_wrapper_cpp_wp.cpp>
#include <sigamos_wrapper_cpp_sc.cpp>
#include <sigamos_wrapper_cpp_pt.cpp>
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <System.Classes.hpp>
#include <dialogs.hpp>
#include <memory>
#include <cwchar>
using namespace std;
//–
TfMainEBK *fMainEBK;
//–
__fastcall TfMainEBK::TfMainEBK(TComponent* Owner)
: TForm(Owner)
{
}
//–
</code>
Wie wir sehen, haben wir für jede Checkbox noch ein OnClick-Ereignis definiert. Hier sind die einzelnen Funktionen dazu:
Delphi-Code:
<code>
procedure TfMainEBK.ckbLogPTClick(Sender: TObject);
var
iResult: Byte;
begin
bLogPT := ckbLogPT.Checked;
if bLogPT then begin
iResult := PT_LoggingStart(PChar(sLoggingPath));
if iResult = 1 then begin
ShowMessage('Logging for all presentation-functions was started. Log-file: ' + sLoggingPath + 'SIGAMOS_PT_Log.txt');
end
else begin
ShowMessage('Error on start logging for presentation-functions!');
ckbLogPT.Checked := False;
end;
end
else begin
iResult := PT_LoggingStop;
if iResult = 1 then begin
ShowMessage('Logging for all presentation-functions was stopped.');
end
else begin
ShowMessage('Error on stop logging for presentation-functions!');
ckbLogPT.Checked := True;
end;
end;
end;
procedure TfMainEBK.ckbLogSCClick(Sender: TObject);
var
iResult: Byte;
begin
bLogSC := ckbLogSC.Checked;
if bLogSC then begin
iResult := SC_LoggingStart(PChar(sLoggingPath));
if iResult = 1 then begin
ShowMessage('Logging for all spreadsheet-functions was started. Log-file: ' + sLoggingPath + 'SIGAMOS_SC_Log.txt');
end
else begin
ShowMessage('Error on start logging for spreadsheet-functions!');
ckbLogSC.Checked := False;
end;
end
else begin
iResult := SC_LoggingStop;
if iResult = 1 then begin
ShowMessage('Logging for all spreadsheet-functions was stopped.');
end
else begin
ShowMessage('Error on stop logging for spreadsheet-functions!');
ckbLogSC.Checked := True;
end;
end;
end;
procedure TfMainEBK.ckbLogWPClick(Sender: TObject);
var
iResult: Byte;
begin
bLogWP := ckbLogWP.Checked;
if bLogWP then begin
iResult := WP_LoggingStart(PChar(sLoggingPath));
if iResult = 1 then begin
ShowMessage('Logging for all wordprocessing-functions was started. Log-file: ' + sLoggingPath + 'SIGAMOS_WP_Log.txt');
end
else begin
ShowMessage('Error on start logging for wordprocessing-functions!');
ckbLogWP.Checked := False;
end;
end
else begin
iResult := WP_LoggingStop;
if iResult = 1 then begin
ShowMessage('Logging for all wordprocessing-functions was stopped.');
end
else begin
ShowMessage('Error on stop logging for wordprocessing-functions!');
ckbLogWP.Checked := True;
end;
end;
end;
</code>
C++-Code:
<code>
void __fastcall TfMainEBK::ckbLogWPClick(TObject *Sender)
{
int iResult;
bLogWP = ckbLogWP->Checked;
if (bLogWP)
{
iResult = int(WP_LoggingStart(sLoggingPath.c_str()));
if (iResult == 1)
{
ShowMessage(sucText1WP.c_str());
}
else
{
ShowMessage(sucText2WP.c_str());
}
}
else
{
iResult = int(WP_LoggingStop());
if (iResult == 1)
{
ShowMessage(sucText4WP.c_str());
}
else
{
ShowMessage(sucText5WP.c_str());
}
}
}
//–
void __fastcall TfMainEBK::ckbLogSCClick(TObject *Sender)
{
int iResult;
bLogSC = ckbLogSC->Checked;
if (bLogSC)
{
iResult = int(SC_LoggingStart(sLoggingPath.c_str()));
if (iResult == 1)
{
ShowMessage(sucText1SC.c_str());
}
else
{
ShowMessage(sucText2SC.c_str());
}
}
else
{
iResult = int(SC_LoggingStop());
if (iResult == 1)
{
ShowMessage(sucText4SC.c_str());
}
else
{
ShowMessage(sucText5SC.c_str());
}
}
}
//–
void __fastcall TfMainEBK::ckbLogPTClick(TObject *Sender)
{
int iResult;
bLogPT = ckbLogPT->Checked;
if (bLogPT)
{
iResult = int(PT_LoggingStart(sLoggingPath.c_str()));
if (iResult == 1)
{
ShowMessage(sucText1PT.c_str());
}
else
{
ShowMessage(sucText2PT.c_str());
}
}
else
{
iResult = int(PT_LoggingStop());
if (iResult == 1)
{
ShowMessage(sucText4PT.c_str());
}
else
{
ShowMessage(sucText5PT.c_str());
Pulsuz fraqment bitdi.