UPD: Use FileReadLn, FileWriteLn instead ReadLn, WriteLn for Unicode support

This commit is contained in:
Alexander Koblov 2008-05-22 15:23:43 +00:00
commit 5f29eecf6e
5 changed files with 1035 additions and 992 deletions

File diff suppressed because it is too large Load diff

View file

@ -424,7 +424,7 @@ end;
procedure TfrmMultiRename.btnOKClick(Sender: TObject);
var
F:TextFile;
hFile: Integer;
c:integer;
begin
try
@ -433,8 +433,16 @@ begin
if edFile.Text='' then
edFile.Text:=lsvwFile.Items.Item[0].SubItems[1]+ PathDelim+'default.log';
ForceDirectory(ExtractFileDir(edFile.Text));
AssignFile(F,edFile.Text);
Rewrite(F);
if mbFileExists(edFile.Text) then
begin
hFile:= mbFileOpen(edFile.Text, fmOpenReadWrite);
FileTruncate(hFile, 0);
end
else
begin
hFile:= mbFileCreate(edFile.Text);
end;
end;
for c:=0 to lsvwFile.Items.Count-1 do
with lsvwFile.Items do
@ -442,11 +450,11 @@ begin
mbRenameFile(Item[c].SubItems[1]+pathDelim+item[c].Caption,
Item[c].SubItems[1]+pathdelim+Item[c].SubItems[0]);
if cbLog.Checked then
Writeln(F,item[c].Caption+';'+Item[c].SubItems[0]);
FileWriteLn(hFile,item[c].Caption+' -> '+Item[c].SubItems[0]);
end;
finally
if cbLog.Checked then
closefile(F);
FileClose(hFile);
end;
ModalResult:=mrOK;
end;

View file

@ -21,15 +21,12 @@ interface
uses
uTypes, ComCtrls;
type
TFileProc = function (fr:PFileRecItem; const sDst:String; pb:TProgressBar):Boolean;
function ForceDirectory(DirectoryName: string): boolean;
function CopyFile(const sSrc, sDst:String; bAppend:Boolean=False):Boolean;
function MoveFile(const sSrc, sDst:String; pb:TProgressBar; iSrcRights:Integer):Boolean;
function DelFile(const sSrc:String):Boolean;
function RenFile(const sSrc, sDst:String):Boolean;
procedure FileReadLn(hFile: Integer; var S: String);
procedure FileWriteLn(hFile: Integer; S: String);
implementation
uses
@ -96,30 +93,62 @@ begin
end;
end;
function MoveFile(const sSrc, sDst:String; pb:TProgressBar; iSrcRights:Integer):Boolean;
procedure FileReadLn(hFile: Integer; var S: String);
const
cBufSize = 4096;
var
Buf: array[1..cBufSize] of Char;
iNumRead,
iCounter,
iBufPos: Integer;
bEOLFound: Boolean;
iFilePos,
iFileSize: Int64;
begin
Result:=False;
if CopyFile(sSrc, sDst,False) then
Result:=DelFile(sSrc);
S:='';
// get current position
iFilePos:= FileSeek(hFile, 0, soFromCurrent);
// get file size
iFileSize:= FileSeek(hFile, 0, soFromEnd);
// restore position
FileSeek(hFile, iFilePos, soFromBeginning);
bEOLFound:= False;
while (iFilePos < iFileSize) and not bEOLFound do
begin
iNumRead:= FileRead(hFile, Buf, SizeOf(Buf));
for iCounter:= 1 to iNumRead do
begin
if Buf[iCounter] in [#13, #10] then
begin
bEOLFound:=True;
iBufPos:=iCounter+1;
if ((iBufPos) <= iNumRead) and (Buf[iBufPos] in [#13, #10]) then
Inc(iBufPos);
Buf[iCounter]:= #0;
S:= StrPas(@Buf);
FileSeek(hFile, iFilePos+iBufPos-1, soFromBeginning);
Break;
end;
end; // for
if (not bEOLFound) then
begin
if (iNumRead < cBufSize) then
Buf[iNumRead+1]:= #0;
S:= StrPas(@Buf);
end;
Inc(iFilePos, iNumRead);
end; // while
end;
// only wrapper for SysUtils.DeleteFile (raise Exception)
function DelFile(const sSrc:String):Boolean;
procedure FileWriteLn(hFile: Integer; S: String);
begin
Result:= mbDeleteFile(sSrc);
if not Result then
msgError(Format(rsMsgNotDelete,[sSrc]));
S:= S + LineEnding;
FileWrite(hFile, PChar(S)[0], Length(S));
end;
function RenFile(const sSrc, sDst:String):Boolean;
begin
Result:=False;
if mbFileExists(sDst) and not MsgYesNo(rsMsgFileExistsRwrt) then
Exit;
Result:=SysUtils.RenameFile(sSrc, sDst);
end;
function ForceDirectory(DirectoryName: string): boolean;
var
i: integer;

494
ulng.pas
View file

@ -1,247 +1,247 @@
{
Double Commander
-------------------------------------------------------------------------
Localization core unit
Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit uLng;
{$mode objfpc}{$H+}
interface
uses
LResources;
resourcestring
rsMsgNotDelete = 'Can not delete file %s';
rsMsgFileExistsRwrt = 'File %s exists, overwrite?';
rsMsgFileChangedSave = 'File %s changed, save?';
rsMsgNewFile = 'New file';
rsMsgDelFlDr = 'Delete %d selected files/directories?';
rsMsgDelSel = 'Delete selected "%s"?';
rsMsgCpFlDr = 'Copy %d selected files/directories?';
rsMsgCpSel = 'Copy selected "%s"?';
rsMsgRenFlDr = 'Rename/move %d selected files/directories?';
rsMsgRenSel = 'Rename/move selected "%s"?';
rsMsgErrForceDir = 'Can not create directory %s!';
rsMsgSelected = 'Selected %s of %s in %d of %d files';
rsMsgPopUpHotAdd = '&Add %s';
rsMsgPopUpHotCnf = '&Configure';
rsDlgButtons = '&OK;&No;&Yes;&Cancel;&None;&Append;&Rewrite;Rewrite &All;&Skip;S&kip All;All;';
rsSpaceMsg = 'Files:%d, Dirs:%d, Size: %d bytes';
rsSelectDir = 'Select a directory';
rsMarkPlus = 'Select mask';
rsMarkMinus = 'Unselect mask';
rsMaskInput = 'Input mask:';
rsFreeMsg = 'Free %s from %s bytes';
rsMsgErrDirExists = 'Directory %s exists!';
rsMsgPopUpHotDelete = '&Delete %s';
rsMsgDiskNotAvail = 'Disk is not available';
rsMsgChDirFailed = 'ChDir to [%s] failed!';
rsMsgNoFreeSpaceCont = 'No enough free space on target drive, Continue?';
rsMsgNoFreeSpaceRetry = 'No enough free space on target drive, Retry?';
// for context menu
rsMnuActions = 'Actions';
// wcx module messages
rsMsgSelLocNextVol = 'Please select location of next volume';
rsMsgNextVolUnpack = 'Next volume will be unpacked';
// wcx module errors messages
rsMsgErrEndArchive = 'No more files in archive';
rsMsgErrNoMemory = 'Not enough memory';
rsMsgErrBadData = 'Data is bad';
rsMsgErrBadArchive = 'CRC error in archive data';
rsMsgErrUnknownFormat = 'Archive format unknown';
rsMsgErrEOpen = 'Cannot open existing file';
rsMsgErrECreate = 'Cannot create file';
rsMsgErrEClose = 'Error closing file';
rsMsgErrERead = 'Error reading from file';
rsMsgErrEWrite = 'Error writing to file';
rsMsgErrSmallBuf = 'Buffer too small';
rsMsgErrEAborted = 'Function aborted by user';
rsMsgErrNoFiles = 'No files found';
rsMsgErrTooManyFiles = 'Too many files to pack';
rsMsgErrNotSupported = 'Function not supported!';
// Log file
rsMsgLogSuccess = 'Done: ';
rsMsgLogError = 'Error: ';
rsMsgLogInfo = 'Info: ';
rsMsgLogCopy = 'Copy file %s';
rsMsgLogMove = 'Move file %s';
rsMsgLogDelete = 'Delete file %s';
rsMsgLogLink = 'Create link %s';
rsMsgLogSymLink = 'Create symlink %s';
rsMsgLogMkDir = 'Create directory %s';
rsMsgLogRmDir = 'Remove directory %s';
rsMsgLogPack = 'Pack to file %s';
rsMsgLogExtract = 'Extract file %s';
rsSavePosition = '&Save position';
rsPositionSaved = 'Position saved.';
// File operations dialog
rsDlgDel = 'Delete file(s)';
rsDlgCp = 'Copy file(s)';
rsDlgMv = 'Move file(s)';
rsDlgPack = 'Packing...';
rsDlgExtract = 'Extracting...';
// Viewer
rsViewAboutText = 'Internal Viewer of Double Commander.';
// Columns in file panel
rsColName = 'Name';
rsColExt = 'Ext';
rsColSize = 'Size';
rsColDate = 'Date';
rsColAttr = 'Attr';
// Configure custom columns dialog
rsConfColDelete = 'Delete';
rsConfColCaption = 'Caption';
rsConfColWidth = 'Width';
rsConfColAlign = 'Align';
rsConfColFieldCont = 'Field contents';
// File properties dialog
rsPropsYes = 'Yes (%s)';
rsPropsNo = 'No';
rsPropsFolder = 'Directory';
rsPropsFile = 'File';
rsPropsSpChrDev = 'Special character device';
rsPropsSpBlkDev = 'Special block device';
rsPropsNmdPipe = 'Named pipe';
rsPropsSymLink = 'Symbolic link';
rsPropsSocket = 'Socket';
rsPropsUnknownType = 'Unknown type';
//Compare by content Dialog
rsCompareDiffs = 'Number of changes:';
// Find files dialog
rsFindScaned = 'Scanned: %d';
rsFindWhereBeg = 'Begin at';
rsFindDirNoEx = 'Directory %s does not exist!';
// Symlink dialog
rsSymErrCreate = 'Error creating symlink.';
// Hardlink dialog
rsHardErrCreate = 'Error creating hardlink.';
// Linker dialog
rsLinkMsgOK = 'Linker complete';
// Splitter dialog
rsSplitSelDir = 'Select directory:';
rsSplitErrFileSize = 'Incorrect file size format!';
rsSplitErrDirectory = 'Unable to create target directory!';
rsSplitErrSplitFile = 'Unable to split the file!';
rsSplitMsgCreated = 'Created:';
rsSplitMsgSize = 'size:';
// MultiRename dialog
rsMulRenFileNameStyleList = 'No change;UPPERCASE;lowercase;First Char Big;';
// Edit
rsEditNewFile = 'new.txt';
rsEditNewOpen = 'Open file';
rsEditNewFileName = 'Filename:';
// Options dialog
rsOptLanguage = 'Language';
rsOptBehav = 'Behaviors';
rsOptTools = 'Tools';
rsOptFonts = 'Fonts';
rsOptColors = 'Colors';
rsOptFilePanels = 'File panels';
rsOptFileTypes = 'File types';
rsOptHotKeys = 'Hot keys';
rsOptPlugins = 'Plugins';
rsOptLayout = 'Layout';
rsOptFileOp = 'File operations';
rsOptFolderTabs = 'Folder tabs';
rsOptLog = 'Log';
rsOptConfig = 'Configuration';
rsOptQuickSearch = 'Quick search';
rsOptColumns = 'Columns';
//-------------------------------
rsOptLineByLineCursor = 'Line by line with cursor movement';
rsOptLineByLine = 'Line by line';
rsOptPageByPage = 'Page by page';
//Columns Menu
rsMenuConfigureCustomColumns= 'Configure custom columns';
rsMenuConfigureThisCustomColumn= 'Configure this custom columns view';
function GetLanguageName(poFileName : String) : String;
procedure lngLoadLng(const sFileName:String);
procedure DoLoadLng;
implementation
uses
Classes, SysUtils, GetText, Translations, uGlobs, uGlobsPaths, uTranslator, LCLProc;
function GetLanguageName(poFileName : String) : String;
var
poFile : TextFile;
sLine : String;
iPos1,
iPos2 : Integer;
begin
AssignFile(poFile, poFileName);
Reset(poFile);
// find first msgid line
ReadLn(poFile, sLine);
while Pos('msgid', sLine) = 0 do
ReadLn(poFile, sLine);
// read msgstr line
ReadLn(poFile, sLine);
repeat
ReadLn(poFile, sLine);
// find language name line
if Pos('X-Poedit-Language:', sLine) <> 0 then
begin
iPos1 := Pos(':', sLine) + 2;
iPos2 := Pos('\n', sLine) - 1;
Result := Copy(sLine, iPos1, (iPos2 - iPos1) + 1);
CloseFile(poFile);
Exit;
end;
until Pos('msgid', sLine) = 1;
CloseFile(poFile);
Result := 'Language name not found';
end;
procedure lngLoadLng(const sFileName:String);
var
Lang, FallbackLang : String;
begin
{ Localization }
if sFileName = 'doublecmd.po' then Exit; // default english interface
DebugLn('Loading lng file: ' + gpLngDir + sFileName);
gPOFileName := sFileName;
if not FileExists(gpLngDir + gPOFileName) then
begin
gPOFileName := 'doublecmd.%s.po';
GetLanguageIDs(Lang, FallbackLang);
gPOFileName := Format(gPOFileName,[FallbackLang]);
end;
if not FileExists(gpLngDir + gPOFileName) then
begin
gPOFileName := Format(gPOFileName,[Lang]);
end;
if FileExists(gpLngDir + gPOFileName) then
begin
Translations.TranslateUnitResourceStrings('uLng', gpLngDir + gPOFileName);
LRSTranslator := TTranslator.Create(gpLngDir + gPOFileName);
end;
end;
procedure DoLoadLng;
begin
lngLoadLng(gPOFileName);
end;
end.
{
Double Commander
-------------------------------------------------------------------------
Localization core unit
Copyright (C) 2007 Koblov Alexander (Alexx2000@mail.ru)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit uLng;
{$mode objfpc}{$H+}
interface
uses
LResources;
resourcestring
rsMsgNotDelete = 'Can not delete file %s';
rsMsgFileExistsRwrt = 'File %s exists, overwrite?';
rsMsgFileChangedSave = 'File %s changed, save?';
rsMsgNewFile = 'New file';
rsMsgDelFlDr = 'Delete %d selected files/directories?';
rsMsgDelSel = 'Delete selected "%s"?';
rsMsgCpFlDr = 'Copy %d selected files/directories?';
rsMsgCpSel = 'Copy selected "%s"?';
rsMsgRenFlDr = 'Rename/move %d selected files/directories?';
rsMsgRenSel = 'Rename/move selected "%s"?';
rsMsgErrForceDir = 'Can not create directory %s!';
rsMsgSelected = 'Selected %s of %s in %d of %d files';
rsMsgPopUpHotAdd = '&Add %s';
rsMsgPopUpHotCnf = '&Configure';
rsDlgButtons = '&OK;&No;&Yes;&Cancel;&None;&Append;&Rewrite;Rewrite &All;&Skip;S&kip All;All;';
rsSpaceMsg = 'Files:%d, Dirs:%d, Size: %d bytes';
rsSelectDir = 'Select a directory';
rsMarkPlus = 'Select mask';
rsMarkMinus = 'Unselect mask';
rsMaskInput = 'Input mask:';
rsFreeMsg = 'Free %s from %s bytes';
rsMsgErrDirExists = 'Directory %s exists!';
rsMsgPopUpHotDelete = '&Delete %s';
rsMsgDiskNotAvail = 'Disk is not available';
rsMsgChDirFailed = 'ChDir to [%s] failed!';
rsMsgNoFreeSpaceCont = 'No enough free space on target drive, Continue?';
rsMsgNoFreeSpaceRetry = 'No enough free space on target drive, Retry?';
// for context menu
rsMnuActions = 'Actions';
// wcx module messages
rsMsgSelLocNextVol = 'Please select location of next volume';
rsMsgNextVolUnpack = 'Next volume will be unpacked';
// wcx module errors messages
rsMsgErrEndArchive = 'No more files in archive';
rsMsgErrNoMemory = 'Not enough memory';
rsMsgErrBadData = 'Data is bad';
rsMsgErrBadArchive = 'CRC error in archive data';
rsMsgErrUnknownFormat = 'Archive format unknown';
rsMsgErrEOpen = 'Cannot open existing file';
rsMsgErrECreate = 'Cannot create file';
rsMsgErrEClose = 'Error closing file';
rsMsgErrERead = 'Error reading from file';
rsMsgErrEWrite = 'Error writing to file';
rsMsgErrSmallBuf = 'Buffer too small';
rsMsgErrEAborted = 'Function aborted by user';
rsMsgErrNoFiles = 'No files found';
rsMsgErrTooManyFiles = 'Too many files to pack';
rsMsgErrNotSupported = 'Function not supported!';
// Log file
rsMsgLogSuccess = 'Done: ';
rsMsgLogError = 'Error: ';
rsMsgLogInfo = 'Info: ';
rsMsgLogCopy = 'Copy file %s';
rsMsgLogMove = 'Move file %s';
rsMsgLogDelete = 'Delete file %s';
rsMsgLogLink = 'Create link %s';
rsMsgLogSymLink = 'Create symlink %s';
rsMsgLogMkDir = 'Create directory %s';
rsMsgLogRmDir = 'Remove directory %s';
rsMsgLogPack = 'Pack to file %s';
rsMsgLogExtract = 'Extract file %s';
rsSavePosition = '&Save position';
rsPositionSaved = 'Position saved.';
// File operations dialog
rsDlgDel = 'Delete file(s)';
rsDlgCp = 'Copy file(s)';
rsDlgMv = 'Move file(s)';
rsDlgPack = 'Packing...';
rsDlgExtract = 'Extracting...';
// Viewer
rsViewAboutText = 'Internal Viewer of Double Commander.';
// Columns in file panel
rsColName = 'Name';
rsColExt = 'Ext';
rsColSize = 'Size';
rsColDate = 'Date';
rsColAttr = 'Attr';
// Configure custom columns dialog
rsConfColDelete = 'Delete';
rsConfColCaption = 'Caption';
rsConfColWidth = 'Width';
rsConfColAlign = 'Align';
rsConfColFieldCont = 'Field contents';
// File properties dialog
rsPropsYes = 'Yes (%s)';
rsPropsNo = 'No';
rsPropsFolder = 'Directory';
rsPropsFile = 'File';
rsPropsSpChrDev = 'Special character device';
rsPropsSpBlkDev = 'Special block device';
rsPropsNmdPipe = 'Named pipe';
rsPropsSymLink = 'Symbolic link';
rsPropsSocket = 'Socket';
rsPropsUnknownType = 'Unknown type';
//Compare by content Dialog
rsCompareDiffs = 'Number of changes:';
// Find files dialog
rsFindScaned = 'Scanned: %d';
rsFindWhereBeg = 'Begin at';
rsFindDirNoEx = 'Directory %s does not exist!';
// Symlink dialog
rsSymErrCreate = 'Error creating symlink.';
// Hardlink dialog
rsHardErrCreate = 'Error creating hardlink.';
// Linker dialog
rsLinkMsgOK = 'Linker complete';
// Splitter dialog
rsSplitSelDir = 'Select directory:';
rsSplitErrFileSize = 'Incorrect file size format!';
rsSplitErrDirectory = 'Unable to create target directory!';
rsSplitErrSplitFile = 'Unable to split the file!';
rsSplitMsgCreated = 'Created:';
rsSplitMsgSize = 'size:';
// MultiRename dialog
rsMulRenFileNameStyleList = 'No change;UPPERCASE;lowercase;First Char Big;';
// Edit
rsEditNewFile = 'new.txt';
rsEditNewOpen = 'Open file';
rsEditNewFileName = 'Filename:';
// Options dialog
rsOptLanguage = 'Language';
rsOptBehav = 'Behaviors';
rsOptTools = 'Tools';
rsOptFonts = 'Fonts';
rsOptColors = 'Colors';
rsOptFilePanels = 'File panels';
rsOptFileTypes = 'File types';
rsOptHotKeys = 'Hot keys';
rsOptPlugins = 'Plugins';
rsOptLayout = 'Layout';
rsOptFileOp = 'File operations';
rsOptFolderTabs = 'Folder tabs';
rsOptLog = 'Log';
rsOptConfig = 'Configuration';
rsOptQuickSearch = 'Quick search';
rsOptColumns = 'Columns';
//-------------------------------
rsOptLineByLineCursor = 'Line by line with cursor movement';
rsOptLineByLine = 'Line by line';
rsOptPageByPage = 'Page by page';
//Columns Menu
rsMenuConfigureCustomColumns= 'Configure custom columns';
rsMenuConfigureThisCustomColumn= 'Configure this custom columns view';
function GetLanguageName(poFileName : String) : String;
procedure lngLoadLng(const sFileName:String);
procedure DoLoadLng;
implementation
uses
Classes, SysUtils, GetText, Translations, uGlobs, uGlobsPaths, uTranslator,
LCLProc, uFileProcs, uOSUtils;
function GetLanguageName(poFileName : String) : String;
var
poFile : Integer;
sLine : String;
iPos1,
iPos2 : Integer;
begin
poFile:= mbFileOpen(poFileName, fmOpenRead);
// find first msgid line
FileReadLn(poFile, sLine);
while Pos('msgid', sLine) = 0 do
FileReadLn(poFile, sLine);
// read msgstr line
FileReadLn(poFile, sLine);
repeat
FileReadLn(poFile, sLine);
// find language name line
if Pos('X-Poedit-Language:', sLine) <> 0 then
begin
iPos1 := Pos(':', sLine) + 2;
iPos2 := Pos('\n', sLine) - 1;
Result := Copy(sLine, iPos1, (iPos2 - iPos1) + 1);
FileClose(poFile);
Exit;
end;
until Pos('msgid', sLine) = 1;
FileClose(poFile);
Result := 'Language name not found';
end;
procedure lngLoadLng(const sFileName:String);
var
Lang, FallbackLang : String;
begin
{ Localization }
if sFileName = 'doublecmd.po' then Exit; // default english interface
DebugLn('Loading lng file: ' + gpLngDir + sFileName);
gPOFileName := sFileName;
if not FileExists(gpLngDir + gPOFileName) then
begin
gPOFileName := 'doublecmd.%s.po';
GetLanguageIDs(Lang, FallbackLang);
gPOFileName := Format(gPOFileName,[FallbackLang]);
end;
if not FileExists(gpLngDir + gPOFileName) then
begin
gPOFileName := Format(gPOFileName,[Lang]);
end;
if FileExists(gpLngDir + gPOFileName) then
begin
Translations.TranslateUnitResourceStrings('uLng', gpLngDir + gPOFileName);
LRSTranslator := TTranslator.Create(gpLngDir + gPOFileName);
end;
end;
procedure DoLoadLng;
begin
lngLoadLng(gPOFileName);
end;
end.

View file

@ -57,11 +57,11 @@ procedure logWrite(Thread : TThread; const sText:String; LogMsgType : TLogMsgTyp
implementation
uses
SysUtils, LCLProc, fMain, uGlobs;
SysUtils, LCLProc, fMain, uGlobs, uFileProcs, uOSUtils;
procedure logWrite(const sText:String; LogMsgType : TLogMsgType);
var
LogFile : TextFile;
hLogFile: Integer;
begin
if Assigned(fMain.frmMain) and gLogWindow then // if write log to window
with fMain.frmMain.seLogWindow do
@ -70,22 +70,21 @@ begin
end;
if gLogFile then // if write log to file
begin
AssignFile(LogFile, gLogFileName);
try
if FileExists(gLogFileName) then
Append(LogFile)
else
Rewrite(LogFile);
WriteLn(LogFile, Format('%s %s', [DateTimeToStr(Now), sText]));
try
if mbFileExists(gLogFileName) then
hLogFile:= mbFileOpen(gLogFileName, fmOpenReadWrite)
else
hLogFile:= mbFileCreate(gLogFileName);
DebugLn(Format('%s %s',[DateTimeToStr(Now), sText]));
FileSeek(hLogFile, 0, soFromEnd);
FileWriteLn(hLogFile, Format('%s %s', [DateTimeToStr(Now), sText]));
CloseFile(LogFile);
except
on E:Exception do
DebugLn('Error writing to log: ' + E.Message);
end;
DebugLn(Format('%s %s',[DateTimeToStr(Now), sText]));
FileClose(hLogFile);
except
on E:Exception do
DebugLn('Error writing to log: ' + E.Message);
end; // gLogWriteFile
end;