所以在VCL中,可以使用以下代码行来检索应用程序路径:
ExtractFilePath(Application.ExeName)
Run Code Online (Sandbox Code Playgroud)
我尝试了同样的事情Firemokey,我注意到ExeName不再可用.我可以使用哪些代码作为替代方案?
我在使用FireMonkey编写的应用程序中有一个表单.在那个(模态)表单上有一个OK按钮,我已将Default属性设置为True.还有一个备忘录组件.现在,如果在输入备忘录时键入enter键,则表单将关闭,而不是在备忘录中插入换行符.
我想要完成的是,当在memo组件中按下enter(或shift + enter或smth)时,则输入换行符.在其他组件中,您不能键入换行符,我仍然希望按Enter键关闭表单.到目前为止,我发现的最好的方法是将以下代码添加到表单OnCloseQuery操作中:
if (Focused.GetObject.ClassName = 'TMemo') and (ModalResult = mrOk) then
begin
CanClose := False;
Memo := TMemo(Focused.GetObject);
Memo.InsertAfter(Memo.CaretPosition, sLineBreak, [TInsertOption.ioMoveCaret,
TInsertOption.ioCanUndo]);
end
else
CanClose := True;
Run Code Online (Sandbox Code Playgroud)
这是有效的,但现在有一个令人讨厌的延迟,在击中输入后和换行符出现之前.我也希望解决方案,这将不那么hacky.
我还应该指出,我也有包含OK按钮但不包含备忘录组件的表单,但是备忘录将在运行时通过更改其父属性移动到该表单.
我正在编写我的第一个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项目中一样.
我已经在firemonkey中移植了一个控件繁重的应用程序,我已经用DXScene工作了两年多.在每个UI更改上更新的可视控件数量绝对保证了所有UI更新方法中分别带有前缀和后缀的BeginUpdate-EndUpdate方法.
移植后,firemonkey引擎对这些方法的行为不正常.
是否仍然建议使用这些或在FMX中引入替代方案?
为了创建字体选择器,我需要获取Firemonkey可用的字体列表.由于FireMonkey中不存在Screen.Fonts我以为我需要使用FMX.Platform?例如:
if TPlatformServices.Current.SupportsPlatformService(IFMXSystemFontService, IInterface(FontSvc)) then
begin
edit1.Text:= FontSvc.GetDefaultFontFamilyName;
end
else
edit1.Text:= DefaultFontFamily;
Run Code Online (Sandbox Code Playgroud)
但是,唯一可用的功能是返回默认的字体名称.
目前我并不担心跨平台支持,但如果我要转向Firemonkey,我宁愿不依赖Windows调用.
我知道我可能会遗漏一些东西,但我无法理解.我刚刚创建了一个包含2个表单(Form1,Form2)的测试应用程序.我在OnClick事件处理程序中使用以下代码向Form1添加了一个按钮:
Application.CreateForm(TForm2,Form2);
Form2.Show;
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,会显示第二个表单,但是如果我单击Form1,即使它将属性TopMost设置为true,也无法将它带到前面.
我错过了什么?我该如何解决?我需要显示一些必须始终位于顶部的子表单和主表单.
我想添加一个带有 TTreeViewItem 的 TList 和另一个带有自定义类 (Troom) 的对象。在 delphi 2007 中,有一个 Pointer 类型的字段“数据”,此处已替换为 TValue,我不知道如何使用。我在互联网上搜索过一些人说它暂时无法处理自定义类型。
除了制作黑客课程之外,有人可以设计出一种方法来实现这一目标吗?
例如,下面的表单代码应该可以正常运行:-
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.TreeView, FMX.Layouts, FMX.Edit;
type
TRoom = class
ID : WORD;
Name : String;
end;
TForm1 = class(TForm)
TreeView1: TTreeView;
TreeViewItem1: TTreeViewItem;
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
var
List : TList;
begin
// Get The List From …Run Code Online (Sandbox Code Playgroud) 该FMX.Types.TBitmap班有ScanLine在FMX(FireMonkey)财产,但似乎除去此属性,并在FMX2(FireMonkey FM2)丢失.
有没有解决方法?我们如何TBitmap直接在FMX2中访问内容?
我正在寻找一种方法来加速firemonkey应用程序中的全局热键(仅限Windows,至少目前为止).经过一些挫折和谷歌搜索这应该工作:注册热键与winapi电话
RegisterHotKey(FmxHandleToHWND(form1.Handle), 0 , MOD_CONTROL, $41);
Run Code Online (Sandbox Code Playgroud)
它返回true.
然后在表单的过程中捕获热键
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
Run Code Online (Sandbox Code Playgroud)
但这个从未被称为.我之前习惯在vcl应用程序中这样做,所以我的猜测是firemonkey以不同的方式处理消息.所以问题是:如何在firemonkey app中捕获全局热键?
编辑:应用该解决方案的一些示例.我创建了一个小班的单元
unit fire_hotkey;
interface
uses windows, messages,allocatehwnd;
type
TMsgHandler = procedure (var Msg: TMessage) of object;
THotClass = class(TObject)
fMsgHandlerHWND : HWND;
proc:TMsgHandler;
constructor Create;
procedure init;
destructor Destroy; override;
end;
implementation
{ hotClass }
constructor THotClass.Create;
begin
inherited;
end;
destructor THotClass.Destroy;
begin
ThreadDeallocateHWnd(fMsgHandlerHWND);
inherited;
end;
procedure THotClass.init;
begin
fMsgHandlerHWND := ThreadAllocateHWnd(proc,true);
end;
end.
Run Code Online (Sandbox Code Playgroud)
然后我的主窗体有一个处理热键事件的过程:
procedure TformEditor.WMHotKey(var Msg: TMessage);
begin
if Msg.Msg = WM_HOTKEY …Run Code Online (Sandbox Code Playgroud) 我有一个表Artist,当前包含四个记录,TSQLQuery其中包含以下语句:
SELECT name
FROM Artist
Run Code Online (Sandbox Code Playgroud)
表格Artist还包含以下记录:
id name
1 Artist 1
2 Artist 2
3 Artist 3
4 Artist 4
Run Code Online (Sandbox Code Playgroud)
目前的记录检索方法:
Query1.Open;
for i := 0 to qArtist.FieldCount -1 do
with cbArtist.ListBox.ListItems[i] do
Text := qArtist.Fields[i].AsString;
Run Code Online (Sandbox Code Playgroud)
以前的记录检索方法:
数据绑定Query1到ComboBox1.
使用"previous"方法,ComboBox1将显示Artist表中的所有预期记录.但是,当我尝试使用"当前"方法时Query1,只选择Artist表中的第一条记录,尽管还有其他三个现有值.我已尝试跨越其他查询的"当前"方法,他们也只返回表的第一个值.
我之所以采用这种新方法,是因为我觉得如果我继续使用"上一个"/数据绑定方法,我的工作非常有限,但除此之外.
那么我该如何解决这个问题呢?即查询问题只选择表中的第一条记录.
delphi ×10
firemonkey-fm2 ×10
delphi-xe3 ×5
firemonkey ×4
delphi-ios ×1
delphi-xe4 ×1
sqlite ×1