![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
На тему ini файлов
markers © (2004-12-27 15:16:00)Привет! С наступающим! Вообщем у меня возник такой маленький вопрос!;) Имеем процедуру в которой мы читаем много значений из инишки при помощи MemIni, всё хорошо без проблем, но после присвоения оного значения мне нужно вывать событие OnChange, в обработке которого у меня тоже читается инифайл (Уже другой), дя заполнения другого элемента, так вот при этом вываливается Access Vivolation, так вот вопрос можно ли это как-то исправить не отказываясь от данного построения? (Точнее закрыть газа на мелкую гадость из-за этого)
KilkennyCat (2004-12-28 01:28:00) [1]ага. можно уменьшить ровно в два раза, объединив три одинаковых блока (которых вполне возможно и больше) в одну процедуру.
> DriveName1.Text:=ReadString(CompCombo.Text,'DriveVendorAndModel1','');
> DriveName2.Text:=ReadString(CompCombo.Text,'DriveVendorAndModel2','');
> DriveName3.Text:=ReadString(CompCombo.Text,'DriveVendorAndModel3','');
MetalFan (2004-12-27 18:22:00) [2]жутький код имхо...
markers (2004-12-27 16:03:00) [3]Баг был в неверном оъекте заданным в качестве параметра Sender
DriveInterface1Change(DriveType1);
И из-за этого происходиа эта эррора на втором круге!
markers (2004-12-27 15:59:00) [4]Всё! Всем большое спасибо;) аг нашёлся;)
Fay (2004-12-27 15:54:00) [5]8)
markers (2004-12-27 15:46:00) [6]Погодь, я кажется нашёл баг...
Fay (2004-12-27 15:42:00) [7]см. [4]
markers (2004-12-27 15:38:00) [8]Процедура (Начальная) из которой вызывается обработчик OnChange
if CompCombo.Text <> '' Then
begin
ClearAllRowers;
MeMIni:=TMemIniFile.Create(ExtractFileDir(Application.ExeName)+'\Data\index.idx');
for i:=0 to FileList.Count-1 do
begin
if OtdelCombo.Text = MeMIni.ReadString('Departments',FileList.Strings[i],Musor) Then
begin
Temp:=ExtractFileDir(Application.ExeName)+'\Data\'+FileList.Strings[i];
end;
end;
MeMIni.Free;
if (Temp <> '') and (Temp <> musor) Then
begin
with TMemIniFile.Create(Temp) do
begin
IniUpdate:=True;
...
{<Drives>}
DrivesPageShow(DrivesPage);
Temp:=ReadString(CompCombo.Text,'DriveInterface1','');
for i2:=0 to DriveInterface1.Items.Count-1 do
if DriveInterface1.Items.Strings[i2]=Temp Then
begin
DriveInterface1.ItemIndex:=i2;
Break;
end;
DriveInterface1Change(DriveInterface1);
Temp:=ReadString(CompCombo.Text,'DriveType1','');
for i2:=0 to DriveType1.Items.Count-1 do
if DriveType1.Items.Strings[i2]=Temp Then
begin
DriveType1.ItemIndex:=i2;
Break;
end;
DriveType1Change(DriveType1);
DriveName1.Text:=ReadString(CompCombo.Text,'DriveVendorAndModel1','');
DriveSize1.Text:=ReadString(CompCombo.Text,'DriveSize1','');
DriveSpeedFormula1.Text:=ReadString(CompCombo.Text,'DriveSpeedFormula1','');
DriveSNAndInventar1.Text:=ReadString(CompCombo.Text,'DriveSNAndInventar1','');
DriveDate1.Text:=ReadString(CompCombo.Text,'DriveDate1','');
if DriveDate1.Text = ' . . ' Then DriveDate1.Text:='01.01.2004';
DriveInterface1Change(DriveType1);
{xxx}
Temp:=ReadString(CompCombo.Text,'DriveInterface2','');
for i2:=0 to DriveInterface2.Items.Count-1 do
if DriveInterface2.Items.Strings[i2]=Temp Then
begin
DriveInterface2.ItemIndex:=i2;
Break;
end;
DriveInterface1Change(DriveInterface2);
Temp:=ReadString(CompCombo.Text,'DriveType2','');
for i2:=0 to DriveType2.Items.Count-1 do
if DriveType2.Items.Strings[i2]=Temp Then
begin
DriveType2.ItemIndex:=i2;
Break;
end;
DriveType1Change(DriveType2);
DriveName2.Text:=ReadString(CompCombo.Text,'DriveVendorAndModel2','');
DriveSize2.Text:=ReadString(CompCombo.Text,'DriveSize2','');
DriveSpeedFormula2.Text:=ReadString(CompCombo.Text,'DriveSpeedFormula2','');
DriveSNAndInventar2.Text:=ReadString(CompCombo.Text,'DriveSNAndInventar2','');
DriveDate2.Text:=ReadString(CompCombo.Text,'DriveDate2','');
if DriveDate2.Text = ' . . ' Then DriveDate2.Text:='01.01.2004';
{xxx}
Temp:=ReadString(CompCombo.Text,'DriveInterface3','');
for i2:=0 to DriveInterface3.Items.Count-1 do
if DriveInterface3.Items.Strings[i2]=Temp Then
begin
DriveInterface3.ItemIndex:=i2;
Break;
end;
DriveInterface1Change(DriveInterface3);
Temp:=ReadString(CompCombo.Text,'DriveType3','');
for i2:=0 to DriveType3.Items.Count-1 do
if DriveType3.Items.Strings[i2]=Temp Then
begin
DriveType3.ItemIndex:=i2;
Break;
end;
DriveType1Change(DriveType3);
DriveName3.Text:=ReadString(CompCombo.Text,'DriveVendorAndModel3','');
DriveSize3.Text:=ReadString(CompCombo.Text,'DriveSize3','');
DriveSpeedFormula3.Text:=ReadString(CompCombo.Text,'DriveSpeedFormula3','');
DriveSNAndInventar3.Text:=ReadString(CompCombo.Text,'DriveSNAndInventar3','');
DriveDate3.Text:=ReadString(CompCombo.Text,'DriveDate3','');
if DriveDate3.Text = ' . . ' Then DriveDate3.Text:='01.01.2004';
...
Free;
IniUpdate:=False;
end;
end;
end;
Везде всё нормально, это точно! Потому-что если я делаю в обрабочике OnChange проверку переменной IniUpdate на её включённость и при "правдивом" состоянии её я выхожу из обработчика, то всё оки!
Fay (2004-12-27 15:35:00) [9]Ну, и в каком же месте AV?
markers (2004-12-27 15:32:00) [10]Это внутринние процедуры для обработчика OnChange
function CNum(Names:String):TObject;
var i:integer;
begin
for i:=0 to DrivesPage.ControlCount-1 do
begin
if DrivesPage.Controls[i].Name = Names Then
begin
Result:=DrivesPage.Controls[i];
end;
end;
end;
function CStr(Name:String):String;
var i:integer;
begin
for i:=0 to DrivesPage.ControlCount-1 do
begin
if DrivesPage.Controls[i].Name = Name Then
begin
Result:=TComboBox(DrivesPage.Controls[i]).Text;
end;
end;
end;
markers (2004-12-27 15:31:00) [11]это стоит в обработчике OnChange
DriveNum:=TComboBox(Sender).Tag;
MemIni2:=TMemIniFile.Create(ExtractFileDir(Application.ExeName)+'\Data\index.idx');
TempString:=TStringList.Create;
TempStrings:=TStringList.Create;
MemIni2.ReadSection('DrivesList',TempString);
for iR:=0 to TempString.Count-1 do
begin
Temp:=MemIni2.ReadString('DrivesList',CStr('DriveInterface'+IntToStr(DriveNum))+IntToStr(iR),'');
if Trim(Temp) <> '' Then
begin
TempStrings.Add(Temp);
end;
end;
TComboBox(CNum('DriveType'+IntToStr(DriveNum))).Items.Clear;
TComboBox(CNum('DriveType'+IntToStr(DriveNum))).Items.AddStrings(TempStrings);
TLabeledEdit(CNum('DriveSpeedFormula'+IntToStr(DriveNum))).Left:=TLabeledEdit(CNum('DriveSize'+IntToStr(DriveNum))).Left ;
TempStrings.Free;
TempString.Free;
MemIni2.Free;
if (TComboBox(CNum('DriveInterface'+IntToStr(DriveNum))).ItemIndex = -1) or (TComboBox(Sender).ItemIndex = TComboBox(Sender).Items.Count-1) Then
begin
TLabeledEdit(CNum('DriveSize'+IntToStr(DriveNum))).Visible:=False;
TLabeledEdit(CNum('DriveSpeedFormula'+IntToStr(DriveNum))).Visible:=False;
end;
Fay (2004-12-27 15:29:00) [12]Код где?