Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2009, 16:14   #1
motaro
Форумчанин
 
Регистрация: 10.07.2007
Сообщений: 104
По умолчанию Сохранение пути в файл

есть код, с помощью которого получаю адрес папки, далее пытаюсь сохранить путь в файл, но при записи в файл выводит ошибку:
Project Project3.exe raised exception class EInOutError with message 'I/O error 104'

uses
ShellAPI, ShlObj;
...
Код:
var
  Form2: TForm2;
  f:text;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  TitleName : string;
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  BrowseInfo.hwndOwner := Form2.Handle;
  BrowseInfo.pszDisplayName := @DisplayName;
  TitleName := 'Please specify a directory';
  BrowseInfo.lpszTitle := PChar(TitleName);
  BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
  lpItemID := SHBrowseForFolder(BrowseInfo);
  if lpItemId <> nil then
  begin
    SHGetPathFromIDList(lpItemID, TempPath);
    ShowMessage(TempPath);
    GlobalFreePtr(lpItemID);
  end;
 AssignFile (f,'d:\file.txt');
 rewrite (f);
 readln (f,temppath);
 closefile(f);
end;

end.
motaro вне форума Ответить с цитированием
Старый 22.08.2009, 16:20   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Ты открыл файл на запись и пытаешься читать из него данные.
Код:
 AssignFile (f,'d:\file.txt');
 rewrite (f);
 readln (f,temppath);  // вот. замени на writeln(f,temppath);
 closefile(f);
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 22.08.2009, 16:20   #3
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Может лучше использовать INI-файлы?
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 22.08.2009, 21:46   #4
motaro
Форумчанин
 
Регистрация: 10.07.2007
Сообщений: 104
По умолчанию

Цитата:
Сообщение от Daramant Посмотреть сообщение
Ты открыл файл на запись и пытаешься читать из него данные.
Код:
 AssignFile (f,'d:\file.txt');
 rewrite (f);
 readln (f,temppath);  // вот. замени на writeln(f,temppath);
 closefile(f);
спс .
motaro вне форума Ответить с цитированием
Старый 22.08.2009, 21:47   #5
motaro
Форумчанин
 
Регистрация: 10.07.2007
Сообщений: 104
По умолчанию

Цитата:
Сообщение от russian-stalker Посмотреть сообщение
Может лучше использовать INI-файлы?
txt прокатывает, а в ini не шарю
motaro вне форума Ответить с цитированием
Старый 22.08.2009, 22:00   #6
Kukkk
Форумчанин
 
Регистрация: 28.06.2007
Сообщений: 123
По умолчанию

motaro, на самом деле в ини шарить=1 раз глянуть 2-3 исходника.
Kukkk вне форума Ответить с цитированием
Старый 22.08.2009, 22:25   #7
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Чтобы использовать ини надо:
1. Добавить в Uses inifiles
2. А вот собственно смысл работы

Код:
//По уничтожению формы записываем размеры и позицию, при создании формы воссоздаём
procedure TForm1.FormDestroy(Sender: TObject);
var
  Ini: Tinifile; //создаём объект нужного класса
begin
  //создаём файл в папке с программой
  Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'test.ini');
  //Записываем нужные данные в ини файл
  //Функция выглядит примерно так WriteInteger(имя секции,имя параметра,сохраняемый параметр)
 //Может так же быть WriteString, WriteBool
  Ini.WriteInteger('Size','Width',form1.width);
  Ini.WriteInteger('Size','Height',form1.height);
  Ini.WriteInteger('Position','X',form1.left);
  Ini.WriteInteger('Position','Y',form1.top);
  Ini.Free;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: Tinifile; //создаём объект нужного класса
begin
  //создаём файл в папке с программой
  Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'test.ini');
  //Присваиваем значения из ини файла, форме
  //Функция выглядит примерно так ReadInteger(имя секции,имя параметра,параметр по дефолту(т.е. если ини файл не содержит описание нужного параметра)
 //Может так же быть ReadString, ReadBool
  Form1.Width:=Ini.ReadInteger('Size','Width',100);
  Form1.Height:=Ini.ReadInteger('Size','Height',100);
  Form1.Left:=Ini.ReadInteger('Position','X',10);
  Form1.Top:=Ini.ReadInteger('Position','Y',10);
  Ini.Free;

end;
3. С файлом смысл работы такой же
Код:
ini.writestring('File','Path','d:\file.txt');
string:=ini.readstring('File','Path','d:\file.txt');
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 22.08.2009, 23:03   #8
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Сохранять инфу в ини(или др файл) в одной папке с приложением – не всегда работает.
Если прога запускается под админом, то все в шоколаде, а если запускает обычный юзер, то зачастую, у него нет прав на запись в папке, в котором находится ваше приложение. В результате выпрыгивает окошечко "Unable to write to Путь_к_файлу". А это всегда непринято.
Лучше всего инфу сохранять в реестре в ветке HKEY_CURRENT_USER.
Тем более TRegistry сильно облегчает жизнь.
Не путайте с HKEY_LOCAL_MASHINE - сюда юзеры тоже записывать не могут, только читать.
Gorychev вне форума Ответить с цитированием
Старый 22.08.2009, 23:16   #9
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Не надо так делать. Это загрязняет реестр и скорость работы ПК со временем падает. Вроде ещё можно в XML писать без привелегий
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 22.08.2009, 23:41   #10
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Цитата:
Это загрязняет реестр и скорость работы ПК со временем падает.
Реестр - огромная база данных для храниния\записи как настроек ОС так и настроек др. программ самых разных цветов и мастей. Аргументируйте, за счет чего может упасть скорость работы ПК?
А как вы объясните, то что это общепринятая технология хранения/записи информации?
Скачайте себе RegMon, если, у вас нет такой проги и посмотрите насколько "плотно" используется реестр.
Мое мнение - добавление вами десятка-другого строк в реестр, повлияет на производительность ПК как пачка сигарет в кармане на скорость ходьбы. Вообще не факт что повлияет.
Стою на своем мнении.
Gorychev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение книги Excel по названию ячейки и по пути ячейки IFRSoff Microsoft Office Excel 16 07.06.2012 16:58
Сохранение в файл Ant1Player PHP 4 31.03.2009 16:33
Как по пути опредилить файл это или папка Anatol_rus Мультимедиа в Delphi 2 07.11.2008 11:51
Сохранение в файл Македонский Общие вопросы Delphi 4 05.09.2007 15:04
Сохранение в файл *.*С Noor Общие вопросы C/C++ 6 08.01.2007 22:44