Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2016, 15:58   #21
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
и в этот момент программа как бы зависает и не каждый пользователь догадается, что нужно ждать некое кол-во времени, я и раньше не работал с ProgressBar'ом
Это несложно.

1) бросьте на форму в нужное место ProgressBar (пусть он имеет имя ProgressBar1 (такое по умолчанию))
разместите его где нужно, растяните на нужную длину.

2) в коде сделайте такие изменения:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
//  aSg : TStringGrid;
  MSWord,Table: OLEVariant;
  iRows,iCols,iGridRows,jGridCols,iNumTables,iTableChosen: integer;
  CellText:string;
  InputString:string;
  i,a,b,j,k, tt,rr : Integer;
  Save_Cursor:TCursor;
begin
//asg:=StringGrid1;
  try
    MSWord:=CreateOleObject('Word.Application');
  except
    ShowMessage('Ошибка открытия файла .docx!');
    Exit;
  end;
  try
    MSWord.Visible:=false;
    OpenDialog1.Filter := 'Документы MS Word|*.doc;*.docx';
    if not OpenDialog1.Execute then Exit;
    MSWord.Documents.Open(OpenDialog1.FileName);
    // Узнаём количество таблиц в документе
    iNumTables:=MSWord.ActiveDocument.Tables.Count;
    InputString:=InputBox('Таблиц в документе: '+IntToStr(iNumTables),'Пожалуйста введите номер таблицы','1');
    // Проверка строки на число, диапазон...
    iTableChosen:= StrToInt(InputString);
    Table:=MSWord.ActiveDocument.Tables.Item(iTableChosen);
    // размер таблицы
    iCols:=Table.Columns.Count;
    iRows:=Table.Rows.Count;

    // иницилизация прогресс бара
    ProgressBar1.Visible := true; // сделаем прогресс бар видимым
    ProgressBar1.Max := iRows;
    ProgressBar1.Step := 1;

    Save_Cursor := Screen.Cursor; // запоминаем, какой курсор был
    Screen.Cursor := crHourGlass;  // курсор мышки превращаем в песочные часики

    // настройка столбцов StringGrid
    StringGrid1.RowCount:=iRows + 1;
    StringGrid1.ColCount:=iCols + 1;

    // поставим нумерацию столбцов
     for jGridCols:=1 to iCols
         do Stringgrid1.Cells[jGridCols, 0] := IntToStr(jGridCols);


    // цикл по ячейкам
    for iGridRows:=1 to iRows do begin
      Stringgrid1.Cells[0, iGridRows] := IntToStr(iGridRows); // нумерация строк

      for jGridCols:=1 to iCols do
      Begin
        CellText:=Table.Cell(iGridRows, jGridCols).Range.FormattedText;
        if not VarisEmpty(CellText) then
        Begin
          // Удаляем из строки все символы переноса
          CellText:=StringReplace(CellText,#$D,'', [rfReplaceAll]);
          CellText := StringReplace(CellText,#$7,'', [rfReplaceAll]);
          // Заполняем Stringgrid
            Stringgrid1.Cells[jGridCols, iGridRows] := CellText;
        End;
      End;
      ProgressBar1.StepIt;
      Application.ProcessMessages;
    end;
    finally
      Screen.Cursor := Save_Cursor;  { Always restore to normal }
      MSWord.Quit;
      ShowMessage('Таблица №1 успешно загружена!');
      ProgressBar1.Visible := false; // сделаем прогресс бар невидимым
  end;
end;

p.s. не могу понять, а зачем Вам ДВЕ процедуры чтения?
на кнопке "Таблица 1" и "Таблица 2"
Они чем отличаются? Только тем, куда пишут?
Так это нужно делать одной процедурой, в которую передавать StringGrid
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2016, 16:19   #22
San22Rus
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 20
По умолчанию

Цитата:
p.s. не могу понять, а зачем Вам ДВЕ процедуры чтения?
на кнопке "Таблица 1" и "Таблица 2"
Они чем отличаются? Только тем, куда пишут?
Так это нужно делать одной процедурой, в которую передавать StringGrid
Да Вы правильно всё поняли, 2 StringGrid'a и 2 кнопки загрузки таблиц, и естественно у меня 2 процедуры чтения.
Можно как то сделать лучше? Буду благодарен, если подскажите
San22Rus вне форума Ответить с цитированием
Старый 06.09.2016, 16:25   #23
San22Rus
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 20
Хорошо

А ProgressBar работает отлично, спасибо огромное!)
San22Rus вне форума Ответить с цитированием
Старый 06.09.2016, 16:34   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всё проще, чем Вы думаете.
нужно вытащить обработку в отдельный метод (процедуру)

Код:
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Panel1: TPanel;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    OpenDialog1: TOpenDialog;
    ProgressBar1: TProgressBar;
    procedure ReadWordTableToStringGrid(SG : TStringGrid);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
.....

потом выносим код в отдельную процедуру:

Код:
procedure TForm1.ReadWordTableToStringGrid(SG : TStringGrid);
var
  MSWord,Table: OLEVariant;
  iRows,iCols,iGridRows,jGridCols,iNumTables,iTableChosen: integer;
  CellText:string;
  InputString:string;
  i,j : Integer;
  Save_Cursor:TCursor;
begin
  try
    MSWord:=CreateOleObject('Word.Application');
  except
    ShowMessage('Ошибка открытия файла .docx!');
    Exit;
  end;
  try
    MSWord.Visible:=false;
    OpenDialog1.Filter := 'Документы MS Word|*.doc;*.docx';
    if not OpenDialog1.Execute then Exit;
    MSWord.Documents.Open(OpenDialog1.FileName);
    // Узнаём количество таблиц в документе
    iNumTables:=MSWord.ActiveDocument.Tables.Count;
    InputString:=InputBox('Таблиц в документе: '+IntToStr(iNumTables),'Пожалуйста введите номер таблицы','1');
    // Проверка строки на число, диапазон...
    iTableChosen:= StrToInt(InputString);
    Table:=MSWord.ActiveDocument.Tables.Item(iTableChosen);
    // размер таблицы
    iCols:=Table.Columns.Count;
    iRows:=Table.Rows.Count;

    // иницилизация прогресс бара
    ProgressBar1.Position:=0;
    ProgressBar1.Max := iRows;
    ProgressBar1.Step := 1;
    ProgressBar1.Visible := true; // сделаем прогресс бар видимым

    Save_Cursor := Screen.Cursor; // запоминаем, какой курсор был
    Screen.Cursor := crHourGlass;  // курсор мышки превращаем в песочные часики

    // настройка столбцов StringGrid
    SG.RowCount:=iRows + 1;
    SG.ColCount:=iCols + 1;

    // поставим нумерацию столбцов
     for jGridCols:=1 to iCols
         do SG.Cells[jGridCols, 0] := IntToStr(jGridCols);


    // цикл по ячейкам
    for iGridRows:=1 to iRows do begin
      SG.Cells[0, iGridRows] := IntToStr(iGridRows); // нумерация строк

      for jGridCols:=1 to iCols do
      Begin
        CellText:=Table.Cell(iGridRows, jGridCols).Range.FormattedText;
        if not VarisEmpty(CellText) then
        Begin
          // Удаляем из строки все символы переноса
          CellText:=StringReplace(CellText,#$D,'', [rfReplaceAll]);
          CellText := StringReplace(CellText,#$7,'', [rfReplaceAll]);
          // Заполняем Stringgrid
            SG.Cells[jGridCols, iGridRows] := CellText;
        End;
      End;
      ProgressBar1.StepIt;
      Application.ProcessMessages;
    end;
    finally
      Screen.Cursor := Save_Cursor;  { Always restore to normal }
      MSWord.Quit;
      ShowMessage('Таблица '+SG.Name+' успешно загружена!');
      ProgressBar1.Visible := false; // сделаем прогресс бар невидимым
  end;
end;
ну и дальше всё совсем просто.
на кнопках пишем код вызова метода с нужным гридом:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ReadWordTableToStringGrid(StringGrid1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ReadWordTableToStringGrid(StringGrid2);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2016, 16:52   #25
San22Rus
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 20
По умолчанию

Да, согласен, так намного меньше времени ушло бы, и размер уменьшится, сделал так, как показали, только у меня процедура настройки ширины столбцов перестала работать, и не знаю куда её воткнуть чтобы заработала. Всё равно спасибо, вот процедура:
Код:
procedure ColumnWidthAlign(aSg: TStringGrid; aColNum : Longword; aDefaultColWidth : Integer = -1);
var
  RowNum       : Integer;
  ColWidth     : Integer;
  MaxColWidth  : Integer;
begin
  if (aColNum < 0) or (aColNum > Pred(aSg.ColCount)) then Exit;

  if aDefaultColWidth < 0 then
    MaxColWidth := aSg.DefaultColWidth
  else
    MaxColWidth := aDefaultColWidth;
  for RowNum := 0 to Pred(aSg.RowCount) do begin
    ColWidth := aSg.Canvas.TextWidth(aSg.Cells[aColNum, RowNum]);
    if MaxColWidth < ColWidth then MaxColWidth := ColWidth;
  end;
  //+5 - потому что иногда текст всё же немного не умещается по ширине. :-)
  aSg.ColWidths[aColNum] := MaxColWidth + 5;
end;
и в обработчике события OnClick прописывал для неё:
Код:
var
asg:TStringGrid;
begin
asg:=StringGrid1;
for i := 0 to asg.ColCount - 1 do ColumnWidthAlign(asg, i);
Может я её не туда просто и пытаюсь вставить
San22Rus вне форума Ответить с цитированием
Старый 06.09.2016, 17:09   #26
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а так (в конце процедуры чтения из файла)?

Код:
..............
      ProgressBar1.StepIt;
      Application.ProcessMessages;
    end;
    finally
      Screen.Cursor := Save_Cursor;  { Always restore to normal }
      MSWord.Quit;
      ShowMessage('Таблица '+SG.Name+' успешно загружена!');
      ProgressBar1.Visible := false; // сделаем прогресс бар невидимым
    end;
    for i := 0 to SG.ColCount - 1 do ColumnWidthAlign(SG, i);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.09.2016, 17:42   #27
San22Rus
Пользователь
 
Регистрация: 07.03.2016
Сообщений: 20
По умолчанию

Всё разобрался, спасибо вам ещё раз, сегодня вы очень много помогли новичку!
San22Rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перетаскивание информации из StringGrid1 в StringGrid2 Delphi 7 carrie bradshaw Помощь студентам 2 24.03.2014 14:56
Скопировать данные с одного StringGrid1 в другой StringGrid2 Екатерина_21 C++ Builder 2 09.10.2011 17:06
Как экспортировать StringGrid1 и StringGrid2 в Word koysara Общие вопросы Delphi 1 05.10.2010 12:18
из StringGrid1 в StringGrid2 robin39 Помощь студентам 1 27.05.2010 19:33
StringGrid1 и StringGrid2. Их связь 2Live Общие вопросы C/C++ 4 03.09.2009 20:10