GVKun编程网logo

delphi – 为什么要使用类而不是记录,反之亦然?(delphi的所有类都是从什么类继承下来的)

29

对于想了解delphi–为什么要使用类而不是记录,反之亦然?的读者,本文将提供新的信息,我们将详细介绍delphi的所有类都是从什么类继承下来的,并且为您提供关于delphi–什么时候和为什么要使用T

对于想了解delphi – 为什么要使用类而不是记录,反之亦然?的读者,本文将提供新的信息,我们将详细介绍delphi的所有类都是从什么类继承下来的,并且为您提供关于delphi – 什么时候和为什么要使用TStringBuilder?、delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?、Delphi,VirtualStringTree – 类(对象)而不是记录、javascript – 什么是使用return false而不是e.preventDefault()的实际应用程序,反之亦然?的有价值信息。

本文目录一览:

delphi – 为什么要使用类而不是记录,反之亦然?(delphi的所有类都是从什么类继承下来的)

delphi – 为什么要使用类而不是记录,反之亦然?(delphi的所有类都是从什么类继承下来的)

我一直在使用Delphi一段时间,但不是来自CS背景,我已经学到了“在工作中” – 大多来自我的老板,并通过从网页上拾取的比特来增加用户指南,例子等等

现在我的老板是老派,开始使用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?

delphi – 什么时候和为什么要使用TStringBuilder?

一年前,我将程序从Delphi 4转换为Delphi 2009,主要是为了跳转到Unicode,而且还可以获得所有这些年Delphi改进的好处。

所以我的代码当然是所有的遗留代码。它使用现在方便的所有短字符串都变成长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只是为了与.NET和Java的一些平衡而被介绍,似乎比任何主要的进步都要更多地勾选框类型的功能。

共识似乎是TStringBuilder在一些操作中更快,而在其他操作中更慢。

您的程序听起来像是一个有趣的,之前/之后的TStringBuilder进行比较,但我不会做,除了作为一个学术练习。

delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?

delphi – 使用try-except块包装try-finally块之间有什么区别,反之亦然?

Delphi中两种编码模式之间是否存在实际差异:

版本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 – 类(对象)而不是记录

Delphi,VirtualStringTree – 类(对象)而不是记录

我需要为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()的实际应用程序,反之亦然?

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()的实际应用程序,反之亦然?等更多相关知识的信息可以在本站进行查询。

本文标签: