Импорт данных из Word в Delphi
От: Аноним  
Дата: 18.04.07 13:17
Оценка:
Всем привет.

Основная проблема в скорости получения данных, а именно в

for i:=0 to WordApp.selection.words.count
begin
str:=WordApp.selection.words.items(i).text;
rr:= WordApp.selection.words.items(i).range;
end;

очень долго работает. Как это все сделать быстрее?

Быстрее и проще

str:=WordApp.selection.text;

но нужен range каждого слова.

Помогите пожалуйста...
Re: Импорт данных из Word в Delphi
От: Аноним  
Дата: 18.04.07 13:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Быстрее и проще


А>str:=WordApp.selection.text;


А>но нужен range каждого слова.


А>Помогите пожалуйста...


А зечем range? если есть строка со всеми словами — не прощее е распарсить средствами Delphi?
Re[2]: Импорт данных из Word в Delphi
От: Аноним  
Дата: 18.04.07 15:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Быстрее и проще


А>>str:=WordApp.selection.text;


А>>но нужен range каждого слова.


А>>Помогите пожалуйста...


А>А зечем range? если есть строка со всеми словами — не прощее е распарсить средствами Delphi?


Мне надо после обработки выделить конкретное слово каким-нибудь цветом или "форматом"...
Re[3]: Импорт данных из Word в Delphi
От: Аноним  
Дата: 19.04.07 05:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне надо после обработки выделить конкретное слово каким-нибудь цветом или "форматом"...


На VB это может выглядить так:

    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "ля-ля-фа-фа"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    Selection.Font.Color = wdColorRed

остается только переписать, соблюдая синтаксис delphi, и вставить в цикл.
Re[4]: Импорт данных из Word в Delphi
От: Аноним  
Дата: 19.04.07 07:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Мне надо после обработки выделить конкретное слово каким-нибудь цветом или "форматом"...


А>На VB это может выглядить так:


А>
А>    Selection.Find.ClearFormatting
А>    With Selection.Find
А>        .Text = "ля-ля-фа-фа"
А>        .Replacement.Text = ""
А>        .Forward = True
А>        .Wrap = wdFindContinue
А>        .Format = False
А>        .MatchCase = False
А>        .MatchWholeWord = False
А>        .MatchWildcards = False
А>        .MatchSoundsLike = False
А>        .MatchAllWordForms = False
А>    End With
А>    Selection.Find.Execute
А>    Selection.Font.Color = wdColorRed
А>

А>остается только переписать, соблюдая синтаксис delphi, и вставить в цикл.

Спасибо за совет, я думал о таком варианте, но пока не пробовал.

Хотел сделать по проще, в том смысле что парсер делать немножко лень , а
word довольно грамотно возвращает слова (и range соответственно) даже если они через дефис и т.п.
Но медленно и быстрее никак ?!
Re[5]: Импорт данных из Word в Delphi
От: Danchik Украина  
Дата: 19.04.07 08:31
Оценка: 9 (2)
Здравствуйте, Аноним, Вы писали:

[Skip]

А>Хотел сделать по проще, в том смысле что парсер делать немножко лень , а

А>word довольно грамотно возвращает слова (и range соответственно) даже если они через дефис и т.п.
А>Но медленно и быстрее никак ?!

Так сносно?
uses
  ActiveX, WordXP;

procedure TForm1.btn1Click(Sender: TObject);
var
  aApplication : WordApplication;
  aFileName    : OleVariant;
  aSaveChanges : OleVariant;
  aDocument    : WordDocument;
  aStr         : string;
  aWords       : Words;
  aRange       : Range;
  aEnum        : IEnumVariant;
  aFetchedObj  : OleVariant;
  aFetched     : Cardinal;
  aReadOnly    : OleVariant;
begin
  aApplication := CoWordApplication.Create;
  try
    aFileName := 'D:\[The C++ Programming Language][Addison-Wesley][2].doc';
    aReadOnly := True;
    aDocument := aApplication.Documents.Open(aFileName,
      EmptyParam,
      aReadOnly,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam,
      EmptyParam
      );

