Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятная ошибка с TIniFile, Перый раз такое 
:(
    Опции темы
CosmoMan
Дата 24.7.2005, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



У меня есть функция, которая из реестра формирует Ини-файл из файловых расширений. Он необходим для того, чтобы как в Проводнике, показывать рядом с расширением пояснение: Файл справки, Delphi Project, Текстовой файл ну и т.д.
Но возникает непонятная ошибка. Я придумал, как её избегать, но для этого в файл надо вписывать дополнительные не нужные строки. Ну зачем мне замусаривать Файл. Помогите пожалуйста с этой сложной проблемой.
Вот код программы. Я не могу понять, почему возникает ошибка. Я обозначил строку с ошибкой. smile

Код
procedure TBaseIniFilesStruct.SetAtributeFileStruct;
var
  i,j,k          :Integer;
  MyKey          :HKey;                   //Handle для работы с разделом
  KeyAnderstand  :HKey;
  Buffer,Buffer1 :array[0..1000] of char; //Буфер
  PBufStr        :PAnsiChar;
  BufStr         :string;
  BufChr         :string;
  Err,ErrKey     :Integer;
  index          :longint;                //Индекс подраздела
begin
  with INIF do  //класс работы с Ини Файлами программы, где FAtributeIF - это поле типа TIniFile
  begin
    ErrKey := 0;
    FAtributeIF.WriteString('Type','e','');  //раздел Тип файла
    //получаем доступ к реестру
    Err := RegOpenKey(HKEY_LOCAL_MACHINE,'SOFTWARE\Classes',MyKey);
    if Err <> ERROR_SUCCESS then ProgramControl.FatalError := 'Ваша операционная система иммеет неверную структуру реестра. Дальнейшее выполнение программы невозможно.';
    index := 1; //index=0 будет звездочка
    Err:=RegEnumKey(MyKey,index,Buffer,Sizeof(Buffer));
    if Err <> ERROR_SUCCESS then ProgramControl.FatalError := 'Ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes пуст. Дальнейшее выполнение программы невозможно.';

    PBufStr := 'SOFTWARE\Classes\';
    BufStr := PBufStr;
    new(PBufStr);
//---------------------------Без этой строки выводится ошибка, данная ниже-------------------- 
    for i := 1 to 10 do //если не 10, а 8, то ошибка другого вида : "Не могу записать в файл <путь к файлу>\<Имя файла испорченное(Не AtrConvent.INI, а типа так AtrCon^#~%)> 
    begin
      FAtributeIF.WriteString('EEEE{или любой другой}'+IntToStr(i),'Number',IntToStr(i));//мусор
    end;
//----------------------------------------------------------------------------------------------------------------
    while ((err=ERROR_SUCCESS) and(Buffer[0] = '.'))do
    begin
      //создаем заготовку файловых расширений
      Form1.Label2.Caption := Buffer;
      FAtributeIF.WriteString(Buffer,'Number',IntToStr(index-1));//ПРИ index=81 ВЫВОДИТСЯ ОШИБКА "Неверный адрес"
      Err:=RegEnumKey(MyKey,index,Buffer,Sizeof(Buffer));
      BufChr := Buffer;
      //получае необходимый путь
      for i := 0 to 19+length(BufChr) do
      begin
        if index = 81 then
        Index := Index +1-1;
        if i < 17 then PBufStr[i] := BufStr[i+1]
        else PBufStr[i] := BufChr[i-16];
      end;
      //получаем пояснение
      Err := RegOpenKey(HKEY_LOCAL_MACHINE,PBufStr,KeyAnderstand);
      if Err <> ERROR_SUCCESS then
      begin
        RegCloseKey(MyKey);
        RegCloseKey(KeyAnderstand);
        ProgramControl.FatalError := 'Ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes '+ Buffer +' пуст, что не возможно в принципе. Дальнейшее выполнение программы невозможно.';
      end;
      ErrKey := RegQueryValue(KeyAnderstand,'',Buffer1,j);
      //идем по пояснению в одноименную папку
      index := index + 1;
    end;
    FAtributeIF.WriteString('Attribute','*','Файл');
    PBufStr := '';
    //читаем реестр на предмет пояснений к расширению

    //добавляем свойство - папка или файл

  end;
end;
smile


Это сообщение отредактировал(а) p0s0l - 24.7.2005, 11:57
PM MAIL   Вверх
Петрович
Дата 24.7.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Текст программы надо оформлять тэгами CODE (кнопка "Код"). Инчаче, читать не оформленный код, нет ни времени ни желания.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
CosmoMan
Дата 24.7.2005, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



О, спасибо, я не знал. У меня чегото эта кнопка срезается и я не виже, что на ней написано.
Ну а что касательно проблемы?
PM MAIL   Вверх
Quadr0
Дата 24.7.2005, 13:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 00:49
  Вверх
CosmoMan
Дата 24.7.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Почему мне нужно именно из файла:
1. Работать с Ини файлом значительно быстрее, чем перебирать реестр, влезать в нужную ветвь, а
затем снова влезать и получать данные.
2. Это можно сделать единожды в программе при первом запуске и больше реестр не трогать.
3. Пользователь сам волен устанавливать для файлового расширения пояснения к нему, не залезая при этом в реестр.
4. Если программа будет использовать файл, а не реестр, то это будет намного безопасней.

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

Меня интерисует, почему ошибка.


PM MAIL   Вверх
Song
Дата 24.7.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



CosmoMan
Покажи как создаётся FAtributeIF

А вообще мне не понятен комментарий "//класс работы с Ини Файлами программы, где FAtributeIF - это поле типа TIniFile"

Если FAtributeIF это

Var FAtributeIF: INIF

то делать надо 'With FAtributeIF'.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Quadr0
Дата 24.7.2005, 18:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 00:50
  Вверх
CosmoMan
Дата 24.7.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Цитата
А вообще мне не понятен комментарий "//класс работы с Ини Файлами программы, где FAtributeIF - это поле типа TIniFile"

Что непонятного
Код


TIniFileWork = class(TObject)
private
   FAtributeIF :TIniFile;
   F....             :TIniFile;
public
//функции
end;
Только глюки непонятно откудо берутся;

var INIF :TIniFileWork;


Цитата
Цитата (CosmoMan @ 24.7.2005, 14:55)
Работать с Ини файлом значительно быстрее, чем перебирать реестр, влезать в нужную ветвь, а
затем снова влезать и получать данные. 
Ненамного.

В моем случаи намного.
Цитата

Цитата (CosmoMan @ 24.7.2005, 14:55)
Это можно сделать единожды в программе при первом запуске и больше реестр не трогать.
Гм. А если а реестре произошли изменения?

Это можно сделать при простое программы или по желанию пользоваетя, притом процедура обновления идет намного быстрее, чем процедура формирования заново. К томуже муторно это постоянно работать с реестром, а в фале все понятно и все, что нужно. Ни какой лишней информации

Цитата
А вот и рабочий код

Ух, а я и не знад, что есть такой тип TRegIniFilе. Это интересно. Обязательно попробую, чотя код я уже закончил писать. Может это сделает его менее грамоздким и менее глючным. Завтра будем пробовать

Да, вопрос. str := StrPas(buf); что за функция. Я делал просто str := buf
PM MAIL   Вверх
Quadr0
Дата 24.7.2005, 19:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 00:50
  Вверх
CosmoMan
Дата 25.7.2005, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Цитата
В хелпе нам лень посмотреть

Нет, просто для этого мне надо вырубить XP и запустить сервак 2003. К томуже я же сказал, что
Цитата
Завтра будем пробовать


А функцию, которая бы обратно преобразовывала из str в buf не знаеш?
PM MAIL   Вверх
Quadr0
Дата 25.7.2005, 13:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 00:50
  Вверх
CosmoMan
Дата 26.7.2005, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Цитата
Взято из секретных архивов Пентагона.

Охотно верю. Ото мне пришлось цикл делать.
PM MAIL   Вверх
RA
Дата 26.7.2005, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



А почему бы не сделать Экспорт ветки реестра ? таже структура что и у INI.
PM   Вверх
CosmoMan
Дата 26.7.2005, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: 1
Всего: 0



Цитата
А почему бы не сделать Экспорт ветки реестра ?

Это как???? smile
smile smile smile
PM MAIL   Вверх
Quadr0
Дата 26.7.2005, 17:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 00:53
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.