Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с FormStyle=fsStayOnTo, форма пропадает 
:(
    Опции темы
Matematik
Дата 11.9.2006, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Работаю с WordApplication и WordDocument, форма находится поверх ворда, нажымаю на кнопочки, происходят разные крязозябры с документом. И в какой-то момент форма становится не поверх всех, без какой-либо закономености.
Вот в этих проц и происходят непонятки
Button9Click
Button3Click
Button4Click
Button5Click
Button6Click


вот код
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Word2000, OleServer, Activex, ExtCtrls, ComCtrls, Buttons,
  SHEllapi;

type
  TMainFormWordMM_ = class(TForm)
    App: TWordApplication;
    Doc1: TWordDocument;
    OpenDialog1: TOpenDialog;
    Doc2: TWordDocument;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    Timer1: TTimer;
    StaticText1: TStaticText;
    StaticText3: TStaticText;
    StaticText2: TStaticText;
    TabSheet4: TTabSheet;
    Button7: TButton;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    procedure Button_Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
    Sel3_bol2 : Byte;
    procedure ShowStep(k:Integer);
    function set_aaa:Integer;
    function sel3:Boolean;
  public
    { Public declarations }
  end;

var
  MainFormWordMM_: TMainFormWordMM_;
  gDirApp        : AnsiString;
  gCloseBol      : Boolean;
  WordList       : TStringList;

implementation

{$R *.dfm}

const
  gCapt = 'Этап ';

procedure CloseMes;
begin
  SendMessage(FindWindow('TMesFormMM_', nil), WM_CLOSE, 0, 0);
end;


procedure StartMes(const aText:AnsiString);
begin
  ShellExecute(0, 'open', PChar(gDirApp+'textwindows.exe'), PChar('"'+aText+'"'), PChar(gDirApp), SW_SHOWNORMAL);
end;


procedure WordReplace2(WordApp:TWordApplication;FindText,ReplaceText:WideString);
var p1,p2 : OleVariant;
begin
  p1 := wdStory;
  WordApp.Selection.HomeKey(p1,EmptyParam);
  WordApp.Selection.Find.ClearFormatting;
  WordApp.Selection.Find.Replacement.ClearFormatting;
  With WordApp.Selection.Find do
  begin
    Text              := FindText;
    Replacement.Text  := '';
    Forward           := True;
    Wrap              := wdFindContinue;
    Format            := False;
    MatchCase         := False;
    MatchWholeWord    := False;
    MatchWildcards    := False;
    MatchSoundsLike   := False;
    MatchAllWordForms := False;
  End;
  while WordApp.Selection.Find.Execute(EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                       EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                       EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                       EmptyParam,EmptyParam,EmptyParam) do
  begin
    p1 := wdCharacter;
    p2 := 1;
    WordApp.Selection.MoveRight(p1,p2,EmptyParam);
    WordApp.Selection.TypeText(ReplaceText);
    WordApp.Selection.MoveLeft(p1,p2,EmptyParam);
  end;
end;


procedure WordReplace(WordApp:TWordApplication;FindText,ReplaceText:WideString);
var p1 : OleVariant;
begin
  p1 := wdStory;
  WordApp.Selection.HomeKey(p1,EmptyParam);
  WordApp.Selection.Find.ClearFormatting;
  WordApp.Selection.Find.Replacement.ClearFormatting;
  With WordApp.Selection.Find do
  begin
    Text              := FindText;
    Replacement.Text  := ReplaceText;
    Forward           := True;
    Wrap              := wdFindContinue;
    Format            := False;
    MatchCase         := False;
    MatchWholeWord    := False;
    MatchWildcards    := False;
    MatchSoundsLike   := False;
    MatchAllWordForms := False;
  End;
  p1 := wdReplaceAll;
  WordApp.Selection.Find.Execute(EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                 EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                 EmptyParam,EmptyParam,p1,EmptyParam,
                                 EmptyParam,EmptyParam,EmptyParam);
end;

procedure FindAndKras(WordApp:TWordApplication;FindText:WideString;Color:TOleEnum;Bold:Integer);
var p1 : OleVariant;
begin
  p1 := wdStory;
  WordApp.Selection.HomeKey(p1,EmptyParam);
  WordApp.Selection.Find.ClearFormatting;
  With WordApp.Selection.Find do
  begin
    Text              := FindText;
    Replacement.Text  := '';
    Forward           := True;
    Wrap              := wdFindContinue;
    Format            := False;
    MatchCase         := False;
    MatchWholeWord    := False;
    MatchWildcards    := False;
    MatchSoundsLike   := False;
    MatchAllWordForms := False;
  End;
  while WordApp.Selection.Find.Execute(EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                       EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                       EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                       EmptyParam,EmptyParam,EmptyParam) do
  begin
    WordApp.Selection.Font.Color := Color;
    WordApp.Selection.Font.Bold  := Bold;
  end;
end;

procedure TMainFormWordMM_.Button_Click(Sender: TObject);
var p1,p2,p3 : OleVariant;
    j,k   : Integer;
    h,w   : Integer;
    zz    : AnsiString;
begin
  if not OpenDialog1.Execute then
  begin
    Close;
    exit;
  end;
  StartMes('Идет начальная обработка документа.'#13#10'Ждите...');
  p1 := OpenDialog1.FileName;
  try
    app.Connect;
    app.Visible := True;
    app.ShowMe;
    app.ChangeFileOpenDirectory(gDirApp);
    doc1.ConnectTo(app.Documents.Open(p1,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam));

    doc1.Activate;
    Application.ProcessMessages;
    //----------------------------------
    // разрыв колонки
    WordReplace(app, '^n', '#@#^n');  // Разрыв колонки
    // разрыв страницы
    WordReplace2(app, '^b', '@#@');  // Разрыв колонки
    // покрас
    FindAndKras(app, '#@#', wdColorBlue, wdToggle);
    FindAndKras(app, '@#@', wdColorRed, wdToggle);
    //----------------------------------
    // удаление колонок
    k := doc1.Paragraphs.Count;
    for j:=1 to k do
    begin
      doc1.Paragraphs.Item(j).Range.Select;
      try
        if app.Selection.PageSetup.TextColumns.Count>1 then
          app.Selection.PageSetup.TextColumns.SetCount(1);
      except
      end;
      // размер фрифта
      doc1.Paragraphs.Item(j).Range.Select;
      try
        if app.Selection.Font.Size<10 then
          app.Selection.Font.Size := 10
      except
      end;
      // междустрочный интервал
      try
        doc1.Paragraphs.Item(j).Range.Select;
        App.Selection.ParagraphFormat.LineSpacingRule := wdLineSpaceSingle;
      except
      end;
      doc1.Paragraphs.Item(j).Range.Select;
      Application.ProcessMessages;
    end;
    //----------------------------------
    // удаление рамок
    k := doc1.Frames.Count;
    for j:=k downto 1 do
      doc1.Frames.Item(j).Delete;
    //----------------------------------
    // замена
    WordReplace(app, '^-^l', '');  // мягкий перенос + Принудительный разрыв строки
    Application.ProcessMessages;
    WordReplace(app, '^-', '');  // мягкий перенос
    Application.ProcessMessages;
    WordReplace(app, '^b', '');  // Разрыв раздела
    Application.ProcessMessages;
    WordReplace(app, '^l', ' '); // Принудительный разрыв строки
    Application.ProcessMessages;
    WordReplace(app, '^m', '');  // Принудительный разрыв страницы
    Application.ProcessMessages;
    WordReplace(app, '^n', '');  // Разрыв колонки
    Application.ProcessMessages;
    //----------------------------------
    set_aaa;
    //----------------------------------
    // удаление картинок
    k := doc1.Shapes.Count;
    for j:=k downto 1 do
    begin
      p1 := j;
      try
        doc1.Shapes.Item(p1).Select(EmptyParam);
        h := round(doc1.Shapes.Item(p1).Height);
        w := round(doc1.Shapes.Item(p1).Width);
        if (h<3) or (w<3) then
          doc1.Shapes.Item(p1).Delete;
      except
      end;
      Application.ProcessMessages;
    end;
    k := doc1.InlineShapes.Count;
    for j:=k downto 1 do
    begin
      p1 := j;
      try
        doc1.InlineShapes.Item(p1).Select;
        h := round(doc1.InlineShapes.Item(p1).Height);
        w := round(doc1.InlineShapes.Item(p1).Width);
        if (h<3) or (w<3) then
          doc1.InlineShapes.Item(p1).Delete;
      except
      end;
      Application.ProcessMessages;
    end;
    //----------------------------------
    // в начало документа
    p1 := wdStory;
    App.Selection.HomeKey(p1,EmptyParam);
  finally
    Application.ProcessMessages;
  end;
  Caption := gCapt+'Обработки абзацев';
  CloseMes;
  ShowStep(3);
  Show;
  sel3;
end;

procedure TMainFormWordMM_.FormCreate(Sender: TObject);
begin
  gCloseBol := False;
  gDirApp   := ExtractFilePath(ParamStr(0));
  WordList  := TStringList.Create;
  Application.ShowMainForm := False;
  OpenDialog1.InitialDir   := gDirApp;
  Left := Screen.WorkAreaRect.Right - Width - 20;
  Top  := Screen.WorkAreaRect.Top + 20;
  app.Connect;
  if app.Documents.Count>0 then
  begin
    ShowMessage('Работает MS Word'#13#10'Программа быдет закрыта');
    FormStyle := fsStayOnTop;
    gCloseBol:=True;
  end;
  app.Disconnect;
  ShowStep(1);
  Sel3_bol2      := 1;
  Timer1.Enabled := True;
end;

procedure TMainFormWordMM_.Timer1Timer(Sender: TObject);
begin
  timer1.Enabled := False;
  if gCloseBol then
  begin
    close
  end
               else
  begin
    Button_Click(nil);
  end
end;

procedure TMainFormWordMM_.Button3Click(Sender: TObject);
var p1,p2,p3:OleVariant;
ch:Char;
ss:string;
s,e:Integer;
begin
  if sel3 then
  begin
    s := app.Selection.Range.Start;
    e := app.Selection.Range.End_;
    p1 := wdCharacter;
    p2 := 1;
    p3 := wdExtend;
    app.Selection.MoveLeft(p1,p2,EmptyParam);
    p2 := 2;
    app.Selection.MoveLeft(p1,p2,p3);
    ss := app.Selection.Text;
    ch := ss[1];
    if IsCharAlpha(ch) then
    begin
      app.Selection.SetRange(s,e);
      app.Selection.TypeBackspace;
      app.Selection.TypeBackspace;
//      app.Selection.MoveRight(p1,p2,EmptyParam);
      app.Selection.TypeText(#32);
      sel3
    end
      else
    begin
      ShowMessage('Автоматическое соединение невозможно');
    end;
  end;
  FormStyle := fsStayOnTop;
end;

procedure TMainFormWordMM_.Button4Click(Sender: TObject);
begin
  if sel3 then
  begin
    app.Selection.TypeBackspace;
    app.Selection.TypeBackspace;
    app.Selection.TypeBackspace;
    sel3
  end;
  FormStyle := fsStayOnTop;
end;

procedure TMainFormWordMM_.ShowStep(k: Integer);
begin
  if k>0 then
    if k<=PageControl1.PageCount then
      PageControl1.ActivePageIndex := k-1;
end;

procedure TMainFormWordMM_.Button5Click(Sender: TObject);
var p1,p2,p3:OleVariant;
begin
  if sel3 then
  begin
    p1 := wdWord;
    p2 := 1;
    app.Selection.MoveLeft(p1,p2,EmptyParam);
    p1 := wdParagraph;
    p2 := 1;
    p3 := wdExtend;
    app.Selection.MoveDown(p1,p2,p3);
    if (app.Selection.Range.ComputeStatistics(wdStatisticLines)>1) or
       (app.Selection.Range.ComputeStatistics(wdStatisticCharacters)>20)
       then
    begin
      showmessage('Абзац удалению не подлежит');
      FormStyle := fsStayOnTop;
    end
      else
    begin
      p1 := wdCharacter;
      p2 := 1;
      app.Selection.Delete(p1,p2);
      sel3
    end
  end;
  FormStyle := fsStayOnTop;
end;

function TMainFormWordMM_.sel3: Boolean;
const t1 : WideString = '#@#';
      t2 : WideString = '@#@';
      t3 : WideString = '@@@';
var p1 : OleVariant;
    zz : WideString;
begin
try
  case Sel3_bol2 of
    1 : zz := t1;
    2 : zz := t2;
    3 : zz := t3;
  end;
//-----------------------------------
  if app.Selection.Text<>zz then
  begin
    App.Selection.Find.ClearFormatting;
    With App.Selection.Find do
    begin
      Text              := zz;
      Replacement.Text  := '';
      Forward           := True;
      Wrap              := wdFindContinue;
      Format            := False;
      MatchCase         := False;
      MatchWholeWord    := False;
      MatchWildcards    := False;
      MatchSoundsLike   := False;
      MatchAllWordForms := False;
    End;
    if App.Selection.Find.Execute(EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                      EmptyParam,EmptyParam,EmptyParam) then
    begin
      result          := False
    end
      else
    begin
      case Sel3_bol2 of
        1 : begin
              Sel3_bol2 := 2;
              result    := sel3;
            end;
        2 : begin
              SpeedButton2.Enabled := False;
              Sel3_bol2 := 3;
              result    := sel3;
            end;
        3 : begin
              p1 := wdStory;
              App.Selection.HomeKey(p1,EmptyParam);
              if set_aaa=0 then
              begin
                result  := False;
                Caption := gCapt + 'Маркировки статей';
                ShowStep(4);
                ShowMessage('Проверте внимательно начало '#13#10'каждой статьи (ВЕРХНИЙ РЕГИСТР, Полужирный)');
                FormStyle := fsStayOnTop;
              end
                           else
              begin
                Sel3_bol2 := 1;
                result := sel3;
                ShowMessage('Вы НЕВЕРНО обработали разрывы текста'#13#10'(Зеленая метка "@@@")'#13#10#13#10'Этап не завершен.');
                FormStyle := fsStayOnTop;
              end
            end;
      end;
    end;
  end
    else
  begin
    result := True
  end;
except
    result := False
end;
  FormStyle := fsStayOnTop;
end;

procedure TMainFormWordMM_.Button6Click(Sender: TObject);
begin
  if sel3 then
  begin
    app.Selection.TypeBackspace;
    sel3
  end;
  FormStyle := fsStayOnTop;
end;

procedure TMainFormWordMM_.Button7Click(Sender: TObject);
var j,k      : Integer;
    p1,p2,p3 : OleVariant;
    sss      : AnsiString;
begin
WordList.Clear;
    k := doc1.Paragraphs.Count;
    for j:=1 to k do
    begin
      doc1.Paragraphs.Item(j).Range.Select;
      p1 := wdCharacter;
      p2 := 1;
      p3 := wdExtend;
      app.Selection.MoveLeft(p1,p2,EmptyParam);
      if app.Selection.Font.Bold<>0 then
      begin
        p1  := wdWord;
        sss := '';
        while (app.Selection.Font.Bold<>0) and (pos(#13,sss)=0) do
        begin
          app.Selection.MoveRight(p1,p2,p3);
          sss := app.Selection.Text;
          p1  := wdCharacter;
          app.Selection.MoveRight(p1,p2,EmptyParam);
        end;
        if pos(#13,sss)=0 then p2 := 3
                          else p2 := 1;
        app.Selection.MoveLeft(p1,p2,EmptyParam);
        p1 := wdLine;
        app.Selection.HomeKey(p1,p3);
        sss := app.Selection.Text;
        if pos(#13,sss)=0 then
        begin
          WordList.Add(sss);
          p1 := wdLine;
          app.Selection.HomeKey(p1,EmptyParam);
          app.Selection.TypeText('@#@#@ ');
        end
      end;
      Application.ProcessMessages;
    end;
  ShowMessage('Найдено всего статей'#13#10+WordList.Text);
  FormStyle := fsStayOnTop;
end;

procedure TMainFormWordMM_.Button9Click(Sender: TObject);
begin
  sel3
end;

function TMainFormWordMM_.set_aaa:Integer;
var k,j      : Integer;
    p1,p2,p3 : OleVariant;
    zz       : AnsiString;
    bol      : Boolean;
begin
  bol := FindWindow('TMesFormMM_', nil)=0;
  if bol then
  begin
    Hide;
    StartMes('Идет обработка документа.'#13#10'Ждите...');
  end;
  result := 0;
    //----------------------------------
    k := doc1.Paragraphs.Count;
    for j:=1 to k do
    begin
      doc1.Paragraphs.Item(j).Range.Select;
      if not app.Selection.Information[wdWithInTable] then
      begin
        p1 := wdCharacter;
        p2 := 1;
        app.Selection.MoveLeft(p1,p2,EmptyParam);
        p2 := 3;
        p3 := wdExtend;
        app.Selection.MoveRight(p1,p2,p3);
        zz := app.Selection.Text;
        if (zz<>'#@#') and (zz<>'@#@') and (pos(#13,zz)=0) and (not IsCharUpper(zz[1])) then
        begin
          p2 := 1;
          app.Selection.MoveLeft(p1,p2,EmptyParam);
          app.Selection.Font.Color := wdColorGreen;
          app.Selection.TypeText('@@@');
          Inc(result)
        end
      end;
      Application.ProcessMessages;
    end;
  if bol then
  begin
    CloseMes;
    Show;
  end
end;

procedure TMainFormWordMM_.FormActivate(Sender: TObject);
begin
  FormStyle := fsStayOnTop
end;

end.

PM MAIL WWW ICQ   Вверх
Matematik
Дата 11.9.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



FormStyle := fsStayOnTop; добавил во все возможные места уже потом, до этого форма пропадала чаще, теперь реже
PM MAIL WWW ICQ   Вверх
gonzales
Дата 11.9.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 13.3.2006

Репутация: 1
Всего: 2



а если так попробывать
Код

SetWindowPos(Mainform.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or
  SWP_NOSIZE or SWP_NOACTIVATE);

--------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!!
PM MAIL   Вверх
drkot
Дата 11.9.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(Matematik @  11.9.2006,  10:04 Найти цитируемый пост)
FormStyle := fsStayOnTop;

если присваивается такоеже значение которое и было то не вызывается обновление формы (за ненадобностью)
можно сначала присвоить fsNormal а затен только свержу.

Еще способ: запускать форму в модальном рещиме (гарантировано будет сверху + блокировка форуса ввода для метеринского приложения)

Глук скорее свего связан с тем, что твое приложение теряет фокус ввода (возможно неправильно выразился),  такое случается в подобных задачах.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.