Excel delphi открыта или нет

1 / 1 / 0

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

Сообщений: 69

1

12.01.2017, 13:08. Показов 6288. Ответов 8


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

Помогите пожалуйста нужно проверить открыт ли конкретный excel файл и если да, то закрыть его.(delphi)



0



5501 / 4296 / 1379

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

Сообщений: 19,295

Записей в блоге: 19

12.01.2017, 14:16

2

эмм, он открыт в Excel, и надо прибить Excel ?



0



Эксперт Pascal/Delphi

4884 / 2756 / 849

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

Сообщений: 10,054

12.01.2017, 16:17

3

Markontr, пригодится для Excel



0



Markontr

1 / 1 / 0

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

Сообщений: 69

17.01.2017, 14:19

 [ТС]

4

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

Delphi
1
2
3
4
5
6
7
8
9
Ap.Workbooks.Open(ExtractFilePath(ParamStr(0))+'rabota2.xls');
 Ap.WorkSheets[1].Activate;
 d:=Ap.ActiveSheet.UsedRange.Rows.Count+1;// подсчет кол-во знятых строк+1
    Ap.Cells.Item[d,1] :=Edit9.Text;
 Ap.DisplayAlerts:=False;
 Ap.ActiveWorkbook.SaveAs(ExtractFilePath(ParamStr(0))+'rabota2.xls');
 showmessage('сохранил ');
 Ap.ActiveWorkbook.Close;
 Ap.Application.Quit;



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

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

Сообщений: 10,054

17.01.2017, 15:45

5

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

как сделать так, чтобы при программа вначале смотрела открыт ли файл rabota2

я же Вам дал ссылку выше. Стоило посмотреть самому

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure OpenWorkBook(WorkBookName: Ansistring);
var
  k: integer;
begin
  CheckExtension(WorkBookName);
  if VarIsEmpty(Excel) = true then
  begin
    Excel := CreateOleObject('Excel.Application');
    Excel.Visible := true;
  end;
  k := WorkBookIndex(WorkBookName);
  if k = 0 then
    Excel.Workbooks.Open(WorkBookName)
  else
    MessageDlg('Книга с таким именем уже открыта.', mtWarning, [mbOk], 0);
end;

Следует учитывать взаимосвязь процедур и функции в приведенной статье. Например, функция WorkBookIndex() — отдельная функция и приведена там же.



0



1 / 1 / 0

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

Сообщений: 69

17.01.2017, 15:46

 [ТС]

6

Благодарю



0



droider

Эксперт Pascal/Delphi

4884 / 2756 / 849

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

Сообщений: 10,054

17.01.2017, 15:49

7

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

и закрывала его

Из той же статьи

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure CloseWorkBook(WorkBookName: Ansistring);
var
  k: integer;
begin
  if VarIsEmpty(Excel) = false then
  begin
    k := WorkBookIndex(WorkBookName);
    if k <> 0 then
      Excel.ActiveWorkbook.Close(WorkBookName)
    else
      MessageDlg('Книга с таким именем отсутствует.', mtWarning, [mbOk], 0);
  end;
end;

Все будет красиво оформлено. Главное — правильно применить!



0



1 / 1 / 0

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

Сообщений: 69

17.01.2017, 15:50

 [ТС]

8

Все все, спасибо большое. Принял!



0



droider

17.01.2017, 15:53


    Проверить открыт ли файл excel, если да закрыть

Не по теме:

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

Принял

;) Good



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

17.01.2017, 15:53

9

 
}|{yk ©
 
(2005-02-28 17:11)
[0]

Собственно.


 
}|{yk ©
 
(2005-02-28 17:18)
[1]

Можна например так
GetPidFromProcessName("EXCEL.EXE")  <> $FFFF
но это как-то неправильно…


 
MU
 
(2005-02-28 17:21)
[2]

может,
function GetActiveOleObject(const ClassName: string): IDispatch;


 
wild_arg ©
 
(2005-02-28 17:22)
[3]

if MessageDlg("А не открыт ли у Вас Excel?", mtConfirmation, [mbYes,mbNo],0)=mrYes
then
 //открыт
else
 //не открыт

:) сорьки, не удержался…


 
pasha_golub ©
 
(2005-02-28 17:25)
[4]

wild_arg ©   (28.02.05 17:22) [3]
LOL

MU   (28.02.05 17:21) [2]
ИМХО, не пойдет. Ибо откроет новое и скажет, шо есть..


 
Ольга
 
(2005-02-28 17:27)
[5]

function GetActiveOleObject в отношении к EXCEL работает некорректно. Я и сама в этом убедилась, а потом нашла в книге «СОМ-технологии» подтверждение, авторы пишут «… по непонятным причинам»


 
MU
 
(2005-02-28 17:28)
[6]

2 pasha_golub ©
 подойдет


 
ArchValentin ©
 
(2005-02-28 18:10)
[7]

не гони, всё можно намутить гораздо проще, перебираешь все окошки FindWindow, и проверяешь если первые n букв в названии равны «MS Exel» то => он открыт иначе нихрена подобного.


 
Ольга
 
(2005-02-28 18:25)
[8]

А если смотреть в корень: зачем вам знать открыт ли Excel? Может нужно просто корректно закрывать «свои» Excel-и, а то можно закрыть открытый пользователем Excel, не имеющий никакого отношения к вашему приложению.


 
aus
 
(2005-02-28 18:30)
[9]

ArchValentin ©   (28.02.05 18:10) [7]
не гони, я ведь имею право свой хелловорлд назвать «MS Exel»


 
Алхимик ©
 
(2005-02-28 18:40)
[10]


> [3] wild_arg ©   (28.02.05 17:22)
> if MessageDlg(«А не открыт ли у Вас Excel?», mtConfirmation,
> [mbYes,mbNo],0)=mrYes
> then
>  //открыт
> else
>  //не открыт

С точки зрения программиста, пользователь — это периферийное устройство,
вводящее набор символов в ответ на команду READ. :)


 
GanibalLector ©
 
(2005-03-01 02:10)
[11]

Вариант№1(облегченный)

 var Excels:Variant;
begin
 try
   try
     Excels:=GetActiveOleObject("Excel.Application");
   finally
     //значит есть ;)
     Excels:=Unassigned;
   end;
 except
   MessageDlg("Нет его тут!",mterror,[MbOk],0);
 end;
end;


 
GanibalLector ©
 
(2005-03-01 02:16)
[12]

Вариант №2(с коннектом)
 var Excels:Variant;
     n:integer;
begin
 try
   try
     Excels:=GetActiveOleObject("Excel.Application");
     Caption:="Найдено документов:"+ IntToStr(Excels.WorkBooks.Count);
     for n:=1 to Excels.WorkBooks.Count do
     begin
       if AnsiSameText("E:Kharkov.xls",Excels.Workbooks[n].FullName) then
       begin
         // тут работаем
         Excels.WorkBooks[1].WorkSheets[1].Name:="Привет из Харькова!";
         //
       end;
     end;
   finally
     Excels:=Unassigned;
   end;
 except
   MessageDlg("Excel не найден!",mterror,[MbOk],0);
 end;
end;


 
GanibalLector ©
 
(2005-03-01 02:22)
[13]

2 }|{yk ©
И еще,хотел поинтересоваться…
В статье http://www.delphimaster.ru/articles/frames/index.html Вы работаете с INI на мой взгяд не корректно.Ведь не всегда есть права на запись! Тут бы try … except не помешали .
З.Ы.Пардон,если что…


 
ArchValentin ©
 
(2005-03-01 03:41)
[14]


> aus   (28.02.05 18:30) [9]

…и сколько ты видел программ с заголовком «Microsoft Exel»? если не секрет. Вот мне только некая прога из какого-то Office»a попадалась :)))


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

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

Введение

Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

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

Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

Создаем новый модуль (unit) и подключаем в uses следующие модули:

uses ComObj, ActiveX, Variants, Windows, Messages, SysUtils, Classes;

теперь объявляем глобальную переменную:

Одну константу (для удобства):

const ExcelApp = 'Excel.Application';

И пишем простенькую функцию:

function CheckExcelInstall:boolean;
var
  ClassID: TCLSID;
  Rez : HRESULT;
begin
// Ищем CLSID OLE-объекта
  Rez := CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID);
  if Rez = S_OK then  // Объект найден
    Result := true
  else
    Result := false;
end;

Или ещё короче:

function CheckExcelInstall: boolean;
var
  ClassID: TCLSID;
