我有一个应用程序,它有多种形式.所有这些表单都有一个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
我有一个树视图(VirtualTree),它有节点.当用户点击某个节点时,我需要运行一个特定的函数,传递该节点的文本名称.此函数是节点的属性之一.例如,假设有两个节点.
节点1,Name = MyHouse,Function = BuildHouse
节点2,Name = MyCar,function = RunCar
当我点击节点1时,我需要调用BuildHouse函数('MyHouse');
当我点击Node 2时,我需要调用RunCar('MyCar');
参数总是字符串.应该注意的是,这些都是真正的功能,而不是一个类的成员.
有太多的节点要有CASE或IF/THEN类型的代码结构.我需要一种动态调用各种函数的方法,即不需要对代码进行硬编码.我该怎么做呢?当我必须在运行时查找函数的名称而不是编译时,如何调用函数?
谢谢,GS
对于Delphi 2010,有没有办法从函数X(甚至整个程序)开始,获取其他函数/过程被调用的图表...
有点像:
Function X
- Function A
- Procedure B
- Procedure C
- Function D
Run Code Online (Sandbox Code Playgroud)
(当然图形会更好......)
我刚安装了一个覆盖我的$ PATH变量的应用程序...所以现在,一堆东西将无法正常工作.虽然我有一个完整的备份,但我希望有一个比恢复更容易的方法,获得PATH,再次"向前滚动".
Windows注册表(或其他任何地方)中是否存在存储较旧的$ PATH设置的位置?
谢谢,GS
使用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种输入格式开始,稍后会添加其他格式,所以我需要一种集中定义这种"映射"的方法,所以无论在我的代码中使用这些例程,正常的例程版本都会即使我称之为通用版本,也可以使用.
使用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 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中,但我仍然得到同样的错误.
如何让这个错误消失?如何在一个位置定义记录结构,并让多个文件访问它?
我需要按排序顺序保留前十个值.我的数据结构是:
TMyRecord = record
Number: Integer;
Value: Float;
end
Run Code Online (Sandbox Code Playgroud)
我将计算一堆浮点值.我需要保持前10个浮动值.每个值都有一个相关的数字.我想添加"sets"...如果我的浮点值高于前10位中的一个,它应该将自己添加到列表中,然后"旧"数字10(现在为11)被丢弃.我应该能够以(浮点值)排序顺序访问列表...
它几乎就像一个TStringList,它维护排序顺序....
Delphi 2010中是否已经内置了这样的内容?
我有一个 REST 服务。默认情况下,返回的 JSON 数据已消除所有 NULL。这给我带来了困难,所以我有一个改变行为的请求标头设置。我需要添加的请求头是: Accept-Formatting: json-nulls=include
我已经能够使用以下格式从 POSTMAN 开始工作。
我无法从我的应用程序中得到它。
我的应用程序有一个 TRestClient、TRestResponse 和 TRestRequest。
我尝试将其添加为 TRestClient 和 TRestRequest 的参数。虽然 REST 服务返回数据,但未显示 NULL 字段,这告诉我我的格式(或与请求标头相关的其他内容)不正确。应该在哪里以及如何添加?
任何想法表示赞赏。
在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