用Delphi在Richedit中获取西里尔文字符串

enxuqcxy  于 2022-09-21  发布在  其他
关注(0)|答案(1)|浏览(285)

我有一个写字板文件(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’,现在我把它正确地保存到文件中,它就完美地打开了!

tpxzln5u

tpxzln5u1#

如果这里所有这些可怕的代码只是为了向文件添加彩色行,那么您应该使用TRichEdit.SelAttributes with Friends:Colorful text in the same line in TRichEdit这样TRichEdit.SelAttributes将能够正确地处理编码。如果您需要一些花哨的文件页眉或页脚,而您不想从代码中创建,那么您可以创建具有所需页眉/页脚的空RTF文件,并将其用作模板。

相关问题