标签: delphi-xe3

如何在Delphi XE3中的Firemonkey FM2应用程序中设置非客户区域的样式

我之前在Delphi XE2时间框架中问过这个问题,然后答案是一个非常丑陋的黑客.

根据官方发布的说明,现在Delphi XE3支持非客户端主题.你如何在Firemonkey FM2中的Delphi XE3中做到这一点?

我认为它必须与风格书有关,但我无法弄明白.表单本身有一个"EnableBorderStyling"属性,我设置为true,我想我必须加载包含一些非客户主题数据的样式,但我找不到包含它的样式.

帮助与此主题无关​​.

Update2好吧,它没有被破坏,只是因为我没有包含这个样式元素的样式(正如RRUZ所说).

procedure TForm1.FormShow(Sender: TObject);
begin
  StyleBook := StyleBook1;
  WindowBorder.UpdateStyle;
end;
Run Code Online (Sandbox Code Playgroud)

Update3:样式文件似乎位于两个不同的位置,这令人困惑:

  C:\Program Files (x86)\Embarcadero\RAD Studio\10.0\Redist\styles\Fmx        
  C:\Users\Public\Documents\RAD Studio\10.0\Styles
Run Code Online (Sandbox Code Playgroud)

请注意,我在任一点上都没有Luna.Style(firemonkey样式),但使用样式编辑器工具只需5秒.(打开,另存为,并将类型更改为.Style,我有一个!)

UPDATE4:RRUZ的答复工作,但我的系统(Windows 8 RTM)的非客户端的风格不看的权利,他们周围的地区白角on't完全绘制.调整窗口大小使它消失,我很清楚我应该能够强制使用WM_NCREPAINT或其他东西,然后让它消失.

delphi firemonkey delphi-xe3

7
推荐指数
1
解决办法
2411
查看次数

如何减小Delphi dll的大小?

我最近从Delphi 7迁移到了Delphi XE3.

Delphi 7中的107kb的dll文件现在编译为2.7 MB.另一个是114kb,现在是4.7 MB!

这是正常的吗?我该怎么做才能减小文件大小?如果您需要更多信息,请询问.

更新:

这两个dll文件都已在发布模式下编译.

遵循梅森的建议:

4.7MB文件减少到834kb,2.7MB文件减少到2.1MB.2.1MB文件使用Generics和一个名为nExcel的外部库来生成Excel文件.虽然在文件大小较小时也使用了nExcel,但是使用泛型是代码的新增功能,我想这可能是文件大小保持相当大的原因.

delphi dll delphi-7 delphi-xe3

7
推荐指数
1
解决办法
1970
查看次数

TOpenDialog/NSOpenPanel无法在沙盒Delphi应用程序中工作

Firemonkey应用程序中的TOpenDialog似乎存在问题,该应用程序是为Mac Appstore沙箱化的.我使用XE3,但它也存在于XE2中.我实际上在这里找到了QC报告,但它仍然没有得到解决:

http://qc.embarcadero.com/wc/qcmain.aspx?d=105344

有没有人有同样的问题,或任何想法如何解决它?

这很容易检查.只需在表单上放置一个TOpenDialog并调用Execute方法即可.根据Embarcadero说明对应用程序进行签名和沙箱:

http://docwiki.embarcadero.com/RADStudio/en/Mac_OS_X_Application_Development

当调用Execute时有一个延迟,应用程序冻结片刻,但没有显示任何内容.没有例外或错误消息.如果应用程序没有沙盒,则对话框可以正常工作.

此代码也不起作用,因此问题可能在TNSOpenPanel中的某个地方,由TOpenDialog调用,但遗憾的是我无法找到它.

var
  LOpenDir: NSOpenPanel;
begin
  LOpenDir := TNSOpenPanel.Wrap(TNSOpenPanel.OCClass.openPanel);
  LOpenDir.runModal;
  LOpenDir.release;
Run Code Online (Sandbox Code Playgroud)

