Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
ВнизФормы из D6 в D5? Найти похожие ветки
← →
mahortov (2002-03-27 13:58) [0]Подскажите пожалуйста каким образом можно перевести формы из Delphi 6 в Delphi 5.
← →
PVOzerski (2002-03-27 15:06) [1]Вообще-то, по крайней мере по умолчанию DFM в D6 текстовые. А еще в комплект Delphi входит
утилитка convert.exe, которая превращает DFM из бинарника в текст и обратно (см. её синтаксис при
запуске в консоли без параметров). Единственно, есть 2 неудобства:
1) Для новосоздаваемого файла надо давать новое имя или расширение;
2) Название утилиты совпадает со стандартной командой W"NT (переделка диска в NTFS),
так что при работе в системах NT её надо либо запускать из того каталога, где она находится,
либо по полному пути, либо переименовывать.
← →
McSimm (2002-03-27 15:23) [2]К сожалению, недостаточно привести форму к текстовому виду. Проблема совместимости возникает из-за того, что Д6 сохраняет строковые значения в Unicode формате.
Решение проблемы, похоже, уже было на этом форуме. К сожалению ветка уже умерла. Вот ее цитирование:
---
Alx2 © (06.03.02 12:43)
Если интересно, вот код:
Procedure TForm1.Button1Click(Sender: TObject);
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;
Begin
Result := "";
While Lexem(K, Str) Do
Result := Result + Str;
If Result <> "" Then
Result := """" + Result + """" + Copy(S, K, Length(S))
Else Result := S;
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
If OpenDialog1.Execute Then
Begin
SList := TStringList.Create;
Try
SList.LOADFROMFILE(OpenDialog1.Filename);
For K := 0 To SList.Count - 1 Do
If isChanges(SList[K], Res) Then
SList[K] := Res;
Finally
SList.SaveToFile(OpenDialog1.FileName); // Храним в тот же файл.
SList.Free;
End;
End;
End;
stikr (06.03.02 13:16)
что касается избыточности как и советовали "просто жал "игнорировать"" и о чудо все как и было...
----
← →
Alx2 (2002-03-27 15:34) [3]Вмешаюсь-таки :)
В прошлом издании были некоторые помарки.
Вот исправленный вариант:
Procedure TForm1.Button1Click(Sender: TObject);
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, L : Integer;
Res : String;
Begin
If OpenDialog1.Execute Then
Begin
For L := 0 To OpenDialog1.Files.Count - 1 Do
Begin
SList := TStringList.Create;
Try
SList.LOADFROMFILE(OpenDialog1.Files[L]);
For K := 0 To SList.Count - 1 Do
If isChanges(SList[K], Res) Then
SList[K] := Res;
Finally
SList.SaveToFile(OpenDialog1.Files[L]);
SList.Free;
End;
End;
End;
End;
Примечание:
Опция ofAllowMultiSelect у OpenDialog1 должна быть True, чтобы можно было выделить все dfm и все их конвертнуть. (перед этим этом надо бы сделать резервные копии, так как dfmы перезаписываются.)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c