begin
  Result:=CLSIDFromProgID(PWideChar(WideString(ExcelApp)), ClassID) = S_OK;
end;

Если функция CLSIDFromProgID находит CLSID OLE-объекта, то, соответственно — Excel установлен.

Но проверка на наличие установленного Excel — это только часть необходимых операций перед началом работы. Другой немаловажной проверкой является проверка на наличие уже запущенного экземпляра Excel. Если этого не делать, то может случиться такая нехорошая ситуация, когда в системе будет зарегистрировано …дцать процессов Excel и все оперативная память волшебным образом утекает «в трубу» — за такое могут и по ушам надавать. Но мы-то свои уши бережем. Пишем вторую функцию проверки.

2. Определяем запущен ли Excel

function CheckExcelRun: boolean;
begin
  try
    MyExcel:=GetActiveOleObject(ExcelApp);
    Result:=True;
  except
    Result:=false;
  end;
end;

Думаю тут лишних объяснений не потребуется? Всё предельно просто — если есть активный процесс Excel, то мы просто получаем на него ссылку и можем использовать Excel для своих корыстных целей. Главное — не забыть проверить — может кто-то этот самый Excel забыл закрыть, но это другой момент. Будем считать, что Excel в нашем полном распоряжении.

3. Как запустить Excel?

Одно дело, когда мы получаем в распоряжение уже запущенный Excel, другое — когда Excel требуется запустить из Delphi. Напишем функцию запуска Excel:

function RunExcel(DisableAlerts:boolean=true; Visible: boolean=false): boolean;
begin
  try
{проверяем установлен ли Excel}
    if CheckExcelInstall then
      begin
        MyExcel:=CreateOleObject(ExcelApp);
//показывать/не показывать системные сообщения Excel (лучше не показывать)
        MyExcel.Application.EnableEvents:=DisableAlerts;
        MyExcel.Visible:=Visible;
        Result:=true;
      end
    else
      begin
        MessageBox(0,'Приложение MS Excel не установлено на этом компьютере','Ошибка',MB_OK+MB_ICONERROR);
        Result:=false;
      end;
  except
    Result:=false;
  end;
end;

Здесь мы в начале проверяем, установлен ли Excel в принципе и, если он все же установлен, запускам. При этом мы можем сразу показать окно Excel пользователю — для этого необходимо выставить параметр Visible в значение True.

Также рекомендую всегда отключать системные сообщения Excel, иначе, когда программа начнет говорить голосом Excel — пользователь может занервничать.

Переходим к следующему этапу работы — созданию рабочей книги.

4. Создаем пустую рабочую книгу Excel

Для создания пустой рабочей книги я обычно использую вот такую функцию:

function AddWorkBook(AutoRun:boolean=true):boolean;
begin
  if CheckExcelRun then
    begin
      MyExcel.WorkBooks.Add;
      Result:=true;
    end
  else
   if AutoRun then
     begin
       RunExcel;
       MyExcel.WorkBooks.Add;
       Result:=true;
     end
   else
     Result:=false;
end;

Второй вариант (более лаконичный):

function AddWorkBook(AutoRun: boolean = true): boolean;
begin
  Result := CheckExcelRun;
  if (not Result) and (AutoRun) then
  begin
    RunExcel;
    Result := CheckExcelRun;
  end;
  if Result then
    MyExcel.WorkBooks.Add;
end;

То есть сразу проверяю запущен ли Excel и, если он не запущен, то либо запускаю и добавляю книгу, либо просто выхожу — всё зависит от ситуации.

Здесь, думаю, следует напомнить, что, если вы выполните эту функцию, например пять раз, то получите пять открытых рабочих книг и работать с ними как Вам захочется. Главное при этом правильно обратиться к необходимой книге, а для этого можно использовать вот такую функцию:

function GetAllWorkBooks:TStringList;
var i:integer;
begin
  try
    Result:=TStringList.Create;
    for i:=1 to MyExcel.WorkBooks.Count do
      Result.Add(MyExcel.WorkBooks.Item[i].FullName)
  except
    MessageBox(0,'Ошибка перечисления открытых книг','Ошибка',MB_OK+MB_ICONERROR);
  end;
end;

Функция возвращает список TStringList всех рабочих книг Excel открытых в данный момент. Обратите внимание, что в отличие от Delphi Excel присваивает первой книге индекс 1, а не 0 как это обычно делается в Delphi при работе, например, с теми же индексами в ComboBox’ах.