我在Apple文档中读到,与没有沙箱的沙盒相比,使用Sandbox时,NSOpenPanel来自不同的类.我想这就是问题的原因.

任何想法将不胜感激.我们无法真正发布一个必须使用没有打开/保存对话框的文件的应用程序:)

顺便说一句,我尝试了项目选项中的权利的几种组合,但它们没有效果.

delphi macos sandbox firemonkey delphi-xe3

7
推荐指数
1
解决办法
987
查看次数

如何有条件地包括一些单位

我有各种define语句用于处理包含文件中的不同Delphi版本.这个包含文件被"包含"在一个单元中.编译器遵循包含文件中给出的定义,但不包括IDE.这导致在uses子句中添加了某些单元,这些单元可以在那里 - 包含在DEFINE编译器指令中.

因此,如果添加了一个在Delphi XE3之前不可用的单元,那么您将遇到一个大问题,因为如果您让IDE添加该单元并且无法使用没有该单元的预先Delphi XE3版本进行编译.

例如,一个单元上有TActionList的项目.

  1. MYINCLUDE.INC 只有一个定义 {$DEFINE DELPHIXE3}

  2. 样本单位可能看起来像

    unit Unit1;
    
    {$I MYINCLUDE.INC}                
    
    uses
       Winapi.Windows, 
       Winapi.Messages, 
       System.SysUtils, 
       System.Variants, 
       System.Classes, 
       Vcl.Graphics,
       Vcl.Controls, 
       Vcl.Forms, 
       Vcl.Dialogs,
       {$IFDEF DELPHIXE3} System.Actions, {$ENDIF}
       Vcl.ActnList;
      ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 保存后,IDE添加System.Actions添加使用列表的结尾,这反过来导致标识符重新声明的编译器错误.如果删除它,IDE将在下次保存时再次添加它.

我刚刚向QC报告了#111178.

该错误是否有解决方法?

基督教

delphi delphi-xe3

7
推荐指数
1
解决办法
2506
查看次数

如何强制Firemonkey在Delphi XE3中使用DirectX 9上下文?

Delphi X3中Firemonkey应用程序的主要TForm3D窗口有一个Context:TContext3D可以访问当前使用的设备的窗口.
在我使用Windows7 64的情况下,它总是显示一个TDX10Context对象FMX.Context.DX10.pas.

我无法TDX9Context通过FMX.Context.DX9.pas 从类中创建新实例,只是为了查看祖先TCustomDX9Context.

我发现这个TContextManager类在严格的私有中收集注册的3D上下文TList:(,这是唯一可以调用构造函数的类...

{ Don't call contructor directly from TContext - only using TContextManager class }
constructor CreateFromWindow(const AParent: TFmxHandle; const AWidth, AHeight: Integer;`
Run Code Online (Sandbox Code Playgroud)

他们TContextManager在创建新表单时调用获取上下文,然后使用readonly属性TContextManager.DefaultContextClass.

除了之外,我无法找到对上下文的访问权限DefaultContextClass.

delphi directx firemonkey delphi-xe3

7
推荐指数
1
解决办法
1068
查看次数

如何停止自动滚动备忘录控件?

在Windows 7中,备忘录控件(TMemo)将在文本被插入(Memo.Lines.Add(Path);)之后自动滚动,这是我不想要的,因为滚动是由我自己完成的.

如何停止自动滚动?

delphi windows-messages delphi-xe3

7
推荐指数
1
解决办法
3549
查看次数

TActionMainMenuBar,VCL-Styles和MDI按钮(最小化,关闭等)没有被设计样式.

我正在尝试制作TActionMainMenuBar显示风格的MDI按钮,就像TMainMenu一样.

VCL样式问题

有什么建议?我不能停止在这个项目中使用MDI.

delphi mdi vcl-styles delphi-xe3

7
推荐指数
1
解决办法
1001
查看次数

我们可以使用RTTI按名称查找函数/过程并运行它们吗?

因为我们可以找到一个Property或者一个Object使用RTTI,我们可以在内存中搜索某个function或者procedure(不是来自一个对象method但是来自一个unit)知道它的名字吗?

如果我们可以,是否可以执行它发送它的参数?

delphi rtti delphi-xe3

7
推荐指数
1
解决办法
1569
查看次数

如何使用Delphi标准确认对话框但带有复选框"不要再问我"?

在许多确认对话框中,有这样的选项是有用的(快速方法来禁用确认).但我无法找到如何做到这一点.我不想自己设计它,因为我需要这个对话框是标准的,不要随着Delphi的每次更新重新设计.是否有简单的方法使用Delphi标准确认对话框这样的复选框?

UPDATE2.Synopse项目推荐的SynTaskDialog库做得很好(我需要的甚至更多),我将在我的项目中使用它.谢谢!

UPDATE.所以,谢谢你们的想法.系统函数MessageBoxCheck是一个不错的解决方案,但似乎不是那么稳定.总的来说,我同意最好使用最新的API函数为用户提供现代操作系统的最佳UI体验,并为旧系统使用老式设计.目前我仍然坚持简单的解决方案(代码如下),但如果有人在现代操作系统的UI支持下共享代码,那就太好了.

function MsgDlgWithCB(const Msg,Title,CBMsg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn;
  var cbDontAskAnymore: TCheckBox): TForm;
var
  i: integer;
  b: TButton;
  y: integer;
begin
  Result := CreateMessageDialog(Msg, DlgType, Buttons, DefaultButton) ;
  Result.Position := poScreenCenter;
  cbDontAskAnymore := TCheckBox.Create(Result);
  cbDontAskAnymore.Caption := CBMsg;
  cbDontAskAnymore.Width := 130;
  y := -1;
  for i := 0 to result.ComponentCount-1 do
    if result.Components[i] is TButton then
    begin
      b := TButton(result.Components[i]);
      b.Left := b.Left + cbDontAskAnymore.Width + 16;
      Result.ClientWidth := Max(Result.ClientWidth, b.Left+b.Width+16);
      y := b.Top+b.Height-cbDontAskAnymore.Height;
    end;
  if y<0 …
Run Code Online (Sandbox Code Playgroud)

delphi dialog confirmation delphi-xe3

7
推荐指数
2
解决办法
3355
查看次数

Delphi 记录分配错误

我遇到了 delphi XE3 编译器的一些奇怪行为(我为 x86 架构编译)。

想象一下,我有一个包含一个字段的类 - 具有多个简单类型字段的自定义记录:

  TPage = class
  type
    TParagraph = record
    public
      FOwner:  TPage;

      FFirst:  Integer;
      FSecond: Integer;

      procedure Select;
    end;
  public
    FSelected: TParagraph;
  end;

procedure TPage.TParagraph.Select;
begin
  FOwner.FSelected:=Self;
end;
Run Code Online (Sandbox Code Playgroud)

逻辑是我的页面可以包含多个段落,在某些时候我希望选择其中一个段落(以便能够在程序的其他部分中使用它执行一些操作):

procedure TMainForm.Button1Click(Sender: TObject);
var
  lcPage:      TPage;
  lcParagraph: TPage.TParagraph;
begin
  lcPage:=TPage.Create;
  try
    <...>

    lcParagraph.FOwner:=lcPage;
    lcParagraph.FFirst:=1;
    lcParagraph.FSecond:=2;

    lcParagraph.Select;

    <...>
  finally
    lcPage.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

当我的记录不超过一定大小时,一切都可以。一个引用和两个整数就可以了,在这种情况下,我得到如下汇编指令:

MainUnit.pas.350: FOwner.FSelected:=Self;
00C117B3 8B45FC           mov eax,[ebp-$04]
00C117B6 8B00             mov eax,[eax]
00C117B8 8B55FC           mov edx,[ebp-$04]
00C117BB 8B0A             mov ecx,[edx]
00C117BD 894804           mov [eax+$04],ecx
00C117C0 …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe3 delphi-10.4-sydney

7
推荐指数
1
解决办法
530
查看次数