На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

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


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как узнать, что файл Excel уже открыт?
    мне надо обрабатывать екселевские файлы, но только если он не открыт еще никем.
    Как можно проверить, что его кто-то уже открыл?

    ЗЫ. И как можно сделать, чтобы ексель не спрашивал при сохранении, куда и что сохранять, а просто сохранял, куда скажут (программно) и в каком формате?
    Сообщение отредактировано: Voice -
      Цитата
      Voice,  <b>сегодня в</b> 15:20

      В FAQ .... И читать ... читать ....
        Там этого нету......
          Voice, а как же Exсel понимает, что файл уже открыт? Может где то во временной директории создается файл???
          Да, файл создается, но для просмотра его не существует! dry.gif
          Может на мысль натолкнет smile.gif
            так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать.... Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
            Нет ли флага какого, что файл занят или как-то еще?
              так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать.... Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
              Нет ли флага какого, что файл занят или как-то еще?
                Нашел :)
                ExpandedWrap disabled
                  FileOpen('e:\1.xls', fmShareExclusive);

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

                  >>> Поищи окна (задачу)
                    Цитата filh @ 29.12.03, 08:39
                    Нашел :)
                    ExpandedWrap disabled
                      FileOpen('e:\1.xls', fmShareExclusive);

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

                    Добавлено в :
                    Цитата 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:
                    Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает.... КТО ЗНАЕТ) <_<
                      Цитата
                      n0wheremany от 29.12.03, 15:45
                      Если файл открыт, то открыто окно!!
                      >>> Поищи окна (задачу)

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

                        А что, от этого окна не появляется?
                          Цитата
                          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;


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

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

                          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;
                            Цитата
                            Song, 30.12.03, 09:12
                            А что, от этого окна не появляется?

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

                            А еще, можно открыть файл через COM интерфейс, не порождая при этом окон.
                              Song,
                              Цитата
                              Петрович от 30.12.03, 11:00
                              Если файл лежит на компе \\COMP1\ и открыт на компе \\COMP2\, то на компе \\COMP1\ никаких окон не появляется.

                              Об этом я и говорил.
                                Правильно, а зачем окнам появляться на Comp2 если он открывается с Comp1!
                                Мы что, сканим на предмет окон с Comp2 ?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0442 ]   [ 16 queries used ]   [ Generated: 20.09.24, 09:38 GMT ]