Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1101666469
MAINUSER
2004-11-28 21:27
2005.01.16
FindFirstChangeNotification


14-1103058203
Красная Майка
2004-12-15 00:03
2005.01.16
Последняя встреча в 2004 году...


14-1104220075
Cosinus
2004-12-28 10:47
2005.01.16
Помогите перевести с С++...


14-1104347648
Vasya.ru
2004-12-29 22:14
2005.01.16
Срочно нужна консультация


1-1103987883
emfw
2004-12-25 18:18
2005.01.16
Кто знает формат файлов *.pbm (problemist for windows - шахматныя





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский