Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-59020
RedKat
2002-10-28 17:47
2002.11.18
Большой цикл с запросами к БД Access


6-59314
Fly``
2002-09-23 18:24
2002.11.18
Data Link Properties


3-58992
Андрей Загибалов
2002-10-28 05:33
2002.11.18
Сортиорвка таблиц по возрастанию(убыванию)


1-59247
AlexT1000
2002-11-06 20:02
2002.11.18
как вставить MainMenu в CoolBar или любой другой компонент ?


14-59359
Veronika
2002-10-29 08:42
2002.11.18
Как защитить книгу Excel от просмотра?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский