項目を選択するのに、チェックリストボックスを使用しています。
項目数は固定の8192個(行)です。
チェックリストボックスで最大数を固定して使用しています。
レジストリにこのデータを保存(読込)しようとしているのですが
最大数が多いと保存(読込)に時間がかかります。
そこで、
CheckListBox1.Checked を WriteBinaryData, ReadBinaryData を
使えばもっと高速で保存(読込)ができると思うのですが、
この保存(読込)する方法を教えてください。
以下のようなかんじになると思うのですが、
これではうごきませんでした。
Regist.ReadBinaryData('RegItem', CheckListBox1.Checked, 8192);
true/false は2値なので、1バイトに8つの状態が保存できますね。
> 以下のようなかんじになると思うのですが、
> これではうごきませんでした。
> Regist.ReadBinaryData('RegItem', CheckListBox1.Checked, 8192);
えーと、これでは全く駄目です。まず、二進数というものを勉強してください。
そして、1バイト変数のなかに任意のビットの on/off を制御する方法を
考えてください。保存・読み込み以前の問題です。
ヘルプ見たの?
レジストリには、あまり大きなDATAを保存するべきではありません。
> レジストリには、あまり大きなDATAを保存するべきではありません。
1バイト = 8ビットだから1kB で済みますが。
1KBでも大きいです。レジストリを肥大化させるソフトは嫌われます。
みなさん、どうもありがとうございます。
以下(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;
好き嫌いの話はどうでもいいです。それ以前の問題ですから。
みなさん、どうもすみませんでした。
わかりました。
RetNum := Reg.ReadBinaryData(〜
として、RetNum をチェックすればよかったのですね。
ツイート | ![]() |