powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel + ProcessMessages (Delphi)
7 сообщений из 7, страница 1 из 1
Excel + ProcessMessages (Delphi)
    #37199297
Missory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Достаточно давно работаю с импортом/экспортом в Excel, но с такой проблемой столкнулся впервые.

Имеется несколько проектов, которые работают с функциями Excel и есть модуль с функциями Excel который подключен ко всем этим проектам.

До этого все функции Excel использовали обрашение к активным страницам или книгам, но решил переделать и в качестве параметра передавать непосредственный указать на лист/книгу.

После того как запустил проект обнаружил функция импорта/экспорта данных выполняется всего 2 раза!!!!!
После долгого и тупого поиска выяснилось что на это как-то влияет "Application.ProcessMessages".

После комментирования данной строки все работает прекрасно.
Помогите разобраться в чем проблема. По большей "обновление" компонент формы заменил на .Refresh, но все же хочется в одном месте (в большом цикле оставить ProcessMessages).

ЗЫ Тему разместил в ветке MS Office, потому что мало понимаю в OLE объектах и думаю причина в них.

Несколько выдержек кода, думаю они всем будут понятны:
Код: plaintext
1.
2.
3.
  ApplicationExcel: OleVariant;
  ApplicationExcelWorkBook: OleVariant;
  ApplicationExcelWorkSheet: OleVariant;

Код: plaintext
1.
      result := CreateOleObject('Excel.Application');
...
Рейтинг: 0 / 0
Excel + ProcessMessages (Delphi)
    #37199314
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Missory,

У меня никогда не было проблем c такими симптомами ни на С++, ни на VB, ни на FoxPro. Тут не помешал-бы тестовый примерчик, потому что гадание на кофейной гуще не мой конёк :)
...
Рейтинг: 0 / 0
Excel + ProcessMessages (Delphi)
    #37199331
Missory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую Delphi XE. Офис 2007.

Еще пара вопросов:
1) зачем необходимо использовать CoInitializeEx. И насколько это необходимо?
2) как видено из дальнейшего примерно я испольщую 2 проверки для проверки объекта:
Код: plaintext
1.
ApplicationExcel := CreateExcel;
 if   not  VarIsEmpty(ApplicationExcel)  and   not  VarIsNull(ApplicationExcel)   then 
А как правильно?


