Обсуждение Joomla , Virtuemart 2 , Cisco IOS , Asterisk , PHP
Аннотация...
За свою практику системным администратором несколько раз сталкивался с тем - что пользователям нужен один общий файл на терминальном сервере (или просто в расшаренной папке) который они могут по очереди редактировать или все хором просматривать. Соответственно сохранить изменения именно в этом же файле может только пользователь первый открывший этот файл, остальные откроют его только для чтения.
Суть проблемы...
Периодически пользователь первый открывший этот файл забывает его закрыть и просто сворачивает или закрывает RDP сессию. Соответственно остальные пользователи теряют возможность вносить в этот файл изменения и начинаются звонки админу с просьбами принудительно его закрыть. Завершение RDP-сеанса по времени тоже сулило проблемы с пользователями которые внесли изменения в документ и не сохранив свернули соединение, а оно оборвалось ни чего не сохранив...
На фоне этой беды написал код на VBA со следующей логикой:
1. Считывается и складывается в переменную положение курсора.
2. Запускается таймер на произвольно установленное ВАМИ время.
3. Освобождаются действия для других процессов.
4. Заканчивается таймер.
5. Еще раз считыватся позиция курсора и сравнивается с предыдущей позицией.
6. Если курсор не двигался проверяется как открыт файл - "Только для чтения" или нет, если "Только для чтения" то EXCEL документ просто закрывается, а если документ открыт с полными правами на запись , то сначала документ сохраняется по тому же пути с тем же именем, а потом закрывается.
7. Если курсор двигался то процесс начинается заново.
Этот код нужно вставить в документ с заранее записанным макросом "Auto_Open" заменив его так как он тут уже есть. (Вкладка меню "Разработчик"→Записать макрос→Обозвать его "Auto_Open"→Указать расположение "Эта книга"→Остановить запись→Заменить макрос на ниже приведенный код в модуле VBA "Module1")
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos _
Lib "user32.dll" (lpPoint As POINTAPI) As Long
Sub Auto_Open()
'
' Auto_Open Макрос
'
GetCursorPosition
'
End Sub
Private Sub GetCursorPosition()
Dim iPOINT As POINTAPI, PauseTime, Start, Finish, TotalTime
Application.DisplayAlerts = True ' Разрешаем предупреждения на время работы
GetCursorPos iPOINT ' Запрашиваем позицию курсора и записываем в переменные
Xx = iPOINT.X
Yy = iPOINT.Y
PauseTime = 60 ' Время в секундах (1 мин)
Start = Timer ' Старт
Do While Timer < Start + PauseTime ' Запускаем цикл таймера
DoEvents ' Выход на другие процессы
Loop
Finish = Timer ' Время вышло.
TotalTime = Finish - Start ' Подсчет времени простоя
GetCursorPos iPOINT ' Запрашиваем позицию курсора и записываем в другие переменные
Xx2 = iPOINT.X
Yy2 = iPOINT.Y
If Xx = Xx2 And Yy = Yy2 Then ' Сравниваем 1 и 2 положение курсора
' Начинаем действия при простое
If ActiveWorkbook.ReadOnly Then ' Проверяем файл на "ТОЛЬКО ЧТЕНИЕ"
Excel.ActiveSheet.Cells(1, 1).Select ' Переходим на ячейку 1,1 для устранения неоконченного ввода
Application.DisplayAlerts = False ' Подавляем предупреждения
Application.Quit ' Закрываем приложение
ActiveWorkbook.Close True
Application.DisplayAlerts = True
Else
Application.DisplayAlerts = False ' Подавляем предупреждения
Excel.ActiveWorkbook.Save ' Сохраняем активную книгу
Application.Quit ' Закрываем приложение
ActiveWorkbook.Close True
Application.DisplayAlerts = True
End If
End
Else
' Тут пользователь двигал курсор
End If
Cicle ' Переходим к процедуре цыкла
End Sub
Private Sub Cicle()
GetCursorPosition ' Зацикливаем процедуру пока не будет бездействие юзера
End Sub
Этот код можно облагородить добавив в начале еще один таймер до первого считывания положения курсора , но меня устроило и так , да и лень было... )))
x64 версия!!!
Какой код должен быть для версии x64?