我之前在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 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,但是使用泛型是代码的新增功能,我想这可能是文件大小保持相当大的原因.
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来自不同的类.我想这就是问题的原因.
任何想法将不胜感激.我们无法真正发布一个必须使用没有打开/保存对话框的文件的应用程序:)
顺便说一句,我尝试了项目选项中的权利的几种组合,但它们没有效果.
我有各种define语句用于处理包含文件中的不同Delphi版本.这个包含文件被"包含"在一个单元中.编译器遵循包含文件中给出的定义,但不包括IDE.这导致在uses子句中添加了某些单元,这些单元可以在那里 - 包含在DEFINE编译器指令中.
因此,如果添加了一个在Delphi XE3之前不可用的单元,那么您将遇到一个大问题,因为如果您让IDE添加该单元并且无法使用没有该单元的预先Delphi XE3版本进行编译.
例如,一个单元上有TActionList的项目.
MYINCLUDE.INC 只有一个定义 {$DEFINE DELPHIXE3}
样本单位可能看起来像
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)保存后,IDE添加System.Actions添加使用列表的结尾,这反过来导致标识符重新声明的编译器错误.如果删除它,IDE将在下次保存时再次添加它.
该错误是否有解决方法?
基督教
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.
在Windows 7中,备忘录控件(TMemo)将在文本被插入(Memo.Lines.Add(Path);)之后自动滚动,这是我不想要的,因为滚动是由我自己完成的.
如何停止自动滚动?
我正在尝试制作TActionMainMenuBar显示风格的MDI按钮,就像TMainMenu一样.

有什么建议?我不能停止在这个项目中使用MDI.
因为我们可以找到一个Property或者一个Object使用RTTI,我们可以在内存中搜索某个function或者procedure(不是来自一个对象method但是来自一个unit)知道它的名字吗?
如果我们可以,是否可以执行它发送它的参数?
在许多确认对话框中,有这样的选项是有用的(快速方法来禁用确认).但我无法找到如何做到这一点.我不想自己设计它,因为我需要这个对话框是标准的,不要随着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 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 ×10
delphi-xe3 ×10
firemonkey ×3
confirmation ×1
delphi-7 ×1
dialog ×1
directx ×1
dll ×1
macos ×1
mdi ×1
rtti ×1
sandbox ×1
vcl-styles ×1