0

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

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

4

1 回答 1

0

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

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

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

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 个条目)。

于 2011-02-06T17:37:38.120 回答