Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

На тему 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
14-1103830814
Andy BitOff
2004-12-23 22:40
2005.01.16
Потребление электроэнергии


14-1104043729
SergP
2004-12-26 09:48
2005.01.16
Я фигею с эры


3-1102728513
ganda
2004-12-11 04:28
2005.01.16
объединение несколько БД в одну таблицу


1-1104751746
t4
2005-01-03 14:29
2005.01.16
ShellListView


9-1096361464
VasyaPupkin
2004-09-28 12:51
2005.01.16
DelphiX