我正在制作一个框架(仅供内部使用),该框架在3 o 4个delphi数据库CRUD应用程序中具有通用代码.
mi框架的一个共同目标是TContext,
TContext = class (IContext)
function DB: IDatabase;
function CurrentSettings: ISettings;
..
end;
Run Code Online (Sandbox Code Playgroud)
传递给许多其他对象的初始化方法.例子(这将是应用程序代码):
TCustomer.Initialize(Context: IContext)
TProjectList.Initialize(Context: IContext)
..
Run Code Online (Sandbox Code Playgroud)
每个应用程序都有一些特定的上下文函数(只能从应用程序代码中调用):
IApp1Context = interface (IContext)
procedure DoSomethingSpecificToApp1;
procedure DoOtherThing;
..
end;
Run Code Online (Sandbox Code Playgroud)
所以当我创建一个Context时,我创建一个IApp1Context,并将其发送到初始化方法..从框架代码一切都很好,问题是从应用程序代码我不断地从IContext转换为IApp1Context来访问特定的App1函数..所以我的应用程序代码看起来像(和它的很多代码):
(FContext as IApp1Context).DoSomethingSpecificToApp1
(FContext as IApp1Context).DoOtherThing;
..
Run Code Online (Sandbox Code Playgroud)
事情显而易见,但在我看来并不好读.也许我夸张了; 这种情况有一种巧妙的设计技巧,我不知道吗?
我在TClientDataSet没有提供者概念的情况下使用a 作为本地数据集.在使用它之后,调用一个方法,该方法应该生成相应的SQL语句,使用它StatusFilter来解析更改(基本上生成SQL).
在阅读文档(设置StatusFilter to [dsInsert],处理所有插入SQL,设置StatusFilter to [dsModified]进程所有更新,删除相同)后,这看起来很容易,但经过几次测试后,现在看起来远非琐碎,例如:
如果我添加一条记录,则进行编辑:设置StatusFilter to [dsInserted]显示它,但使用原始数据.
如果我添加一条记录,然后编辑,然后将其删除:该记录StatusFilter set to [dsInserted] and [dsModified]也随之出现.
和其他类似的情况..
1)我知道如果我首先处理所有插入,那么所有更新然后所有删除数据库都将以正确的状态更新,但它看起来很不正确这种方法(生成无用的sql语句).
2)我试图访问PRecInfo(ClientDataSet.ActiveBuffer + ClientDataSet.RecordSize).Attribute信息(dsRecNew,dsRecOrg等),但仍无法解决逻辑问题.
3)我可以对逻辑进行编程以解决它,例如在处理和插入,设置StatusFilter to [dsDeleted]和定位之前,如果记录要查看其后是否删除了...与编辑相同,在插入之前,检查记录是否是更新之后所以在更新版本中插入sql等等..但它应该更容易..
¿有人试图以优雅和直接的方式解决这个问题吗?我错过了什么?谢谢
我通常将 ActiveModel::Model 包含到一些 PORO 中(例如对于 FormObject::SignUp)。我读过新的 Rails 5 ActiveRecord::Attribute API,我想我可以用它来进行更简单的转换,但不是运气。
例如,给定
class FormObject::SignUp
include ActiveRecord::Model
include ActiveRecord::Attributes
attribute :birthday, :date
validates :birthday, presence: true
end
Run Code Online (Sandbox Code Playgroud)
NameError: undefined local variable or method `reload_schema_from_cache' for FormObjects::SignUp:Class当我尝试实例化它时出现异常。
预计不会单独使用?谢谢
它是可以使用的还是它使用了仅在XE2中提供的一些编译器技术?
我只想将(双向)TEdit.Text属性绑定到一个对象函数,该函数在代码中返回一个字符串(我不需要设计器组件或表达式求值器).
谢谢!
我有一个TGUID变量,我想通过Rtti将其"转换"为描述该接口的PTypeInfo.
AGUID := StringToGUID('{19BB9F78-1FB1-4B0F-B691-82EE5CD7A941}');
.. transform AGUID to PTypeInfo ..
AInterface = GlobalContainer.Resolve( <PTypeInfo> expected);
Run Code Online (Sandbox Code Playgroud)
Delphi 2010+
有一些替代gsub只是替换一个字符串出现与另一个?
根据文档"如果替换是一个字符串,它将替换匹配的文本.它可能包含对格式\ d的模式捕获组的反向引用,其中d是一个组号,或者\ k,其中n是一个团队名字."
我不想要这个功能..
简化示例:
"abc".gsub("b", "\\7") -> "ac"
Run Code Online (Sandbox Code Playgroud)
我想"a\7c"..
问题是从用户那里询问替换字符串(实际上它是一个包含的路径"xxx\7.0\yyy"),如果它是一个简单的固定字符串我可以自己逃避它.
我知道这是有效的:"abc".gsub("b") { |x| "\\\7" }..但是像红宝石这样美丽的语言要学习到现在我相信应该有一个简单的替代方案,我在文档中忽略.
我有一个数据输入表单,其中包含动态添加的(发票+详细信息)。对于产品搜索,我创建了一个链接到带有选项的数据列表的输入。每当用户输入时,它都会使用 JS 过滤大量产品,然后用构造的选项替换链接数据列表的内容,因此它会更新建议(就像 jQuery 自动完成,但都是本机的)。到目前为止,一切都很好。
现在,当我不断向发票添加详细信息时,搜索操作的性能开始下降。(MacOsX 和 Windows 上的版本 59.0.3071.115(官方版本)(64 位))。我已经开始分析内容,并将问题固定在设置数据列表的innerHTML 的行上:
updateDatalist: (filter = '') =>
options = @buildOptions(@filterWith(filter))
console.time 'updateDatalist'
@$datalist[0].innerHTML = options
console.timeEnd 'updateDatalist'
Run Code Online (Sandbox Code Playgroud)
当只有一个细节时,性能计时器开始报告约 30 毫秒,然后当大约有 10 个细节时,它会扩展到 500-700 毫秒。我一直在进行分析,猜测我的设置应该有问题,但没有任何问题。然后我用 Firefox 尝试了一下,哇,它总是完美运行,而且性能永远不会下降。
你认为这是一个错误还是我遗漏了一些东西?我应该报告吗?如何报告?
编辑:这是源的完整要点:https://gist.github.com/vizcay/969f2b492630b12a520adb6e7433628e
delphi ×4
delphi-2010 ×2
frameworks ×1
html ×1
interface ×1
javascript ×1
livebindings ×1
performance ×1
rtti ×1
ruby ×1