Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по реестру. [D6, WinXP]


Начинающий2 ©   (2004-12-03 18:20:00) 

Как прочитать имена ключей в реестре, если известен только раздел. Вообщем нужно прочитать и занести в список. Облазил весь Help, и ничего не нашол кроме ReadString('name');, а как быть если имя то и не известно.


Начинающий2   (2004-12-10 13:08:00) [1]

Похоже не кто не знает, значит буду делать как всегда, сам разбираться.


Начинающий2   (2004-12-07 16:42:00) [2]

> begin...end ©   (06.12.04 20:38) [18]

> А почему бы и нет, разве лучше писАть name ? К тому же, with ещё есть.

Не имею нечего против, просто написать метку проще чем писать целую строку, особенно когда используется в несколиких процедурах.

> novice__man   (04.12.04 21:46) [15]

Всё работает только с компанентами типа ListBox, кроме ListView. В ListView выводит лиш в одно поле, да и только с параметром типа ListView1.Items.Add.SubItems.Assign(ListKey); , а ме как раз и нужен ListView. Мне надо занисти в ListView, при открытии программы а не по нажатию кнопки, список имён раздела и их параметры типа: Имя - Параметр. Я пробовал с  Form.Create (Activate, Show), нечиго не выводится, а привязывать к кнопке,
делать её невидимой и циплять к ней таймер, это абсурд. Может посоветуете что другое, или компанент какой есть типа ListView, чтоб в него можно было считать весь список как в ListBox. К примеру, как это делается в проге jv16 PowerTools и других подобных.


begin...end   (2004-12-06 20:38:00) [3]

> [17] Начинающий2   (06.12.04 17:29)

> Вы совершенно правы, при условии что переменная используется
> только для одной строки типа: Prog.Items.Add.Caption:=Val.Strings[i];.
> А если следуюшие строки также нуждаются в этой переменной,
> везде писать :=Val.Strings[i]; ?

А почему бы и нет, разве лучше писАть name? К тому же, with ещё есть.


Начинающий2   (2004-12-06 17:29:00) [4]

> novice__man   (04.12.04 21:29) [14]

Спавку я читаю, и к томуже постоянно, да только с пониманием на англиском туговато, немецкий приходится штудировать. Да и с переводом ошибки я розобрался потом, только всё равно не вышло. Сделал обходным путём, получился лишний код, как при сохранении ключей, так и при чтении. Так как использовал стандартные процедуры чтения. А за пример спасибо, щя буду пробовать, как только пару компанент пропишу в 7 дэльфяк.

> begin...end ©   (04.12.04 21:49) [16]
Да можно и без name...

Вы совершенно правы, при условии что переменная используется только для одной строки типа: Prog.Items.Add.Caption:=Val.Strings[i];.
А если следуюшие строки также нуждаются в этой переменной, везде писать :=Val.Strings[i]; ?


begin...end   (2004-12-04 21:49:00) [5]

> [12] Zacho ©   (04.12.04 20:38)

> name:= Val.Strings[i];  
> Prog.Items.Add.Caption:=name;

Да можно и без name...


novice__man   (2004-12-04 21:46:00) [6]

Вот так я вывел список всех имен подразделов "SOFTWARE"

procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
ListKey: TStringList;
begin
ListKey := TStringList.Create;
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKeyReadOnly('software') then begin
   reg.GetKeyNames(ListKey);
   ListBox1.Items.Assign(ListKey);
   end;
ListKey.Free;
end;


novice__man   (2004-12-04 21:29:00) [7]

name:= reg.GetValueNames(Val);  / здесь и выдаёт ошибку

Правильно выдает, как это можно приравнять ПРОЦЕДУРУ к переменной string?

Это из хелпа Delphi:

Returns a string list containing the names of all data values associated with the current key.

procedure GetValueNames(Strings: TStrings);

Description

Call GetValueNames to determine the names of all data values associated with the current key. Determining the names of data values is useful in an application that iterates through a set of data values for a key.

Strings is a variable of type TStrings into which to return the list of data value names.


Или читать хелп выше вашего уровня программирования?


