Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Уникальное имя раздела реестра.


Автор: Егор (к сожалению, не Летов) 24.8.2002, 02:14
Как можно реализовать следующее?

В реестре нужно создать раздел
HKEY_LOCAL_MACHINE\MyKey\00000
при добавлении следующей записи, нужно создать раздел
HKEY_LOCAL_MACHINE\MyKey\00001
и так далее. То есть, если раздел 00000 сушествует - создать 00001, если и 00001 сушествует - создать 00002 и т.д и т.п. Идей у меня пока нет, топчусь на одном месте, как видите. Вот и решил спросить.

Пример обязателен, хоть какой-нибудь.  :hmmm

:baaa

Автор: Vit 24.8.2002, 03:21
Код

 var t:TStringlist;
begin
 t:=TStringList.create;
 try
   with TRegistry.create do
     try
       RootKey:=HKEY_LOCAL_MACHINE;
       OpenKey('Software\MyKey',true);
       GetKeyNames(t);
       t.Sorted:=true;
       t.sort;
       if t.count>0 then
         OpenKey(Format('%.5d',[strtoint(t[t.count-1])+1]), true)
       else
         OpenKey('00000', true);
       WriteString('A','A');
     finally
       free;
     end;
 finally
   t.free;
 end;
end;

Автор: Егор (к сожалению, не Летов) 24.8.2002, 03:57
Спасибо. На этом форуме действительно профи помогают.
Агой (пока по чешски, или привет, точно уже не помню).  ;-)

Автор: Song 24.8.2002, 16:53
Для этой цели использую GUI - всегда будет уникальной, хотя и неудобоваримой как Ваш ключ.

Автор: Егор (к сожалению, не Летов) 27.8.2002, 22:26
Не работает. Ошибочка вот такая:

Project Project1.exe raised exception class EConvertError with message
"MPEG-4DC' Is nol a valid Inleger value". Process slopped. Use Slep or Run to
conllnue.


Вот код:

Код
procedure NewUninstallKey;
var
UnikKey:TStringlist;
begin
 Reg := TRegistry.Create;
try
 Reg.RootKey:=HKEY_LOCAL_MACHINE;
 UnikKey:=TStringList.Create;
  if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Uninstall', True) then
   begin
    Reg.GetKeyNames(UnikKey);
    UnikKey.Sorted:=true;
    UnikKey.sort;
     if UnikKey.count > 0 then
      Reg.OpenKey(Format('%.5d',[StrToInt(UnikKey[UnikKey.count-1])+1]), True)
     else
      Reg.OpenKey('\00000', true);
//       Reg.WriteString('DisplayName', FrmChange.txtDn.text);
//       Reg.WriteString('UninstallString', FrmChange.txtUnstr.text);
    end;
  Reg.CloseKey;
  Reg.Free;
except
 Reg.CloseKey;
 Reg.Free;
 UnikKey.Free;
end;
// FrmChange.Hide;
// ReadUninstalKey;
end;

Автор: Vit 27.8.2002, 23:19
Ну так я расчитывал что у тебя будут только папки "00000", "00001" и т.д., а у тебя там появилась "MPEG-4DC". Тебе надо или исключить их появление или обрабатывать эту ситуацию.

Автор: Егор (к сожалению, не Летов) 27.8.2002, 23:49
Цитата
Тебе надо или исключить их появление или обрабатывать эту ситуацию.


Я не понимаю.

Автор: Vit 28.8.2002, 00:12
Собственно моя ошибка в том, что видимо нельзя давать готовый код - он будет просто вставлен и вопрошающий так и не поймёт что он делает :(

В данном случае надо исключить не числовые значения из массива UnikKey - т.е. там надо оставить значения "00000", "00001" и т.п. и исключить типа "MPEG- 4DC", кроме того, естественно я не предполагал что будет посторонний мусор, поэтому надо придумать как обработать ситуацию если попадётся например ключ "234" - сортируются то строки, не цифры, так что такие значения если найдены то должны быть тоже исключены.

Автор: Егор (к сожалению, не Летов) 28.8.2002, 00:20
Объясни что делает следующий фрагмент кода (желательно по-подробнее):

Format('%.5d',[StrToInt(UnikKey[UnikKey.count-1])+1])




:baaa  :baaa

Автор: Vit 28.8.2002, 00:35
Функия Format позволяет вставлять в строку различные значения. Например

Format('Егор (%s %s) ',['который', 'не Летов']) вернёт строку:
'Егор (который не Летов)'

т.е. вместо %s будут вставлены значения строк из массива в квадратных скобках

Format('%d Попугаев',[38]) вернёт строку:

'38 Попугаев'

т.е. вместо %d будет вставлено число (не строка) из массива

теперь в нашем случае:


Format('%.5d', ....

"%.5d" обозначает что мы вставляем число и что это число будет пятизначным, т.е. если мы вставим

Format('%.5d', [1]) то получим строку "00001"


"UnikKey.count-1" - номер последней строки в массиве (отсортированном по порядку)

UnikKey[UnikKey.count-1] - последняя строка в массиве

StrToInt - перевод строки в число (она как раз и генерит ошибку, когда попадается строка, которую нельзя конвертировать в целое число)

StrToInt(UnikKey[UnikKey.count-1]) взять последнюю строку в массиве и конвертировать ее в число

StrToInt(UnikKey[UnikKey.count-1])+1 - взять следуещее число


Format('%.5d',[StrToInt(UnikKey[UnikKey.count-1])+1]) - следующее число конвертировать в 5тизначнное число в виде строки

Автор: Егор (к сожалению, не Летов) 31.8.2002, 22:31
Не выходит у меня без ошибки создать ключ. Может, кто поможет?

Автор: Vit 4.9.2002, 04:29
Ok, значит задача состоит в том чтобы убрать из массива названий все что не являются цифрами, и сделать это надо здесь:

    Reg.GetKeyNames(UnikKey);
   //сюда вставляет код который удаляет все ключи из UnikKey, которые не являются цифрами
    UnikKey.Sorted:=true;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)