Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизРабота с реестром (чтение+запись) Найти похожие ветки
← →
Дмитрий (2003-08-20 13:47) [0]Помогите выйти из тупика!!!
В реестре есть данные (тип DWORD - создан с помощью метода
WriteBool). Читаю эти данные методом ReadBool - всё нормально.
Присваиваю эти данные в CheckListBox.Checked - тоже всё путём.
В обработке события CheckListBox.CheckListBoxClick формируется отображение элемента формы Panel в зависимости от CheckListBox.Checked. Для того, чтобы этот метод сработал - вызываю обработку события CheckListBox.CheckListBoxClick.
Так вот в чём проблема!До вызова обработки события CheckListBox.Checked в соответствии с реестром, а после вызова - CheckListBox.Checked=False и в реестре False. Программно ничего в реестре не менял, объект TRegistry закрывал.
Помогите разобраться, пожалуйста...
← →
Anatoly Podgoretsky (2003-08-20 14:00) [1]Меняешь наверняка, но может не сам, а с помощью какого ни будь компонента, например из RX
← →
mOOx_ (2003-08-20 14:03) [2]Так просто ничего не бывает (из личного опыта %) ), так что ищи что не там вызывается. Пошаговая отладк4а поможет 100%.
← →
Семен Сорокин (2003-08-20 14:07) [3]возможно когда присваиваешь CheckListBox.Checked := ... происходит событие CheckListBox.CheckListBoxClick.
← →
Дмитрий (2003-08-20 14:09) [4]Пошаговая отладка вообще не включается - может, это глюк совместимости Delphi 7 и Windows XP... А может, сам дурак...
Я проверял Message"ами - ни фига. В конце одной процедуры всё путём, в начале другой - всё кувырком.
← →
mOOx_ (2003-08-20 14:11) [5]А как это, не включается пошаговая отладка, ты как ее включаешь?
← →
Дмитрий (2003-08-20 14:12) [6]To: Anatoly Podgoretsky
RX - не использую
← →
Дмитрий (2003-08-20 14:16) [7]To: mOOx_
Отладку включаю как в Delphi 6. Ставлю курсор в нужное место. Жму F4 - выполнить до курсора. Не включается. В 6 работало.
← →
NAlexey (2003-08-20 14:19) [8]Код давай.
← →
Anatoly Podgoretsky (2003-08-20 14:19) [9]Слово например видел?
← →
mOOx_ (2003-08-20 14:24) [10]Не включается, в смысле не запускается или чо? И вообще, жми на ф5, это брякпоинт, удобней на мою взгляд :). Да и кодик бы глянуть :).
← →
Дмитрий (2003-08-20 14:41) [11]To All
unit Unload;
interface
uses ...
type
TForm1 = class(TForm)
Memo1: TMemo;
CheckListBox1: TCheckListBox;
Label1: TLabel;
Label2: TLabel;
Panel1: TPanel;
Label3: TLabel;
DBUserName: TEdit;
Label4: TLabel;
DBPassword: TEdit;
Button1: TButton;
ArchiveFolder: TLabel;
bsSkinSelectDirectoryDialog1: TbsSkinSelectDirectoryDialog;
Button2: TButton;
Panel2: TPanel;
Label5: TLabel;
AnimationEffect1: TAnimationEffect;
Button3: TButton;
bsSkinGroupBox1: TbsSkinGroupBox;
DateTimePicker1: TDateTimePicker;
Label6: TLabel;
DateTimePicker2: TDateTimePicker;
bsSkinGroupBox2: TbsSkinGroupBox;
ComboBox1: TComboBox;
bsSkinGroupBox3: TbsSkinGroupBox;
Label7: TLabel;
UpDown1: TUpDown;
bsSkinGroupBox4: TbsSkinGroupBox;
bsSkinGroupBox5: TbsSkinGroupBox;
Label9: TLabel;
UpDown2: TUpDown;
ComboBox2: TComboBox;
Label8: TLabel;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure CheckListBox1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ChangeRekvisit(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Reg,Reg2:TRegistry;
MyKey,ProgramPath:String;
F:Text;
ErrorExists:Boolean;
implementation
uses About;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
n:integer;
begin
Reg:=TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
ErrorExists:=False;
If Reg.OpenKey("\Software\1C\1Cv7\7.7", False) Then
Begin
ProgramPath:="";
Reg.GetKeyNames(Memo1.Lines);
For n:=0 To Memo1.Lines.Count-1 Do
Begin
If Memo1.Lines[n][1]="1" Then
Begin
If Reg.OpenKey("\Software\1C\1Cv7\7.7\"+Memo1.Lines[n],False) then
ProgramPath:=Reg.ReadString("1CPath");
End;
End;
Reg.Free;
if ProgramPath="" then ErrorExists:=True
Else
Begin
Reg:=TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
If Reg.OpenKey("\Software\1C\1Cv7\7.7\Titles",False) Then
Begin
Memo1.Lines.Clear;
Reg.GetValueNames(Memo1.Lines);
if Memo1.Lines.Count>0 then
Begin
CheckListBox1.Items.Clear;
For n:=0 To Memo1.Lines.Count-1 Do
Begin
CheckListBox1.Items.Add(Reg.ReadString(Memo1.Lines[n]));
MyKey:="\Software\MyPrg\"+Memo1.Lines[n];
MyKey:=LeftStr(MyKey,Length(MyKey)-1);
Reg2:=TRegistry.Create;
Reg2.RootKey := HKEY_LOCAL_MACHINE;
if Reg2.OpenKey(MyKey,False) then
Begin
if Not Reg2.ValueExists("Need") then CheckListBox1.Checked[n]:=False
Else CheckListBox1.Checked[n]:=Reg2.ReadBool("Need");
End
Else
CheckListBox1.Checked[n]:=False;
End;
Reg2.Free;
End
Else ErrorExists:=True;
End;
CheckListBox1.ItemIndex:=0;
Button2.Visible:=False;
Button3.Visible:=False;
CheckListBox1Click(Sender);
Reg.Free;
End;
End;
If ErrorExists Then Halt;
end;
procedure TForm1.CheckListBox1Click(Sender: TObject);
label 1;
var
n:integer;
BaseExists:Boolean;
Reg:TRegistry;
begin
n:=0;
Reg:=TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
If Reg.OpenKey("\Software\1C\1Cv7\7.7\Titles",False) Then
Begin
While n<=Memo1.Lines.Count-1 Do
Begin
if Reg.ReadString(Memo1.Lines[n])=CheckListBox1.Items[CheckListBox1.ItemI ndex] Then goto 1;
n:=n+1;
End;
End;
1:
BaseExists:=FileExists(Memo1.Lines[n]+"1Cv7.md");
Panel1.Visible:=False;
Reg.RootKey := HKEY_LOCAL_MACHINE;
If BaseExists Then
Begin
if CheckListBox1.Checked[CheckListBox1.ItemIndex] then
Begin
MyKey:="\Software\MyPrg\"+Memo1.Lines[n];
MyKey:=LeftStr(MyKey,Length(MyKey)-1);
If Reg.OpenKey(MyKey, True) Then
Begin
if Not Reg.ValueExists("Need") then Reg.WriteInteger("Need",1);
Reg.WriteInteger("Need",1);
if Not Reg.ValueExists("ArchiveFolder") then Reg.WriteString("ArchiveFolder",Memo1.Lines[n]+"
← →
Дмитрий (2003-08-20 14:52) [12]To:mOOx_
Брякпоинт тоже не слушается.
← →
mOOx_ (2003-08-20 15:03) [13]А где у тебя в этом коде writebool and readbool?
← →
pasha_golub (2003-08-20 15:36) [14]2Дмитрий
1. Чтобы работала отладка в самом начале поставь такое {$D+}
2. В делфях есть 4 разновидности логического типа, из-за этого могут возникнуть проблеме. А так как я понял в реестре у тебя храниться двойное слово, а свойство Checked у компонента может быть просто boolean, а он - -один байт.
Это так на вскидку
← →
pasha_golub (2003-08-20 15:41) [15]Кусок справки, обрати внимание на размеры и типы.
The four predefined Boolean types are Boolean, ByteBool, WordBool, and LongBool. Boolean is the preferred type. The others exist to provide compatibility with other languages and operating system libraries.
A Boolean variable occupies one byte of memory, a ByteBool variable also occupies one byte, a WordBool variable occupies two bytes (one word), and a LongBool variable occupies four bytes (two words).
Boolean values are denoted by the predefined constants True and False. The following relationships hold.
Boolean ByteBool, WordBool, LongBool
False < True False <> True
Ord(False) = 0 Ord(False) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True
A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.
Обрати внимание: "ByteBool, LongBool или WordBool равны TRUE если не равны 0, то есть может быть есть нестыковка с границами"
Поэтому советую явно преобразовывать так
Boolean(<значение из реестра>)
← →
Дмитрий (2003-08-21 07:03) [16]To All
Sorry.
В процедуре TForm1.CheckListBox1Click(Sender: TObject) вместо
if Not Reg.ValueExists("Need") then Reg.WriteInteger("Need",1);
Reg.WriteInteger("Need",1);
Следует читать
if Not Reg.ValueExists("Need") then Reg.WriteBool("Need",True);
Reg.WriteBool("Need",True);
Это я уже проэкспериментировал со значениями Integer.
← →
Дмитрий (2003-08-21 07:17) [17]Эврика!!!!!!!!!!!!
Сам дурак!!!!!!!!!
Я CheckListBox1.Sorted по умолчанию поставил True - вот фигня и получалась. Как только сортировку убрал - всё пучком!!!!!!!!!!!
Вот что значит - "УТРО".
Помните? "Утро вечера мудренее"...
Спасибо всем за то, что не пропустили мимо мою просьбу.
Все Ваши замечания в мой адрес принимаю безоговорочно.
:)))))))))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c