Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 806

Раздел: Delphi » Прочее
/ вопрос решён /

Здравствуйте, уважаемые эксперты! В реестре есть такая запись REG_MULTI_SZ, т.е. это мультистроковая запись или если говорить проще то много строковая. Так вот собственно вопрос состоит в том, что как можно этот параметр прочесть... например , насколько я визуально это представляю сходство, в ListBox. Ну или на худой конец в строку. Заранее спасибо.

eclipse Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 11 декабря 2010, 10:32
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: Мережников Андрей

Здравствуйте, eclipse!
Вот такой код приведен в DelphiWorld (см.приложение)

Приложение:
  1.  
  2. --------------------------------------------------------------------------------
  3.  
  4.  
  5.  
  6. function ReadMultirowKey(reg: TRegistry; Key: string): TStrings;
  7. const
  8. bufsize = 100;
  9. var
  10. i: integer;
  11. s1: string;
  12. sl: TStringList;
  13. bin: array[1..bufsize] of char;
  14. begin
  15. try
  16. result := nil;
  17. sl := nil;
  18. sl := TStringList.Create;
  19. if not Assigned(reg) then
  20. raise Exception.Create('TRegistry object not assigned.');
  21. FillChar(bin, bufsize, #0);
  22. reg.ReadBinaryData(Key, bin, bufsize);
  23. i := 1;
  24. s1 := '';
  25. while i < bufsize do
  26. begin
  27. if ord(bin[i]) >= 32 then
  28. s1 := s1 + bin[i]
  29. else
  30. begin
  31. if Length(s1) > 0 then
  32. begin
  33. sl.Add(s1);
  34. s1 := '';
  35. end;
  36. end;
  37. inc(i);
  38. end;
  39. result := sl;
  40. except
  41. sl.Free;
  42. raise;
  43. end;
  44. end;
  45.  
  46.  
  47.  


Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 12 декабря 2010, 18:17
Оценка за ответ: 5

Комментарий к оценке: робит!

Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 17 марта 2012, 18:33; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 11 декабря 2010, 10:37 [#1]:

Не знаю, может ли работать с такими параметрами TRegistry и TRegIniFile, а вот функция RegQueryValueEx() - точно может.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 11 декабря 2010, 10:47 [#2]:

Хм... проверю.
min@y™

min@y™ (статус: Доктор наук), 11 декабря 2010, 10:56 [#3]:

А чо проверять-то? В хэлпе написано жеж.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 11 декабря 2010, 10:59 [#4]:

Дык ни разу не пользовался... только TRegistry
min@y™

min@y™ (статус: Доктор наук), 11 декабря 2010, 11:05 [#5]:

Теперь придётся... :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 11 декабря 2010, 11:06 [#6]:

Кстати, а что возвращает TRegistry при чтении параметра такого типа? Эксперименты проводились?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 11 декабря 2010, 11:12 [#7]:

Да пипец! Там целая наука! Не помню точно но там сперва надо определить тип параметра потом ещё чё - то тока потом попытаться считать данные , и то такой функции нету нифига... тока read string, boolea, и ещё какие - то левые... я в общем парился почти день с этакой ерундой пока не плюнул на TRegistry
min@y™

min@y™ (статус: Доктор наук), 11 декабря 2010, 11:20 [#8]:

Напиши свой класс-наследник TRegisry и счтением/записью параметров типа REG_MULTI_SZ и выложи на сайт. Выйдешь из минуса по репутации. :)))
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 11 декабря 2010, 11:28 [#9]:

Да пофиг не репу
eclipse

eclipse (статус: Посетитель), 11 декабря 2010, 11:29 [#10]:

как сделаю всеравно кину

12 декабря 2010, 19:27: Статус вопроса изменён на решённый (изменил автор вопроса — eclipse)

eclipse

eclipse (статус: Посетитель), 17 марта 2012, 18:33 [#11]:

Вот нашёл единственно верное и правильно работающее решение:

function ReadMultirowKey(Reg: TRegistry; ValueName: string): TStrings;
var valueType: DWORD;
    valueLen: DWORD;
    p, buffer: PChar;
    key: HKEY;
    Strings: TStrings;
begin
if RegOpenKeyEx(Reg.RootKey, PChar(Reg.CurrentPath), 0, KEY_READ, key) = ERROR_SUCCESS then
   begin
     SetLastError(RegQueryValueEx(key, PChar(ValueName), nil, @valueType, nil, @valueLen));
     if GetLastError = ERROR_SUCCESS then
       if valueType = REG_MULTI_SZ then
       begin
         Strings:= TStringList.Create;
         GetMem(buffer, valueLen);
         try
           RegQueryValueEx(key, PChar(ValueName), nil, nil, PBYTE(buffer), @valueLen);
           p := buffer;
           while p^ <> #0 do
             begin
               Strings.Add(p);
               Inc(p, lstrlen(p) + 1)
             end
         finally
           FreeMem(buffer);
           Result:= Strings;
         end;
       end;
   end;
end;

min@y™: что ты там говорил...? :-)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.