0

この質問は、ルーチンを保存できることと、リストからそれらを選択できることについてです…. 1つを選択すると、何をどこにリンクするかなどがわかります。理解するためだけに。実際のプログラムではありません

Delphi フォームでルーチンを作成したいとします。そして、私はいくつかの異なるものを作りたいと思っています。まったく同じではありませんが、似ているものもあります。Delphi で物事を保存する方法と、アプリケーションを閉じたり終了したりしても、再度開いたときにそれらが記憶されていることを知りたいです。どこから始めて、どのように作業すればよいかわかりません。どんな助けでも素晴らしいでしょう。単なるヒントまたは方向性であり、より多くの情報や例が掲載されている Web サイトかもしれません。フォーム上でどのように表示されるかについて、以下で簡単に説明しようと思います。アイデアだけで、これを理解すればそれで十分、または少なくとも良いスタートになると思います。

フォームには、リスト ボックス、保存ボタン、および 4 つの異なる編集ボックスが含まれます。edit1;1 と edit2;2 と edit3;3 と edit4;4 と入力するとします。次に、保存ボタンをクリックすると、これら 4 つの値が各編集ボックスに記憶され、≔edit1.text + 'to' + edit4.text のリスト ボックスの値の下に保存されます。これまでのところ意味があるといいのですが、編集ボックスにすべて間違った方法で入力します。edit1;4 および edit2;3 および edit3;2 および edit4;1. 保存ボタンをクリックすると、リスト ボックスに (≔edit1.text + 'to' + edit4.text) が追加されます。次に、アプリケーションを閉じたいと思います。もう一度開いて、まだこれをそこに持っていて、これらの奇妙なサンプルをさらに追加することができます….

誰でも私を助けることができますか?

質問を編集すると、より明確になるかもしれません....

フォームに次の要素を配置します。正しいもの、それらはここで順番に並んでいますが、そうではなかったのは何ですか。フォームに表示されないテーブルまたはアプリケーションのメモリ内で、それらをリンクしたい。次に、フォームに 2 つの編集ボックスを配置し、最初の 1 つを入力すると、もう 1 つが別の編集ボックスに配置されます。したがって、ある意味では、どれがどれに対応するかを知っているだけでなく、編集ボックスに入力したときに検索するテーブルを作成していると思います。それが理にかなっていることを願っています

4

1 に答える 1

0

あなたが書いたことから、覚えておくべき値をリスト ボックスに追加する方法をすでに知っていると思います。そのため、ここではこの部分については扱いません。この回答から始めて、Delphi ヘルプ ファイルで何を見ればよいかについての手がかりがすでにあるはずです。この例はテストしていないため、タイプミスがある可能性があることに注意してください。

コンピュータ レジストリにデータを格納するために、delphi はRegistryクラスを含むユニットを提供しますTRegistry

TRegistry値を取得して保存するために必要なすべてのメソッドがあります。以下は、実際の使用を伴わない短い例です。画像を提供するだけです。コメントで述べたように、最適化する余地が十分にあることに注意してください。たとえば、TRegistry オブジェクトを 1 回だけ作成してから、メソッドを繰り返し呼び出す方がよいでしょう。そして、私が書いたこの単純な古い Delphi ユニットは構文的に有効ですが、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));

OK、これは非常に基本的な例ですが、正しい方向へのポインタを提供する必要があります。もちろん、何らかの例外処理が必要になる可能性があります (ユーザーが誤っEntry42てレジストリから削除したにもかかわらず、NumberOfEntriesまだ 55 個のエントリがあると言っているとします)。

于 2011-02-06T17:37:38.120 に答える