Кастрированный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
 procedure  TfmFromExcel.btn_ProverkaExecute(Sender: TObject);
 var 
  Import: TImport;
  __CountRange: word;
  ApplicationExcel: OleVariant;
  ApplicationExcelWorkBook: OleVariant;
  ApplicationExcelWorkSheet: OleVariant;
 begin 
   if  (L_PATH.Caption <> '')  then 
   begin 

      ApplicationExcel := CreateExcel;
       if   not  VarIsEmpty(ApplicationExcel)  and   not  VarIsNull(ApplicationExcel)   then 
       begin 
        ApplicationExcelWorkBook := OpenWorkBook(ApplicationExcel, L_PATH.Caption);
         if   not  VarIsEmpty(ApplicationExcelWorkBook)  then    //L_Excel_File.Caption := ExtractFileName(L_PATH.Caption); 
         begin 
          PB_Sheet_MAX( CountSheets(ApplicationExcelWorkBook) );
          PB_Sheet_MAX(  1  );
          PB_Sheet.Min :=  1 ;
          PB_Sheet.Position := PB_Sheet.Min;
           // *********************************************** 

           for  NSheet :=  1   to  CountSheets(ApplicationExcelWorkBook)  do 
           begin 
            L_Excel_Page.Caption := IntToStr(NSheet) + ' / ' + IntToStr( CountSheets(ApplicationExcelWorkBook) );

            PB_Function_MAX( 19 );  // 19 операций 

            Row_Null :=  0 ;
            Col_Null :=  0 ;

            ___ColInEXCEL :=  1 ;
            ___RowInEXCEL :=  1 ;

            Import := TImport.Create;
            PB_Function_INC();  //  *** 

             // установка типов для массиов значений 
            Import.RangeType := ' ';
            Import.IDType := 'I';
            Import.ValueType := 'F';
            Import.SourceType := 'S';
            Import.UnitType := 'S';
            Import.IndexType := 'S';
            Import.IndustryType := 'S';
            Import.DateType := ' ';

             // режим поиска ошибок 
            Import.DEBUG_MODE := CB_debug.Checked;

             // цвета 
            Import.Color_Selection := chk_SetColorType.Checked;
            Import.Color_Insert := col_New.Color;
            Import.Color_Update := col_Upd.Color;
            Import.Color_Error := col_Err.Color;
            Import.Color_Type_ID := col_Type_ID.Color;
            Import.Color_Type_Index := col_Type_Index.Color;
            Import.Color_Type_Region := col_Type_Region.Color;
            Import.Color_Type_Source := col_Type_Source.Color;
            Import.Color_Type_Industry := col_Type_Industry.Color;
            Import.Color_Type_Unit := col_Type_Unit.Color;
            Import.Color_Type_Date := col_Type_Date.Color;
            Import.Color_Type_Value := col_Type_Value.Color;

            Import.CurrentSheet := NSheet;
            ApplicationExcelWorkSheet := GetSheet(ApplicationExcel, NSheet);

            LB_LOG.Items.Add(TimeToStr(Now)+'| Страница: '+IntToStr(NSheet));
 //            Application.ProcessMessages; 

 //             ********** Распознание ячеек ********** 
            GetValueOfRange( Import, ApplicationExcel );

             // предварительное распознание ячеек 
            FirstCheckValue( Import, ApplicationExcel );

             if  (Import.IndexCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одного показателя');
             if  (Import.DateCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одной даты');
             if  (Import.SourceCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одной даты');
             if  (Import.UnitCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одной единицы измерения');
             if  (Import.ValueCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одного значения');

            PrintValues(Import, ApplicationExcel);

             if  (chk_CheckValue.Checked)  then 
             begin 
              __CountRange := Import.ValueCount;
              LB_LOG.Items.Add(TimeToStr(Now)+'| Проверка значений '+IntToStr(__CountRange));
              PB_Range_MAX(__CountRange);
               while  __CountRange >  0   do 
               begin 
                __CountRange := Import.TestRange(ApplicationExcel, chk_InsertDB.Checked);
                PB_Range_INC(__CountRange);
               end ;
             end ;
            PB_Function_INC();  //  *** 

             // Не распознанные ячеки выделяем красным цветом 
             if  (chk_SetColor.Checked)  and  (Import.RangeCount> 0 )  then 
               for  i :=  0   to  Import.RangeCount- 1   do 
               begin 
                ___Range := Import.GetRange(i);
                SetPatternRange(ApplicationExcelWorkBook, ___Range.Range,  0 ,  0 ,  0 , col_Err.Color,  0 );  // Красный 
               end ;  // end 
            PB_Function_INC();  //  *** 

             if  ( chk_SaveLOG.Checked )  then  Import.LOG_SaveToFile(IMPORT_LOG_FILE);
            PB_Function_INC();  //  *** 

            Import.Free;

            PB_Sheet_INC();

 //            Application.ProcessMessages; 
           end ;  // for NSheet := 1 to CountSheets(ApplicationExcelWorkBook) do 

           if  (RB_Visible.Checked)  then  VisibleExcel(ApplicationExcel, true);

          act_EXCEL_CloseNSExecute( nil );

           // ********************************************** 
         end   else  showmessage('Книга не открыта');
       end   else  showmessage('EXCEL не создан');

   end ;  // if (L_PATH.Caption <> '') 

 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 function  CreateExcel: OleVariant;
 begin 
   // Ищем запущеный экземпляр Excel, если он не найден, вызывается исключение 
  result := null;

     try 
      result := GetActiveOleObject('Excel.Application');
     except 

       try 
        result := CreateOleObject('Excel.Application');
       except 

       end ;

     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 function  CountSheets(XlsBook: OleVariant): integer;
 begin 
  result := - 1 ;
   if   not  VarIsEmpty( XlsBook )  then 
     try 
      result := XlsBook.Sheets.Count;
     except 
       raise  Exception.Create('Ошибка доступа OLE-объекта в функции CountSheets.');
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 function  GetSheet(Excel: OleVariant; sheet_number: word): OleVariant;
 begin 
  result := Unassigned;
   if   not  VarIsEmpty( Excel )  then 
     try 
      result := Excel.Sheets.Item[ sheet_number ];
     except 
       raise  Exception.CreateFmt ('Ошибка доступа OLE-объекта в функции GetSheet (Param:%d)',[sheet_number]);
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 function  SetRange(XlsSheet: OleVariant; range: OleVariant; value_: OleVariant): boolean;
 begin 
  result := false;
   if   not  VarIsEmpty( XlsSheet )  then 
   try 
    XlsSheet.range[range, EmptyParam].Value := value_;
    result := true;
   except 
     raise  Exception.Create('Ошибка доступа OLE-объекта в функции SetRange.');
   end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 function  GetRange(XlsSheet: OleVariant; range:  string ): OleVariant;
 begin 
  result := Unassigned;
   if   not  VarIsEmpty( XlsSheet )  then 
     try 
      result := XlsSheet.range[range, EmptyParam].Value;
     except 
      result := Unassigned;
       raise  Exception.Create('Ошибка доступа OLE-объекта в функции GetRange.');
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 function  VisibleExcel(Excel: OleVariant; visible: boolean): boolean;
 begin 
  result := false;
   if   not  VarIsEmpty( Excel )  then 
     try 
      Excel.visible := visible;
      result := true;
     except 
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 function  OpenWorkBook(Excel: OleVariant; file_:  string ): OleVariant;
 begin 
   if   not  VarIsEmpty( Excel )  then 
   begin 
    OpenedWorkBook( Excel , file_);
    result := true;
     try 
      result := Excel.Workbooks.Open(file_);
     except 
      result := null;
     end ;
   end ;
 end ;
...
Рейтинг: 0 / 0
Excel + ProcessMessages (Delphi)
    #37199626
Missory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто не знает?
...
Рейтинг: 0 / 0
Excel + ProcessMessages (Delphi)
    #37199643
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MissoryНикто не знает?
тебе сюда
http://www.sql.ru/forum/actualtopics.aspx?bid=20
...
Рейтинг: 0 / 0
Excel + ProcessMessages (Delphi)
    #37199687
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MissoryЕще пара вопросов:
1) зачем необходимо использовать CoInitializeEx. И насколько это необходимо?

Здесь написано что: MSDNNew applications should call CoInitializeEx instead of CoInitialize. :)

Missory2) как видено из дальнейшего примерно я испольщую 2 проверки для проверки объекта:
Код: plaintext
1.
ApplicationExcel := CreateExcel;
 if   not  VarIsEmpty(ApplicationExcel)  and   not  VarIsNull(ApplicationExcel)   then 
А как правильно?

Да можно и так, только у меня бывала ситуация когда на компе вообще не был установлен Офис. И я выдаю сообщение что мол, установите офис, а потом работайте

MissoryКастрированный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
 procedure  TfmFromExcel.btn_ProverkaExecute(Sender: TObject);
 var 
  Import: TImport; - кто такой?
  __CountRange: word;
  ApplicationExcel: OleVariant;
  ApplicationExcelWorkBook: OleVariant;
  ApplicationExcelWorkSheet: OleVariant;
 begin 
   if  (L_PATH.Caption <> '')  then 
   begin 

      ApplicationExcel := CreateExcel;
       if   not  VarIsEmpty(ApplicationExcel)  and   not  VarIsNull(ApplicationExcel)   then 
       begin 

У тебя функция OpenWorkBook может возвращать true, книгу и null. А проверяешь на Empty!
        ApplicationExcelWorkBook := OpenWorkBook(ApplicationExcel, L_PATH.Caption);
         if   not  VarIsEmpty(ApplicationExcelWorkBook)  then    //L_Excel_File.Caption := ExtractFileName(L_PATH.Caption); 
         begin 
Заведи переменную и инициализируй её количеством листов, а потом используй переменную, вместо вызова функции
          PB_Sheet_MAX( CountSheets(ApplicationExcelWorkBook) );
Как-то следующая строка не вяжется с предыдущей
          PB_Sheet_MAX(  1  );
          PB_Sheet.Min :=  1 ;
          PB_Sheet.Position := PB_Sheet.Min;
           // *********************************************** 

           for  NSheet :=  1   to  CountSheets(ApplicationExcelWorkBook)  do 
           begin 
            L_Excel_Page.Caption := IntToStr(NSheet) + ' / ' + IntToStr( CountSheets(ApplicationExcelWorkBook) );

            PB_Function_MAX( 19 );  // 19 операций 

            Row_Null :=  0 ;
            Col_Null :=  0 ;

            ___ColInEXCEL :=  1 ;
            ___RowInEXCEL :=  1 ;

            Import := TImport.Create;
            PB_Function_INC();  //  *** 

Не понятно что за зверь и что у него внутрях :)
             // установка типов для массиов значений 
            Import.RangeType := ' ';
            Import.IDType := 'I';
            Import.ValueType := 'F';
            Import.SourceType := 'S';
            Import.UnitType := 'S';
            Import.IndexType := 'S';
            Import.IndustryType := 'S';
            Import.DateType := ' ';

             // режим поиска ошибок 
            Import.DEBUG_MODE := CB_debug.Checked;

             // цвета 
            Import.Color_Selection := chk_SetColorType.Checked;
            Import.Color_Insert := col_New.Color;
            Import.Color_Update := col_Upd.Color;
            Import.Color_Error := col_Err.Color;
            Import.Color_Type_ID := col_Type_ID.Color;
            Import.Color_Type_Index := col_Type_Index.Color;
            Import.Color_Type_Region := col_Type_Region.Color;
            Import.Color_Type_Source := col_Type_Source.Color;
            Import.Color_Type_Industry := col_Type_Industry.Color;
            Import.Color_Type_Unit := col_Type_Unit.Color;
            Import.Color_Type_Date := col_Type_Date.Color;
            Import.Color_Type_Value := col_Type_Value.Color;

            Import.CurrentSheet := NSheet;
Переменная не используется
            ApplicationExcelWorkSheet := GetSheet(ApplicationExcel, NSheet);

Врядли будет виснуть из-за добавления в ЛистБокс
            LB_LOG.Items.Add(TimeToStr(Now)+'| Страница: '+IntToStr(NSheet));
 //            Application.ProcessMessages; 

 //             ********** Распознание ячеек ********** 
            GetValueOfRange( Import, ApplicationExcel );

             // предварительное распознание ячеек 
            FirstCheckValue( Import, ApplicationExcel );

             if  (Import.IndexCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одного показателя');
             if  (Import.DateCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одной даты');
             if  (Import.SourceCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одной даты');
             if  (Import.UnitCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одной единицы измерения');
             if  (Import.ValueCount =  0 )  then  LB_LOG.Items.Add(TimeToStr(Now)+'| ОШИБКА! Не обнаружено ни одного значения');

            PrintValues(Import, ApplicationExcel);

             if  (chk_CheckValue.Checked)  then 
             begin 
              __CountRange := Import.ValueCount;
              LB_LOG.Items.Add(TimeToStr(Now)+'| Проверка значений '+IntToStr(__CountRange));
              PB_Range_MAX(__CountRange);
               while  __CountRange >  0   do 
               begin 
                __CountRange := Import.TestRange(ApplicationExcel, chk_InsertDB.Checked);
                PB_Range_INC(__CountRange);
               end ;
             end ;
            PB_Function_INC();  //  *** 

             // Не распознанные ячеки выделяем красным цветом 
             if  (chk_SetColor.Checked)  and  (Import.RangeCount> 0 )  then 
               for  i :=  0   to  Import.RangeCount- 1   do 
               begin 
                ___Range := Import.GetRange(i);
                SetPatternRange(ApplicationExcelWorkBook, ___Range.Range,  0 ,  0 ,  0 , col_Err.Color,  0 );  // Красный 
               end ;  // end 
            PB_Function_INC();  //  *** 

             if  ( chk_SaveLOG.Checked )  then  Import.LOG_SaveToFile(IMPORT_LOG_FILE);
            PB_Function_INC();  //  *** 

После освобождения заnullять переменную не нужно?
Да и зачем в цикле создавать/разрушать объект? Может внести в него функцию сброса состояния?
            Import.Free;

            PB_Sheet_INC();

 //            Application.ProcessMessages; 
           end ;  // for NSheet := 1 to CountSheets(ApplicationExcelWorkBook) do 

           if  (RB_Visible.Checked)  then  VisibleExcel(ApplicationExcel, true);

          act_EXCEL_CloseNSExecute( nil );

           // ********************************************** 
         end   else  showmessage('Книга не открыта');
       end   else  showmessage('EXCEL не создан');

   end ;  // if (L_PATH.Caption <> '') 

 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 function  CreateExcel: OleVariant;
 begin 
   // Ищем запущеный экземпляр Excel, если он не найден, вызывается исключение 
  result := null;

     try 
      result := GetActiveOleObject('Excel.Application');
     except 

       try 
        result := CreateOleObject('Excel.Application');
       except 

       end ;

     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 function  CountSheets(XlsBook: OleVariant): integer;
 begin 
  result := - 1 ;
   if   not  VarIsEmpty( XlsBook )  then 
     try 
      result := XlsBook.Sheets.Count;
     except 
       raise  Exception.Create('Ошибка доступа OLE-объекта в функции CountSheets.');
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 function  GetSheet(Excel: OleVariant; sheet_number: word): OleVariant;
 begin 
  result := Unassigned;
   if   not  VarIsEmpty( Excel )  then 
     try 
      result := Excel.Sheets.Item[ sheet_number ];
     except 
       raise  Exception.CreateFmt ('Ошибка доступа OLE-объекта в функции GetSheet (Param:%d)',[sheet_number]);
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 function  SetRange(XlsSheet: OleVariant; range: OleVariant; value_: OleVariant): boolean;
 begin 
  result := false;
   if   not  VarIsEmpty( XlsSheet )  then 
   try 
    XlsSheet.range[range, EmptyParam].Value := value_;
    result := true;
   except 
     raise  Exception.Create('Ошибка доступа OLE-объекта в функции SetRange.');
   end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 function  GetRange(XlsSheet: OleVariant; range:  string ): OleVariant;
 begin 
  result := Unassigned;
   if   not  VarIsEmpty( XlsSheet )  then 
     try 
      result := XlsSheet.range[range, EmptyParam].Value;
     except 
      result := Unassigned;
       raise  Exception.Create('Ошибка доступа OLE-объекта в функции GetRange.');
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 function  VisibleExcel(Excel: OleVariant; visible: boolean): boolean;
 begin 
  result := false;
   if   not  VarIsEmpty( Excel )  then 
     try 
      Excel.visible := visible;
      result := true;
     except 
     end ;
 end ;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 function  OpenWorkBook(Excel: OleVariant; file_:  string ): OleVariant;
 begin 
   if   not  VarIsEmpty( Excel )  then 
   begin 
    OpenedWorkBook( Excel , file_);
    result := true;
     try 
      result := Excel.Workbooks.Open(file_);
     except 
      result := null;
     end ;
   end ;
 end ;
А после вызова двух раз, что с памятью? может утечка ресурсов? И сходил-бы на форум по Делфи, все таки здесь больше делфи чем офиса :)
...
Рейтинг: 0 / 0
Excel + ProcessMessages (Delphi)
    #37199741
Missory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь Горбонос,

И на том спасибо ))
Буду дальше разбирать, возможно и правда косяк в программировании под делфи.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel + ProcessMessages (Delphi)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]