Eski bir projeyi içine Rusça, Çekçe ve Lehçe eklemek için Delphi7'den Delphi2010 aktardım. Bu aktarmada formları yeniden oluşturdum ve sadece kodu aynen aldım. Sonra bütün stringleri Ansistring olarak değiştirdim. Aynen Char değişkenlerini Ansichar yaptım. Son olarak dosya içinde arama yapan bir program olduğundan test ettiğimde arama yapmadığını gördüm. Bir süre araştırdıktan sonra PosEx komutunun başlangıcının D7 gibi 0 değilde 1 olması gerekiyormuş, düzelttim. Program Türkçe ve İngilizce yüklü bütün sürümlerde çalışıyor.
Fakat Çekçe (gönderdiğim birisinde test ettim) bir işletim sisteminde bulması gerekenleri (yüklenen dosyanın içinde önceden tanımlı hex stringleri) bulmuyor. Kontrol ettim, döngü tamamen Ansi üzerinden geliyor. Oysa aynı kopya benim bilgisayarımda hiçbir sorun olmadan çalışıyor.
- Çekçe veya diğer dillerin Unicode olarak menüye, mesaj kutularına yansımasından hiçbir sorun yok.
- Delphi 2010'da stringlerin Unicode olduğunu bildiğim için hepsini Ansistring yaptım.
Kullanıcının bilgisayarına bağlanıp orada da çalıştım fakat bir türlü sonuç alamadım.
Aşağıdaki bu procedure Türkçe ve İngilizce işletim sistemlerinde gayet güzel çalışıyor. Ama Unicode diller (Çekçe ve büyük ihtimalle Lehçe) dillerinde PosEx ile arama işlemi hep 0 oluyor. İşin içinden çıkamadım maalesef ve sormaya karar verdim.
Kod: Tümünü seç
Patch Proc V1.0
----------------------------------------------------
filebuf = File buffer
sstr = Search string
pfar = patch point far from finding point
pval1, pval2 = patch bytes
psize = patch size, if 0 patch until end1 and end2 byted
end1, end2 = patch limited sign if psize = 0
posnext = start point for PosEx search command
fpath = Full path loaded file
fsize = Filesize loaded file
}
Procedure PatchPro(var filebuf:Ansistring; sstr:Ansistring; pfar: integer; pval1: byte; pval2:byte; psize: integer; end1:byte; end2:byte; posnext:integer; fpath : Ansistring; fsize:integer);
var
sstr2, filebuf2,fpath2 : Ansistring;
pbool: Boolean;
begin
sstr2 := sstr;
filebuf2 := filebuf;
fpath2 := fpath;
if posnext = 0 then inc(posnext);
try
pbool := False;
posnext := lastpos;
c := PosEx(AnsiString(sstr2),AnsiString(filebuf2),posnext);
if c = 0 then
begin
Form1.sMemo1.Lines.add(im(07)+IntToStr(findcount)+ im(08)); // ortak mesajlar
findkey := False;
exit;
end;
if c <> 0 then
begin
if meskey = False then goto p2;
//Dosyayı patchleme kısmı
...