| 
| 
 | Вопрос # 1 307/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Прочитав из реестра параметр типа MultiString получаю строку 'str1'#0'str2'#0'str3'. Как бы ее эффективно представить в одной строке чтобы было возможно восстановить этот параметр?
 
|  |   Вопрос задал: Евгений Eklmn (статус: Посетитель)Вопрос отправлен: 2 февраля 2008, 15:49
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Трофимов Евгений!Параметры типа REG_MULTI_SZ в реестре хранятся в виде нуль-терминальной строки, т.е. каждая строка заканчивается специальным код-маркером #0. Далее все просто. Надо вырезать эти маркеры. Или заменить их на нужный Вам знак-разделитель, или вырезать каждую строку отдельно в список. Это уже смотря, что именно Вам надо с ними делать.
 В приложении простой пример чтения такой строки и разбор ее в Memo1.Lines.
 
 Пару примеров по вырезанию и замене маркера на коды #13#10:
 Пример №1:
 
 repeat
         p := Pos(#0, tmpStr);
         if p <> 0 then
         begin
           Delete(tmpStr, p, 1);
           Insert(#13#10, tmpStr, p);
         end;
       until p = 0;Пример №2:
 StringReplace(tmpStr, #0, #13#10, [rfReplaceAll]);А для записи такой строки в реестр делаете обратное преобразование, т.е. собираете все свои строки через код #0, как вы указали строку в вопросе. Желаю удачи...
 Приложение:Переключить в обычный режим usesRegistry; procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string;Strings: TStrings);varvalueType: DWORD;valueLen: DWORD;p, buffer: PChar;key: HKEY;begin// Clear TStringsStrings.Clear;// open the specified keyif RegOpenKeyEx(CurrentKey,                 PChar(Subkey),                 0, KEY_READ, key) = ERROR_SUCCESS thenbegin   // retrieve the type and data for a specified value name   SetLastError(RegQueryValueEx(key,                PChar(ValueName),                nil,                @valueType,                nil,                @valueLen));   if GetLastError = ERROR_SUCCESS then     if valueType = REG_MULTI_SZ then     begin       GetMem(buffer, valueLen);       try         // receive the value's data (in an array).         RegQueryValueEx(key,                         PChar(ValueName),                         nil,                         nil,                         PBYTE(buffer),                         @valueLen);         // Add values to stringlist         p := buffer;         while p^ <> #0 do         begin           Strings.Add(p);           Inc(p, lstrlen(p) + 1)         end       finally         FreeMem(buffer)       end     end     else       raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...')   else     raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+       'Kann den MULTI_SZ Wert nicht lesen...');end;end; // Test it: procedure TForm1.Button1Click(Sender: TObject);beginReadREG_MULTI_SZ(HKEY_CURRENT_USER, 'Software\XYZ', 'Test44', Memo1.Lines);end;
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 4 февраля 2008, 13:05
 
 |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 4 февраля 2008, 13:08; участников в обсуждении: 2. 
|   | min@y™ (статус: Доктор наук), 4 февраля 2008, 08:46 [#1]:MultiString - это что-то новое. Не слыхал. Может быть REG_SZ? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Feniks (статус: Бакалавр), 4 февраля 2008, 13:08 [#2]:Все верно. Есть такой тип в Windows NT. В более старых версия 9х его еще не было. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |