我想使用通用TList的OnNotify事件.将过程分配给OnNotify会产生错误消息:
E2010 Incompatible types: 'System.Generics.Collections.TCollectionNotification' and 'System.Classes.TCollectionNotification'
Run Code Online (Sandbox Code Playgroud)
我正在声明一个类,并在其中使用通用TList如下:
TEditor_Table = class (TObject)
public
FEditors: TList<TGradient_Editor>; // List containing the editors
Run Code Online (Sandbox Code Playgroud)
这不是最好的方法,但我需要这个来进行测试.该列表在构造函数中实例化:
constructor TEditor_Table.Create (Owner: TFMXObject);
begin
inherited Create;
FEditors := TList<TGradient_Editor>.Create;
FOwner := Owner;
end; // Create //
Run Code Online (Sandbox Code Playgroud)
接下来在main表单中声明一个函数
procedure do_editor_change (Sender: TObject; const Item: TGradient_Editor; Action: TCollectionNotification);
Run Code Online (Sandbox Code Playgroud)
并且TColor_Editor类实例化如下:
FColor_Editor := TEditor_Table.Create (List_Gradients);
FColor_Editor.FEditors.OnNotify := do_editor_change;
^
error occurs here----------------------------------+
Run Code Online (Sandbox Code Playgroud)
我根本不理解这个消息,而且为什么编译器似乎混淆了两个单元:'System.Generics.Collections.TCollectionNotification'和'System.Classes.TCollectionNotification'.我究竟做错了什么?
在VCL,我可以从资源加载一个字体而不保存它我可以从内存中使用它.
这是我使用的代码,它适用于VCL:
procedure TForm1.Button1Click(Sender: TObject);
var
ResStream : tResourceStream;
FontsCount : DWORD;
begin
ResStream := tResourceStream.Create(hInstance, 'MyResourceName', RT_RCDATA);
winapi.windows.AddFontMemResourceEx(ResStream.Memory, ResStream.Size, nil, @FontsCount);
ResStream.Free();
button1.Font.name := 'MySavedFontNameInResource';
end;
Run Code Online (Sandbox Code Playgroud)
在Firemonkey我刚改变button1.Font.name,button1.Font.family但不幸的是字体没有改变.所以我认为这段代码与firemonkey不兼容.
那么在Firemonkey中,如何从资源加载字体并将其临时保存到内存并直接从那里使用?
我看到这些页面:在firemonkey中安装字体,如何使用外部字体?
根据Ed先生的回答,似乎FMX中没有解决这个问题的方法.但也许我们可以加载字体,如果我们在运行应用程序之前安装它.我几乎尝试了一切,但我仍然无法加载字体.
AFAIK没有内置功能.在网上搜索我找到了这个功能,它对我有用,但我不喜欢使用它,因为它是汇编,我无法理解它在做什么.所以我写了这个函数也有效:
function Cardinality(const PSet: PByteArray;
const SizeOfSet(*in bytes*): Integer): Integer;
const
Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
var
I, J: Integer;
begin
Result := 0;
for I := 0 to SizeOfSet - 1 do
for J := 0 to 7 do
if (PSet^[I] and Masks[J]) > 0 then
Inc(Result);
end;
Run Code Online (Sandbox Code Playgroud)
现在,我想知道我是否可以依赖这个功能?或者也许设置数据类型背后有一个技巧,这就是delphi没有内置方法的原因.
但if我的功能是可靠的then,我怎样才能改进它:
SizeOfSet参数我想把它称为Cardinality(AnySet)而不是Cardinality(@AnySet, SizeOf(TAnySet)).
顺便说一句,我需要在XE和XE5中编译它.
我正在编写一个需要看起来像老式终端会话的备忘录组件.这应该非常简单,但FireMonkey样式的工作方式似乎令人难以置信的复杂.
在非移动FireMonkey应用程序中,我可以右键单击一个控件并选择"编辑自定义样式".此选项在移动应用中不可用.以下是其中一位FireMonkey开发人员给出的原因.
它支持iOS和Android上的不同风格.我们无法在iOS风格的Android上运行应用程序.但是当您尝试更改平台样式时,我们将自动在每个目标平台上使用它.如果要更改fm控件的默认样式,则应该在表单样式书中添加样式,或者加载到样式表平台样式并对其进行更改.
同样非常重要的是,当您在样式簿中加载平台样式时,您可能希望该应用程序实例不具有两个平台样式副本(一个 - fmx包中的系统和样式簿中的其他副本).为此,您应该在TStylebook.UseStyleManager中设置标志true.在这种情况下,样式书中的样式将取代平台样式.
好的,所以我想我需要创建一个自定义样式.如何创建自定义样式以仅覆盖字体和背景属性?
我想我可以覆盖这样的ApplyStyle过程.
procedure TMyMemo.ApplyStyle;
var
BackgroundObject: TFmxObject;
begin
inherited;
BackgroundObject := FindStyleResource('content');
if Assigned(BackgroundObject) then
begin
// Change the background color of the background
end;
end;
Run Code Online (Sandbox Code Playgroud)
我如何知道背景对象的类型以及需要更改的属性?
当然,改变一个控件的背景颜色不是这么难!我错过了FM风格的基本内容吗?
我有这段代码
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
msg: String;
begin
msg := 'Do you really want to exit?';
if MessageDlg(msg, TMsgDlgType.mtConfirmation,
[TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrNo then
CanClose := False
else
CanClose := True; { FIXME: don't want to work on Android }
end;
Run Code Online (Sandbox Code Playgroud)
它在Windows上运行完美.如果我选择"是",申请将关闭.但是,应用程序不会在Android上关闭.我做错了什么?
单元SysUtils(System.SysUtils)不再具有EraNames或FormatSettings.EraNames.什么是它的替代品,它去了哪里?
即:
for I := Low(SysUtils.EraNames) to High(SysUtils.EraNames) do
begin
..
end;
Run Code Online (Sandbox Code Playgroud) 希望我只是遗漏了一些明显的东西,但我似乎发现在使用Delphi XE5 Android编译器时,常量字符串参数被破坏了.测试代码:
1)创建一个新的空白移动应用程序项目.
2)TButton在表单中添加一个,并为其创建一个OnClick处理程序.
3)像这样填写处理程序:
procedure TForm1.Button1Click(Sender: TObject);
begin
GoToDirectory(PathDelim + 'alpha' + PathDelim + 'beta');
GoToDirectory(FParentDir);
end;
Run Code Online (Sandbox Code Playgroud)
4)在表单类声明中,添加两个字段和一个方法,如下所示:
FCurrentPath, FParentDir: string;
procedure GoToDirectory(const Dir: string);
Run Code Online (Sandbox Code Playgroud)
5)实施Foo和GoToDirectory喜欢:
function Foo(const S: string): Boolean;
begin
Result := (Now <> 0);
end;
procedure TForm1.GoToDirectory(const Dir: string);
begin
FCurrentPath := IncludeTrailingPathDelimiter(Dir);
FParentDir := ExcludeTrailingPathDelimiter(ExtractFilePath(Dir));
ShowMessageFmt('Prior to calling Foo, Dir is "%s"', [Dir]);
Foo(FParentDir);
ShowMessageFmt('After calling Foo, Dir is "%s"', [Dir]);
end;
Run Code Online (Sandbox Code Playgroud)
6)编译并在设备上运行.
当我这样做时,前两个消息框没有指出任何错误,但是Dir然后在第三和第四个提示之间清除.有没有其他人得到这个,或者我只是做一些愚蠢的事情?(当我为测试目的而定位Win32时,没有什么不好的.) …
有没有人能够在用Delphi Firemonkey XE5编写的应用程序中从Android上的相机拍照?视频捕捉怎么样?
这被认为是框架中的错误或只是缺少文档的东西.
任何人都可以告诉为什么代码波纹管无法工作/从Android上的相机检索任何图像?
删除了表单上的TCameraComponent和TImage组件,没有任何反应.
procedure TCameraComponentForm.OnCreate(Sender: TObject);
begin
CameraComponent1.Kind := FMX.Media.TCameraKind.ckFrontCamera;
CameraComponent1.FlashMode := FMX.Media.TFlashMode.fmFlashOff;
CameraComponent1.Active := True;
end;
procedure TCameraComponentForm.CameraComponent1SampleBufferReady(
Sender: TObject; const ATime: Int64);
begin
CameraComponent1.SampleBufferToBitmap(Image1.Bitmap, True);
Image1.Width := Image1.Bitmap.Width;
Image1.Height := Image1.Bitmap.Height;
end;
Run Code Online (Sandbox Code Playgroud)
权限设置正确.
下一个代码:
function get_symbol (var s: String): String;
var c: Char;
p: Int32;
begin
// ... some more code ...
c := upcase (s [p]);
if IsDigit (c) then
Run Code Online (Sandbox Code Playgroud)
导致以下错误消息:
[dcc32 Warning] fmx_utilities_string.pas(188): W1000 Symbol 'IsDigit' is deprecated: 'Use TCharHelper'
我不理解这条消息,因为包含了System.Character,c被声明为Char,而TCharhelper被声明为Char的字符助手.我究竟做错了什么?
我认为在FireMonkey中扩展应用程序应该很容易,因为它应该也适用于Retina-Mac.似乎有一些背景魔法选择了另一种风格,但在Windows中似乎并非如此.
在VCL中有TForm.Scaled可以完成工作(或多或少).
对于FireMonkey,我发现Embarcadero的这篇文章,但似乎Embarcadero不太确定这种方法是否有用,因为在XE5中,sampleproject"ControlsDemo"不再包含scale-trackbar.它还需要在所有形式中都存在root-TLayout,可以设置比例因子.我的表单中没有这样的元素(我害怕添加一个,因为我不能确定我是否运行另一个firemonkey bug).
那么如何使用FireMonkey考虑不同的DPI设置?
编辑:我试图破解TPlatFormWin并将CurrentScreenScale设置为2但它不起作用:我有黑色工具栏,但没有缩放,但至少它使用了提供的TImage.MultiResBitmap中的HighRes替代.
delphi ×10
delphi-xe5 ×10
firemonkey ×4
android ×3
char ×1
delphi-xe ×1
fonts ×1
generics ×1
set ×1
styles ×1