小编use*_*073的帖子

方法指针和常规过程不兼容

我有一个应用程序,它有多种形式.所有这些表单都有一个PopupMenu.我以编程方式构建菜单项,所有这些都在一个共同的根菜单项下.我希望所有菜单项都调用相同的程序,菜单项本身基本上作为参数....

当我只有一个表单执行此功能时,我有这个工作.我现在有多种形式需要这样做.我正在将所有代码移动到一个公共单元.

Example.
Form A has PopupMenu 1.  When clicked, call code in Unit CommonUnit.
Form B has PopupMenu 2.  When clicked, call code in unit CommonUnit.
Run Code Online (Sandbox Code Playgroud)

当我需要从每个表单调用我的弹出窗口时,我调用我的顶级过程(在单元CommonUnit中),将顶部菜单项的名称从每个表单传递到公共单元中的顶级过程.

我正在使用代码向PopupMenu添加项目.

M1 := TMenuItem.Create(TopMenuItem);
M1.Caption := FieldByName('NAME').AsString;
M1.Tag := FieldByName('ID').AsInteger;
M1.OnClick := BrowseCategories1Click;
TopMenuItem.Add(M1);
Run Code Online (Sandbox Code Playgroud)

我编译时收到错误消息.具体来说,OnClick线正在抱怨

不兼容的类型:'方法指针和常规过程'.

我已经定义了BrowseCategories1Click,就像我在单个表单上执行此操作之前一样.唯一的区别是它现在定义在一个公共单元中,而不是作为表单的一部分.

它被定义为

procedure BrowseCategories1Click(Sender: TObject);
begin
//
end;
Run Code Online (Sandbox Code Playgroud)

解决这个问题的最简单方法是什么?

谢谢GS

delphi methods pointers delphi-2010

14
推荐指数
4
解决办法
3万
查看次数

Delphi - 动态调用不同的函数

我有一个树视图(VirtualTree),它有节点.当用户点击某个节点时,我需要运行一个特定的函数,传递该节点的文本名称.此函数是节点的属性之一.例如,假设有两个节点.

节点1,Name = MyHouse,Function = BuildHouse
节点2,Name = MyCar,function = RunCar

当我点击节点1时,我需要调用BuildHouse函数('MyHouse');
当我点击Node 2时,我需要调用RunCar('MyCar');

参数总是字符串.应该注意的是,这些都是真正的功能,而不是一个类的成员.

有太多的节点要有CASE或IF/THEN类型的代码结构.我需要一种动态调用各种函数的方法,即不需要对代码进行硬编码.我该怎么做呢?当我必须在运行时查找函数的名称而不是编译时,如何调用函数?

谢谢,GS

delphi function dynamic call

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

有没有办法得到什么叫什么?

对于Delphi 2010,有没有办法从函数X(甚至整个程序)开始,获取其他函数/过程被调用的图表...

有点像:

Function X
  - Function A
    - Procedure B
    - Procedure C
  - Function D
Run Code Online (Sandbox Code Playgroud)

(当然图形会更好......)

delphi diagram

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

需要恢复较旧的$ PATH设置

我刚安装了一个覆盖我的$ PATH变量的应用程序...所以现在,一堆东西将无法正常工作.虽然我有一个完整的备份,但我希望有一个比恢复更容易的方法,获得PATH,再次"向前滚动".

Windows注册表(或其他任何地方)中是否存在存储较旧的$ PATH设置的位置?

谢谢,GS

path recover

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

如何为Delphi创建模块化插件

使用Delphi 2010,我需要编写一个程序来支持模块或插件.虽然有点做作,但假设我有一个转换数据文件/文本文件的应用程序.它将支持30种输入格式和30种格式作为输出.第一个版本可能只实现其中的一些格式.我的挑战是我想要一个数据驱动的流程.

例如,假设我有一个PARSE_FILE例程.如果我的输入数据文件格式是'Format_A',那么当我调用PARSE_FILE时,它应该知道使用PARSE_FILE_Format_A,而不是PARSE_FILE例程的其他29个不同版本.

PARSE_FILE只是一个例子.我可能会有60个不同的常用函数,LOAD_FILE,GET_DELIMITER,PARSE_FILE等,但这些函数中的每一个对于30种不同格式中的每一种都会有所不同.我可以使用什么技术,以便在我使用FORMAT_A加载文件时,这60个不同的常用例程中的每一个都使用这60个例程的正确"版本"?

请记住,我只是从5种输入格式开始,稍后会添加其他格式,所以我需要一种集中定义这种"映射"的方法,所以无论在我的代码中使用这些例程,正常的例程版本都会即使我称之为通用版本,也可以使用.

architecture delphi plugins modular-design

6
推荐指数
1
解决办法
1290
查看次数

Delphi - 如何创建通用REST调用

使用Delphi Seattle.我有一个应用程序,可以进行各种REST调用.其中一些调用可能通过JSON返回10-20行,而其他调用可能返回30-40,000行.我已将我的REST服务器设置为以1,000个批量返回行.当数据回到我的客户端时,我使用RestDataAdapater,DataSource和Client Data Set来公开数据,就像它是本地表一样.这部分似乎工作正常.如果我们在1000行的末尾,那么我更改URL,并请求下一批1,000行.

我的挑战:我想抽象这个,以便一个例程可以处理所有场景(至少对于GET调用).棘手的部分是如何处理数据源/客户端数据集1,000行问题?一个例子可能有助于澄清......我希望能够执行这样的事情......

