标签: delphi-xe5

如何使用通用TList的OnNotify

我想使用通用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'.我究竟做错了什么?

delphi generics delphi-xe5

9
推荐指数
1
解决办法
1601
查看次数

Firemonkey:将资源从资源添加到内存并使用它

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中没有解决这个问题的方法.但也许我们可以加载字体,如果我们在运行应用程序之前安装它.我几乎尝试了一切,但我仍然无法加载字体.

delphi fonts firemonkey delphi-xe5

9
推荐指数
1
解决办法
2570
查看次数

如何获取类型集的任何变量的元素数量?

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,我怎样才能改进它:

  1. 将常量传递给它
  2. 进行类型检查并确保将一个集传递给该函数
  3. 传递值而不是其地址
  4. 摆脱SizeOfSet参数

我想把它称为Cardinality(AnySet)而不是Cardinality(@AnySet, SizeOf(TAnySet)).

顺便说一句,我需要在XE和XE5中编译它.

delphi set delphi-xe delphi-xe5

9
推荐指数
2
解决办法
2205
查看次数

在FireMonkey中更改TMemo的字体和背景颜色

我正在编写一个需要看起来像老式终端会话的备忘录组件.这应该非常简单,但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风格的基本内容吗?

delphi styles firemonkey-fm3 delphi-xe5

8
推荐指数
2
解决办法
4042
查看次数

如何在Delphi-XE5 Firemonkey应用程序中关闭Android应用程序?

我有这段代码

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上关闭.我做错了什么?

delphi android firemonkey delphi-xe5

8
推荐指数
2
解决办法
2万
查看次数

EraNames在哪里进入Delphi XE5?

单元SysUtils(System.SysUtils)不再具有EraNamesFormatSettings.EraNames.什么是它的替代品,它去了哪里?

即:

 for I := Low(SysUtils.EraNames) to High(SysUtils.EraNames) do
    begin
      ..
    end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe5

8
推荐指数
1
解决办法
1388
查看次数

常量字符串参数和适用于Android的Delphi XE5编译器

希望我只是遗漏了一些明显的东西,但我似乎发现在使用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)实施FooGoToDirectory喜欢:

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 android delphi-xe5

8
推荐指数
1
解决办法
1269
查看次数

从Delphi Firemonkey XE5应用程序在Android上拍照

有没有人能够在用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)

权限设置正确.

delphi android firemonkey delphi-xe5

8
推荐指数
1
解决办法
8484
查看次数

如何使用TCharHelper?

下一个代码:

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的字符助手.我究竟做错了什么?

delphi char delphi-xe5

8
推荐指数
1
解决办法
3666
查看次数

用于高DPI Windows的Delphi Firemonkey Scale

我认为在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 firemonkey delphi-xe5

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