Delphi word на передний план

 
И. Павел ©
 
(2011-12-29 13:03)
[0]

Здравствуйте.

Я создаю документ Word на основе dot файла, используя ole (Word — 2007 но работать должно и в других версиях; версия Delphi — XE). Потом пытаюсь вывести приложение Word на передний план (app.Activate). При запуске в Delphi (т.е. вместе с отладчиком) работает, а при простом запуске exe — нет.
Вот код (кончено, между ActiveDocument и Visible := true есть код, но даже если его удалить, созданный пустой документ Word все равно не хочет выводиться на передний план)
 app := CreateOleObject("Word.Application");
 app.Documents.Add(ProgrDir+"doc.dot").Activate;
 doc := app.ActiveDocument;
 app.Visible := True;
 app.Activate;

Подскажите, пожалуйста, как вывести сгенерированный документ Word на передний план?
PS: конечно, можно попытаться найти Handle окна Word и вывести его на передний план средствами WIN API. Но называет Word окно как вздумается и, вероятно, это может меняться от версии к версии Word.

Заранее спасибо.


 
Kilowatt ©
 
(2011-12-29 13:08)
[1]

BringToFront?


 
И. Павел ©
 
(2011-12-29 13:16)
[2]

> [1] Kilowatt ©   (29.12.11 13:08)
> BringToFront?

Уточните, пожалуйста, о каком BringToFront идет речь? VCL/API/COM или др.?


 
И. Павел ©
 
(2011-12-29 13:18)
[3]

Нашел забавный способ :)
Но все же интересно, можно ли вывести окно Word на передний план без обходных путей.
app.WindowState := 2;
app.WindowState := 0;


 
Kilowatt ©
 
(2011-12-29 13:50)
[4]

app.BringToFront?


 
И. Павел ©
 
(2011-12-29 14:09)
[5]

> [4] Kilowatt ©   (29.12.11 13:50)
> app.BringToFront?

Оба варианта:
app.BringToFront;
app.BringToFront := True;
Приводят к ошибке: method not supported by automation object… Т.е. нет такого метода в OLE Word 2007…


 
Dimka Maslov ©
 
(2011-12-29 14:15)
[6]

У WordApplication нет метода BringToFront. Кроме того, обычно BringToFront заставляет приложение моргать в панели задач. Следовательно, метод с WindowState — единственно возможный. Но для пущей правильности (чтоб отрабатывать случай максимизированного окна) надо сначала сохранить значение, присвоить двойку, а потом значение восстановить. Можно ещё выключить анимацию при сворачивании окон, чтобы не моргало.


 
И. Павел ©
 
(2011-12-29 16:35)
[7]

> Можно ещё выключить анимацию при сворачивании окон, чтобы
> не моргало.

