我正在使用Delphi XE2。很自我解釋的問題。我有一個變體,我在其中存儲單個字符(例如'?'),我想將它轉換爲AnsiChar。如果我不能投射它,那我該如何轉換它。我試圖按照通常的方式投射,但沒有奏效。我試着在Google上搜索,發現沒有簡單的答案。我對unicode轉換理論不感興趣。我正在尋找一行或兩行delphi代碼中的參考信息。如何將變體轉換爲(或轉換爲)AnsiChar?
3
A
回答
6
這是做這件事:
v : Variant;
a : AnsiChar;
...
v := AnsiChar('a'); // Will be stored as an AnsiString
// Check variant
if VarIsStr(v) and (Length(AnsiString(v)) = 1) then
a := AnsiString(v)[1]; // Cast variant holding an AnsiString to an AnsiChar
//Another way
if (VarType(v) = varString) and (Length(AnsiString(v)) = 1) then
a := AnsiString(v)[1]; // Cast variant holding an AnsiString to an AnsiChar
的變體可以容納不同的字符串類型(AnsiString類型= varString,的UnicodeString = varUString和WideString的= varOleStr)。
如果要存儲的屬於ANSIChar在你變一個字節:
v := Byte(AnsiChar('A')); // Will be stored as a byte
if (VarType(v) = varByte) then
a := AnsiChar(Byte(v));
注:存儲的ANSIChar類型爲一個字節與一個AnsiString類型是比較喜歡的,因爲你避免堆分配。
注意到在您指定的變量爲註釋:
v := 'c';
這意味着你的變種字符串將在varUString
格式。
if (Vartype(v) = varUString) and (Length(String(v)) = 1) then
a := AnsiChar(String(v)[1]);
如果您想覆蓋所有的基地,有一個參加的所有變型的轉換例程:
function GiveMeThatAnsiCharFromVariant(const v: Variant; var a: AnsiChar): Boolean;
// Accepts UnicodeString,AnsiString,WideString,byte for conversion to AnsiChar;
begin
Result := False;
if VarIsStr(v) then
begin
case VarType(v) of
varString :
if (Length(AnsiString(v)) = 1) then
begin
a := AnsiChar(AnsiString(v)[1]);
Result := True;
end;
varUString :
if (Length(String(v)) = 1) then
begin
a := AnsiChar(String(v)[1]);
Result := True;
end;
varOleStr :
if (Length(Widestring(v)) = 1) then
begin
a := AnsiChar(Widestring(v)[1]);
Result := True;
end;
end;
end
else
begin
if (VarType(v) = varByte) then
begin
a := AnsiChar(Byte(v));
Result := True;
end;
end;
end;
+1
+1用於識別在變體中存儲字符的正確方法 –
5
如果你的變種持有一個AnsiChar(存儲爲AnsiString),你可以訪問TVarData
的VString
字段,然後將該值轉換爲AnsiString。像這樣
var
v : Variant;
a : AnsiChar;
begin
v:=AnsiString('a'); //this is a variant holding a single AnsiChar
if (TVarData(v).VType=varString) and (TVarData(v).VString<>nil) then
a:=AnsiString(TVarData(v).VString)[1];// or a:= AnsiString(v)[1];
如果變體抱着一個字符(被存儲爲一個字符串),你可以訪問TVarData
的VUString
領域再投價值AnsiString類型。像這樣
v:=String('a');
if (TVarData(v).VType=varUString) and (TVarData(v).VUString<>nil) then
a:= AnsiString(VarToStr(v))[1];
相關問題
- 1. 如何將AnsiChar轉換爲WideChar?
- 2. 將TMemoryStream轉換爲變體
- 3. 如何將變體轉換爲TADOConnection.ConnectionObject?
- 4. 將Char轉換爲AnsiChar或WideChar(德爾福)
- 5. 將Delphi變體記錄轉換爲C#
- 6. 將變體轉換爲布爾
- 7. 將BoxGeometry轉換爲球體
- 8. 將EntityReference轉換爲實體
- 9. 如何將ttf字體轉換爲pff2?
- 10. 如何將Unicode字體轉換爲ansi
- 11. 如何將函數體轉換爲lambda?
- 12. 將.innerHTML或.value轉換爲變量
- 13. 如何將字符串值轉換(或轉換)爲整數值?
- 14. 如何將java.io.File轉換或轉換爲java.io.List?
- 15. 如何將cairo-pdf轉換爲eps,而無需將字體轉換爲輪廓
- 16. 如何將NSData轉換爲NSArray(或NSObject)
- 17. 如何將NSString *轉換爲ANTLR3_UINT8或ANTLR3_UINT16
- 18. 如何將PCWSTR轉換爲char []或wchar_t []
- 19. 如何將LPWSTR *(或WCHAR *)轉換爲LPWSTR
- 20. 如何將Xmlstring轉換爲Xmlfile或QDomDocument
- 21. 如何將userdata轉換爲uint32或float?
- 22. 如何將ArrayCollection轉換爲xmllistcollection或xmllist
- 23. 如何將UIImage轉換爲NSData或CFDataRef?
- 24. 如何將FMX.Graphics.TBitmap轉換爲VCL.Graphics.TBitmap或Vcl.Imaging.PngImage.TPngImage?
- 25. 如何將'char'或''TBuf'轉換爲'TPtrC8'?
- 26. 如何將IntPtr轉換爲Cursor或SafeHandle?
- 27. 如何將unsafe.Pointer轉換爲reflect.Type或reflect.Value
- 28. 如何將輸出轉換爲變量?
- 29. 如何將php變量轉換爲javascript
- 30. 如何將$ username變量轉換爲javascript
它是如何被存儲於變形。它應該被存儲爲一個整體類型。 –
這只是一廂情願的想法。事實上,你沒有在這個變體中存儲的角色。您已在變體中存儲了一個字符串。這當然是你爲什麼試圖失敗的原因。如果您想存儲單個字符,請這樣做而不是使用字符串。 –
我認爲這是諷刺,但我不確定你在做什麼 –