Итак код работы с DFM.
Код: Выделить всё
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
FS->Dirs=Brows->Path;
FS->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FSFound(TObject *Sender, PLMDSPFileRecord filedata)
{
Memo1->Lines->Add(filedata->Directory+filedata->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FSEnd(TObject *Sender)
{
while(Form1->Memo1->Lines->Count>0)
{
Form1->M->Lines->LoadFromFile(Form1->Memo1->Lines->operator [](0));
Form1->M->Text=ProcessingDFM(Form1->M->Text);
Form1->M->Lines->SaveToFile(Form1->Memo1->Lines->operator [](0));
Form1->Memo1->Lines->Delete(0);
}
M->Lines->Clear();
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ProcessingDFM(AnsiString Text)
{
int Addr=0;
AnsiString Symb,Str;
AnsiString NewText="";
int Pos1=0,Pos2=0,LastPos=1;
bool MultiString=false;
bool AnsiMode=false;
while(Addr<Text.Length()-1)
{
if(Pos1==0)
{
Symb=Text.SubString(Addr,3);
if(Symb=="= #")
{
Pos1=Addr+2;
Addr+=2;
}
if(Symb=="= '")
{
Pos1=Addr+2;
Addr+=2;
AnsiMode=true;
}
if(Pos1>0)
{
NewText=NewText+Text.SubString(LastPos,Pos1-LastPos);
}
}
else
{
Symb=Text.SubString(Addr,2);
if(Symb=="\r\n")
{
Pos2=Addr;
}
if(Pos2>0)
{
Str=Text.SubString(Pos1,Pos2-Pos1);
Str=ToAnsi(Str);
Str=Translate(Str);
Str=ToDFM(Str);
NewText=NewText+Str;
LastPos=Pos2;
Pos1=0;
Pos2=0;
}
}
Addr++;
//Symb,Str
}
NewText=NewText+Text.SubString(LastPos,Text.Length()-LastPos+1);
return NewText;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ToAnsi(AnsiString Str)
{
ASymbol AS;
WSymbol WS;
AnsiString Symb=" ";
char* CStr=Symb.c_str();
bool AnsiMode=false;
AnsiString Res="";
AnsiString NumStr;
int Addr=1;
int Pos1=0,Pos2=0;
while(Addr<=Str.Length())
{
Symb=Str.SubString(Addr,1);
if(Symb=="#" && !AnsiMode)
{
if(Pos1==0)
{
Pos1=Addr+1;
}
else
{
Pos2=Addr;
NumStr=Str.SubString(Pos1,Pos2-Pos1);
WS.Code=(WORD)NumStr.ToInt();
Res=Res+WideCharLenToString(&WS.Symb,1);
Pos1=Pos2+1;
Pos2=0;
}
}
if(Symb=="'")
{
if(Pos1!=0 && !AnsiMode)
{
Pos2=Addr;
NumStr=Str.SubString(Pos1,Pos2-Pos1);
WS.Code=(WORD)NumStr.ToInt();
Res=Res+WideCharLenToString(&WS.Symb,1);
Pos1=Pos2+1;
Pos2=0;
}
if(!AnsiMode)
{
Pos1=Addr+1;
AnsiMode=true;
}
else
{
Pos2=Addr;
Res=Res+Str.SubString(Pos1,Pos2-Pos1);
AnsiMode=false;
Pos1=0;
Pos2=0;
}
}
Addr++;
}
if(Pos1!=0 && !AnsiMode)
{
Pos2=Addr;
NumStr=Str.SubString(Pos1,Pos2-Pos1);
WS.Code=(WORD)NumStr.ToInt();
Res=Res+WideCharLenToString(&WS.Symb,1);
}
return Res;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::Translate(AnsiString Text)
{
return _(Text);
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ToDFM(AnsiString Str)
{
ASymbol AS;
WSymbol WS;
AnsiString Symb=" ";
char* CStr=Symb.c_str();
bool AnsiMode=false;
AnsiString Res="";
int Addr=1;
while(Addr<=Str.Length())
{
Symb=Str.SubString(Addr,1);
CStr=Symb.c_str();
AS.Symb=*CStr;
StringToWideChar(AS.Symb,&WS.Symb,sizeof(WideChar));
if((WS.Code<0x80 && WS.Code>=0x20)&&(WS.Code!=0x27))
{
if(!AnsiMode)
{
AnsiMode=true;
Res=Res+"'";
}
Res=Res+Symb;
}
else
{
if(AnsiMode)
{
AnsiMode=false;
Res=Res+"'";
}
Res=Res+"#"+IntToStr(WS.Code);
}
Addr++;
}
if(AnsiMode)
{
AnsiMode=false;
Res=Res+"'";
}
return Res;
}
В результате получается абсолютно такой же DFM.
Осталось переводилку подключить
Последний раз редактировалось
DJ VK 14 окт 2010, 13:40, всего редактировалось 5 раз.