标签: delphi-xe2

Delphi XE2 VCL样式,更新字幕块其他控件失效

发现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)

delphi vcl styles skinning delphi-xe2

25
推荐指数
1
解决办法
1297
查看次数

Delphi XE2 64位字符串例程的运行时性能非常慢

我正在移植一些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 64-bit delphi-xe2

25
推荐指数
4
解决办法
3884
查看次数

Delphi XE2:可以在VCL应用程序中实例化FireMonkey表单吗?

在Delphi XE2之前,我们只使用VCL来创建GUI应用程序.Delphi XE2声明:

警告:FireMonkey(FMX)和可视组件库(VCL)不兼容,不能在同一项目或应用程序中使用.也就是说,应用程序必须只有一个或另一个,FireMonkey或VCL.不兼容性是由FireMonkey(FMX)和VCL之间的框架差异引起的.

我的应用程序是一个使用运行时包构建的纯VCL应用程序.所有VCL表单都存储在运行时包中.如果我要创建一个FireMonkey表单并存储在一个包中,我是否有机会在运行时在我的VCL应用程序中实例化这个FireMonkey表单?所以我可能会喜欢FireMonkey的3D或HD效果.

delphi vcl delphi-xe2 firemonkey

24
推荐指数
3
解决办法
8263
查看次数

Delphi XE2:通过64位app调试64位dll

有没有人通过运行/附加到64位应用程序来成功调试64位dll?我有应用程序和DLL的Delphi代码.我可以用32位和64位调试应用程序.我也可以通过使用Run- > Parameters来调试32位dll 来选择32位版本的应用程序.

但是,我似乎无法通过运行64位应用程序调试我的64位DLL,有没有人让这个工作?

delphi debugging dll 64-bit delphi-xe2

24
推荐指数
1
解决办法
2201
查看次数

使用FireMonkey及其跨平台,我应该在哪里存储我的应用程序数据?

通常,使用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)

delphi directory delphi-xe2 firemonkey

23
推荐指数
1
解决办法
3308
查看次数

传递记录参数而不首先将其声明为变量

如果我试图调用一个记录类型(不是对象)作为参数的过程,是否有可能以某种方式传递该参数"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 delphi-xe2

23
推荐指数
3
解决办法
8353
查看次数

设计时包无法构建 - 找不到文件:'Graphics.dcu'

在Delphi XE2中,我在一对设计/运行时包中有一个控件.最初,一切都很好.我已经多次建造了它们.突然间没有任何警告,设计时间包开始在我的一个单位抱怨Graphics我建造时单元缺失.Graphics是一个标准单位,但在这一个地方找不到.我甚至没有对这个单位做过任何改动,据我所知,任何可能影响这个的变化.

这里只是本单元顶部(界面)的用途:

uses
  Graphics, ColorConv, Classes, Dialogs, ZLib;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它是一个非常简单的单元,我只对这个项目进行了非常简单的更改.有什么可以让它开始抱怨这一点?

奇怪的是,如果我安装它,一切正常,它只是不构建.

有相当多的代码,我不想发布整个事情.

delphi scope custom-controls delphi-xe2

22
推荐指数
3
解决办法
3万
查看次数

对于最大化的风格窗户,我可以做些什么,在相邻的显示器上显示边框?

在多监视器系统上,"空白"VCL应用程序可以最大化,但启用了样式的相同应用程序(以及一个默认选择的应用程序)最大化不正确.我所看到的是窗口的右侧边缘延伸到第二台显示器(我的主要位于左侧).当我开始与其他Windows应用程序进行比较时,我注意到在Windows 7(至少)下,最大化的窗口甚至在左侧,右侧或底侧都没有非客户端边框.事实上,标准VCL(非样式)应用程序的行为方式相同,没有非客户端边界.

我该如何解决?我注意到TFormStyleHook有一个WMNCCalcSize的处理程序,我还没有解剖,但让我想知道VCL是否可能错误地处理这个消息以获得最大化的窗口.

delphi maximize-window delphi-xe2 vcl-styles

22
推荐指数
1
解决办法
2183
查看次数

如何计算字符串中某个char的出现次数?

如何计算Delphi中字符串中某个字符的出现次数?

例如,假设我有以下字符串并且想要计算其中的逗号数:

S := '1,2,3';
Run Code Online (Sandbox Code Playgroud)

然后我想获得2结果.

delphi delphi-2010 delphi-xe2

22
推荐指数
4
解决办法
3万
查看次数

"现在打包强制字节对齐记录"是什么意思?

Delphi XE2的新功能包含以下内容.

现在打包强制字节对齐记录

如果您的遗留代码使用打包记录类型,并且您想要与外部DLL或C++链接,则需要从代码中删除"packed"一词.packed关键字现在强制字节对齐,而在过去它不一定这样做.行为更改与Del​​phi 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 delphi-xe2

21
推荐指数
1
解决办法
3894
查看次数