На главную Наши проекты:
Журнал   ·   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_
  
> Как узнать, что файл 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 ?
                                  мне все равно, где файл открывается...
                                  дело в том, что моя программа просто должна обновлять данные в каком-то файле (вып. процедуры RefreshAll для сводной таблицы) и не важно, где он лежит (путь указывается в качестве параметра)
                                  Я это делаю через ексель. Т.е. я его сначала открываю в скрытом виде (visible:=false), а потом начинаю сканить все книги, листы и сводные таблицы, а потом сохраняю. Если файл уже кем-то занят, то невидимый ексель выдает невидимое собщение с предложением сохранить этот файл под другим именем (все свойства типа DisplayAlerts, AlertBeforeOverwriting равны false, но он все равно продолжает показывать эти сообщения) и получается, что программа зависла (для юзера), хотя она просто ждет, когда же этот юзер наконец нажмет на невидимый ОК.
                                  Поэтому я проверяю его свойство ReadOnly, если оно true, значит оно кем-то открыто (не обязат. Может просто иметь такое св-во)...
                                  Я думаю, самы лучший вариант, это предложение filh+Voice
                                  if FileOpen('e:\1.xls', fmShareExclusive)>=0 then
                                  if FileExists('e:\1.xls') then
                                  обрабатываем......
                                    Цитата
                                    n0wheremany, 30.12.03, 07:54
                                    if StrPas(buff)='Microsoft Excel - '+NameFile then result:=true;


                                    Берешся гарантировать, что во всех случаях и версиях Excel заголовок будет иметь такой же вид?
                                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                    0 пользователей:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0,1073 ]   [ 15 queries used ]   [ Generated: 18.07.25, 00:59 GMT ]