Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

На тему 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]

Код где?


Наверх

Титульная страница Поиск, карта сайта Написать письмо