チェック状態を保存するには?

解決


メルモ  2006-04-18 17:55:20  No: 21080

項目を選択するのに、チェックリストボックスを使用しています。
項目数は固定の8192個(行)です。
チェックリストボックスで最大数を固定して使用しています。
レジストリにこのデータを保存(読込)しようとしているのですが
最大数が多いと保存(読込)に時間がかかります。

そこで、
CheckListBox1.Checked を WriteBinaryData, ReadBinaryData を
使えばもっと高速で保存(読込)ができると思うのですが、
この保存(読込)する方法を教えてください。

以下のようなかんじになると思うのですが、
これではうごきませんでした。
Regist.ReadBinaryData('RegItem', CheckListBox1.Checked, 8192);


えーと  2006-04-18 18:13:18  No: 21081

true/false は2値なので、1バイトに8つの状態が保存できますね。

> 以下のようなかんじになると思うのですが、
> これではうごきませんでした。
> Regist.ReadBinaryData('RegItem', CheckListBox1.Checked, 8192);

えーと、これでは全く駄目です。まず、二進数というものを勉強してください。
そして、1バイト変数のなかに任意のビットの on/off を制御する方法を
考えてください。保存・読み込み以前の問題です。


ナニはなくとも  2006-04-18 18:13:39  No: 21082

ヘルプ見たの?
レジストリには、あまり大きなDATAを保存するべきではありません。


えーと  2006-04-18 18:16:08  No: 21083

> レジストリには、あまり大きなDATAを保存するべきではありません。

1バイト = 8ビットだから1kB で済みますが。


NONE  2006-04-18 18:22:44  No: 21084

1KBでも大きいです。レジストリを肥大化させるソフトは嫌われます。


メルモ  2006-04-18 18:47:28  No: 21085

みなさん、どうもありがとうございます。
以下(Create部)のように読込部分を変更しました
プログラムは選択後セーブボタンを押したときにレジストリに
登録するようにしています。

ここで、以下のプログラムの初期の実行ではレジストリに
なにも登録されていないはずなので例外が発生すると
思ったのですが、例外が発生することもなく
BDatにデータが(Trueになる箇所が存在)設定されます。

もちろん、ReadInteger等は例外が発生します。
ReadBinaryDataの場合は
キー['RegItem']の存在をチェックしなければならないのでしょうか?

var
  i:    Integer;
  Reg:  TRegistry;
  BDat: array [1..8192] of Boolean;
begin
  Reg.RootKey := HKEY_CURRENT_USER;
  if Reg.OpenKey('\SoftWare\ItemSelect', false) then begin
    try
      Reg.ReadBinaryData('RegItem', BDat, 8192);
      for i := 1 to 8192 do CheckListBox1.Checked[i - 1] := BDat[i];
    except
      for i := 1 to 8192 do CheckListBox1.Checked[i - 1] := false;
    end;
  end;
end;


えーと  2006-04-18 18:50:09  No: 21086

好き嫌いの話はどうでもいいです。それ以前の問題ですから。


メルモ  2006-04-18 19:07:34  No: 21087

みなさん、どうもすみませんでした。
わかりました。

RetNum := Reg.ReadBinaryData(〜
として、RetNum をチェックすればよかったのですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加