Ну, и наконец, после того, как поработали с книгами — их требуется закрыть. Точнее сохранить, а потом уж закрыть.

5. Сохраняем рабочую книгу и закрываем Excel

Для того, чтобы сохранить рабочую книгу, я использовал такую функцию:

function SaveWorkBook(FileName:TFileName; WBIndex:integer):boolean;
begin
  try
    MyExcel.WorkBooks.Item[WBIndex].SaveAs(FileName);
    if MyExcel.WorkBooks.Item[WBIndex].Saved then
      Result:=true
    else
      Result:=false;
  except
    Result:=false;
  end;
end;

Если у Вас открыто 10 книг — просто вызываете функцию 10 раз, меняя значение параметра WBIndex и имени файла и дело в шляпе.

А закрывается Excel вот так:

function StopExcel:boolean;
begin
  try
    if MyExcel.Visible then MyExcel.Visible:=false;
    MyExcel.Quit;
    MyExcel:=Unassigned;
    Result:=True;
  except
    Result:=false;
  end;
end;

Вот набор тех основных функций с которых начинается вся интеграция Excel в приложения написанные на Delphi. В следующий раз займемся работой с конкретной книгой — научимся записывать и читать данные из книг.

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

5
3
голоса

Рейтинг статьи

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

    msm.ru

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

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

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


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


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


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

    >
    Как узнать, что файл Excel уже открыт?

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



    Сообщ.
    #1

    ,
    24.12.03, 12:20

      мне надо обрабатывать екселевские файлы, но только если он не открыт еще никем.
      Как можно проверить, что его кто-то уже открыл?

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

      Сообщение отредактировано: Voice — 24.12.03, 12:32


      QUE



      Сообщ.
      #2

      ,
      24.12.03, 13:42

        Цитата
        Voice,  <b>сегодня в</b> 15:20

        В FAQ …. И читать … читать ….


        Voice



        Сообщ.
        #3

        ,
        25.12.03, 08:55

          Там этого нету……


          filh



          Сообщ.
          #4

          ,
          25.12.03, 10:27

            Full Member

            ***

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

            Voice, а как же Exсel понимает, что файл уже открыт? Может где то во временной директории создается файл???
            Да, файл создается, но для просмотра его не существует!

            dry.gif

            Может на мысль натолкнет

            smile.gif


            Guest



            Сообщ.
            #5

            ,
            25.12.03, 13:06

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


              Voice



              Сообщ.
              #6

              ,
              26.12.03, 07:58

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


                filh



                Сообщ.
                #7

                ,
                29.12.03, 08:39

                  Full Member

                  ***

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

                  Нашел :)

                  ExpandedWrap disabled

                    FileOpen(‘e:1.xls’, fmShareExclusive);

                  При возвращении -1 файл открыт, все что >0 никто не использует.
                  Делаешь проверку перед открытием и все.
                  Для примера взят файл 1.xls
                  Но! если файла не существует, FileOpen будет <0

                  Сообщение отредактировано: filh — 29.12.03, 08:43


                  n0wheremany



                  Сообщ.
                  #8

                  ,
                  29.12.03, 12:45

                    Чел, юзай череп (свой)!
                    Если файл открыт, то открыто окно!!

                    >>> Поищи окна (задачу)


                    Voice



                    Сообщ.
                    #9

                    ,
                    29.12.03, 13:17

                      Цитата filh @ 29.12.03, 08:39

                      Нашел :)

                      ExpandedWrap disabled

                        FileOpen(‘e:1.xls’, fmShareExclusive);

                      Я уже немного по-другому сделал :)
                      if Excel.WorkBooks[1].ReadOnly then…..

                      Добавлено в 29.12.03, 13:29:

                      Цитата filh @ 29.12.03, 08:39

                      Нашел :)

                      ExpandedWrap disabled

                        FileOpen(‘e:1.xls’, fmShareExclusive);

                      Я уже немного по-другому сделал ;)
                      if Excel.WorkBooks[1].ReadOnly then…..
                      Но скорее, воспользуюсь твоим методом, т.к. Excel.WorkBooks[1].ReadOnly возвратит true, даже если файл никем не открыт, но просто имеет атрибут «для чтения»
                      а если FileOpen(‘e:1.xls’, fmShareExclusive)<0 можно проверить и на существование файла
                      например
                      if FileOpen(‘e:1.xls’, fmShareExclusive)<0 then
                      if FileExists(‘e:1.xls’) then
                      …………….
                      спасибо :rolleyes:

                      n0wheremany
                      Я уже думал об этом, но это не рационально… Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана «снять», а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят…. (это был сарказм) :angry:
                      Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает…. КТО ЗНАЕТ) <_<


                      filh



                      Сообщ.
                      #10

                      ,
                      30.12.03, 04:50

                        Full Member

                        ***

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

                        Цитата

                        n0wheremany от 29.12.03, 15:45
                        Если файл открыт, то открыто окно!!
                        >>> Поищи окна (задачу)

                        А если придется открывать файл по сети? Что тогда?


                        Song



                        Сообщ.
                        #11

                        ,
                        30.12.03, 06:12

                          Цитата

                          filh, 30.12.03, 07:50
                          А если придется открывать файл по сети? Что тогда?

                          А что, от этого окна не появляется?


                          n0wheremany



                          Сообщ.
                          #12

                          ,
                          30.12.03, 07:54

                            Цитата

                            n0wheremany
                            Я уже думал об этом, но это не рационально… Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана «снять», а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят…. (это был сарказм)
                            Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает…. КТО ЗНАЕТ)

                            Это ты зря память сканить не надо!

                            ExpandedWrap disabled

                              function tform1.listprocesses:string;

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=»;

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if result=» then result:=’ ‘+StrPas(buff) else result:=result+’#13#10’+’ ‘+StrPas(buff);

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;

                            Вот адаптированная для тебя

                            ExpandedWrap disabled

                              function tform1.ExcelFileOpen(NameFile:string):boolean; {без расширения}

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=»;

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if StrPas(buff)=’Microsoft Excel — ‘+NameFile then result:=true;

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;

                            Проверь и посмотри!!

                            Добавлено в 30.12.03, 07:58:
                            Чуть чуть ошибся

                            ExpandedWrap disabled

                              function tform1.ExcelFileOpen(NameFile:string):boolean; {без расширения}

                              VAR

                               Wnd : hWnd;  

                               buff: ARRAY [0..127] OF Char;

                              begin

                               result:=false;                  {<<<<<<<<<<<}

                               Wnd := GetWindow(Handle, gw_HWndFirst);

                               WHILE Wnd <> 0 DO

                               BEGIN {Не показываем:}

                               IF (Wnd <> Application.Handle) AND {-Собственное окно}

                               IsWindowVisible(Wnd) AND {-Невидимые окна}

                              (GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}

                              (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}

                               THEN BEGIN

                               GetWindowText(Wnd, buff, sizeof(buff));

                               if StrPas(buff)=’Microsoft Excel — ‘+NameFile then result:=true;

                               END;

                               Wnd := GetWindow(Wnd, gw_hWndNext);

                               END;

                              end;


                            Петрович



                            Сообщ.
                            #13

                            ,
                            30.12.03, 08:00

                              Цитата

                              Song, 30.12.03, 09:12
                              А что, от этого окна не появляется?

                              Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется.

                              А еще, можно открыть файл через COM интерфейс, не порождая при этом окон.


                              filh



                              Сообщ.
                              #14

                              ,
                              30.12.03, 08:52

                                Full Member

                                ***

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

                                Song,

                                Цитата

                                Петрович от 30.12.03, 11:00
                                Если файл лежит на компе \COMP1 и открыт на компе \COMP2, то на компе \COMP1 никаких окон не появляется.

                                Об этом я и говорил.


                                Song



                                Сообщ.
                                #15

                                ,
                                30.12.03, 09:01

                                  Правильно, а зачем окнам появляться на Comp2 если он открывается с Comp1!
                                  Мы что, сканим на предмет окон с Comp2 ?

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

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

                                  • Предыдущая тема
                                  • Delphi: Общие вопросы
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0448 ]   [ 16 queries used ]   [ Generated: 13.04.23, 23:39 GMT ]  

                                  Like this post? Please share to your friends:
                                • Excel delphi одну лист
                                • Excel count for names
                                • Excel delphi как закрыть книгу
                                • Excel count for duplicates
                                • Excel delphi значение в ячейке