2015-02-25 4 views
0

В последнее время я столкнулся с небольшой проблемой, которая вызывает нарушение доступа при попытке чтения файлов .ini.Работа с файлами в нескольких файлах Delphi

Мой вопрос: могу ли я загрузить несколько файлов .ini (например, settings.ini и data.ini) в рамках одной и той же процедуры? Например, у меня есть два ini-файла, на которые я пишу и читаю.

Вот сокращенная процедура, которая записывает данные:

//writing to file uninstall.ini 
try 
    ini := TIniFile.Create(edPath.Text + '\Uninstall.ini'); 
    ini.WriteString('Uninstall', 'qfProgramName', Label4.Caption); 
    ini.WriteString('Uninstall', 'qfUninstPath', edPath.Text); 
finally 
    ini.Free; 
end; 

И потом, есть этот код (в том же порядке)

configini := configini.Create(ExtractFilePath(Application.ExeName) + '\quickfix.ini'); 
sectionsCount := getMaxSectionIndex(ExtractFilePath(Application.ExeName) + '\quickfix.ini'); 

startmenuLoc := GetProperDir(_STARTMENU); 
desktopLoc := GetProperDir(_DESKTOP); 
for I := 1 to sectionsCount do begin 
    currentSection := 'qfShortcut_' + IntToStr(I); 
    shortcutFile := configini.ReadString(currentSection, 'qfShTarget', ''); 
    shortcutDesc := configini.ReadString(currentSection, 'qfShDescription', ''); 
    shortcutFullPath := installPath + '\' + shortcutFile; 
    shortcutDest := configini.ReadString(currentSection, 'qfShPath', ''); 
    displayName := configini.ReadString(currentSection, 'qfDisplayName', ''); 

    showmessage(startmenuLoc + '\' + displayName + '.lnk'); 
    showmessage(shortcutFullPath); 

    if shortcutDest = 'spStartMenu' then CreateLink(shortcutFullPath, startmenuLoc + '\' + displayName + '.lnk', '', ''); 
    if shortcutDest = 'spDesktop' then CreateLink(shortcutFullPath, desktopLoc + '\' + displayName + '.lnk', '', ''); 

Линия со вторыми нагруженными авариями файлов с нарушением доступа. Не исключено, что проблема исходит из какого-то другого места, однако, я бы хотел, чтобы вы, ребята, посмотрели, может быть, кто-то увидит еще одну проблему.

Этот сниппет предназначен для создания ярлыков на рабочем столе и в меню «Пуск», загрузка данных из файлов .ini. Файл «quickfix.ini» также загружается один раз в OnCreate, но затем освобождается.

+0

На какой строке происходит нарушение доступа? –

+2

Ваша 'попытка' неверна. Делается так: 'obj: = TObject.Create; попробуйте dostuff; наконец obj.Free; end; 'Пожалуйста, воспользуйтесь этой возможностью, чтобы узнать, как отлаживать. Гораздо эффективнее выполнять основную отладку самостоятельно. Если вы задаете вопросы о переполнении стека каждый раз, когда вы совершаете небольшую ошибку (что все мы делаем много), это неэффективно. Если бы вы могли отлаживать, вы бы знали, какая строка кода подняла нарушение прав доступа, и вы поймете, что случилось. С другой стороны, возможно, вы еще не знаете, что такое нарушение прав на самом деле. Это знание важно. –

+0

Keith, нарушение прав доступа происходит в строке, где я загружаю quickfix.ini, однако, даже когда я комментирую весь другой окружающий код, нарушение прав доступа по-прежнему сохраняется. Дэвид, спасибо за ответ, однако, я перекодировал свои заявления о попытках, и ничего не изменилось. Любые другие идеи? Заранее спасибо! –

ответ

9

Попробуйте заменить

configini := configini.Create(ExtractFilePath(Application.ExeName) + '\quickfix.ini'); 

с:

configini := TIniFile.Create(ExtractFilePath(Application.ExeName) + '\quickfix.ini'); 

Вы пытаетесь вызвать Создать на неинициализированного переменной, а не на классе.

+0

Keith. Я должен тебе пиво! Большое спасибо. –

+0

Да, вот и все, поразившись, что мы этого не заметили, мы видели его столько раз! Отлично сработано. –

+2

@LukasSynDurjan Пожалуйста, прочтите следующее: http://meta.stackexchange.com/q/5234/, чтобы узнать о принятии –

Смежные вопросы