Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Преобразование Unicode строк в DFM файлах Delphi 6 в Ansi строки

Delphi , Синтаксис , Преобразования

Преобразование Unicode строк в DFM файлах Delphi 6 в Ansi строки

Автор: Alx2
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Преобразование Unicode строк в DFM файлах Delphi 6 в Ansi строки.

При попытке открыть проект созданный в Delphi 6 из Delphi 5 возникает
проблема с чтением DFM-файла. Проблема заключается в том, что Delphi5
не может прочитать строки, записанные в формате Unicode (WideString).

Данная функция переводит строки из DFM файла в формат ANSI, после чего
DFM файл читается в D5. Но при этом может возникнуть проблема, связанная
с незнакомыми для D5 свойствами компонентов, которая, в свою очередь,
решается игнорированием этих свойств.

Зависимости: Classes
Автор:       Радионов Алексей (Alx2), alx@argo.mv.ru, ICQ:113442587, Ульяновск
Copyright:   Alx2
Дата:        31 мая 2002 г.
***************************************************** }

procedure RemoveUnicodeFromDFM(const Filename: string);
  function isChanges(const S: string; var Res: string): Boolean;
  var
    len: Integer;
    function LexemSharp(var K: Integer): Boolean;
    begin
      Result := (K < len) and (S[K] = '#');
      if Result then
      begin
        inc(K);
        while (K <= len) and (S[K] in ['0'..'9']) do
          inc(K);
      end;
    end;
    function LexemAp(var K: Integer): Boolean;
    begin
      Result := (K < len) and (S[K] = '''');
      if Result then
      begin
        inc(K);
        while (K <= len) and (S[K] <> '''') do
          inc(K);
        if K <= len then
          inc(K);
      end;
    end;

    function Lexem(var K: Integer; var Str: string): Boolean;
    var
      Start: Integer;
      ValS: string;
    begin
      Result := False;
      Start := K;
      if LexemSharp(K) then
      begin
        ValS := Copy(S, Start + 1, K - Start - 1);
        Str := WideChar(StrToInt(ValS));
        Result := True;
      end
      else if LexemAp(K) then
      begin
        Str := Copy(S, Start + 1, K - Start - 2);
        Result := True;
      end;
    end;

    function Prepare(var K: Integer): string;
    var
      Str: string;
      WasLexem: Boolean;
    begin
      Result := '';
      WasLexem := False;
      while Lexem(K, Str) do
      begin
        Result := Result + Str;
        WasLexem := True;
      end;
      if Result <> '' then
        Result := '''' + Result + '''' + Copy(S, K, Length(S))
      else if not WasLexem then
        Result := S
      else
        Result := '''''';
    end;
    function Min(A, B: Integer): Integer;
    begin
      if A = 0 then
        Result := B
      else if B = 0 then
        Result := A
      else if A > B then
        Result := B
      else
        Result := A;
    end;

  var
    StartIdx: Integer;
  begin
    Result := False;
    StartIdx := Min(Pos('#', S), Pos('''', S));
    if StartIdx > 0 then
    begin
      len := Length(S);
      while (StartIdx <= len) and (not (S[StartIdx] in ['#', ''''])) do
        inc(StartIdx);
      if StartIdx < len then
      begin
        Res := Copy(S, 1, StartIdx - 1) + Prepare(StartIdx);
        Result := True;
      end;
    end;
  end;

var
  SList: TStringList;
  K: Integer;
  Res: string;
begin
  SList := TStringList.Create;
  try
    SList.LOADFROMFILE(Filename);
    for K := 0 to SList.Count - 1 do
      if isChanges(SList[K], Res) then
        SList[K] := Res;
    SList.SaveToFile(Filename);
  finally
    SList.Free;
  end;
end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
var
  K: Integer;
begin
  if OpenDialog1.Execute then
    for K := 0 to OpenDialog1.Files.Count - 1 do
      RemoveUnicodeFromDFM(OpenDialog1.Files[K]);
end;

Эта функция Delphi, написанная Alx2, конвертирует строковые значения в файле DFM (Delphi Form Files) из формата Unicode в формат ANSI, позволяя файл быть прочитанным Delphi 5.

Функция RemoveUnicodeFromDFM принимает имя файла в виде параметра и читает файл построчно. Для каждого строки она проверяет, есть ли символ '#' или ''' на начальной позиции строки. Если так, она извлекает строковое значение (WideChar в Delphi) между этими символами и конвертирует его в ANSI с помощью функции StrToInt. Конвертированное значение затем записывается обратно в оригинальную строку.

Функция использует несколько вложенных функций для выполнения этого преобразования:

  • LexemSharp: ищет символ '#'followed by one or more digits
  • LexemAp: ищет символ 'followed by zero or more characters until another ' is found
  • Lexem: вызывает либо LexemSharp, либо LexemAp и возвращает извлеченное строковое значение
  • Prepare: вызывает Lexem повторно, чтобы извлечь все строковые значения из строки, и конкатенирует их с оригинальной строкой (если она есть)

Функция также обрабатывает случаи, когда в строке нет символов '#' или ''', в которых случае она просто копирует оригинальную строку.

Для использования этой функции вам нужно создать форму с кнопкой и компонентом OpenDialog. В обработчике события клика по кнопке вызовите RemoveUnicodeFromDFM для каждого файла, выбранного пользователем с помощью OpenDialog.

Некоторые предложения по улучшению:

  1. Используйте более описательное имя переменной вместо K.
  2. Рассмотрите добавление обработки ошибок для случаев, когда файл не существует или не может быть прочитан.
  3. Вы можете использовать библиотеку регулярных выражений (например, RegEx) для упрощения парсинга строковых значений в файлах DFM.
  4. Если вам нужно сохранить оригинальный файл, рассмотрите создание резервной копии перед его изменением.

Пример использования этой функции:

procedure TForm1.Button1Click(Sender: TObject);
var
  K: Integer;
begin
  if OpenDialog1.Execute then
    for K := 0 to OpenDialog1.Files.Count - 1 do
      RemoveUnicodeFromDFM(OpenDialog1.Files[K]);
end;

В этом примере обработчик события клика по кнопке вызывает RemoveUnicodeFromDFM для каждого файла, выбранного пользователем с помощью OpenDialog.

Преобразование Unicode строк в DFM файлах Delphi 6 в Ansi строки позволяет открыть проект, созданный в Delphi 6, в Delphi 5, исправляя проблему чтения DFM-файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Преобразования ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:22:10/0.0061748027801514/1