我正在努力将一些Delphi 7代码移植到XE4,因此,unicode就是这里的主题.
我有一个方法,其中一个字符串被写入TMemoryStream,所以根据这篇embarcadero文章,我应该将字符串的长度(以字符为单位)乘以Char类型的大小,以获得所需的字节长度. WriteBuffer的长度(以字节为单位)参数.
所以之前:
rawHtml : string; //AnsiString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml);
Run Code Online (Sandbox Code Playgroud)
后:
rawHtml : string; //UnicodeString
...
memorystream1.WriteBuffer(Pointer(rawHtml)^, Length(rawHtml)* SizeOf(Char));
Run Code Online (Sandbox Code Playgroud)
我对Delphi的UnicodeString类型的理解是它内部是UTF-16.但我对Unicode的一般理解是,即使是2个字节也不能表示所有unicode字符,有些角落外壳字符将占用4个字节.embarcadero的另一篇文章似乎证实了我的怀疑,"事实上,一个Char等于两个字节甚至不总是这样!"
所以...这让我想知道是否Length(rawHtml)* SizeOf(Char)真的足够稳健以保持一致的准确性,或者是否有更好的方法来确定更准确的字符串大小?
我有一个这样的列表:
FMyScheduleList: TObjectList<TMySchedule>;
Run Code Online (Sandbox Code Playgroud)
它有一个属性:
property ADate: TDate read FDate write FDate;
Run Code Online (Sandbox Code Playgroud)
如何通过此属性对列表进行排序?
我希望我在某种程度上感到困惑.我TRect.Intersect和and 有一些不一致的行为TRect.IntersectsWith.这是一些演示此问题的代码.
program RectCheck;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Types,
Vcl.Dialogs;
var
rect1: TRect;
rect2: TRect;
combinedRect: TRect;
begin
Rect1 := Rect(0,0,200,101);
Rect2 := Rect(0,100,200,200);
if Rect1.IntersectsWith(Rect2) then
begin
// We have interesected, get the combined rect
combinedRect := TRect.Intersect(Rect1, Rect2);
if not combinedRect.IsEmpty then
ShowMessage(Format('Our new rect (%d, %d), (%d, %d)',
[combinedRect.Left, combinedRect.Top, combinedRect.Right, combinedRect.Bottom]))
else
raise Exception.Create('They were supposed to intersect!');
end;
Rect1 := Rect(0,0,200,100);
Rect2 := Rect(0,100,200,200);
if Rect1.IntersectsWith(Rect2) then
begin
// …Run Code Online (Sandbox Code Playgroud) 我正在编写我的第一个delphi驱动的iPhone应用程序.我已创建它但我希望它被命名为.dpr文件的名称以外的东西,因为dpr文件不能包含空格,例如,EXE名称并不总是与人们可以分配应用程序的名称相同.
在Windows Delphi应用程序中,EXE的名称与.dpr文件的名称相同,因为快捷方式中的英文名称,或桌面上或任何其他非英语位置的开始菜单中的本地化名称不一定是与项目名称相同.在iOS中,应用程序短名称可能包含空格,而Delphi项目名称则不能,因此我很惊讶地看到这两者是硬连接在一起的.
在XCode中,您可以单独在iOS主屏幕上设置软件包名称,项目名称和可见名称.
我的问题是,因为我今天刚安装了Delphi XE4(RTM),我正在尝试:
我可以在项目选项中的某处设置捆绑ID吗?我似乎找不到它.Bundle id对于任何朝向app store的应用程序非常重要,但我看不到可以设置它的UI元素.
我还可以在某处设置显示名称吗?
我可以在某处查看和编辑应用程序的.plist(Apple要求所有应用程序在iOS上拥有的属性列表),还是为我生成而无法查看或修改它?似乎.plist文件位于Windows的Debug \文件夹中的磁盘上,这意味着Delphi XE4将其视为输出工件而不是输入源文档,就像在Xcode项目中一样.
我正在尝试调试仅在我的大型应用程序 - 在XE3中正常工作 - 在使用XE4编译后运行时才出现的行为.该问题似乎导致一些引用的字符串(例如"MyString")即使在由Web.HTTPProd中的TPageProducer"解除引用"之后仍保留其引号.例如,考虑以下代码,该代码是来自此Delphi源单元Web.HTTPApp的小提取:
procedure ExtractHeaderFields(Separators, _WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings; Decode: Boolean; StripQuotes: Boolean = False);
{$ENDIF NEXTGEN}
var
Head, Tail: PChar;
EOS, InQuote, LeadQuote: Boolean;
QuoteChar: Char;
ExtractedField: string;
{$IFNDEF NEXTGEN}
WhiteSpaceWithCRLF: TSysCharSet;
SeparatorsWithCRLF: TSysCharSet;
{$ENDIF !NEXTGEN}
function DoStripQuotes(const S: string): string;
var
I: Integer;
InStripQuote: Boolean;
StripQuoteChar: Char;
begin
Result := S;
InStripQuote := False;
StripQuoteChar := #0;
if StripQuotes then
begin
for I := Result.Length - 1 downto 0 do
if Result.Chars[I].IsInArray(['''', '"']) then …Run Code Online (Sandbox Code Playgroud) 在以下类型中:
MyClass = class(TInterfacedPersistent)
private
FMyProperty: Integer;
published
procedure setMyProperty(Value: Integer); virtual;
property MyProperty: Integer read FMyProperty write setMyProperty;
Run Code Online (Sandbox Code Playgroud)
我想通过RTTI知道"MyProperty"属性的setter方法的名称.我尝试过以下方法:
procedure ShowSetterMethodsNames(pMyObject: TObject);
var
vPropList: TPropList;
vCount, I: Integer;
begin
vCount:= GetPropList(pMyObject.ClassInfo, tkProperties, @vPropList);
for I:= 0 to vCount -1 do
begin
if Assigned(vPropList[I]^.SetProc) then
ShowMessage(pMyObject.ClassType.MethodName(vPropList[I]^.SetProc));
end;
end;
Run Code Online (Sandbox Code Playgroud)
虽然指针不是nil,但我所有的都是空消息.有人给我一些小费吗?
PS:我正在使用Delphi XE4,我知道我应该使用扩展RTTI而不是经典,但无论如何,我不能在两个功能中做我想要的...所以,任何帮助将不胜感激.谢谢你的回复.
最终版,问题解决了:
这是代码工作,基于(我的朋友和...的帮助)RTTI单元(TRTTIInstanceProperty类的DoSetValue方法):
procedure ShowVirtualSettersNames(pObject: Pointer);
var
vSetter, vPointer: Pointer;
vPropList: TArray<TRttiProperty>;
vProp: TRttiProperty;
begin
vPropList:= RTTIUtils.ExtractProperties(TObject(pObject).ClassType); // Helper to get properties from a type, based in extended RTTI
for …Run Code Online (Sandbox Code Playgroud) 我希望按钮大小(宽度和高度)尽可能小,但我希望它适合文本.任何代码示例?Delphi XE4 FireMonkey移动应用程序.
对不起,如果我的问题很愚蠢!
我正在使用Delphi XE4,现在我正在努力IdTelnet.但我遇到了OnDataAvailable事件的问题.看看这张图:

所以我无法使用OnDataAvailableEvent.
这是因为Delphi XE4吗?我该如何解决?
谢谢
如今,一个很简单的问题来到我的脑海里,当我不得不重写TObject的BeforeConstruction方法:
为什么TObject方法AfterConstruction和BeforeConstruction有public知名度?
我希望他们是protected.他们不是的原因是什么?
我无法想象调用AfterConstruction或BeforeConstruction不调用该类的构造函数或析构函数的有效目的.你呢?
我公司主要产品的GUI是在90年代后期用Delphi编写的,并且已经更新到Delphi 2007.我正在与一个小组合作将Delphi 2007更新为XE4.
我们仍然使用ADL VCL中的许多组件(类似于DevExpress,但现在已经不存在),但还没有安装整个软件包.相反,我们需要的文件位于与我们的项目文件夹分开的文件夹中,并且具有指定这些文件的路径:工具 - 选项 - 库 - 浏览路径和项目 - 选项 - 搜索路径
当我打开main时,我收到错误:"找不到TADLAboutBox.忽略错误并继续?"
定义"ADLAboutBox"的单元"ADLAbout"在main的uses子句中声明.而且,我们的项目编译得很好.
我怎样才能摆脱这些消息?可能有什么问题?
非常感谢您的建议.
delphi ×10
delphi-xe4 ×10
button ×1
delphi-ios ×1
firemonkey ×1
ide ×1
indy ×1
indy10 ×1
reflection ×1
rtti ×1
sorting ×1
string ×1
telnet ×1
text ×1
tobject ×1
unicode ×1