对于想了解delphi–为什么要使用类而不是记录,反之亦然?的读者,本文将提供新的信息,我们将详细介绍delphi的所有类都是从什么类继承下来的,并且为您提供关于delphi–什么时候和为什么要使用T
对于想了解delphi – 为什么要使用类而不是记录,反之亦然?的读者,本文将提供新的信息,我们将详细介绍delphi的所有类都是从什么类继承下来的,并且为您提供关于delphi – 什么时候和为什么要使用TStringBuilder?、delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?、Delphi,VirtualStringTree – 类(对象)而不是记录、javascript – 什么是使用return false而不是e.preventDefault()的实际应用程序,反之亦然?的有价值信息。
本文目录一览:- delphi – 为什么要使用类而不是记录,反之亦然?(delphi的所有类都是从什么类继承下来的)
- delphi – 什么时候和为什么要使用TStringBuilder?
- delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?
- Delphi,VirtualStringTree – 类(对象)而不是记录
- javascript – 什么是使用return false而不是e.preventDefault()的实际应用程序,反之亦然?
delphi – 为什么要使用类而不是记录,反之亦然?(delphi的所有类都是从什么类继承下来的)
现在我的老板是老派,开始使用Pascal进行编程,并不一定保持最新的Delphi的最新变化。
最近我一直在想,我们的核心技术之一是否“错了”。
我们的大部分应用程序与MysqL接口。一般来说,我们将创建一个记录,其结构用于存储从DB读取的数据,这些记录将存储在TList中。通常我们将有一个单位定义我们在应用程序中的各种记录,以及种子和读取记录的功能和过程。我们不使用如here概述的记录程序
在回顾了一些例子后,我开始想知道我们是否会更好地使用课程而不是记录,但是我无法以任何一种方式找到强有力的指导。
我们正在处理的事情将是用户信息:名称,dob,事件,事件类型。或时间表信息:小时,工作等…
解决方法
>对于值类型,当您使用赋值时,a:= b,将进行复制。有两个不同的实例,a和b。
>对于引用类型,当您使用赋值时,a:= b,两个变量都指向同一个实例。只有一个实例。
这样做的主要后果是当您写入a.Field:= 42时会发生什么。对于记录,值类型,赋值a.Field会更改a中的成员的值,但不更改b中的成员的值。这是因为a和b是不同的实例。但是对于一个类,由于a和b都引用相同的实例,所以在执行a.Field:= 42后,你可以安全地声明b.Field = 42。
没有硬而快的规则说,你应该始终使用值类型,或者总是使用引用类型。两者都有自己的位置。在某些情况下,优选使用一种,在其他情况下,优选使用另一种。本质上,决策总是归结于对您所要求的任务运算符的意义。
你有一个现有的代码库,大概是熟悉它的程序员,做出了特别的选择。除非你有一个令人信服的理由转向使用参考类型,否则这种变化几乎肯定会导致缺陷。在现有代码(切换到引用类型更改赋值运算符的含义)以及在将来写入的代码中,缺陷(您和您的同事已经在特定上下文中对赋值运算符的意义开发了直觉,直觉会断开如果你切换)。
此外,您声明您的类型不使用方法。仅由数据组成的类型,并且没有与之相关联的方法很可能最好由值类型表示。我不能肯定地说,但我的本能告诉我,原来的开发商做出了正确的选择。
delphi – 什么时候和为什么要使用TStringBuilder?
所以我的代码当然是所有的遗留代码。它使用现在方便的所有短字符串都变成长Unicode字符串,并且我已将所有旧的ANSI函数更改为新的等效项。
但是在Delphi 2009中,他们引入了TStringBuilder类,大概是以StringBuilder类为基础的。
我的程序执行了大量的字符串处理和操作,并可以一次将数百兆字节的大字符串加载到内存中。
我不太了解Delphi的TStringBuilder的实现,但是我听说有些操作比使用默认的字符串操作要快。
我的问题是,我是否值得我努力,并将我的标准字符串转换为使用TStringBuilder类。这样做会失去什么?
感谢您的回答,并引导我得出结论,除非需要.NET兼容性,否则不要费心。
在他的博客Delphi 2009 String Performance,Jolyon Smith states:
But it looks to me as if TStringBuilder is there primarily as a .NET compatibility fixture,rather than to provide any real benefit to developers of Win32 applications,with the possible exception of developers wishing or needing to single-source a Win32/.NET codebase where string handling performance isn’t a concern.
解决方法
共识似乎是TStringBuilder在一些操作中更快,而在其他操作中更慢。
您的程序听起来像是一个有趣的,之前/之后的TStringBuilder进行比较,但我不会做,除了作为一个学术练习。
delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?
版本1
try try {Do something} finally {Do tidy up} end except {Handle exception} end;
版本2
try try {Do something} except {Handle exception} end finally {Do tidy up} end;
解决方法
> except和finally块执行的相对顺序不同.在版本1中,finally在except之前执行.在版本2中,执行顺序是相反的.
>在版本1中,如果finally块引发,则它将由except块处理.在版本2中,则它将由下一个包含异常处理程序处理,即在此代码之外.
通常你不关心最后提升的块.你根本不希望发生这种情况,如果发生这种情况,有些东西可能会非常破碎.
因此,重要的区别在于finally是否在异常处理程序之前运行,反之亦然.有时它并不重要,但它往往确实有所作为.
Delphi,VirtualStringTree – 类(对象)而不是记录
我应该声明它是标准的(但在这种情况下是棘手的)方式:
PNode = ^TNode; TNode = record obj: TMyObject; end; //.. var fNd: PNode; begin fNd:= vstTree.getNodeData(vstTree.AddChild(nil)); fNd.obj:= TMyObject.Create; //..
或者我应该直接使用TMyObject?如果是这样 – 怎么样?!
如何分配(构建)对象并释放它?
提前致谢
米
解决方法
vstTree.NodeDataSize := SizeOf(TMyObject);
>获取datasize holder并绑定到您的对象
vstTree.getNodeData(passed in interested node)^ := your object
要么
vstTree.getNodeData(vstTree.AddChild(nil))^ := TMyObject.Create;
要么
使用vstTree.InsertNode方法
>释放绑定对象连接OnFreeNode事件
vstTree.OnFreeNode := FreeNodeMethod;
同
procedure TFoo.FreeNodeMethod(Sender: TBaseVirtualTree; Node: PVirtualNode); var P: ^TMyObject; begin P := Sender.getNodeData(Node); if P <> nil then begin P^.Free; P^ := nil; //for your safety or you can omit this line end; end;
javascript – 什么是使用return false而不是e.preventDefault()的实际应用程序,反之亦然?
我明白,如果我返回false,它实质上是调用e.preventDefault()和e.stopPropagation.
我的问题在于决定何时我想要继续事件流程而不是完全停止它.我们能否列出一些真实世界的情况,我想使用e.preventDefault()而不是返回false,反之亦然,为我绘制更清晰的图片?
编辑:
我是一个视觉学习者,看到某些东西是如何工作的,而不是阅读它,我是如何理解它为什么起作用的.对于能为我发布代码示例的人,我将非常感激.
编辑:
基于@Pointy的回答和评论,我为那些视觉学习者创建了一个jsFiddle demo工作.我认为它很好地总结了它.
解决方法:
您可能希望在“提交”按钮的“单击”处理程序上使用“preventDefault()”,但不返回false.为什么?因为您可能有一个按钮的“本地”处理程序,可以决定是否继续提交表单.但是,可能有其他处理程序设置为“.delegate()”或“.live()”,根据按钮点击执行其他有趣的事情,所以我希望允许事件冒泡到那些.
编辑 – 非常重要的是要注意,具有错误返回值的约定会阻止传播(冒泡)和默认行为是jQuery的事情,而不是本机的.
编辑更多通过举例说明,请考虑以下HTML:
<body>
<form name='foo' action='whatever'>
<!-- ... -->
<input type='submit' value='Go' id='mainSubmit'>
</form>
</body>
现在,如果我想在页面上的任何按钮上发生某种奇特的动画,我可能会有一些代码通过“.delegate()”连接起来:
// provide entertaining animation upon button clicks
$('body').delegate('input:submit, input:button, button', 'click', function() {
$(this).performExcitingAnimation();
});
对于表单中的提交按钮,我可能想要进行表单验证以确定是否可以真正提交表单:
$('#mainSubmit').click(function(e) {
if ($(this).closest('form').valid()) return true;
$('#errorBox').text("Uh oh something is wrong");
e.preventDefault(); // ... instead of return false
});
如果该处理程序使用了return false;而不是调用“preventDefault()”方法,然后事件不会冒泡到委托的处理程序,用户将遗憾地剥夺一些令人兴奋的按钮动画.
今天关于delphi – 为什么要使用类而不是记录,反之亦然?和delphi的所有类都是从什么类继承下来的的介绍到此结束,谢谢您的阅读,有关delphi – 什么时候和为什么要使用TStringBuilder?、delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?、Delphi,VirtualStringTree – 类(对象)而不是记录、javascript – 什么是使用return false而不是e.preventDefault()的实际应用程序,反之亦然?等更多相关知识的信息可以在本站进行查询。
本文标签: