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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2008, 14:30   #1
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию Ini файлы

1. В ХP SP2 максимальный размер 64кбайта?
2. Доступ к уже созданному ини файлу осуществлять через assign? А то везде натыкаюсь только на примеры где ини файл создается через IniFile:=TIniFile.Create(dir).
3. Если не трудно напишите пример восстановления (2 кнопок например, с любым параметром) из ini файла. Причем желательно чтобы это делалась так как будто мы не знаем кол-во кнопок и есть ли они вообще.
---У меня идея была насчет того, чтобы в секции Buttons создавать записи с ключами типа

Name
Left
Top
Caption
Name
Left
Top
Caption

А при новой загрузке программы переписывать эти все значения в мемо какое-нибудь и перебирая их восстанавливать обьекты. Но не знаю лучшее=рациональное ли это решение.
Airou вне форума Ответить с цитированием
Старый 02.05.2008, 14:41   #2
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

1. размер чего?
2. Нет
3.
Цитата:
В этой статье мы рассмотрим технику создания инифайлов их назначение и применение. Начнем с ответа на вопрос зачем же нужны эти инифайлы?! Предположим, что вы создали приложение, в котором пользователь может настраивать цвет фона, шрифт надписей и так далее. Когда он повторно включит вашу программу он очень сильно разочаруется, так как всего его старания по настройке интерфейса вашей программы пропали даром - программа будет иметь такой вид, который сделали вы при проектировании программы. Так вот чтобы эти настройки сохранять, лучше всего пользоваться инифайлами.

Одно из главных преимуществ инифайлов заключается в том, что эти файлы подерживают переменные разных типов (String, Integer, Boolean). В этих файлах очень удобно хранить различные настройки, например параметры шрифта, цвет фона, какие checkbox'ы выбрал пользователь и многое другое.

Теперь начнем разбираться с этими инифайлами. Для начала создайте новое приложение. Добавьте в секцию uses слово inifiles. Сохраните и откомпилируйте ваше приложение. Теперь сделаем, чтобы при каждом открытии программы форма имела такие размеры, какие установил пользователь последний раз. Для начала нам надо создать объект типа Inifile. Создается он методом Create(Filename:string); причем если в переменной Filename не указан путь к фалу, то он создаться в директории Windows, что не очень-то удобно. Поэтому мы создадим этот файл в директории нашей программы. Напишем это в обработчик события OnDestroy для формы:
procedure TForm1.FormDestroy(Sender: TObject);
var
Ini: Tinifile; //необходимо создать объект, чтоб потом с ним работать
begin
//создали файл в директории программы
Ini:=TiniFile.Create(extractfilepat h(paramstr(0))+'MyIni.ini');
Ini.WriteInteger('Size','Width',for m1.width);
Ini.WriteInteger('Size','Height',fo rm1.height);
Ini.WriteInteger('Position','X',for m1.left);
Ini.WriteInteger('Position','Y',for m1.top);
Ini.Free;
end;



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

Вот файл MyIni.ini после завершения работы программы (у вас естественно значения будут другими):
[Size]
Width=188
Height=144

[Position]
X=14
Y=427

Теперь подробно разберемся как записывать информацию в инифайлы: После того, как вы создали инифайл, в него можно записывать три вида переменных: Integer, String, Boolean, это осуществляется соответствующими процедурами: WriteInteger, WriteString, WriteBool. У всех этих процедур одинаковые параметры. В общем объявление этих процедур выглядит так:

Ini.WriteInteger(const Section: string, const Ident:string, Value: Integer);

Здесь Section -это имя секции, куда будут помещены параметры и значения. В файле имена секций заключены в квадратные скобки. Обычно в секции объединяют схожие параметры.

Ident - это название параметра, которому будет присваиваться какое-нибудь значение.

Value - это собственно значение, которое будет присвоено параметру. В файле оно стоит после знака равно.

Теперь напишем обработчик события OnCreate для формы, в котором будем считывать значения из файла и изменять размеры формы в соответствии с полученными значениями. Код должен иметь такой вид:
procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
begin
//открываем файл
Ini:=TiniFile.Create(extractfilepat h(paramstr(0))+'MyIni.ini');
Form1.Width:=Ini.ReadInteger('Size' ,'Width',100);
//последнее значение (100) это значение по умолчанию (default)
Form1.Height:=Ini.ReadInteger('Size ','Height',100);
Form1.Left:=Ini.ReadInteger('Positi on','X',10);
Form1.Top:=Ini.WriteInteger('Positi on','Y',10);
Ini.Free;
end;



В этом коде все просто: открыли файл, прочитали из соответствующих секций необходимые параметры и присвоили их форме. Чтение значений из инифайла по сути ничем не отличается от записи в них. Указываете секцию, где хранится необходимый параметр, указываете параметр и читаете его значение. Как вы видите все просто!

