2016-04-14 9 views
1

Inno Setup için çalışan bir Pascal komut dosyası var, ancak yakın bir zamanda Unicode karakterleriyle ilgili bir soruna girdik. Ve Inno Kurulumunu Unicode sürümüne değiştirdikten sonra, mevcut komut dosyalarında hatalar var. Ve bu hata çok genel - Belirli bir satır için "Eşleşmiyor". Bizim ana betik dahil birçok diğer betikleri oluşan beri ben bu satırın doğru olup olmadığını emin değilim, ve aşağıdaki bu işlevi işaret eder ve Set of Char ile satır. Inno Kurulum belgelerine baktıktan sonra Unicode sürümünün bazı şeylerle ilgili biraz daha katı olduğunu ve ayrıca ANSI dizisi kullanımıyla ilgili bazı değişiklikler olduğunu (ve muhtemelen Char da) buldum.Inno Setup Unicode sürümünün Pascal Komut Dosyası'nda "char kümesi" hatası "Hata eşleşmesi" hatası

function IsValidName(Name: String):String; 
var 
    Valid_Ch: Set of Char; 
    Location: Integer; 
begin 
    Valid_Ch := ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '_', '-']; 
    Result := ''; 
    for Location := 1 to Length(Name) do 
    begin 
     if Name[Location] in Valid_Ch then 
     begin 
      Result := Result + Name[Location]; 
     end 
     else 
     begin 
      Result := Result + '_'; 
     end; 
    end;  
end; 

Bu bana göre güzel görünüyor, ancak Pascal'la ilk bağlantım bu. Daha deneyimli bir kişi bana bu konuda yardımcı olabilir eğer müteşekkir olurdu. Teşekkürler!

cevap

0

Pascal (Komut Dosyası) içinde set yalnızca 256 (2^8) değer içerebilir. Unicode Inno Kurulumunda char 2 bayttır, dolayısıyla 256 farklı değerden daha fazlasını içerebilir. Yani artık set ile kullanamazsınız. Ord() > 255

  • tüm karakterleri değiştirmek Veya set yerine string kullanmak Char ve Byte ve açık bir şekilde arasındaki

    • kullanın Byte ve döküm:

      İki seçeneğiniz vardır. Bir örnek için aşağıya bakın.

    Ayrıca, char-by-char dizesini eklemek oldukça verimsiz olabilir. Karakterleri yerine yerinde değiştirin.

    function IsValidName(Name: string): string; 
    var 
        Valid_Ch: string; 
        Location: Integer; 
    begin 
        Valid_Ch := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-'; 
        Result := Name; 
        for Location := 1 to Length(Result) do 
        begin 
        if Pos(Result[Location], Valid_Ch) = 0 then 
        begin 
         Result[Location] := '_'; 
        end; 
        end;  
    end; 
    
  • +0

    Bu işe yarıyor gibi görünüyor. Açıklama ve yardım için teşekkürler. –

    İlgili konular