...
genericREST_Get(baseURL, resource, suffix);  // This would actually execute the REST call, where the components are in Datamodule DM1.
while not dm1.ds_Generic.DataSet.Eof do
        begin
       ... some kind of processing
       dm1.ds_Generic.DataSet.Next;
        end;
Run Code Online (Sandbox Code Playgroud)

如何处理超过1000行阈值?当我的调用程序(如上所示)从第1000行到1001时,REST API需要从服务器请求下一组1000行.虽然我知道如何做到这一点,但我不知道该怎么做.我希望"获取下一个1000行"在通用例程中(也就是genericREST_Get例程).我不希望每个调用例程都必须处理它.

假设所有例程都只能向前移动,而不是向后移动.

delphi rest

6
推荐指数
1
解决办法
647
查看次数

为什么即使我为所有单元提供了记录定义,也会出现"不兼容类型"错误?

我正在编写一个Delphi 2010应用程序.它有许多文件,其中两个称为Utils_ABS和Utils_MAT.我创建了一个两个文件都需要理解的记录类型,所以我将它放在自己的文件中,名为TypeDefs.inc.

在Utils_MAT和Utils_ABS的顶部,我已经包含了TypeDefs.inc.

unit Utils_ABS;

interface

{$WARNINGS ON}
{$HINTS ON}
{$WARN UNIT_PLATFORM OFF}
{$WARN SYMBOL_PLATFORM OFF}

uses
Windows, Messages, ... Utils, Analysis, UserFeedback, Utils_MAT;

{$I TypeDefs.inc}     // Include TypeDefs that are used multiple places

procedure ABS_Load;
...
Run Code Online (Sandbox Code Playgroud)

Utils_MAT看起来非常相似,特别是与之相关{$I TypeDefs.inc}.

关键项是两个文件引用第三个文件TypeDefs.inc作为INCLUDE,它具有RECORD的定义:

type
TTableAttrType = Record
tabIOT: Boolean; // Is table an IOT
...
end;
Run Code Online (Sandbox Code Playgroud)

除了这个文件中的这个记录定义之外别无其他.

问题是,当我编译时,我收到以下错误:

[DCC错误] Utils_ABS.pas(212):E2010不兼容的类型:'Utils_ABS.TTableAttrType'和'Utils_MAT.TTableAttrType'

我完全糊涂了.如果它们来自相同的定义,它们如何是不兼容的类型?不是定义的副本,而是字面上相同的定义.

我已检查了所有源代码,并且此TTableAttrType记录未在其他任何位置定义.

我试图注释掉$ INCLUDE,并将记录的定义硬编码到Utils_ABS和Utils_MAT中,但我仍然得到同样的错误.

如何让这个错误消失?如何在一个位置定义记录结构,并让多个文件访问它?

delphi record include type-declaration

5
推荐指数
1
解决办法
3062
查看次数

Delphi - 什么对象(多维数组等)可以工作?

我需要按排序顺序保留前十个值.我的数据结构是:

TMyRecord = record
  Number: Integer;
  Value: Float;
end
Run Code Online (Sandbox Code Playgroud)

我将计算一堆浮点值.我需要保持前10个浮动值.每个值都有一个相关的数字.我想添加"sets"...如果我的浮点值高于前10位中的一个,它应该将自己添加到列表中,然后"旧"数字10(现在为11)被丢弃.我应该能够以(浮点值)排序顺序访问列表...

它几乎就像一个TStringList,它维护排序顺序....

Delphi 2010中是否已经内置了这样的内容?

delphi structure delphi-2010

5
推荐指数
1
解决办法
946
查看次数

Delphi - 将标头值传递给 REST 服务

我有一个 REST 服务。默认情况下,返回的 JSON 数据已消除所有 NULL。这给我带来了困难,所以我有一个改变行为的请求标头设置。我需要添加的请求头是: Accept-Formatting: json-nulls=include

我已经能够使用以下格式从 POSTMAN 开始工作。

在此处输入图片说明

我无法从我的应用程序中得到它。
我的应用程序有一个 TRestClient、TRestResponse 和 TRestRequest。

我尝试将其添加为 TRestClient 和 TRestRequest 的参数。虽然 REST 服务返回数据,但未显示 NULL 字段,这告诉我我的格式(或与请求标头相关的其他内容)不正确。应该在哪里以及如何添加?
任何想法表示赞赏。

在此处输入图片说明

delphi rest

5
推荐指数
1
解决办法
6275
查看次数

Delphi - 如何在该表单上关闭来自WITHIN的表单?

在Delphi 2010中,我创建一个表单,然后创建一个TFrame,将TFrame.Parent分配给表单,然后显示表单MODALLY.工作得很好......框架有一个DBNavigator,一个字段DBFields等.当用户点击发布/保存时,我想自动关闭表单.我尝试了一些东西,比如Close,Action = caFree,(DBNav.parent.parent)作为TForm.Free等,似乎什么都没有用.我如何 - 从TFrame中关闭表格?

创建这个东西的代码是......

 // Create the Window
    ThisWin := TEmptyFrameWin.Create(nil);

  // Create the Frame for the Window
  ThisFrame := TFrameUsage.Create(Application);

  ThisFrame.Parent := ThisWin;

  // Load the data
  ThisFrame.tUsage.Open;
  ThisFrame.tUsage.FindKey([StrToInt(ID)]);
  ThisFrame.LoadDateFields;

  ThisWin.Caption := 'Change Appointment Information';
  // Only show the POST button    
  ThisFrame.UsageNav.VisibleButtons := [sbPost];

  try
    ThisWin.ShowModal;
  finally
    ThisWin.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

谢谢,

GS

forms delphi tframe

4
推荐指数
1
解决办法
1773
查看次数