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

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

Чтение из реестра переменных с типом REG_MULTI_SZ [D7, WinXP]


Trimp ©   (2005-07-18 21:13:00) 

Здравствуйте мастера. Как можно прочитать из реестра переменную (defaultGateway), у которой тип REG_MULTI_SZ (многострочный текст)?
Заранее спасибо.


Trimp   (2005-07-18 23:09:00) [1]

2 Джо
Спасибо, нашёл свою ошибку. При проверке ReadBinaryData неправильно указывал третий атритбут (у тебя Sz).


Джо   (2005-07-18 22:34:00) [2]


> [3] Trimp ©   (18.07.05 21:39)

Ну вот, зачем обманывать, сам же написал ReadBinaryData. Именно при помощи этого метода и читать.
Некогда переписывать на АПИ, но, с использованием TRegistryвыглядеть будет примерно так.

//Класс-наследник от TRegistry, добавляющий новый метод чтения значений типа REG_MULTI_SZ

type
 TRegistryEx = class (TRegistry)
 private
 public
   function ReadLines (const KeyName: string; AStrings: TStrings): Integer;
 end;
///
implementation

function TRegistryEx.ReadLines(const KeyName: string; AStrings: TStrings): Integer;
var
 Buff: array of Char;
 I, Sz: Cardinal;
 Ch,PrevCh: Char;
 S: string;
begin
 Result := 0;
 AStrings.Clear;
 Sz := GetDataSize(KeyName);
 SetLength (Buff,Sz);
 ReadBinaryData(KeyName,Buff[0],Sz);
 // parse data
 PrevCh := #0;
 S := '';
 for I := 0 to Sz do
 begin
   Ch := Buff[I];
   if (Ch=#0) and (PrevCh=#0) then
      Break;
   if (Ch=#0) then
   begin
     AStrings.Add(S);
     S := '';
   end
   else
     S := S + Ch;
   PrevCh := Ch;
 end;
 Result := AStrings.Count
end;


------------------------------
Пример использования
------------------------------

procedure TForm3.Button1Click(Sender: TObject);
var
 RegEx: TRegistryEx;
 Lst: TStrings;
 I: Integer;
begin
 RegEx := TRegistryEx.Create;
 try
   RegEx.RootKey := HKEY_LOCAL_MACHINE;
   RegEx.OpenKey('SOFTWARE\NEW_SECTION',False);

   Lst := TStringList.Create;
   try
     RegEx.ReadLines('key1',Lst);
     for I := 0 to Lst.Count-1 do
       ShowMessage (Lst[I])
   finally
     Lst.Free;
   end;
 finally
   RegEx.Free;
 end;
end;


Anatoly Podgoretsky   (2005-07-18 22:09:00) [3]

Что ты сделал для разрешения проблемы?
Как собираешься решать, от этого зависит и форум.


Trimp   (2005-07-18 22:04:00) [4]

2 Anatoly Podgoretsky
Ок, возможно я ошибся, в каком подфоруме мой вопрос будет уместней?

И всё же по существу кто-то может ответить?


Fay   (2005-07-18 21:44:00) [5]

2 Trimp ©   (18.07.05 21:39) [3]
Я не могу тебе помочь так как
1) Я не помню все API наизусть
2) Я не стану вспоминать с (делая, кстати, то, что я и посоветовал) специально для тебя.
3) Невозможно помочь тому, кто ничего не делает.

спасибо за внимание.


Anatoly Podgoretsky   (2005-07-18 21:43:00) [6]

А при чем тут TRegistry и WinAPI?


Trimp   (2005-07-18 21:42:00) [7]

2 Anatoly Podgoretsky
Умею читать String,byte,boolean,float,Integer и остальные перечисленные в [3]


Trimp   (2005-07-18 21:39:00) [8]

2 Fay
Спасибо, здорово помогли уже во второй раз. Мне кажется, что такой совет эквивалентен ответу:"Не знаю". Я, когда не знаю, спрашиваю, вот и в этот раз сначала проверил все типы READ в исходниках TRegistry:
reg.ReadCurrency()
reg.ReadBinaryData()
reg.ReadBool()
reg.ReadDate()
reg.ReadDateTime()
reg.ReadFloat()
reg.ReadInteger()
reg.ReadString()
reg.ReadTime()
и не один из них не может читать REG_MULTI_SZ.


Anatoly Podgoretsky   (2005-07-18 21:26:00) [9]

Trimp ©   (18.07.05 21:13)  
Ты другие то типы читать умеешь?


Fay   (2005-07-18 21:24:00) [10]

2 Trimp ©   (18.07.05 21:13)
В левую руку возьми исходники TRegistry
Правой жми на F1.

Максимум через час тебе будет Щястье.


Наверх

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