2015-11-22 18 views
2

我正在爲存儲庫構建SQL查詢構建器。此構建器將查找查詢的所有必填字段並創建SQL文本。爲此,我使用Format()過程。但是,我在運行時創建必須傳遞給Format過程的TVarRec數組時遇到問題。德爾福:如何使用格式()與運行時構建的TVarRec數組?

使用像Format('%s,%s',['AString','AnotherString']);`這樣的常量很容易構建這個數組。但是我們在運行時如何創建它?

這裏是我的方法的簡化版本:

procedure BuildString; 
begin 

    FStrings := TStringList.Create; 

    FStrings.Add('String 1'); 
    FStrings.Add('String 2'); 
    FStrings.Add('String 3'); 

    FFormatString := '%0:s, %1:s, %2:s'; 

    SetLength(FFormatStringParams, FStrings.Count); 

    for I := 0 to FStrings.Count - 1 do 
    begin 
     aString := FStrings.Strings[I]; 
     FFormatStringParams[I].VString := Addr(aString); 
    end; 

    ShowMessage(Format(FFormatString, FFormatStringParams)); 

end; 

但是當我運行它,我得到錯誤「格式 '%0:S,%1:S,%2:S' 是無效或參數」

我明白,我錯誤地建立TVarRec陣列,我必須通過格式程序。任何人都可以幫我在這不兼容?

謝謝。

回答

3

您正在傳遞字符串變量的地址而不是其值。此外,您正在分配VString字段,該字段預計爲ShortString。您正在提供本地String

更換

VString := Addr(aString) 

VUnicodeString := Pointer(aString) 

此外,你需要通過分配VType字段指定字符串類型。

for I := 0 to FStrings.Count - 1 do 
begin 
    aString := FStrings.Strings[I]; 
    FFormatStringParams[I].VType := vtUnicodeString; 
    FFormatStringParams[I].VUnicodeString := Pointer(aString); 
end; 
+0

非常感謝。那樣做了! – Ludo

+0

@Remy你的編輯很奇怪。 –

+0

FWIW,@Ludo,如果你真的想操作'TVarRec's,請閱讀我關於[開放數組參數和const數組]的文章(http://www.rvelthuis.de/articles/articles-openarr.html)。它還顯示可幫助您執行此操作的代碼。 –