Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизНа тему ini файлов Найти похожие ветки
← →
markers © (2004-12-27 15:16) [0]Привет! С наступающим! Вообщем у меня возник такой маленький вопрос!;) Имеем процедуру в которой мы читаем много значений из инишки при помощи MemIni, всё хорошо без проблем, но после присвоения оного значения мне нужно вывать событие OnChange, в обработке которого у меня тоже читается инифайл (Уже другой), дя заполнения другого элемента, так вот при этом вываливается Access Vivolation, так вот вопрос можно ли это как-то исправить не отказываясь от данного построения? (Точнее закрыть газа на мелкую гадость из-за этого)
← →
Fay © (2004-12-27 15:29) [1]Код где?
← →
markers © (2004-12-27 15:31) [2]это стоит в обработчике 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;
← →
markers © (2004-12-27 15:32) [3]Это внутринние процедуры для обработчика 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;
← →
Fay © (2004-12-27 15:35) [4]Ну, и в каком же месте AV?
← →
markers © (2004-12-27 15:38) [5]Процедура (Начальная) из которой вызывается обработчик 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:42) [6]см. [4]
← →
markers © (2004-12-27 15:46) [7]Погодь, я кажется нашёл баг...
← →
Fay © (2004-12-27 15:54) [8]8)
← →
markers © (2004-12-27 15:59) [9]Всё! Всем большое спасибо;) аг нашёлся;)
← →
markers © (2004-12-27 16:03) [10]Баг был в неверном оъекте заданным в качестве параметра Sender
DriveInterface1Change(DriveType1);
И из-за этого происходиа эта эррора на втором круге!
← →
MetalFan © (2004-12-27 18:22) [11]жутький код имхо...
← →
KilkennyCat © (2004-12-28 01:28) [12]ага. можно уменьшить ровно в два раза, объединив три одинаковых блока (которых вполне возможно и больше) в одну процедуру.
> DriveName1.Text:=ReadString(CompCombo.Text,"DriveVendorAndModel1","");
> DriveName2.Text:=ReadString(CompCombo.Text,"DriveVendorAndModel2","");
> DriveName3.Text:=ReadString(CompCombo.Text,"DriveVendorAndModel3","");
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c