Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Вниз2 экземпляра TIniFile Найти похожие ветки
← →
MsGuns (2002-11-06 11:51) [0]Есть необходимость сохранения параметров программы 2-х типов: глобальные - для всех пользователей, и локальных - для каждого свои. Я объявил и создал 2 экземпляра TIniFile (ComIni и LocIni), один - в файл с именем "VBCom.ini" в разделяемый каталог, второй - файл "VBLoc.ini" - в каталог локального диска (Допустим, C:\VB).
В дальнейшем я собирался использовать их в разных частях проекта (формах) для сохранения-восстановления.
С первым из них (ComIni) проблем нет. А вот со вторым чудеса. Процедура, где делается обращение к ReadString, не просто не отрабатывает, а делает нечто вроде Exit из тела процедуры.
Посмотрел Хэлп и обратил внимание, что там в каждой проце, юзающей TIniFile, сначала он создается, а затем освобождается.
Неужели не могут существовать одновременно 2 или более экземпляра класса TIniFile ?
Уважаемые мастаки, объясните глупому, в чем его глупость. Заранее благодарен.
← →
KoluChi (2002-11-06 11:59) [1]>Посмотрел Хэлп и обратил внимание, что там в каждой проце, >юзающей TIniFile, сначала он создается, а затем освобождается.
А ты как хотел?
>Неужели не могут существовать одновременно 2 или более экземпляра класса TIniFile ?
Могут.
Приведи код и посмотрим, скорее всего ReadString обращается к недоступному файлу.
← →
MsGuns (2002-11-06 12:08) [2]
Вот это - работает !!!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
lsbCom: TListBox;
lsbLoc: TListBox;
Label1: TLabel;
Label2: TLabel;
Panel1: TPanel;
Label3: TLabel;
Label4: TLabel;
edFirmName: TEdit;
Label5: TLabel;
edFirmOKPO: TEdit;
Label6: TLabel;
edFirmPhon: TEdit;
edFirmAddr: TEdit;
edFirmMail: TEdit;
edFirmDir: TEdit;
edFirmBuh: TEdit;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
edFirmTaxNDS: TEdit;
Label13: TLabel;
edFirmTaxNum: TEdit;
Label14: TLabel;
Bevel1: TBevel;
Panel2: TPanel;
Label15: TLabel;
lbCommonINI: TLabel;
lblLocalINI: TLabel;
Label16: TLabel;
edPeriodSYr: TEdit;
Label17: TLabel;
edPeriodSMn: TEdit;
UpDown1: TUpDown;
UpDown2: TUpDown;
Label18: TLabel;
edPeriodEYr: TEdit;
UpDown3: TUpDown;
Label19: TLabel;
edPeriodEMn: TEdit;
UpDown4: TUpDown;
Label20: TLabel;
chbOptRecalcLast: TCheckBox;
chbOptRecalcNew: TCheckBox;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ComLib,LocLib: string;
implementation
Uses IniFile;
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
// Определить локальный и системный каталоги
LocLib := GetCurrentDir+"\";
ComLib := "N:\Users\Ms\NetDr\";
Form1.lbCommonINI.Caption := ComLib;
Form1.lblLocalINI.Caption := LocLib;
ReadParams;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WriteParams;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WriteParams;
Form1.Close;
end;
end.
// Обслуживание параметров программы
// Есть 2 ini - файла:
// VBLocal.ini, расположенный в приват-каталоге программы
// VBCommon.ini, расположенный в каталоге с БД
unit IniFile;
interface
uses Dialogs, IniFiles, SysUtils, StdCtrls, Classes;
const
VB_COMMONSECTIONID: string = "COMMON PARAMETERS";
VB_LOCALSECTIONID: string = "PARAMETERS";
var
ComIni,LocIni: TIniFile;
procedure ReadParams;
procedure WriteParams;
implementation
uses Unit1, Controls;
procedure ReadParams;
var
i: integer;
begin
ComIni := TIniFile.Create(ComLib+"VBCom.ini");
LocIni := TIniFile.Create(LocLib+"VBLoc.ini");
for i := 0 to Form1.Panel1.ControlCount-1 do
if Form1.Panel1.Controls[i].ClassType=TEdit then
TEdit(Form1.Panel1.Controls[i]).Text :=
ComIni.ReadString(VB_COMMONSECTIONID,Form1.Panel1.Controls[i].Name,"");
try
Form1.lsbCom.Items.LoadFromFile(ComIni.FileName);
except
Form1.lsbCom.Items.Clear;
end;
for i := 0 to Form1.Panel2.ControlCount-1 do
if Form1.Panel2.Controls[i].ClassType=TEdit then
TEdit(Form1.Panel2.Controls[i]).Text :=
LocIni.ReadString(VB_LOCALSECTIONID,Form1.Panel2.Controls[i].Name,"");
try
Form1.lsbLoc.Items.LoadFromFile(LocIni.FileName);
except
Form1.lsbLoc.Items.Clear;
end;
end;
procedure WriteParams;
var
i: integer;
begin
for i := 0 to Form1.Panel1.ControlCount-1 do
if Form1.Panel1.Controls[i].ClassType=TEdit then
ComIni.WriteString(VB_COMMONSECTIONID,Form1.Panel1.Controls[i].Name,
TEdit(Form1.Panel1.Controls[i]).Text);
ComIni.UpdateFile;
for i := 0 to Form1.Panel2.ControlCount-1 do
if Form1.Panel2.Controls[i].ClassType=TEdit then
LocIni.WriteString(VB_LOCALSECTIONID,Form1.Panel2.Controls[i].Name,
TEdit(Form1.Panel2.Controls[i]).Text);
LocIni.UpdateFile;
ReadParams;
end;
end.
Никаких убиваний - просто работает, причем с многократным чтеним-записью. Можно запустить и проверить.
← →
MsGuns (2002-11-06 12:13) [3]Кажется, всосал ! При чтении параметров экземпляры создаются по-новой. В осн.проге я создаю их только один раз, в MainForm.OnCreate. А далее просто ReadString и WriteString без пересоздания. Но ведь их все равно ДВА ! И оба работают ! Тем более ни фига не понял !
← →
KoluChi (2002-11-06 12:29) [4]ну ты сам уже все понял, я надеюсь:
procedure FormOnCreate
begin
ComLib := ...;
LocLib := ...;
ComIni := TIniFile.Create(ComLib+"VBCom.ini");
LocIni := TIniFile.Create(LocLib+"VBLoc.ini");
end;
procedure FormOnClose
begin
ComIni.Free();
LocIni.Free();
end;
← →
Ihor Osov'yak (2002-11-06 12:33) [5]2 MsGuns © (06.11.02 11:51)
> Есть необходимость сохранения параметров программы 2-х типов:
> глобальные - для всех пользователей, и локальных - для каждого
> свои. Я объявил и создал 2 экземпляра TIniFile
А по мне для сохранения глобальных для всех юзеров больше регистри катит, с его ейчкей_локал_машинг. Ну и локальные также в регистри, но в сарент_юзер...
← →
MsGuns (2002-11-06 12:42) [6]>KoluChi © (06.11.02 12:29)
Не понял Вашей ремарки. Причем здесь освобождение ресурсов при закрытии Гл.формы (я не о приведенной здесь проге, а об осн.проекте). Не работает второй TIniFile вообще ! Ни единого разу ! Сейчас переделаю так, как написано в умных книжках (типа каждый раз пара Create-Free), но что-то мне шепчет, что это не поможет :(((
>Ihor Osov"yak © (06.11.02 12:33)
Ваше мнение я понял и даже где-то разделил. Но все же на сабж Вы не ответили.
← →
KoluChi (2002-11-06 12:51) [7]Ну тогда давай по-порядку:
в "VBLoc.ini" что-нибудь пишется?
← →
MsGuns (2002-11-06 13:17) [8]>KoluChi © (06.11.02 12:51)
По-порядку так по-порядку.
Изначально (например, в тек.момент) такого файла нет. При чтении из него (ReadString) возвращается значение, заданное третьим парметром, т.е. пробел, для всех четырех переменных. Пустые значения переменных (я пробел дальше преобразую в пусто) записываются в TEdit`ы формы, которую юзер (я в данном случае) редактирует. Потом по кнопке на этой же форме парметры сбрасываются в ини-файл. Все так, как я показал в приведенном выше коде.
Так вот, с файлом VBCom.ini (ComIni) все это катит (даже если самого файла физ.нет) чудесненько, а вот с VBLoc (LocIni) - ни фига ! Т.е. при обработке первой строки сообв. процы ReadString в отладчике курсор "сигает" в посл.строку процедуры и затем из нее, не выполнив даже последней строки. Ощущение, что сработал оператор Exit.
Сейчас переделал на классический вариант - в каждой проце чтения-записи соотвю экземпляр TIniFile криэйтится, а затем фришиться - и все заработало.
Так вот, мне АБСОЛЮТНО НЕПОНЯТНО, почему в приведенном выше примере схема с ОДНОРАЗОВЫМ созданием 2-х разных экземпляров TIniFile работает, а в моем проекте (не привожу его, т.к. зело огроменный, но блоки создания, чтения и записи идентичны приведенному мной примеру) - не хочет работать 2-й экземпляр !
← →
Дремучий (2002-11-06 13:27) [9]
> MsGuns © (06.11.02 12:08)
зачем так длинно объяснять?
> KoluChi © (06.11.02 12:29)
вполне исчерпывающий ответ,
от себя добавлю только, что первый файл нужно писать на сервер (вместе с прогой, ну если такой имеется), а второй на локальную машину. Хотя, если есть потребность править настрой ки юзеров, то тоже на сервер. :))
← →
MsGuns (2002-11-06 13:30) [10]>KoluChi © (06.11.02 12:51)
По-порядку так по-порядку.
Изначально (например, в тек.момент) такого файла нет. При чтении из него (ReadString) возвращается значение, заданное третьим парметром, т.е. пробел, для всех четырех переменных. Пустые значения переменных (я пробел дальше преобразую в пусто) записываются в TEdit`ы формы, которую юзер (я в данном случае) редактирует. Потом по кнопке на этой же форме парметры сбрасываются в ини-файл. Все так, как я показал в приведенном выше коде.
Так вот, с файлом VBCom.ini (ComIni) все это катит (даже если самого файла физ.нет) чудесненько, а вот с VBLoc (LocIni) - ни фига ! Т.е. при обработке первой строки сообв. процы ReadString в отладчике курсор "сигает" в посл.строку процедуры и затем из нее, не выполнив даже последней строки. Ощущение, что сработал оператор Exit.
Сейчас переделал на классический вариант - в каждой проце чтения-записи соотвю экземпляр TIniFile криэйтится, а затем фришиться - и все заработало.
Так вот, мне АБСОЛЮТНО НЕПОНЯТНО, почему в приведенном выше примере схема с ОДНОРАЗОВЫМ созданием 2-х разных экземпляров TIniFile работает, а в моем проекте (не привожу его, т.к. зело огроменный, но блоки создания, чтения и записи идентичны приведенному мной примеру) - не хочет работать 2-й экземпляр !
← →
MsGuns (2002-11-06 14:21) [11]>Дремучий © (06.11.02 13:27)
>зачем так длинно объяснять?
Затем, чтоб понятен был вопрос. Но видно, объяснил кОротко, потому что по сути вопроса НИКТО НИ РАЗУ не ответил. Ответили как надо сделать - в итоге я так и поступил. Но я не понял главного - почему в одном случае работает, а в другом нет.
> KoluChi © (06.11.02 12:29)
Для Вас, возможно.. Но не для меня. См. MsGuns © (06.11.02 12:42)
← →
KoluChi (2002-11-06 14:32) [12]>Для Вас, возможно.. Но не для меня. См. MsGuns © (06.11.02 12:42)
Не понял, к чему это?
Заработало же - ну и радуйся. А не работало потому-что кто-то где-то что-то написал не то.
← →
MsGuns (2002-11-06 15:06) [13]>KoluChi © (06.11.02 14:32)
>Не понял, к чему это?
К тому, что мастер блеснул знанием и пониманием. Мне, конечно, это приятно, но мне лично ничего не дало его замечание. Я вообще не понимаю посты, в которых товарищ говорит типа "Делай как сказал X и не выпендривайся", и при этом не потрудившись ВНИКНУТЬ в суть проблемы. А в данном случае она (суть) не в том, что я не нашел выход, а в том, что я НЕ ПОНЯЛ, почему не работает ! Про ошибки это Вы верно заметили - для их выявления надо ОЧЕНЬ хорошо понимать суть используемых классов, чего лично у меня пока в дефиците. Для чего собственно, и обратился к мастакам. Но если в лом разбираться (это не о Вас), зачем кидаться ничего не значащей (в данном случае) фразой ? Показать, что я дурак ? Да я и не возражаю сильно.
Ладно, проехали... Во всяком случае спасибо за время и желание помочь 8)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c