【问题标题】:saving delphi routines and memory节省delphi例程和内存
【发布时间】:2011-02-06 16:00:36
【问题描述】:

这个问题是关于能够保存例程,并能够从列表中选择它们……。当您选择一个时,它知道要在哪里链接等等。只是为了理解。不是实际的程序

假设我想以 Delphi 形式创建一个例程。我想创建几个不同的。它们不会完全相同,但有些可能相似。我想知道如何在 Delphi 中保存内容,以及当您关闭或终止应用程序时,它们会在您重新打开时被记住。我不知道从哪里开始以及如何工作。任何帮助都会很棒。只是一个提示或方向,也许是一个包含更多信息甚至示例的网站。我将尝试在下面给出一个更简单的描述,说明它在表单上的外观......只是为了这个想法,我认为如果我理解这一点就足够了,或者至少是一个好的开始。

表单将包含一个列表框、一个保存按钮和 4 个不同的编辑框。假设我输入了 edit1;1 和 edit2;2 和 edit3;3 和 edit4;4。然后单击保存按钮,它会将这 4 个值记住到每个编辑框,让我们说保存在 ≔edit1.text + 'to' + edit4.text 列表框中的值下。希望到目前为止它是有意义的,然后我在编辑框中输入错误的所有内容。编辑1;4 和编辑2;3 和编辑3;2 和编辑4;1。然后单击保存按钮,它会再次(≔edit1.text + 'to' + edit4.text)进入列表框。然后我想关闭应用程序。再次打开它,仍然有这个,仍然可以添加更多这些奇怪的样本……

谁能帮帮我?

编辑问题,可能会更清楚......

我将在表单上放置以下元素:2 个列表框(每 3 行,在第一个列表框中:木材、塑料和玻璃。在第二个列表框中:树、杯子、窗口。) 现在我想链接正确的,它们在这里是有序的,但它们不是什么。在我想链接它们的表单上不可见的表格或应用程序的内存中。 然后,如果我要在表单上放置两个编辑框,并且我输入第一个木材或树木,它会将另一个放在另一个编辑框中。因此,在某种程度上,我假设您正在创建一个表格,该表格知道哪个与哪个对应,但在您在编辑框中键入时也会进行查找。希望这是有道理的

【问题讨论】:

  • 您希望节省多少种不同的例程?它只是其中的几个,那么您可以使用注册表或平面文件,如果可能有数百或数千个,那么数据库可能是最佳选择。
  • 我对此毫无意义。什么是例行公事?
  • 你想保存sn-ps的代码吗?那么文本编辑器呢?我推荐记事本++。
  • @Partick Echterbruch - 可以说只有 10 次保存。没有什么太极端了。我不想节省数百或数千。你有如何使用注册表或平面文件的例子吗?或网站....
  • @David Heffernan - 不是代码的 sn-ps,只是程序的记忆。关闭它后我可以稍后再返回。我只是希望它记住某个例程,当我选择该例程并填写数据时,它知道要连接到什么。

标签: delphi memory save routines


【解决方案1】:

根据您所写的内容,我假设您已经知道如何将要记住的值添加到您的列表框中,所以我不会在这里处理这部分。从这个答案开始,您应该已经知道在 delphi 帮助文件中要查看的内容。请注意,我没有测试示例,因此可能存在拼写错误。

为了在计算机注册表中存储数据,delphi 为您提供了单元Registry,其中包含一个类TRegistry

TRegistry 具有检索和存储值所需的所有方法。以下是一个没有任何实际用途的简短示例,只是为了给您提供图片。请注意,就像 cmets 中提到的那样,还有很多空间供您优化。例如,最好只创建一次 TRegistry 对象,然后重复调用这些方法。而且 - 虽然我写的这个普通的旧德尔福单元在语法上是有效的 - 你可能最好使用更面向对象的方法,比如从 TRegistry 派生一个新类。还请检查文档以获取方法的返回值,因为有些(如OpenKey)在无法满足您的请求时简单地返回false,而另一些(如ReadString)可以抛出一个execption。

unit Unit1;

interface
uses TRegistry, Windows;

procedure saveStringToRegistry(name : String; value : String);
function readIntegerFromRegistry(name : String) : Integer;

implementation

procedure saveStringToRegistry(name : String; value : String);
var r : TRegistry;
begin
   r := TRegistry.Create;
   try
      r.RootKey := HKEY_CURRENT_USER; // Defined in unit Windows, as well as HKEY_LOCAL_MACHINE and others.
      r.OpenKey('Software\Manufacturer Name\Produkt Name\Other\Folders',true); // TRUE allows to create the key if it doesn't already exist
      r.WriteString(name,value); //Store the contents of variable 'value' in the entry specified by 'name'
      r.CloseKey;
   finally
      r.Free;
   end;
end;

function readIntegerFromRegistry(name : String) : Integer;
var r : TRegistry;
begin
   r := TRegistry.Create;
   try
      r.RootKey := HKEY_LOCAL_MACHINE; // Defined in unit Windows
      r.OpenKey('Software\Manufacturer Name\Produkt Name\Other\Folders',false); // FALSE: do not create the key, fail if it doesn't already exist
      result := r.ReadInteger(name);
      r.CloseKey;
   finally
      r.Free;
   end;
end;

end.

好的,现在您可以在应用程序中使用for 循环来处理列表框的所有项目,并使用上述过程将其保存到注册表中,如下所示:

for i := 0 to ListBox1.Count -1 do
   saveStringToRegistry('Entry' + IntToStr(i),ListBox1.Items[i];

然后,您可能会保存您拥有的项目数(当然您必须定义过程 saveIntegerToRegistry):

saveIntegerToRegistry('NumberOfEntries',ListBox1.Count);

当你需要重新加载数据时,你可以这样做:

ListBox1.Clear;
for i := 0 to readIntegerFromRegistry('NumberOfEntries') -1 do
   ListBox1.Items.Add(readStringFromRegistry('Entry' + IntToStr(i));

好的,这是一个非常基本的示例,但应该可以为您指明正确的方向。它当然需要一些异常处理(想象一下用户不小心从注册表中删除了Entry42,但NumberOfEntries 仍然说有55 个条目)。

【讨论】:

  • 一些问题:您的读/写方法是多余的,它们包装了 TRegistry 实例的创建和销毁,只是为了调用一个方法。在循环中使用这些方法会导致每次创建和销毁 TRegistry 类:不好。 ReadXXX 方法不检查r.OpenKey 的返回值:如果该键不存在,并且没有创建,则以下行(r.ReadXXX)将引发异常。
  • @Cosmin Prund - 那么你建议怎么做呢?
  • @ployo60 你为什么不尝试自己做呢。当你卡住时,再问一次。真的没那么难。
  • @ployo60,听从 David 的建议:您有一些想法,自己尝试一下。
  • 好的,我继续,当我需要更多帮助时告诉你!谢谢你们俩!
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 2011-12-26
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多