发现VCL样式的故障:当您更新表单标题时,之前在同一过程中重绘的其他控件不会重新绘制,并且您被迫调用Repaint,从而丢失了重绘的宝贵处理时间.
示例:(手动设置项目选项/ vcl样式)
unit Unit11;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm11 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form11: TForm11;
implementation
{$R *.dfm}
procedure TForm11.Button1Click(Sender: TObject);
begin
Panel1.Caption := 'test';
caption := 'glitch';
end;
end.
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 89
ClientWidth = 352
Color = clBtnFace
Font.Charset …Run Code Online (Sandbox Code Playgroud) 我正在移植一些32到64位delphi的应用程序,它们进行了大量的文本处理,并注意到处理速度的极端变化.例如,使用一些程序进行了一些测试,这比64位的时间已经超过200%,而编译为32(2000 + ms与~900相比)
这是正常的吗?
function IsStrANumber(const S: AnsiString): Boolean;
var P: PAnsiChar;
begin
Result := False;
P := PAnsiChar(S);
while P^ <> #0 do begin
if not (P^ in ['0'..'9']) then Exit;
Inc(P);
end;
Result := True;
end;
procedure TForm11.Button1Click(Sender: TObject);
Const x = '1234567890';
Var a,y,z: Integer;
begin
z := GetTickCount;
for a := 1 to 99999999 do begin
if IsStrANumber(x) then y := 0;//StrToInt(x);
end;
Caption := IntToStr(GetTickCount-z);
end;
Run Code Online (Sandbox Code Playgroud) 在Delphi XE2之前,我们只使用VCL来创建GUI应用程序.Delphi XE2声明:
警告:FireMonkey(FMX)和可视组件库(VCL)不兼容,不能在同一项目或应用程序中使用.也就是说,应用程序必须只有一个或另一个,FireMonkey或VCL.不兼容性是由FireMonkey(FMX)和VCL之间的框架差异引起的.
我的应用程序是一个使用运行时包构建的纯VCL应用程序.所有VCL表单都存储在运行时包中.如果我要创建一个FireMonkey表单并存储在一个包中,我是否有机会在运行时在我的VCL应用程序中实例化这个FireMonkey表单?所以我可能会喜欢FireMonkey的3D或HD效果.
有没有人通过运行/附加到64位应用程序来成功调试64位dll?我有应用程序和DLL的Delphi代码.我可以用32位和64位调试应用程序.我也可以通过使用Run- > Parameters来调试32位dll 来选择32位版本的应用程序.
但是,我似乎无法通过运行64位应用程序调试我的64位DLL,有没有人让这个工作?
通常,使用Windows,我将应用程序的数据保存在用户文件夹(%appdata%)中.
为此,我使用ExpandEnvironmentStrings链接到Windows 的函数来获取我需要的文件夹,并将其存储在我的inifile子文件夹中.
有没有最佳实践来管理它并符合所有支持的平台(Windows 32b,64b和Mac)?
我成功地测试过:
procedure TfrmMain.SaveSettings;
var
fnINI: TFileName;
ini : TIniFile;
begin
fnINI := IncludeTrailingPathDelimiter(GetHomePath) + IncludeTrailingPathDelimiter(APP_NAME) + ChangeFileExt(APP_NAME, '.ini');
if ForceDirectories(ExtractFilePath(fnINI)) then
begin
ini := TIniFile.Create(fnINI);
try
ini.WriteString(INI_CONNECTION, INI_IP, edtIP.Text);
finally
ini.Free;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud) 如果我试图调用一个记录类型(不是对象)作为参数的过程,是否有可能以某种方式传递该参数"inline"的细节而不必先声明该类型的变量?
假设我有这种简单的记录类型:
type TMyRecord = record
AString: string;
AnInt: Integer;
end;
Run Code Online (Sandbox Code Playgroud)
和这个程序声明:
procedure MyProcedure(Rec: TMyRecord);
Run Code Online (Sandbox Code Playgroud)
如果我想调用MyProcedure,我必须声明TMyRecord类型的变量,或者我可以执行以下操作:
MyProcedure(TMyRecord("Test", 10));
Run Code Online (Sandbox Code Playgroud)
这不起作用(XE2)(得到关于它的编译器错误,期望")").
那么,我可以这样做吗?或者不可能.
谢谢
在Delphi XE2中,我在一对设计/运行时包中有一个控件.最初,一切都很好.我已经多次建造了它们.突然间没有任何警告,设计时间包开始在我的一个单位抱怨Graphics我建造时单元缺失.Graphics是一个标准单位,但在这一个地方找不到.我甚至没有对这个单位做过任何改动,据我所知,任何可能影响这个的变化.
这里只是本单元顶部(界面)的用途:
uses
Graphics, ColorConv, Classes, Dialogs, ZLib;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它是一个非常简单的单元,我只对这个项目进行了非常简单的更改.有什么可以让它开始抱怨这一点?
奇怪的是,如果我安装它,一切正常,它只是不构建.
有相当多的代码,我不想发布整个事情.
在多监视器系统上,"空白"VCL应用程序可以最大化,但启用了样式的相同应用程序(以及一个默认选择的应用程序)最大化不正确.我所看到的是窗口的右侧边缘延伸到第二台显示器(我的主要位于左侧).当我开始与其他Windows应用程序进行比较时,我注意到在Windows 7(至少)下,最大化的窗口甚至在左侧,右侧或底侧都没有非客户端边框.事实上,标准VCL(非样式)应用程序的行为方式相同,没有非客户端边界.
我该如何解决?我注意到TFormStyleHook有一个WMNCCalcSize的处理程序,我还没有解剖,但让我想知道VCL是否可能错误地处理这个消息以获得最大化的窗口.
如何计算Delphi中字符串中某个字符的出现次数?
例如,假设我有以下字符串并且想要计算其中的逗号数:
S := '1,2,3';
Run Code Online (Sandbox Code Playgroud)
然后我想获得2结果.
Delphi XE2的新功能包含以下内容.
现在打包强制字节对齐记录
如果您的遗留代码使用打包记录类型,并且您想要与外部DLL或C++链接,则需要从代码中删除"packed"一词.packed关键字现在强制字节对齐,而在过去它不一定这样做.行为更改与Delphi 2009中的C++对齐兼容性更改有关.
我不明白这一点.我正在努力解决这一问题:而在过去,它并不一定会这样做.我无法调和的是,压缩总是导致记录的字节对齐,据我所知.任何人都可以给出一个非字节对齐的打包记录的例子吗?显然,这必须是早期版本.
为什么文档说"如果你想与外部DLL或C++链接,你需要删除代码中的单词"?如果外部代码使用了#pragma pack(1)那么如果打包是非限制我们该怎么办?
$ALIGN指令怎么样?是{$A1} and {$A-}相当于packed或者是有一些额外的意义与packed?
我似乎错过了一些东西,如果有人能够解释这一点,我会很感激.或者文档真的很差?
更新
我有理由相信文档是指记录本身的对齐而不是记录的布局.这是一个小程序,它表明packed记录的使用强制记录的对齐为1.
program PackedRecords;
{$APPTYPE CONSOLE}
type
TPackedRecord = packed record
I: Int64;
end;
TPackedContainer = record
B: Byte;
R: TPackedRecord;
end;
TRecord = record
I: Int64;
end;
TContainer = record
B: Byte;
R: TRecord;
end;
var
pc: TPackedContainer;
c: TContainer;
begin
Writeln(NativeInt(@pc.R)-NativeInt(@pc.B));//outputs 1
Writeln(NativeInt(@c.R)-NativeInt(@c.B));//outputs 8
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
这在Delphi …
delphi ×10
delphi-xe2 ×10
64-bit ×2
firemonkey ×2
vcl ×2
debugging ×1
delphi-2010 ×1
directory ×1
dll ×1
scope ×1
skinning ×1
styles ×1
vcl-styles ×1