小编Rai*_*ith的帖子

如何在Delphi中正确释放包含各种类型的记录?

type
  TSomeRecord = Record
    field1: integer;
    field2: string;
    field3: boolean;
  End;
var
  SomeRecord: TSomeRecord;
  SomeRecAr: array of TSomeRecord;
Run Code Online (Sandbox Code Playgroud)

这是我所拥有的最基本的例子,因为我想重复使用SomeRecord(某些字段保持为空,没有释放所有字段将在重复使用时被转移SomeRecord,这显然是不受欢迎的)我正在寻找一种方法一次释放所有字段.我已经开始string[255]使用ZeroMemory(),这很好,直到它开始泄漏内存,这是因为我切换到string.我仍然缺乏了解原因的知识,但似乎与动态有关.我也在使用动态数组,因此我认为尝试ZeroMemory()任何动态都会导致泄漏.有一天浪费了这一点.我想,我通过使用解决了这个Finalize()SomeRecordSomeRecAr之前ZeroMemory(),但我不知道这是正确的做法,或只是我太傻了.

所以问题是:如何一次性解放所有东西?是否存在一些我不知道的单一程序?

换句话说,或者我会建议如何以不同的方式实现这些记录,所以我不需要做出复杂的尝试来释放东西.我已经研究过创建记录New()然后去掉它Dispose(),但我不知道当调用之后的变量Dispose()是未定义的而不是nil 时它意味着什么.另外,我不知道某个type(SomeRecord: TSomeRecord)的变量与指向type()的变量之间的区别是什么SomeRecord: ^TSomeRecord.我现在正在调查上述问题,除非有人能够快速解释,否则可能需要一些时间.

delphi records

15
推荐指数
3
解决办法
1万
查看次数

如何在delphi中一次将具有不同字体格式的文本绘制到画布?

我一直在使用DrawText我所有的"矩形文本"输出需求,但是我没有看到绘制字符串的方法,例如,每个其他单词都是粗体或不同的颜色,或者更糟糕的是,不同的背景对于所述随机选择的单词.据我所知,可能没有单一程序可以做到这一点,我可能错了,这是这个问题的要点.有人能指出试图达到这种效果的人可能感兴趣的程序吗?另外,如果我是正确的并且没有简单的方法,那么建议的路径是什么?分别绘制每个单词,然后尝试将所有这些粘合在一起似乎是一场噩梦,当你开始考虑可能由此产生的问题时,我的头脑:当你有不同的字体或大小时,在单个水平线上进行正确的文本对齐. ..

我有delphi xe3; 如果有人可以改进我的问题和/或文字的措辞,请这样做.

delphi

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

德尔福的"降序"记录?

我知道你实际上不能从记录中删除任何内容,但我不确定如何用一句话来概括我的问题.如果你这样做,请编辑标题.

我想要做的是创建一个通用类型的数组,它可以是X个类型之一,数组将填充那些自定义类型(它们具有不同的字段,这是重要的).简单的方法是只创建一个变量记录数组,每个变体都有自己的类型,但显然不能重新声明标识符,如下所示:

GenericRec = Record
  case SubTypeName: TSubTypeName of
    type1name: (SubRec: Type1);
    type2name: (SubRec: Type2);
    ...
    typeNname: (SubRec: TypeN);
  end;
Run Code Online (Sandbox Code Playgroud)

更改SubRecSubRec1, SubRec2... SubRecN品牌引用痛苦的,但并非不可能.因为我开始寻找上述问题的替代解决方案,所以我想起了课程.

显示我想要实现的TObject一个明显的例子是,可以将这些数组分配给许多不同的东西.这就是我想要的,但有记录(这是不可能做到的),因为我希望能够将记录保存到文件中并将其读回(也因为它是我已经熟悉的东西).制作我自己的简单类并不是一个问题,从中创建一个后代类来表示我的子类型 - 我可以这样做.但是如何写入文件并将其读回来呢?这归结为序列化,我不知道该怎么做.从我收集的内容来看,它并不容易,而且必须从这里下课TComponent.

TMyClass = Class
Run Code Online (Sandbox Code Playgroud)

如果我像上面那样上课,会有什么不同吗?它没什么特别的,最多有10个字段,包括一些自定义类型.

将序列化放在一边(仅仅因为我有很多关于该主题的阅读),在这里使用类也可能是不可能的.

在这一点上,我的选择是什么?我应该放弃记录并在课堂上尝试这个吗?或者只是坚持记录并处理变体"限制"会不那么复杂?我只是在学习,如果课程方法的爆炸可能让我更聪明,我会做的.我也只是调查TList过(从未使用它),但似乎它与记录混合得不是很好,也许它可以完成,但这可能不在我的联盟中.我愿意接受任何建议.我该怎么办?

delphi records

8
推荐指数
2
解决办法
526
查看次数

为什么在 OnChange 事件中调用 Delete 时会出现 RichEdit 行插入错误?

我已经用谷歌搜索并检查了许多地方的解决方案,但我发现的所有案例都不同或涉及比简单地添加或删除行更高级的东西。基本上,我想做一种滚动丰富的编辑(另一种方法是将插入符号移到底部,我已经找到了解决方案)。

我正在向它添加行并检查富编辑Lines.CountOnChange事件,一旦它达到大于 15 我想调用的值Lines.Delete(0),但是我收到错误:

RichEdit line insertion error
Run Code Online (Sandbox Code Playgroud)

有人能告诉我我在这里做错了什么吗?

delphi richedit delphi-xe2

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

用frame2访问frame1的组件,frame2在frame1上,在delphi中,框架是动态创建的

最初的问题首先是如何访问组件,但我设法弄清楚了。我刚刚学习 Delphi,所以我很容易遇到愚蠢而明显的问题。我也正处于这样一个阶段:我实际上并没有写任何有用的东西,而只是乱搞一些随机的东西,看看它是如何工作的,也许还能学到一些东西。

文字墙即将到来,我想解释一下我目前正在探索的内容......

基本上我有一个带有按钮1的form1,按下它会创建一个框架2,该框架2有一个按钮2,按下按钮2会在框架2内创建一个框架3(它是框架3的父级和所有者)。每个框架都有另一个 freeandnil 按钮。按下每个按钮 1/2/3 后,它会被禁用以防止创建多个实例。我最初的问题是,在使用 freeandnil-button 之后,我无法访问前一帧上的按钮(它对于表单工作正常,form1.button1.enabled:=true在框架 2 中工作得很好),该按钮被禁用以重新启用它(frame2.button1.enabled:=true从框架 3 中创建一个访问我认为是违规的)。

假设我以后写一些东西需要这样的交流呢?因此,我向每个框架添加了一个编辑框,另一个框架上有一个按钮来更改编辑框文本,这是我当前的工作解决方案:

procedure TFrame2.Button3Click(Sender: TObject);
var i,z:integer;
begin
for i := 0 to ComponentCount - 1 do
  if components[i] is tframe3 then
    for z := 0 to (components[i] as tframe3).ComponentCount - 1 do
      if (components[i] as tframe3).Components[z] is TEdit then
         ((components[i] as tframe3).Components[z] as TEdit).Text:='ping';
end;
Run Code Online (Sandbox Code Playgroud)

procedure TFrame3.Button3Click(Sender: TObject);
var i:integer;
begin
for i := 0 to parent.ComponentCount-1 do
  if parent.components[i] is …
Run Code Online (Sandbox Code Playgroud)

delphi components communication frames

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

当面板改变尺寸时,如何将控件保持在面板的底部或右侧?

解决方案有一些类似的问题,但没有人回答我的问题,所以在这里.

TPanel使用TButton它进行崩溃/扩展是非常简单的,或者我认为.我玩了一下,把按钮放在最顶部(从上到下扩展/折叠高度)或左边(从左到右扩展/折叠宽度)按计划工作.事实上,所有可扩展/可折叠的"高级"面板都以完全相同的方式工作 - 按钮仅放置在顶部或左侧.很快我就撞墙了:如果你把按钮放在底部或右边分别用于扩展/折叠高度或宽度,按钮就会停留在它们所在的位置......客户区(?) - 我缺乏解释的知识这是正确的,但我会认为,除非另有说明,否则很清楚会发生什么.重点是,按照我这样做的方式,唯一的解决方案是重新定位面板中的按钮,但这可能会放在一些根本不可见的其他组件之上.

所以问题是:我怎样才能使这种情况正常发生?因为我调整面板大小然后重新定位按钮的想法看起来不是解决这个问题的正确方法.或者,我很乐意采取一些这样做的组件,但是从我检查过的组件中,所有行为都一样,甚至JEDI VCL TJvRollOut组件也可以设置Placement(按钮/标题)仅为plTop或者plLeft,所以我在想这不是那么简单吗?

delphi layout panel

3
推荐指数
1
解决办法
2739
查看次数

Richedit样式格式自行更改

(如果你能更好地理解和定义我的问题,有人会编辑标题.)

我遇到的问题是RichEdit的样式格式化"恢复"回到默认的"无" [],然后回到我设置的任何内容,例如粗体或斜体.

有问题的东西 - 我认为,因为我不知道它是如何破坏的 - 是一个程序(REMainLinesCheck),它检查RichEdit中的行数并删除第一个直到达到某个点(显示一次最多14行)像这样:

while REMain.Lines.Count > 14 do
  REMain.Lines.Delete(0); 
Run Code Online (Sandbox Code Playgroud)

我在其他过程中有6次出现上述过程,这些过程向RichEdit添加了行,但是没有RichEdit.SelAttributes.Style一行更改而只有一行,它只添加了一条粗线,如下所示:

REMain.SelAttributes.Style := [fsBold];
REMain.Lines.Add('something');
REMainLinesCheck;
Run Code Online (Sandbox Code Playgroud)

所以我已经删除了除了那个之外的所有事件,并且开始四处寻找,没过多久就看到它实际上工作正常,常规和粗体线正常添加和多余的线被删除 - 没有问题.但是,只要我将REMainLinesCheck程序重新引入另一个程序(为了清楚起见,我们称之为Proc3Lines,因为它的作用是:添加3行,然后调用多余的行检查),此Proc3Lines之后的每一行都应该是Bold不是......从我在这里经历的看来,似乎REMainLinesCheck在Proc3Lines中做了一些事情,因为没有它一切都很好.

显然,这不是一个相互调用的程序圈,但代码的其他部分与此RichEdit无关,更不用说RichEdit.SelAttributes.Style除了我已经显示的一个地方之外我没有改变任何地方,有另一个RichEdit在同一个单元中,我确实改变了它的线条样式,但这不可能以任何方式相关......是吗?(不,它没有,我只是检查.)

基本上:德尔福到底是什么?它不能比这更简单,我仍然设法失败,有人可以解释和/或解决这个问题吗?提出问题,如果不清楚,我会尽可能详细说明.

delphi styles richedit

2
推荐指数
1
解决办法
4131
查看次数