2015-05-13 360 views
2

我試圖在沒有冒號的Inno安裝程序中獲得安裝路徑的驅動器號,如果驅動器號是C,它將返回一個空字符串。爲什麼我會收到「Variable Expected」編譯器錯誤?

調用函數:

{code:GetDriveLetter|{drive:{src}} 

功能:

function GetDriveLetter(DriveLetter: string): string; 
var 
    len: Integer; 
begin 
    len := CompareText(UpperCase(DriveLetter), 'C'); 
    if len = 0 then 
    begin 
    Result := ''; 
    end 
    else 
    begin 
    Result := Delete(UpperCase(DriveLetter), 2, 1); 
    end; 
end; 

我得到的編譯器錯誤:

Variable Expected

在這條線:

Result := Delete(UpperCase(DriveLetter), 2, 1); 

那條線有什麼問題?我如何解決這個功能?

回答

1

你有因爲Delete可變預計編譯器錯誤是要在其中有望通過一個聲明的程序string類型變量(然後在內部修改)。你沒有傳遞一個變量,而是一個UpperCase函數調用的中間結果。因此,要解決這個錯誤,你可以聲明一個變量,或使用預聲明Result一個,例如:

var 
    S: string; 
begin 
    S := UpperCase('a'); 
    Delete(S, 2, 1); 
end; 

除了我想指出的幾件事情。 Deleteprocedure,因此不會返回任何值,因此即使您傳遞了一個聲明的變量,也會失敗一個不存在的結果分配。功能已經是不區分大小寫的比較,所以不需要上層輸入。除了我不會比較整個輸入(例如,C:drive:常量返回),但只有第一個字符(但它取決於您想要使用的函數的安全性)。對於只有第一個字符的比較,我會寫這樣的東西:

[Code] 
function GetDriveLetter(Drive: string): string; 
begin 
    // we will upper case the first letter of the Drive parameter (if that parameter is 
    // empty, we'll get an empty result) 
    Result := UpperCase(Copy(Drive, 1, 1)); 
    // now check if the previous operation succeeded and we have in our Result variable 
    // exactly 1 char and if we have, check if that char is the one for which we want to 
    // return an empty string; if that is so, return an empty string 
    if (Length(Result) = 1) and (Result[1] = 'C') then 
    Result := ''; 
end; 
1

也許你想要這樣的事情?

[Code] 
function GetDriveLetter(DriveLetter: string): string; 
begin 
if CompareStr(DriveLetter, 'C:\') = 0 then 
    begin 
    Result := ''; 
    end 
    else begin 
    Result := Copy(DriveLetter, 1, 1); 
    end 
end; 

但你的榜樣是不是安裝路徑,但安裝程序源路徑...

相關問題