
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.86.78] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
мне надо обрабатывать екселевские файлы, но только если он не открыт еще никем.
Как можно проверить, что его кто-то уже открыл? ЗЫ. И как можно сделать, чтобы ексель не спрашивал при сохранении, куда и что сохранять, а просто сохранял, куда скажут (программно) и в каком формате? |
Сообщ.
#2
,
|
|||
|
В FAQ .... И читать ... читать .... |
Сообщ.
#3
,
|
|
|
Там этого нету......
|
Сообщ.
#4
,
|
|
|
Voice, а как же Exсel понимает, что файл уже открыт? Может где то во временной директории создается файл???
Да, файл создается, но для просмотра его не существует! ![]() Может на мысль натолкнет ![]() |
Сообщ.
#5
,
|
|
|
так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать.... Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
Нет ли флага какого, что файл занят или как-то еще? |
Сообщ.
#6
,
|
|
|
так временных папок, куда он файлы сохраняет, может быть куча и все их проверить просто нереально, т.к. придется все просматривать и пересматривать.... Точнее не нереально, а не рационально. Слишком долго это все будет сканиться и проверяться
Нет ли флага какого, что файл занят или как-то еще? |
Сообщ.
#7
,
|
|
|
Нашел
![]() ![]() ![]() FileOpen('e:\1.xls', fmShareExclusive); При возвращении -1 файл открыт, все что >0 никто не использует. Делаешь проверку перед открытием и все. Для примера взят файл 1.xls Но! если файла не существует, FileOpen будет <0 |
Сообщ.
#8
,
|
|
|
Чел, юзай череп (свой)!
Если файл открыт, то открыто окно!! >>> Поищи окна (задачу) |
Сообщ.
#9
,
|
|
|
Цитата filh @ 29.12.03, 08:39 Нашел ![]() ![]() ![]() FileOpen('e:\1.xls', fmShareExclusive); Я уже немного по-другому сделал ![]() if Excel.WorkBooks[1].ReadOnly then..... Добавлено в : Цитата filh @ 29.12.03, 08:39 Нашел ![]() ![]() ![]() 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 ................ спасибо ![]() n0wheremany Я уже думал об этом, но это не рационально... Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана "снять", а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят.... (это был сарказм) ![]() Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает.... КТО ЗНАЕТ) ![]() |
Сообщ.
#10
,
|
|
|
Цитата n0wheremany от 29.12.03, 15:45 Если файл открыт, то открыто окно!! >>> Поищи окна (задачу) А если придется открывать файл по сети? Что тогда? |
Сообщ.
#11
,
|
|
|
Цитата filh, 30.12.03, 07:50 А если придется открывать файл по сети? Что тогда? А что, от этого окна не появляется? |
Сообщ.
#12
,
|
|
|
Цитата n0wheremany Я уже думал об этом, но это не рационально... Можно конечно и все процессы просмотреть и всю память просканировать. А еще можно и картинку с экрана "снять", а потом поискать на ней текст, где есть что-то похожее на имя нужного файла и, если что-то нашлось, то значит, файл занят.... (это был сарказм) Но можно сделать все намного проще, главное поискать (а если не нашел, то спросить у кого-то, кто знает.... КТО ЗНАЕТ) Это ты зря память сканить не надо! ![]() ![]() 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; Вот адаптированная для тебя ![]() ![]() 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; Проверь и посмотри!! Добавлено в : Чуть чуть ошибся ![]() ![]() 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
,
|
|
|
Цитата Song, 30.12.03, 09:12 А что, от этого окна не появляется? Если файл лежит на компе \\COMP1\ и открыт на компе \\COMP2\, то на компе \\COMP1\ никаких окон не появляется. А еще, можно открыть файл через COM интерфейс, не порождая при этом окон. |
Сообщ.
#14
,
|
|
|
Song,
Цитата Петрович от 30.12.03, 11:00 Если файл лежит на компе \\COMP1\ и открыт на компе \\COMP2\, то на компе \\COMP1\ никаких окон не появляется. Об этом я и говорил. |
Сообщ.
#15
,
|
|
|
Правильно, а зачем окнам появляться на Comp2 если он открывается с Comp1!
Мы что, сканим на предмет окон с Comp2 ? |