Я сделал так (решил максимизировать окно, т.к. после того, как пользователь нажал на кнопку печати, он скорее всего все равно будет работать именно с этим документом):
 app.WindowState := wdWindowStateMinimize;
 app.Visible := True;
 app.WindowState := wdWindowStateMaximize;


    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    user posted image

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

    Соблюдайте общие правила форума

    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как запустить программу/файл? (и дождаться ее завершения)
    5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
    … (продолжение следует) …


    Внимание:
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки — бан.
    Мат в разделе — бан на три месяца…


    Полезные ссылки:
    user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


    Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

    >
    Сделать активным окно Word
    , открытое с помощью EkRTF

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    26.12.05, 14:25

      Ольга Full Member

      ***

      Рейтинг (т): 0

      Доброе время суток.
      Я новичок в системных командах. Я просмотрела все похожие темы, но ничего не поняла. Объясните мне, пожалуйста, доходчиво.
      Я открываю Word с помощью компонента EkRTF:

      ExpandedWrap disabled

              EkRTF1.OutFile:=FormStorage1.StoredValue[‘WordPath’]+’Res’+s_var+s_item+’, действующих на предприятии по состоянию на ‘+DateTimeToStr(Date)+’.doc’;

              EkRTF1.ExecuteOpen([RxMemoryData1, RxMemoryData2], SW_SHOW);

      Допустим пользователь открыл Word, не закрыл его, перешел в окно программы и дальше работает в нем, потом опять пытается открыть тот же самый файл Word, нужно выдвинуть окно Word на первый план.
      Заранее благодарна за помощь


      vet



      Сообщ.
      #2

      ,
      26.12.05, 15:37

        Full Member

        ***

        Рейтинг (т): 16

        SetForegroundWindow?


        Лисенок



        Сообщ.
        #3

        ,
        27.12.05, 07:14

          Ольга Full Member

          ***

          Рейтинг (т): 0

          А можно поподробней?


          Super-Vadim



          Сообщ.
          #4

          ,
          27.12.05, 08:13

            Senior Member

            ****

            Рейтинг (т): 57

            Цитата Лисенок @ 27.12.05, 07:14

            А можно поподробней?

            ExpandedWrap disabled

              SetForegroundWindow(hwndWord);

              //hwndWord — хэндл окна Word-а


            Лисенок



            Сообщ.
            #5

            ,
            27.12.05, 09:37

              Ольга Full Member

              ***

              Рейтинг (т): 0

              А как узнать Handle окна Worda?


              Super-Vadim



              Сообщ.
              #6

              ,
              27.12.05, 10:25

                Senior Member

                ****

                Рейтинг (т): 57

                Цитата Лисенок @ 27.12.05, 09:37

                А как узнать Handle окна Worda?

                Если у EkRTF1 нету свойств похожих на hwnd, то искай так:

                ExpandedWrap disabled

                  // OpusApp — имя класса окна Ворда.

                  hwndWord:=FindWindow(‘OpusApp’,nil);

                А если вордов открыто нескоько, то вместо nil подставляй заголовок окна Ворда.
                :) А если не знаешь какой у него заголовок, то юзай FindWindowEx для перебора всех вордовских окошек, с использованием GetWindowText.


                Лисенок



                Сообщ.
                #7

                ,
                27.12.05, 15:48

                  Ольга Full Member

                  ***

                  Рейтинг (т): 0

                  Огромное тебе спасибо, Super Vadim :)))))
                  Все получилось. А можно еще один маленький вопросик — какое имя класса для Excel?


                  Лисенок



                  Сообщ.
                  #8

                  ,
                  28.12.05, 09:39

                    Ольга Full Member

                    ***

                    Рейтинг (т): 0

                    В общем я сама отвечу на свой вопрос: имя класса для Excel — XLMain.
                    Вопрос можно считать решеным. Огромное спасибо всем.

                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                    0 пользователей:

                    • Предыдущая тема
                    • Delphi: Система, Windows API
                    • Следующая тема

                    Рейтинг@Mail.ru

                    [ Script execution time: 0,0264 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                    2 / 2 / 0

                    Регистрация: 18.01.2012

                    Сообщений: 163

                    1

                    23.05.2012, 15:30. Показов 2042. Ответов 2


                    Студворк — интернет-сервис помощи студентам

                    Задача такая:
                    генерировать отчет в ворде и открыть диалоговое окно сохранения документа ворда.
                    вобщем задача решена, но…
                    диалоговое окно сохр-я документа открывается за окном моего приложения (((. как вывести его на передний план?
                    может как то через API? (SetforegroundWindow не катит) может что то другое?



                    0



                    Programming

                    Эксперт

                    94731 / 64177 / 26122

                    Регистрация: 12.04.2006

                    Сообщений: 116,782

                    23.05.2012, 15:30

                    2

                    Andrys74

                    217 / 81 / 6

                    Регистрация: 23.04.2012

                    Сообщений: 340

                    24.05.2012, 13:35

                    2

                    Лучший ответ Сообщение было отмечено Ilnur888 как решение

                    Решение

                    выложи кусок кода, посмотрим. Подобное делал с Excell, с Word д.б. аналогично (смотри последние строки):

                    Delphi
                    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
                    
                    // формирование акта в EXCEl
                      E:=CreateOleObject('Excel.Application');
                      E.WorkBooks.Open('C:Учёт оргтехникиShablonShablon1.xls');
                      E.Range['T16']:=Akt.Edit1.Text;
                      E.Range['CJ14']:=Datamodule1.Spisanie.FieldByName('S_Data').Value;
                      E.Range['X21']:=Akt.Edit6.Text;
                      E.Range['A39']:=DataModule1.Spisanie.FieldByName('S_Tip').Value;
                      E.Range['A40']:=DataModule1.Spisanie.FieldByName('S_Marka').Value;
                      E.Range['T39']:=DataModule1.Spisanie.FieldByName('S_Inv').Value;
                      E.Range['AD39']:=DataModule1.Spisanie.FieldByName('S_Zav').Value;
                      E.Range['BA24']:=Akt.Edit2.Text;
                      E.Range['BH39']:=i;
                      E.Range['N28']:=Akt.Edit3.Text;
                      E.Range['A55']:=Akt.Edit4.Text;
                      E.Range['U57']:=Akt.Edit5.Text;
                      E.Range['Q58']:=Akt.DBLookupComboBox2.Text;
                      E.Range['Q60']:=Akt.DBLookupComboBox4.Text;
                      E.Range['Q62']:=Akt.DBLookupComboBox6.Text;
                      E.Range['AY58']:=Akt.Edit7.Text;
                      E.Range['AY60']:=Akt.Edit8.Text;
                      E.Range['AY62']:=Akt.Edit9.Text;
                      if not SaveDialog1.Execute then exit;
                      E.ActiveWorkBook.SaveCopyAs(SaveDialog1.FileName); //диалог сохранения
                      E.Visible:=true; // делаем видимым Excell
                      E:=unassigned;



                    1



                    FU_BA

                    Заблокирован

                    29.05.2012, 09:33

                    3

                    Цитата
                    Сообщение от Andrys74
                    Посмотреть сообщение

                    выложи кусок кода, посмотрим. Подобное делал с Excell, с Word д.б. аналогично (смотри последние строки):

                    Delphi
                    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
                    
                    // формирование акта в EXCEl
                      E:=CreateOleObject('Excel.Application');
                      E.WorkBooks.Open('C:Учёт оргтехникиShablonShablon1.xls');
                      E.Range['T16']:=Akt.Edit1.Text;
                      E.Range['CJ14']:=Datamodule1.Spisanie.FieldByName('S_Data').Value;
                      E.Range['X21']:=Akt.Edit6.Text;
                      E.Range['A39']:=DataModule1.Spisanie.FieldByName('S_Tip').Value;
                      E.Range['A40']:=DataModule1.Spisanie.FieldByName('S_Marka').Value;
                      E.Range['T39']:=DataModule1.Spisanie.FieldByName('S_Inv').Value;
                      E.Range['AD39']:=DataModule1.Spisanie.FieldByName('S_Zav').Value;
                      E.Range['BA24']:=Akt.Edit2.Text;
                      E.Range['BH39']:=i;
                      E.Range['N28']:=Akt.Edit3.Text;
                      E.Range['A55']:=Akt.Edit4.Text;
                      E.Range['U57']:=Akt.Edit5.Text;
                      E.Range['Q58']:=Akt.DBLookupComboBox2.Text;
                      E.Range['Q60']:=Akt.DBLookupComboBox4.Text;
                      E.Range['Q62']:=Akt.DBLookupComboBox6.Text;
                      E.Range['AY58']:=Akt.Edit7.Text;
                      E.Range['AY60']:=Akt.Edit8.Text;
                      E.Range['AY62']:=Akt.Edit9.Text;
                      if not SaveDialog1.Execute then exit;
                      E.ActiveWorkBook.SaveCopyAs(SaveDialog1.FileName); //диалог сохранения
                      E.Visible:=true; // делаем видимым Excell
                      E:=unassigned;

                    о, как раз то, что искал



                    0



                    Below is a working code snippet that opens a Microsoft Word document, and goes to a specific index from the Table of Contents. filePath is a filepath, and strTopic is a value that links to the Table of Contents in the Word document.

                    Set objWord = CreateObject("Word.Application")
                    objWord.Visible = True
                    
                    Set docWord = objWord.Documents.Open(fileName:=strPath, ReadOnly:=True)
                    
                    docWord.Bookmarks(strTopic).Range.Select
                    

                    I need to bring the Word document to the foreground.

                    Is there a toFront() type «function» in VBA?

                    Community's user avatar

                    asked Aug 18, 2014 at 11:46

                    RossC's user avatar

                    You can achieve what you want using APIS. I am using two APIs SetForegroundWindow and FindWindow

                    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) _
                    As Long
                    
                    Private Declare Function FindWindow Lib "user32" Alias _
                    "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) _
                    As Long
                    
                    Sub Sample()
                        Dim objWord As Object, docWord As Object
                        Dim strPath As String, FileName As String
                        Dim hwnd As Long
                    
                        Set objWord = CreateObject("Word.Application")
                        objWord.Visible = True
                    
                        '~~> Change this to the relevant Filename and path
                        strPath = "C:UsersSiddharth RoutDesktopSample.docx"
                        '~~> Put the acutal file name here without the extension
                        FileName = "Sample"
                    
                        Set docWord = objWord.Documents.Open(FileName:=strPath, ReadOnly:=True)
                    
                        hwnd = FindWindow(vbNullString, FileName & " [Read-Only] - Microsoft Word")
                    
                        If hwnd > 0 Then
                          SetForegroundWindow (hwnd)
                        End If
                    End Sub
                    

                    NOTE: If you are sure that there is no other Word Application open other than what you opened then you can use this as well :)

                    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
                    
                    Private Declare Function FindWindow Lib "user32" Alias _
                    "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
                    
                    Sub Sample()
                        Dim objWord As Object, docWord As Object
                        Dim strPath As String
                        Dim hwnd As Long
                    
                        Set objWord = CreateObject("Word.Application")
                        objWord.Visible = True
                    
                        '~~> Change this to the relevant Filename and path
                        strPath = "C:UsersSiddharth RoutDesktopSample.docx"
                    
                        Set docWord = objWord.Documents.Open(FileName:=strPath, ReadOnly:=True)
                    
                        hwnd = FindWindow("OpusApp", vbNullString)
                        If hwnd > 0 Then
                          SetForegroundWindow (hwnd)
                        End If
                    End Sub
                    

                    answered Aug 18, 2014 at 11:58

                    Siddharth Rout's user avatar

                    Siddharth RoutSiddharth Rout

                    146k17 gold badges206 silver badges250 bronze badges

                    8

                    How about,

                    docWord.Activate
                    

                    This should bring the file that has been «Set» for the docWord object to foreground.

                    EDIT: Tested this on Access, quiet unreliable on Excel. Using an API is the best way to go if there are multiple instances of the Word application running.

                    answered Aug 18, 2014 at 11:51

                    PaulFrancis's user avatar

                    PaulFrancisPaulFrancis

                    5,7381 gold badge19 silver badges35 bronze badges

                    9

                    Once you’ve opened a document (or added one) you can get a Hwnd to pass to the SetForegroundWindow API function from the ActiveWindow object (e.g. obWord.ActivieWindow.Hwnd). That way you don’t need to search for the correct Word instance to bring to front.

                    answered Jan 25, 2016 at 12:12

                    John0987's user avatar

                    1

                    This seems to work every time. Word running or not, multiple docs open or not.

                    OpenAlready:
                    
                    On Error GoTo 0
                    With wrdApp
                        .Selection.Goto What:=1, Which:=2, Name:=PageNumber
                        .Visible = True
                        .Activate '<---seems to work well. regardless of number of Word docs open OR not open.
                    End With
                    Set wrdDoc = Nothing
                    Set wrdApp = Nothing
                    

                    answered Nov 14, 2017 at 17:26

                    RealEstateMan's user avatar

                    i’m quite new here, and in doing a ~30 min research on this specific case, I think I could bring something to the table here…

                    I found in this link: http://www.vbaexpress.com/forum/showthread.php?27589-bringing-Word-in-fornt-of-Excel this line of code:
                    Application.ActivateMicrosoftApp xlMicrosoftWord
                    It will force Word in front of everything, BUT if there is something opened it will create a new document, so what I found is that, if you want to open something and then bring it to front you use this sintax:

                    […]

                    Application.ActivateMicrosoftApp xlMicrosoftWord
                    Word.Documents.Open(MyDocument)
                    

                    […]

                    Once in vba debugging the code will always be in front, but when using the code with the excel vba userform it works great! I can see the word changing the words on the fly!!!!

                    answered Nov 29, 2019 at 14:35

                    Alex Silva's user avatar

                    1

                    Can also use AppActivate «Microsoft Word»

                    visit Microsoft help :here

                    Using AppActivate needs the exact title of the window you want focused. E.g. for a word 2013 template opened as an «add», you would have to use AppActivate «Document1 — Word»

                    Community's user avatar

                    answered Aug 18, 2014 at 12:05

                    Dinesh Niduvani Somanna's user avatar

                    1

                    I just use;

                    FileAndPath = "C:tempMydocument.docx"
                    ThisWorkbook.FollowHyperlink (FileAndPath)
                    

                    It even works if the file is already open.

                    answered Mar 26, 2020 at 7:37

                    Nibby's user avatar

                    NibbyNibby

                    161 bronze badge

                    Since «.Activate» is comented various times but at least for me calling it from excel to bring to fornt a word doc.
                    I have to do a work around minimizing and maximazing the window.
                    This works well for me until now:

                    Set wdApp = CreateObject("Word.Application")
                    wdApp.Visible = True
                    wdApp.ScreenUpdating = True
                    Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "" & stWordDocument) 'update your path
                    wdDoc.Activate
                    ActiveDocument.ActiveWindow _
                    .WindowState = wdWindowStateMinimize
                    ActiveDocument.ActiveWindow _
                    .WindowState = wdWindowStateMaximize
                    

                    answered May 20, 2021 at 8:12

                    Schn5's user avatar

                    Schn5Schn5

                    1292 silver badges8 bronze badges

                    Содержание

                    1. Delphi excel на передний план
                    2. Delphi excel на передний план
                    3. Delphi excel на передний план
                    4. Программирование на Delphi
                    5. Вывести окно на передний план
                    6. Программа и Интерфейс — Размеры и Положение
                    7. 1.3.2.4. Перевод приложения на передний план
                    8. Читайте также
                    9. 13.3. Динамический перевод сообщений программ
                    10. Перевод в различные системы счисления
                    11. 2.4. Перевод
                    12. Банковский перевод
                    13. Почтовый перевод
                    14. Перевод
                    15. 8.4.5. Перевод процесса в фоновый режим
                    16. Перевод на другие языки
                    17. 1.1. Машинный перевод
                    18. Перевод текстов
                    19. PROMT – перевод текста
                    20. ПИСЬМОНОСЕЦ: Передний Край ушел в другое место
                    21. 3. Перевод в конечный формат
                    22. Заполняем передний план

                    Delphi excel на передний план

                    Как загрузить новый экземпляр Excel или подключиться к запущенному экземпляру EXCEL.EXE? Как отсоединиться от Excel и закрыть его экземпляр?

                    Для определения, будет ли запущен новый экземпляр Excel.Application или присоединение к уже запущенному, используется свойство TExcelApplication.ConnectKind. По умолчанию это свойство имеет значение ckRunningOrNew (константы определены в unit OleServer). Однако рекомендуется, если нет на то особой надобности, всегда запускать новый экземпляр Excel.Application во избежание конфликтов с запущенным раннее экземпляром Excel.Application. Свойство TExcelApplication.AutoQuit в конструкторе устанавливается по умолчанию в False (только в модуле ExcelXP в True) — это значит, что если вы хотите при отсоединении завершить работу Excel (закрыть), то нужно вызвать метод TExcelApplication.Quit или установить свойство TExcelApplication.AutoQuit равным True.

                    Как запустить Excel из консольного приложения или в отдельном потоке (TThread)

                    Консольное приложение и дочерний поток (класс TThread) не предполагают работу с COM сервером, как это сделано в главном потоке для Application в VCL. Для того чтобы все работало, необходим вызов функции WinAPI CoInitialize.

                    Отличие при работе в Thread — весь код работы должен быть помещен в метод TThread.Execute.

                    Для C# ничего дополнительно вызывать не нужно — все работает, что для WinForms, что для Console, что для объекта класса Thread().

                    Как получить и настроить папки Excel по умолчанию?

                    По умолчанию все открываемые и сохраняемые документы находятся в папке «%USERPROFILE%Мои документы» (Personal). Ссылка на эту папку содержится в свойстве TExcelApplication.DefaultFilePath (read/write). Для чтения и записи в другие папки используйте полный путь к файлу книги.

                    Чем отличается TExcelApplication от ExcelApplication, TExcelWorkbook от ExcelWorkbook?

                    Все отличие TExcelApplication от ExcelApplication в том, что первый — наследник TOleServer. Это расширяет возможности для выбора способа подключения/отключения COM-сервера Excel и упрощает работу с событиями Excel.Application. Получить интерфейс ExcelApplication всегда можно из свойства TExcelApplication.DefaultInterface (DefaultInterface — штатное свойство всех наследников класса ToleServer).

                    Как узнать локализацию Excel’я (русская версия или нет)?

                    Для Delphi это можно почитать здесь.

                    Как сделать, чтобы Excel работал быстрее?

                    Для ускорения работы с Excel’ем можно сделать следующие шаги:

                    Не использовать метод Select, и, как следствие, свойство Selection (смотрите дальше).

                    Существенно повышается скорость, если вместо записи в каждую ячейку использовать запись из VarArray (смотрите дальше про объект Range). В Demo-проекте есть тест затраченного времени для различных методов записи.

                    Так как основное время работы с Excel’ем затрачивается на перерисовку (установка отступов для страницы, размеров строк и столбцов, атрибуты шрифтов и т.д.), то лучше всего использовать заранее подготовленный шаблон.

                    Как вывести приложение Excel на передний план?

                    Для «выноса» приложения Excel на передний план просто вызовите метод Visible объекта ExcelApplication.

                    Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?

                    К сожалению, при работе с русским Excel’ем из C# проблемы те же, но, к счастью, решаются проще — через CultureInfo:

                    Что такое Selection?

                    Как пишут в «Best Practices for Setting Range Properties»: «Код, использующий Selection, сгенерирован записью макроса Excel, часто используется для обнаружения объекта или метода, который будет работать. Это хорошая идея, за исключением того, что записанный макрос не оптимизирован для пользователя. Обычно Excel при записи макроса использует Selection и изменяет выбор объекта при записи какой либо задачи».

                    Т.е. использование Selection не является обязательным и даже не рекомендуется для разработчика. Цитата оттуда же: «На практике вызывайте метод Select объекта только тогда, когда твердо намерены изменить выбранный пользователем элемент. Вы можете никогда не использовать метод Select просто потому, что это вам удобно, как разработчику. Если вы устанавливаете свойства объекта Range, у вас всегда есть альтернатива. Отказ от метода Select не только делает ваш код быстрее, но и порадует пользователей вашей программы (it makes your users happier)». Эта тема еще затронута здесь.

                    Почему не нужно использовать Excel.Application.Range, а следует ExcelWorksheet.Range?

                    Использование ExcelApplication.Range позволяет работать только с активным листом активной книги. Если вы открываете по ходу работы еще одну книгу или делаете активным другой лист в книге (например, добавляете новый лист), то данные будут вноситься именно в активный в данный момент лист. Чтоб не попасть в неудобную ситуациюб всегда используйте объект Range объекта ExcelWorksheet. Это не только обезопасит ваш код от попадания «куда Бог пошлет», но и позволит записывать данные сразу в несколько листов и даже книг без изменения ActiveSheet и ActiveCell.

                    Если приложение Excel работает и пользователь выполняет в Excel, одновременно, какие либо действия, то попытка подключится к Excel и вносить в него данные, вызывает ошибку. Как этого избежать?

                    При работе с запущенным приложением Excel, он может быть занят, если в это время пользователь редактирует значение в ячейке, или в нем открыто какое-либо модальное диалоговое окно (например, «Открытие документа»). Чтобы обойти эту ситуациюб всегда запускайте новую копию Excel.Application и устанавливайте свойство Interactive в False, что запретит пользователю что-либо делать в Excel’е или закрыть запущенный экземпляр Excel.Application:

                    Экспорт в Excel длится довольно долго. Как можно уведомлять пользователя о ходе выполнения работы?

                    Чтобы пользователь не подумалб что во время экспорта данных в Excel ваша программа и Excel «висит», лучше уведомлять его о ходе работы. Т.к. обновление экрана занимает довольно много времени и так довольно длительного процесса экспорта (хотя все же стоит подумать, как этот процесс оптимизировать и ускорить), то лучшим выходом из этой ситуации является показ этапов работы в свойстве ExcelApplication.StatusBar:

                    Переношу записанный VBA макрос рисования границы в Excel, но Delphi не знает что такое xlContinuous. Где взять значение этой константы?

                    Это всего лишь значит, что вы пользуетесь в Delphi поздним связыванием. Добавьте в uses ExcelXP или Excel2000. Для C# нужно полностью указывать namespace, тип и имя этой константы, например Excel.XlLineStyle.xlContinuous.

                    Почему я не могу найти описание компонентов палитры Delphi «Servers» в Help’е? Где найти документацию по работе с Excel’ем?

                    Компоненты на палитре «Servers» — это «обертка» (wrapper) популярных COM-серверов Microsoft. Для описания их объектной модели, свойств и методов используйте поставляемый с Microsoft Office VBA Help или ищите информацию на MSDN (также смотрите «Полезные ссылки» в конце).

                    Источник

                    Delphi excel на передний план

                    Здраствуйте! Формирую отчеты в MS Excel и MS Word. Использую позднее связывание. В конце формирования отчета делаю Word видимым W.Visible:=true; , но он открывается за окном программы, приходится кликать на панели задач чтобы отобразить отчет. Как его отобразить сразу на переднем плане? Искал в инете. но не нашел толком ответа.


                    Омлет © ( 2010-05-13 19:36 ) [1]


                    ixen © ( 2010-05-13 19:48 ) [2]

                    если использовать SetForegroundWindow нужно найти хэндл Word, а хэндл своего приложения всегда известен.. тогда может сделать проще. отодвинуть окно своего приложения на один уровень назад?


                    Омлет © ( 2010-05-13 20:00 ) [3]

                    > отодвинуть окно своего приложения на один уровень назад?

                    За твоим окном может оказаться не ворд. (Прям эпиграф к мистическому рассказу.)


                    Омлет © ( 2010-05-13 20:17 ) [4]

                    Источник

                    Delphi excel на передний план

                    Здраствуйте! Формирую отчеты в MS Excel и MS Word. Использую позднее связывание. В конце формирования отчета делаю Word видимым W.Visible:=true; , но он открывается за окном программы, приходится кликать на панели задач чтобы отобразить отчет. Как его отобразить сразу на переднем плане? Искал в инете. но не нашел толком ответа.


                    Омлет © ( 2010-05-13 19:36 ) [1]


                    ixen © ( 2010-05-13 19:48 ) [2]

                    если использовать SetForegroundWindow нужно найти хэндл Word, а хэндл своего приложения всегда известен.. тогда может сделать проще. отодвинуть окно своего приложения на один уровень назад?


                    Омлет © ( 2010-05-13 20:00 ) [3]

                    > отодвинуть окно своего приложения на один уровень назад?

                    За твоим окном может оказаться не ворд. (Прям эпиграф к мистическому рассказу.)


                    Омлет © ( 2010-05-13 20:17 ) [4]

                    Источник

                    Программирование на Delphi

                    Вывести окно на передний план

                    Программа и Интерфейс — Размеры и Положение

                    Восстановление размера окна

                    Вывести окно на передний план

                    Границы для перемещения формы в рабочей области

                    Изменение положения нужного окна

                    Изменение стандартной формы

                    Как заставить форму находиться позади всех окон в системе

                    Как развернуть форму на весь экран, как в играх

                    Как узнать, была ли перемещена форма

                    Как узнать, что форма готовится изменить размеры

                    Момент окончания изменения размера или перемещения окна

                    Найти формы, которые частично перекрывают окно вашего приложения

                    Обработать моменты сворачивания и разворачивания формы

                    Обработка запроса на максимальное раскрытие окна

                    Ограничение размеров окна

                    Определить, находится ли окно в режиме Выше всех

                    Показать или спрятать окно

                    Предотвращение изменения вертикальных размеров окна

                    Предохранить форму от перемещения и изменения размеров

                    При изменении размеров окна без заголовка сначала отрисовывается рамка будущих размеров

                    Размер диалогового окна

                    Реакция на минимизацию формы перед тем как произойдет изменение размера

                    Ручное масштабирование формы

                    Сворачивает все приложение при сворачивании неглавного окна

                    Создать растягиваемую без бордюра форму

                    Сохранение и восстановление положения и размеров окон

                    Сохранение размеров, позиции и состояния окна

                    Источник

                    1.3.2.4. Перевод приложения на передний план

                    1.3.2.4. Перевод приложения на передний план

                    Первая копия приложения, получив команду от другой копии, должна вывести себя на передний план. Казалось бы, все просто: с помощью функции SetForegroundWindow мы можем вывести туда любое окно. Однако так было только до Windows 95 и NT 4. В более поздних версиях введены ограничения, и теперь программа не может вывести себя на передний план по собственному усмотрению. Функция SetForegroundWindow просто заставит мигать соответствующую кнопку на панели задач.

                    Тем не менее, если программа свернута, команда Application.Restore не только восстанавливает окно, но и выводит его на передний план, что нам и требуется. Ну а если программа не свернута, то «выливаем из чайника воду и тем самым сводим задачу к предыдущей»: сначала сворачиваем приложение с помощью Application.Minimize, а потом разворачиваем его. Цели мы добились — главное окно на переднем плане.

                    Дело портит только то, что изменение состояния окна сопровождается анимацией: видно, как главное окно сначала сворачивается, а потом разворачивается. Чтобы убрать этот неприятный эффект, можно на время сворачивания/разворачивания окна запретить анимацию, а потом восстановить ее. С учетом этого метод GoToForeground выглядит так, как показано в листинге 1.50.

                    Листинг 1.50. Перевод приложения на передний план

                    // Перевод приложения на передний план

                    // Проверяем, включена ли анимация для окон

                    SizeOf(Info), @Info, 0 and (Info.iMinAnimate <> 0);

                    // если включена, отключаем, чтобы не было ненужного мерцания

                    if Animation then

                    SysteParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);

                    // Если приложение не минимизировано, минимизируем

                    if not IsIconic(Application.Handle) then Application.Minimize;

                    // Восстанавливаем приложение. При этом оно автоматически выводится

                    // на передний план

                    // Если анимация окон была включена, снова включаем ее

                    if Animation than

                    SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);

                    Теперь у нас сделано все, что нужно: приложение умеет ассоциировать расширение с двумя командами; проверять, не ассоциировано ли расширение с другим приложением, и если да, предлагать пользователю установить эту ассоциацию; запрещать запуск второй копии приложения, переводя вместо этого на передний план первую копию; передавать параметры второй копии первой, чтобы она могла выполнить требуемые действия.

                    Данный текст является ознакомительным фрагментом.

                    Продолжение на ЛитРес

                    Читайте также

                    13.3. Динамический перевод сообщений программ

                    13.3. Динамический перевод сообщений программ Только что освещенные интерфейсы стандартной библиотеки С решают простые части проблемы локализации. Для денежных, числовых значений, значений времени и даты, также, как для проблем сортировки строк, применяется управление

                    Перевод в различные системы счисления

                    Перевод в различные системы счисления base_convertКонвертация числа из одной системы счисления в другую.Синтаксис:string base_convert(string $number, int $frombase, int $tobase)Переводит число $number (заданное как строка в системе счисления по основанию $frombase) в систему по основанию $tobase. Параметры $frombase и

                    2.4. Перевод

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

                    Банковский перевод

                    Банковский перевод Банковский перевод является, пожалуй, самым распространенным способом передачи денег. Причем под словом «банк» в подавляющем большинстве случаев подразумевается Сбербанк, так как в России он имеет самую обширную сеть филиалов, поэтому наиболее

                    Почтовый перевод

                    Почтовый перевод Это еще один популярнейший способ перевода. Почтовые отделения есть практически везде, и если в вашем местечке нет банка, то обязательно где-то поблизости находится старая добрая почта.Кстати, на счет «старой доброй». Эти слова вовсе не означают, что и

                    Перевод

                    Перевод Знание какого-либо иностранного языка открывает перед вами широчайшие горизонты на рынке удаленной работы. Однако места, на которые вы можете рассчитывать, будут сильно зависеть от уровня ваших знаний.Если вы знаете иностранный язык в совершенстве, то вам будут

                    8.4.5. Перевод процесса в фоновый режим

                    8.4.5. Перевод процесса в фоновый режим Если вы запускаете какой-то процесс путем запуска программы из командной строки, то обычно процесс запускается, как говорят, «на переднем плане». Это значит, что процесс «привязывается» к терминалу, с которого он запущен, воспринимая

                    Перевод на другие языки

                    Перевод на другие языки Увеличение количества посетителей – одна из приоритетных задач любого Web-сайта. Расширить аудиторию за счет иностранных клиентов позволяет перевод Web-страниц на другой язык. Для некоторых сайтов, которые ориентированы на многоязычных

                    1.1. Машинный перевод

                    1.1. Машинный перевод Исторически машинный перевод является первой попыткой использования компьютеров для решения невычислительных задач (знаменитый Джорджтаунский эксперимент в США в 1954 г.; работы по машинному переводу в СССР, начавшиеся в 1954 г.). Развитие электронной

                    Перевод текстов

                    Перевод текстов Как мы уже отмечали ранее, удаленные переводчики также являются потенциальными жертвами мошенников. При этом схема обмана может выглядеть примерно так, как и в ситуации с набором текстов. Ниже мы приводим конкретный пример объявления, которое дали

                    PROMT – перевод текста

                    PROMT – перевод текста Знание хотя бы одного иностранного языка необходимо сегодня всем, как воздух. В особенности пользователям: ведь избежать столкновения с английским языком на компьютерном поприще, увы, невозможно. Ладно, если бы дело касалось только файлов с

                    ПИСЬМОНОСЕЦ: Передний Край ушел в другое место

                    ПИСЬМОНОСЕЦ: Передний Край ушел в другое место Автор: Владимир ГуриевДоброго времени.Уже неоднократно встречал высказывания о низком качестве научных статей в wiki-ресурсах. Однако поводом к написанию послужила передача по «Discovery» с названием «Действительно большие вещи»

                    3. Перевод в конечный формат

                    3. Перевод в конечный формат Итак… переводим книгу в нужный формат. Я здесь рассматриваю только формат PDF как единственно простое, быстрое, кардинальное решение «форматного вопроса»… стойте. Где-то я уже это говорил. Ах, да. Ну, хорошо, есть много форматов в которые можно

                    Заполняем передний план

                    Заполняем передний план Заполненный передний план всегда смотрится выигрышно. Городской пейзаж здесь не является исключением. Старайтесь не допускать скучной пустоты — однотонного асфальта, равномерного газона и т. д. Если посмотреть внимательно, можно скомпоновать

                    Источник

                    Как вывести мое приложение на передний план?

                    Я знаю все причины, почему это плохая идея. Мне не нравится, когда приложение крадет фокус ввода, но это исключительно для личного использования, и я хочу, чтобы это произошло; ничего не будет мешать.

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

                    Этот вопрос не помог и не гуглить. Кажется, что BringToFront() уже давно не работает, и я не могу найти альтернативу.

                    Любые идеи?

                    person
                    Mawg says reinstate Monica
                      
                    schedule
                    18.10.2012
                      
                    source
                    источник


                    Ответы (7)

                    Вы не можете сделать это надежно. В Windows XP был обходной путь, который разрешал это, но версии с тех пор по большей части запрещали его (см. примечание ниже). Об этом прямо указано в разделе примечаний документации MSDN по адресу SetForegroundWindow:

                    Система ограничивает, какие процессы могут устанавливать окно переднего плана. Процесс может установить окно переднего плана, только если выполняется одно из следующих условий:

                    • Процесс является процессом переднего плана.
                    • Процесс был запущен процессом переднего плана.
                    • Процесс получил последнее входное событие.
                    • Процесса на переднем плане нет.
                    • Процесс переднего плана отлаживается.
                    • Передний план не заблокирован (см. LockSetForegroundWindow).
                    • Время ожидания блокировки переднего плана истекло (см. SPI_GETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo).
                    • Нет активных меню.

                    Приложение не может перевести окно на передний план, пока пользователь работает с другим окном. Вместо этого Windows мигает кнопкой панели задач окна, чтобы уведомить пользователя.

                    Обратите внимание на последний абзац цитируемой документации, особенно на первое предложение.

                    Проблема с

                    это исключительно для личного пользования, и я хочу, чтобы это произошло; ничего не будет мешать.

                    заключается в том, что любое приложение может попытаться сделать то же самое. Как «исключительно личное использование» говорит о том, что это вы лично, а не просто какое-либо приложение? :-)

                    Примечание. Я пробовал все, что мог придумать, чтобы документация IDE отображалась на переднем плане, когда я нажимаю кнопку справки, но все, что я могу получить, это мигающая кнопка на панели задач (и я, как пользователь, этого хочу) .

                    person
                    Ken White
                      
                    schedule
                    18.10.2012

                    Вот что-то простое, что, кажется, работает, протестировано с несколькими коробками, состоящими из XP, Server2003, Vista, Server2008, W7. Тестовое приложение запускалось со стандартной (или администраторской) учетной записью, украл фокус ввода из блокнота при записи на переднем плане.

                    var
                      Input: TInput;
                    begin
                      ZeroMemory(@Input, SizeOf(Input));
                      SendInput(1, Input, SizeOf(Input)); // don't send anyting actually to another app..
                      SetForegroundWindow(Handle);
                    

                    Вы можете настроить его дальше f.i. для свернутого приложения или такого, если требуется.

                    person
                    Sertac Akyuz
                      
                    schedule
                    18.10.2012

                    Я делаю что-то подобное в одном из своих приложений, и эта функция у меня работает в xp/vista/w7:

                    function ForceForegroundWindow(hwnd: THandle): Boolean;
                    const
                      SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
                      SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
                    var
                      ForegroundThreadID: DWORD;
                      ThisThreadID: DWORD;
                      timeout: DWORD;
                    begin
                      if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);
                    
                      if GetForegroundWindow = hwnd then Result := True
                      else
                      begin
                        // Windows 98/2000 doesn't want to foreground a window when some other
                        // window has keyboard focus
                    
                        if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
                          ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
                          ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
                          (Win32MinorVersion > 0)))) then
                        begin
                          Result := False;
                          ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
                          ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
                          if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
                          begin
                            BringWindowToTop(hwnd); // IE 5.5 related hack
                            SetForegroundWindow(hwnd);
                            AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
                            Result := (GetForegroundWindow = hwnd);
                          end;
                          if not Result then
                          begin
                            // Code by Daniel P. Stasinski
                            SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
                            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
                              SPIF_SENDCHANGE);
                            BringWindowToTop(hwnd); // IE 5.5 related hack
                            SetForegroundWindow(hWnd);
                            SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
                          end;
                        end
                        else
                        begin
                          BringWindowToTop(hwnd); // IE 5.5 related hack
                          SetForegroundWindow(hwnd);
                        end;
                    
                        Result := (GetForegroundWindow = hwnd);
                      end;
                    end;
                    

                    Другое решение — не красть фокус, а просто поместить окно TOPMOST в z-буфер:

                    procedure ForceForegroundNoActivate(hWnd : THandle);
                    
                    begin
                     if IsIconic(Application.Handle) then
                      ShowWindow(Application.Handle, SW_SHOWNOACTIVATE);
                     SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE);
                     SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE);
                    end;
                    

                    person
                    whosrdaddy
                      
                    schedule
                    18.10.2012

                    Предполагая, что другие приложения StayOnTop не запущены, вы можете временно установить для своих форм FormStyle значение fsStayOnTop, а затем выполнить восстановление приложения и BringToFront, а затем изменить стиль формы обратно на то, что было.

                    tmpFormStyle := Application.MainForm.FormStyle;
                    Application.MainForm.FormStyle := fsStayOnTop;
                    Application.Restore; // optional
                    Application.BringToFront;
                    Application.MainForm.FormStyle := tmpFormStyle;
                    

                    Опять же, это работает только в том случае, если нет других приложений Stayontop.

                    person
                    Toby
                      
                    schedule
                    11.12.2015

                    Это должно работать даже в ОС Windows7+8. Единственным требованием является то, что само приложение может вызывать функции. Сложнее использовать внешнее приложение для установки фронта окна другого процесса.

                    Application.Restore; // unminimize window, makes no harm always call it
                    SetWindowPos(self.Handle, HWND_NOTOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
                    SetWindowPos(self.Handle, HWND_TOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
                    SetWindowPos(self.Handle, HWND_NOTOPMOST,0,0,0,0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE);
                    

                    Изменить Хорошо, я обнаружил одну проблему с этим. Приложение выводится на передний план, но фокус сохраняется в исходном приложении. Используйте этот ответ, чтобы решить проблему, это довольно сложный метод, но копипаста помогает. Перед вызовом ForceForegroundWindow(wnd) вам, возможно, придется вызвать Application.Restore, чтобы развернуть окно. https://stackoverflow.com/a/5885318/185565

                    person
                    Whome
                      
                    schedule
                    20.12.2013

                    Вы можете написать исполняемый файл, чтобы обойти это ограничение. Возьмем, к примеру, простое (невизуальное) приложение (в основном консольное приложение, но без {$APPTYPE CONSOLE}) с единственной целью вывести желаемое окно на передний план.

                    Ваше фоновое приложение для мониторинга вызывает вспомогательное приложение через вызов командной строки (например, ShellExecute) всякий раз, когда требуется ваше действие по перемещению на передний план. Поскольку это приложение становится процессом переднего плана, оно может выводить другие окна на передний план (SetForeGroundWindow). Вы можете использовать FindWindow, чтобы получить дескриптор целевого окна или передать соответствующие параметры при запуске вспомогательного приложения.

                    person
                    Erik Virtel
                      
                    schedule
                    18.10.2012

                    Бланк.вынести на передний план; ?

                    Должно сработать. Если вы поместите его в таймер, он останется впереди.

                    person
                    Rudi
                      
                    schedule
                    25.10.2012

                    Понравилась статья? Поделить с друзьями:
                  • Delphi word как закрыть word
                  • Delphi excel количество строк
                  • Delphi excel как число
                  • Delphi excel как скопировать диапазон
                  • Delphi excel имя всех листов