//      aApplication.Visible := True;

      mmoOutput.Lines.BeginUpdate;
      try
        mmoOutput.Lines.Clear;

        aApplication.Selection.SetRange(0, 1000);
        aWords := aApplication.Selection.Words;
        if Supports(aWords._NewEnum, IEnumVariant, aEnum) then
        begin
          repeat
            aEnum.Next(1, aFetchedObj, aFetched);
            if aFetched = 0 then Break;

            if Supports(IUnknown (aFetchedObj), Range, aRange) then
            begin
              aStr := aRange.Text;
              mmoOutput.Lines.Add (aStr);
            end;
          until False;
        end;

      finally
        mmoOutput.Lines.EndUpdate;
      end;

      Application.ProcessMessages;

  finally
     aSaveChanges := False;
     aApplication.Quit(aSaveChanges, EmptyParam, EmptyParam);
  end;
end;
Re[6]: Импорт данных из Word в Delphi
От: Аноним  
Дата: 19.04.07 14:24
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


D>[Skip]


А>>Хотел сделать по проще, в том смысле что парсер делать немножко лень , а

А>>word довольно грамотно возвращает слова (и range соответственно) даже если они через дефис и т.п.
А>>Но медленно и быстрее никак ?!

D>Так сносно?

D>
D>uses
D>  ActiveX, WordXP;

D>procedure TForm1.btn1Click(Sender: TObject);
D>var
D>  aApplication : WordApplication;
D>  aFileName    : OleVariant;
D>  aSaveChanges : OleVariant;
D>  aDocument    : WordDocument;
D>  aStr         : string;
D>  aWords       : Words;
D>  aRange       : Range;
D>  aEnum        : IEnumVariant;
D>  aFetchedObj  : OleVariant;
D>  aFetched     : Cardinal;
D>  aReadOnly    : OleVariant;
D>begin
D>  aApplication := CoWordApplication.Create;
D>  try
D>    aFileName := 'D:\[The C++ Programming Language][Addison-Wesley][2].doc';
D>    aReadOnly := True;
D>    aDocument := aApplication.Documents.Open(aFileName,
D>      EmptyParam,
D>      aReadOnly,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam,
D>      EmptyParam
D>      );

D>//      aApplication.Visible := True;

D>      mmoOutput.Lines.BeginUpdate;
D>      try
D>        mmoOutput.Lines.Clear;

D>        aApplication.Selection.SetRange(0, 1000);
D>        aWords := aApplication.Selection.Words;
D>        if Supports(aWords._NewEnum, IEnumVariant, aEnum) then
D>        begin
D>          repeat
D>            aEnum.Next(1, aFetchedObj, aFetched);
D>            if aFetched = 0 then Break;

D>            if Supports(IUnknown (aFetchedObj), Range, aRange) then
D>            begin
D>              aStr := aRange.Text;
D>              mmoOutput.Lines.Add (aStr);
D>            end;
D>          until False;
D>        end;

D>      finally
D>        mmoOutput.Lines.EndUpdate;
D>      end;

D>      Application.ProcessMessages;

D>  finally
D>     aSaveChanges := False;
D>     aApplication.Quit(aSaveChanges, EmptyParam, EmptyParam);
D>  end;
D>end;
D>


Вот это да, супер !!!
Проверил: 40 страниц примерно за 2 минуты это уже супер "гуд"!!!
А тем способом: 8 ито не дождался конца...

Теперь другой вопрос, а почему ? (надеюсь не глупый )
Re[7]: Импорт данных из Word в Delphi
От: Danchik Украина  
Дата: 19.04.07 15:18
Оценка:
Здравствуйте, Аноним, Вы писали:

[Skip, пожалуйста не цитируйте все]

А>Вот это да, супер !!!


Вообще то, было бы классно, если бы вы зарегистрировались и поставили оценку
Мелочь но приятно.

А>Проверил: 40 страниц примерно за 2 минуты это уже супер "гуд"!!!

А>А тем способом: 8 ито не дождался конца...

А>Теперь другой вопрос, а почему ? (надеюсь не глупый )


Скорее всего вызов Item(i) делает то же что и Next * i раз, при чем, Words.Count это вызов Next * Count раз. Вот и посчитайте в какие тормоза мы падаем.
А в предложеном мною решении все делается за один проход.
Re[8]: Импорт данных из Word в Delphi
От: transcoder  
Дата: 20.04.07 10:18
Оценка:
Здравствуйте, Danchik,

Это похоже на правду.
Тогда становится понятным снижение скорости загруски данных к концу текста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.