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

解決


メルモ  2006-04-18 08:55:20  No: 21080  IP: 192.*.*.*

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

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

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

編集 削除
えーと  2006-04-18 09:13:18  No: 21081  IP: 192.*.*.*

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

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

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

編集 削除
ナニはなくとも  2006-04-18 09:13:39  No: 21082  IP: 192.*.*.*

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

編集 削除
えーと  2006-04-18 09:16:08  No: 21083  IP: 192.*.*.*

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

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

編集 削除
NONE  2006-04-18 09:22:44  No: 21084  IP: 192.*.*.*

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

編集 削除
メルモ  2006-04-18 09:47:28  No: 21085  IP: 192.*.*.*

みなさん、どうもありがとうございます。
以下(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 09:50:09  No: 21086  IP: 192.*.*.*

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

編集 削除
メルモ  2006-04-18 10:07:34  No: 21087  IP: 192.*.*.*

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

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

編集 削除