Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.10.2013, 15:03
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание При обработке информации окно приложения мигает

Ребята всем привет..
- помогите разобраться с такой вот проблемой..
написал программу по обработки гору документов EXCEL
но появилась проблема которая раздражает ...дело в том что как только выбираю папку с документами EXCEL и жму на кнопку Начать обработку работаем вот такой код

Код берет по очереди файлы excel из FileListBox1 загружает его StringGrid1 потом ищет в нем нужные нам строку и берет его значение сохраняет в памяти если мы дошли до конца документа то эти значения добавляется в StringGrid2 - и так до конца FileListBox1 (пока не обработаем последний документ excel)
Код:
var
 lst, i2, i4 :integer;
 number, rs :string;
begin
 files:=0;
for lst := 0 to FileListBox1.Items.Count-1 do
  begin
    //Загружаем документ EXCEL в StringGrid1 начинаем обработку
    if Xls_To_StringGrid(StringGrid1, DirectoryListBox1.Directory+'\'+FileListBox1.Items[lst]) then
     begin
      s1:=DirectoryListBox1.Directory+'\'+FileListBox1.Items[lst];
      len:=length(s1);
      Application.ProcessMessages();
      MyThread:=TMyThread.Create(False);
      MyThread.Priority:=tpNormal;
     end;
        x_cab:=0;
        x_rez:=0;
        x_nar:=0;
        x_other:=0;
        x_grs:=0;
        x_roa:=0;
        number:='';

for i:=1 to StringGrid1.RowCount-1 do
 begin
  if (StringGrid1.Cells[4,i]='NarDATA-Off') or
   (StringGrid1.Cells[4,i]='NarDATA-Pk') then
    begin
     x_nar:=x_nar+strtofloat(StringGrid1.Cells[9,i]);
    end;

  if (StringGrid1.Cells[4,i]='CabDATA-Pk') or
   (StringGrid1.Cells[4,i]='CabDATA-Off') then
    begin
     x_cab:=x_cab+strtofloat(StringGrid1.Cells[9,i]);
    end;

  if (StringGrid1.Cells[4,i]='RezDATA-Pk') or
   (StringGrid1.Cells[4,i]='RezDATA-Off') then
    begin
     x_rez:=x_rez+strtofloat(StringGrid1.Cells[9,i]);
    end;

  rs:=copy(StringGrid1.Cells[4,i], 1, 4);
  
  if rs='RSteel' then //rsteel
   begin
    x_grs:=x_grs+strtofloat(StringGrid1.Cells[9,i]);
   end;
  if rs='Roa' then //roa
   begin
    x_roa:=x_roa+strtofloat(StringGrid1.Cells[9,i]);
   end 
    else 
     begin
      if trim(StringGrid1.Cells[9,i])='' then
     begin
    
     end 
      else
       x_other:=x_other+strtofloat(StringGrid1.Cells[9,i]); //other
      end;

  for i4 := 1 to StringGrid3.RowCount-1 do
   begin
    if trim(StringGrid3.Cells[0,i])=trim(label3.Caption) then
     number:=StringGrid3.Cells[1,i];
   end;
    StringGrid2.Cells[0,files]:=label3.Caption;
    StringGrid2.Cells[1,files]:=number;//NAME
    StringGrid2.Cells[2,files]:=FloatToStrF(x_cab, ffFixed, 15, 3); //Cab DATA
    StringGrid2.Cells[3,files]:=FloatToStrF(x_nar, ffFixed, 15, 3); //Nar DATA
    StringGrid2.Cells[4,files]:=FloatToStrF(x_rez, ffFixed, 15, 3); //Rez DATA
    StringGrid2.Cells[5,files]:=FloatToStrF(x_grs, ffFixed, 15, 3);//RSteel DATA
    StringGrid2.Cells[6,files]:=FloatToStrF(x_roa, ffFixed, 15, 3);//Roa DATA
    StringGrid2.Cells[7,files]:=FloatToStrF(x_other-x_nar-x_cab-x_rez-x_grs, ffFixed, 15, 3);//Other DATA
    StringGrid2.Cells[8,files]:=FloatToStrF(x_other+x_roa, ffFixed, 15, 3);;//TOTAL
    stringGrid2.RowCount:=StringGrid2.RowCount+1;
    progressbar2.Position:=progressbar2.Position+1;
   end;
  end;

for i2 := StringGrid2.RowCount-1 downto 1 do
 begin
  if trim(StringGrid2.Cells[2,i2])='' then // delete EMPTY rows
   TDeleteGrid(StringGrid2).DeleteRow(i2);
  end;
end;
После обработки полученные данные по одиночке добавляем в StringGrid2...

StringGrid1 не виден в окне приложения - пользователю показывается только результат который попадает вовремя обработки в StringGrid2

но окно приложения мигает из за того что StringGrid1 не видел и его ВЫСОТА и ШИРИНА ровна 0 и оно находится в самом верхнем углу формы (LEFT - TOP = 0)

При каждом обращении к след. документу excel - StringGrid1 меняет свои параметры ширины и высоты и это приводит к тому что окно приложения мигает

- помогите разобраться как можно решить эту проблему...и можно ли как то по другому решить данную задачу без загрузки документа excel в StringGrid1??
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #2  
Старый 27.10.2013, 18:27
nano_bot nano_bot вне форума
Новичок
 
Регистрация: 05.05.2013
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

попробуй stringgrid1.visible:=false
Либо повтыкай в коде stringgrid1.height:=0; stringgrid1.width:=0;
Ответить с цитированием
  #3  
Старый 27.10.2013, 18:40
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
По умолчанию

Цитата:
Сообщение от nano_bot
попробуй stringgrid1.visible:=false
Либо повтыкай в коде stringgrid1.height:=0; stringgrid1.width:=0;

Это не решения.
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #4  
Старый 27.10.2013, 18:53
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

LockWindowUpdate? не?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 27.10.2013, 21:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,093
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
LockWindowUpdate? не?

Не, рельс. Руки выпрямлять.
Чем обычный двумерный массив не подходит для промежуточного хранения данных?
Ответить с цитированием
  #6  
Старый 28.10.2013, 23:56
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 562
Версия Delphi: Delphi 11
Репутация: 18
Восклицание

Цитата:
Сообщение от lmikle
Не, рельс. Руки выпрямлять.
Чем обычный двумерный массив не подходит для промежуточного хранения данных?

Спасибо за совет - но не могу кое чем разобраться
как определить количество строк в динамическом массиве
что бы настроить обработку поиска где

Код:
for i:=1 to ??? do
 begin
  if (a[i,4]='NarDATA-Off') or
   (a[i,4]='NarDATA-Pk') then
    begin
     x_nar:=x_nar+strtofloat(a[i,9]);
    end;

что должно быть вместо "???" High(a) выдает ошибку Range Check Error
помоги разобраться а то массивами у меня всегда проблемы

Разобрался - спасибо спасибо спасибо всем
масссссссссивыыыы класная штука программа сейчас даже шустро работает)))

проблема была
Код:
if rs='Roa' then //roa
begin
x_roa:=x_roa+strtofloat(a[i,9]);
end
else
begin
if trim(a[9,i])='' then // ТУТ ЗАБЫЛ ИСПРАВИТЬ a[9,i] на a[i,9]     
begin
...
...
__________________
Нет ничего не возможного. Вопрос только во времени...

Последний раз редактировалось M.A.D.M.A.N., 29.10.2013 в 08:35.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025