我有一个写字板文件(RTF)上的格式化文本。我正试着在Delphi的表格上打开它。问题是,字符串是用西里尔语(保加利亚语)保存的,它是用奇怪的象形文字或其他什么符号保存的。有没有一种方法可以将象形文字转换成丰富的文字,这样它们就可以显示为正确的文本?
我使用这个函数来检查文件是否为空,这样我就可以输入第一个RTF标记,或者删除结束标记,这样我就可以在不破坏文件的情况下在其中添加更多文本
function FileIsEmpty(const FileName: String): Boolean;
var
fad: TWin32FileAttributeData;
begin
Result := GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) and
(fad.nFileSizeLow = 0) and (fad.nFileSizeHigh = 0);
end;
这是我用来格式化文本并将其提供给文件的代码:
procedure FormatLogAndAddToFile(richEditLog : TRichEdit; richEditTextColor : TRichEdit);
var
i : integer;
s, c, finalText : string;
sString : TStringList;
begin
with frmMain do
begin
sString := TStringList.Create;
sString.LoadFromFile('C:UserslyubenDesktopLyuben Airport DelphiLog FileTestFormating.rtf');
if Pos('{rtf}', sString.Strings[0]) <> 0 then
begin
sString.Delete(0);
end
else
begin
sString.Delete(sString.Count - 1);
end;
sString.SaveToFile('C:UserslyubenDesktopLyuben Airport DelphiLog FileTestFormating.rtf');
sString.free;
AssignFile(logFile, 'C:UserslyubenDesktopLyuben Airport DelphiLog FileTestFormating.rtf');
Append(logFile);
if FileIsEmpty('C:UserslyubenDesktopLyuben Airport DelphiLog FileTestFormating.rtf') = True then
begin
WriteLn(logFile, '{rtfansiansicpg1252deff0nouicompat{fonttbl{f0fnilfcharset0 Calibri;}}');
end;
for i := 0 to richEditLog.Lines.Count do
begin
s := richEditLog.Lines[i];
c := richEditTextColor.Lines[i];
if c = 'blue' then
begin
finalText := '{colortbl ;red0green128blue255;red255green0blue0;}' +
'viewkind4uc1 pardsa200sl276slmult1cf1f0fs32lang9 ' + s + 'cf2par';
end
else if c = 'red' then
begin
finalText := '{colortbl ;red255green0blue0;}' +
'viewkind4uc1 pardsa200sl276slmult1cf1f0fs32lang9 ' + s + 'par';
end
else if c = 'green' then
begin
finalText := '{colortbl ;red0green128blue128;red255green0blue0;}' +
'viewkind4uc1 pardsa200sl276slmult1cf1f0fs32lang9 ' + s + 'cf2par';
end;
WriteLn(logFile, finalText);
end;
WriteLn(logFile, '}');
CloseFile(logFile);
end;
end;
这是我用来将日志行添加到文件中的代码。我还编写了一些代码来检查文件中是否有行的日期是在TDateEdit上输入的,因此我只能从输入的日期获取日志。
procedure OpenLogInRichEdit(dateFilter : Boolean; searchDate : tDate);
var
sTime : string;
dateExists : Boolean;
I : integer;
begin
with frmMain do
begin
dateExists := false;
frmLogSearch.tLogRichEdit.Clear;
frmLogSearch.tLogRichEdit.Lines.LoadFromFile('C:UserslyubenDesktopLyuben Airport DelphiLog FileTestFormating.rtf');
sTime := DateTimeToStr(searchDate);
if dateFilter then
begin
for I := 0 to frmLogSearch.tLogRichEdit.Lines.Count do
begin
if Pos(sTime, frmLogSearch.tLogRichEdit.Lines[i]) <> 0 then
begin
frmLogSearch.tLogRichEdit.Lines.Delete(i);
dateExists := True;
end;
end;
if dateExists = false then
begin
ShowMessage('No log from this day!');
end;
end;
end;
end;
这就是我如何将文本添加到稍后用于过程FormatLogAndAddToFile的richedit中。
dateTimeNow := Now;
logText.Lines.Add('<' + DateTimeToStr(dateTimeNow) + '> Изтрита е поръчка');
logTextColor.Lines.Add('red');
这就是我最终如何调用这些程序的。首先是将格式化的日志发送到RICHEDITS的过程
OpenLogInRichEdit(tcxCheckBoxDate.Checked, tcxDate.Date);
这是格式化文本并将其提供给文件的过程
LogFileUse.FormatLogAndAddToFile(logText, logTextColor);
多亏了这些评论,我成功地让它发挥了作用。我已经更改了上面的代码。我没有把‘fcharset0’作为标记,而是现在有了‘fcharset1’,我还把‘lang9’改成了‘lang1026’,现在我把它正确地保存到文件中,它就完美地打开了!
1条答案
按热度按时间tpxzln5u1#
如果这里所有这些可怕的代码只是为了向文件添加彩色行,那么您应该使用TRichEdit.SelAttributes with Friends:Colorful text in the same line in TRichEdit这样TRichEdit.SelAttributes将能够正确地处理编码。如果您需要一些花哨的文件页眉或页脚,而您不想从代码中创建,那么您可以创建具有所需页眉/页脚的空RTF文件,并将其用作模板。