Теперь я отвечу еще на один вопрос, который может появиться - почему не обычные текстовые файлы и не реестр? Отвечаю: из текстового файла очень сложно получить и обработать необходимую информацию. Многие рекомендуют для Win95/98/2000/Me, короче для всех 32-разрядных ОС использовать именно реестр, но лично я считаю, что инифайлы удобнее, так как при при переносе программы на другой компьютер, нужно перенести только один инифайл, а во-вторых, если вы что-нибудь в реестре случайно удалите, то может случиться каюк.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 02.05.2008, 14:58   #3
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Цитата:
Сообщение от SunKnight Посмотреть сообщение
1. размер чего?
2. Нет
1. Ini файла собственно, тема же про него)
2. Я конечно понимаю что это исчерпывающий ответ . Как тогда записать в переменную IniFile файл BC.ini . // прочитал понял.
3. Сейчас гляну что там...
Не понятна вот эта строка
Form1.Width:=Ini.ReadInteger('Size' ,'Width',100);
//последнее значение (100) это значение по умолчанию (default)

Что значит 100, и что 10 при чтении.. в это поле мы при write записываем значение переменной.

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

Последний раз редактировалось Airou; 02.05.2008 в 15:15.
Airou вне форума Ответить с цитированием
Старый 02.05.2008, 15:13   #4
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

Цитата:
1. В ХP SP2 максимальный размер 64кбайта?
А ты попробуй создать ини файл такого размера
Это где то 200+ обьектов со всеми свойствами
AngelOfDeath вне форума Ответить с цитированием
Старый 02.05.2008, 15:25   #5
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Лично для вашего случая

var But:TButton;Ini:Tinifile;
begin
Ini:=TiniFile.Create(extractfilepat h(paramstr(0))+ 'MyIni.ini');
But:=TButton.Create(application);
But.parent:=form1;
But.Width:=Ini.ReadInteger('Button' ,'Width',100);
end;

думаю этого простейшего примера хватит..
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 02.05.2008, 15:36   #6
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Да млин прочитайте же что я пишу.
Этот код подходит к кнопкам созданным при создании проги... я же прошу помочь с кодом к динамически создаваемым кнопкам. Тоесть юзер зашел в программу, насоздавал кнопок, закрыл программу, открыл и видит те же кнопки на тех же местах.

Может можно перебирать в цикле секции... тогда в каждой секции был бы записан отдельный обьект и создавался он бы со свойствами, взятыми из ключей данной секции.
Airou вне форума Ответить с цитированием
Старый 02.05.2008, 15:39   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Не слышали про WriteComponent ( если не ошибся с названием ) ? Т.е. по сути можно спокойно писать компонент в поток и соответственно его читать. Данные из потока сохраняйте на диск каким вам угодно способом ( могу перечислить, если своей фантазии не хватка ).
BOBAH13 вне форума Ответить с цитированием
Старый 02.05.2008, 15:43   #8
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Цитата:
Сообщение от Airou Посмотреть сообщение
Да млин прочитайте же что я пишу.
Этот код подходит к кнопкам созданным при создании проги... я же прошу помочь с кодом к динамически создаваемым кнопкам. Тоесть юзер зашел в программу, насоздавал кнопок, закрыл программу, открыл и видит те же кнопки на тех же местах.

Может можно перебирать в цикле секции... тогда в каждой секции был бы записан отдельный обьект и создавался он бы со свойствами, взятыми из ключей данной секции.
помойму у Вас фантазии нехватает.

var But:array of TButton;i:word;
begin
But[i]:=TButton.Create(application);
But[i].parent:=form1;
BUT[i].name:='FUCK'+inttostr(i);
But[i].Width:=100;
But[i].Left:=random(100);//и т.д.
end.//это для пользователя, "клацалка".

ну а сохранить в ИНИ сами думайте (через цикл).
end;
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 02.05.2008, 15:44   #9
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Цитата:
Сообщение от SunKnight Посмотреть сообщение
помойму у Вас фантазии нехватает.
var But:array of TButton;i:word;
begin
But[i]:=TButton.Create(application);
But[i].parent:=form1;
BUT[i].name:='FUCK'+inttostr(i);
But[i].Width:=100;
But[i].Left:=random(100);//и т.д.
end.//это для пользователя, "клацалка".

ну а сохранить в ИНИ сами думайте (через цикл).
end;
Сохранить сохраню, весь вопрос как их считать через цикл. То что вы привели присваевает i-тому обьекту свойство которое вы сами написали... а я хочу чтобы свойство считывалось например из i-той секции but[i].width:=(button[i],width,100) (это скорее всего не будет работать но принцип показывает) и тп. Улавливаете разницу?

...Не слышали про WriteComponent
Уже начал гуглить :D

Последний раз редактировалось Airou; 02.05.2008 в 15:53.
Airou вне форума Ответить с цитированием
Старый 02.05.2008, 16:10   #10
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Цитата:
but[i].width:=(button[i],width,100)
Эх..
ну сделайте так but[i].width:=('button'+inttostr(i),width,100)//для чтения и так же для записи

Ini.WriteInteger('button'+inttostr( i),'Width',But.width);
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файлы NeiL Win Api 3 24.07.2008 17:02
Файлы. BR@BUS Помощь студентам 5 09.04.2008 19:35
Файлы madmot Операционные системы общие вопросы 3 06.02.2008 12:10
INI файлы aesoem Общие вопросы Delphi 3 24.12.2007 21:22
два вредных вопроса:про асю и прикриплёные файлы файлы steck Свободное общение 3 17.06.2007 14:53