Начинающий2   (2004-12-04 21:06:00) [8]

Вроде прошло, вот только всё равно не читает. Да и выход из программы вызывает ошибку.


Zacho   (2004-12-04 20:38:00) [9]

Правильно будет так:

...
Reg.OpenKey('\Software\StM\AllProg', true);
Reg.GetValueNames(Val);
for I:=0 to Val.Count-1 do
 begin
  name:= Val.Strings[i];  
  Prog.Items.Add.Caption:=name;
 end;
...


Может и ещё какие ошибки есть, детально не смотрел.

А with Val doубери нафиг.


Начинающий2   (2004-12-04 20:14:00) [10]

Не получилось, не пойму что не так. Пробовал и так и так, не идет, выдает ошибку:

[Error] StartManager.pas(272): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter'

А вот код:

Procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
name:string;
Val:TStringList;
Reg.TRegistry;
begin
Val:=TStringList.Create;
Reg:=TRegistry.Create;
Reg.RootKey:= HKEY_LOCAL_MACHINE;
try
   with Val do
  if Reg.KeyExists('\Software\StM\AllProg') then
  begin
   Reg.GetValueNames(Val);
   for I:=0 to Val.Count-1 do
  begin
   Reg.OpenKey('\Software\StM\AllProg', true);
   name:= reg.GetValueNames(Val);  / здесь и выдаёт ошибку
   Prog.Items.Add.Caption:=name;
   end;
  end;
  finally
     Val.Free;
 end;
end;

Не пойму что не так.


Начинающий2   (2004-12-03 19:38:00) [11]

Спасибо, попробую, если что то завтра снова спрошу, да код возьму.


begin...end   (2004-12-03 19:28:00) [12]

> [8] Начинающий2   (03.12.04 19:25)

> А на счёт  if i=0 to List1.Items[i].Count -1 do begin ошибся,
> не if а for.

Не важно, всё равно эта строка не нужна.

> А как его создать?

List1 := TStringList.Create


Начинающий2   (2004-12-03 19:25:00) [13]

Да я вообще первый раз за реестор взялся, до этого с ini делал.
А на счёт   if i=0 to List1.Items[i].Count -1 do beginошибся, не if а for. А дальше добавляю в список типа LictView.

LictView.Items.add.caption:=nam;
reg.closekey;
reg.free;

>А List1 нужно предварительно создать.

А как его создать? А полный код не могу дать, на другом компе, дома.


begin...end   (2004-12-03 19:08:00) [14]

> [5] Начинающий2   (03.12.04 18:58)

> if i=0 to List1.Items[i].Count -1 do begin

Эта строка вообще не нужна. А List1 нужно предварительно создать.


Anatoly Podgoretsky   (2004-12-03 19:04:00) [15]

Что то вроде этого не надо, давай точный код и посмотри справку.


Начинающий2   (2004-12-03 18:58:00) [16]

Код на другом компе. Попробую вспомнить.
var
nam:string;
i:Integer;
....
if i=0 to List1.Items[i].Count -1 do begin
Reg.OpenKey('Software\Programma\My Prog',true);
nam:=Reg.GetKeyNames(List);
....

Что то вроде этого.


begin...end   (2004-12-03 18:35:00) [17]

> [3] Начинающий2   (03.12.04 18:31)

Так вот я уже и привёл пример в [1]. Лучше Вы приведите код, с которым не получилось.


Начинающий2   (2004-12-03 18:31:00) [18]

Именно список ключей, вот только про Registry.GetKeyNames(List) я находил в справке. Пробовал, не получилось. Может пример подскажете.


ALS   (2004-12-03 18:28:00) [19]

Класс TRegistry, методы GetKeyNames, GetValueNames


begin...end   (2004-12-03 18:25:00) [20]

> Начинающий2   (03.12.04 18:20)

Определитесь, что именно нужно - получить список ключей (их названий) в данном разделе реестра, или прочитать значения параметров.

Если первое, то Registry.GetKeyNames(List), где List: TStringList.


Наверх

Титульная страница Поиск, карта сайта Написать письмо