![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как добавить таймер на форму в VBA редакторе [WinXP]
Calibr2 © (2006-07-14 11:39:00)Почему то в VBA редакторе нету компонента Timer, не подскажете где его взять?
Сергей М. (2006-07-14 15:14:00) [1]И что творится в OnTimer ?
Calibr2 (2006-07-14 15:06:00) [2]Тестируя этот пример раз 5-10 не для всех документов срабатывает процедура BeginClose, а если она не срабатывает, то диалог сохранения не выводится, т.е. все даные с последнего пользовательского сохранения не сохраняются, а в скрипте процедура OnBeginClose для AcadDocument срабатывает всегда. Но из скрипта я не могу передать данные в Delphi программу и поэтому не знаю сохранил пользователь документ или нет.
var
Acad: OleVariant;
AcadApp: IAcadApplication;
AcadDocs: array[0..50] of TAcadDocument;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: Integer;//Счетчик, вспомогат. переменная
iCol: Integer;//Количество документов в AutoCADе
begin
try
{пытаемся подключиться к уже запущенному AutoCADу}
Acad := GetActiveOleObject('AutoCAD.Application');
AcadApp := IDispatch(Acad) as IAcadApplication;
Caption := 'AutoCAD запущен';// пишем, что AutoCAD запущен
except
{если не получилось, то пишем, что AutoCAD закрыт}
Caption := 'AutoCAD сейчас закрыт...';
ListBox1.Clear;// очищаем список
iCol := 0;
exit;// выходим
end;
try
{пытаемся подключиться к активному документу}
iCol := AcadApp.Documents.Count;//Определяем кол-во документов
{Цикл перебора всех запущенных документов}
for i := 0 to iCol - 1 do
begin
AcadDocs[i].Free;
AcadDocs[i] := nil;
AcadDocs[i] := TAcadDocument.Create(Self);//Создаем документ
AcadDocs[i].ConnectTo(AcadApp.Documents.Item(i));//Соединяем его с
//i-тым в AutoCadе
AcadDocs[i].OnBeginClose := BeginClose;//Закрытие
end;
except
{если не получилось, то пишем Чертёж не запущен}
Caption := 'Чертеж не запущен...';
exit;// выходим
end;
end;
(******* ПРОЦЕДУРА ЗАКРЫТИЯ ДОКУМЕНТОВ *******)
procedure TForm1.BeginClose(Sender: TObject);
var
Name: String; //Имя закрывающегося файла
begin
Timer1.Enabled := false;
Name := (Sender as TAcadDocument).Name;//Определяем имя закрывающегося файла
{Выводим диалог сохранения}
if Application.MessageBox(pChar('Сохранить изменения в документе ' + Name + '?'), 'AutoCAD', mb_YESNO + MB_ICONWARNING) = idYES then
{Если отвечают "ДА"}
Caption := 'Yes';
else
Caption := 'No';
Timer1.Enabled := true;
end;
Сергей М. (2006-07-14 14:42:00) [3]И при чем в этом случае таймер ?
Calibr2 (2006-07-14 14:33:00) [4]Просто в Delphi для Акада в таймере не всегда срабатывает событие OnBeginClose поэтому нужно написать скрипт хотя бы для этого события, потому что если пользователь закроет документ после того как программа сохранила его, то запроса на сохранение не выйдет и данные будут потеряны, поэтому я должен организовать свой запрос, а я не знаю как из скрипта передать данные в Delphi-программу.
Сергей М. (2006-07-14 13:45:00) [5]ACad вроде бы реализован как сервер автоматизации.
Если так, то никакие скрипты не нужны.
Пишется обычное делфи приложение, которое получает доступ к АКаду как к олей-серверу и с нужной периодичностью командует АКаду сохранить тот или иной открытый им документ в тот или иной файл.
Calibr2 (2006-07-14 13:41:00) [6]Я хочу написать Скрипт на VBA чтоб при открытии Acad-овского документа открытый файл пересохранялся в мою папку(C:\Временный файлы\<Имя открытого файла>) и сохранялся каждую минуту, а тот файл пусть остается прежним. Если пользователь сохранит документ, то мой файл заменяет старый, если при закрытии документа пользователь в ответ на диалог сохранения нажмет "Нет", то мой пересохраненный файл удаляется.
Так вот Timer мне нужен только для того, чтоб каждую минуту сохранять документ.
Я знаю что в Acadе есть BackUp, но он не всегда срабатывает как надо, вот я и решил сделать такую программу.
Сергей М. (2006-07-14 13:11:00) [7]Тебе оно вообще зачем ?
Изложи задачу подробно ..
Есть предположение, что и без таймера можно обойтись.
Calibr2 (2006-07-14 12:54:00) [8]Расскажите пожалуйста по подробнее как создать этот Timer и как связать его с VBA
TUser (2006-07-14 12:18:00) [9]Сергей предлагает тебе его сделать из delphi-компонента
Calibr2 (2006-07-14 12:12:00) [10]А можно поподробнее? Я чего то не нашел в ActiveXControl класс TTimer
Сергей М. (2006-07-14 11:48:00) [11]
> где его взять?
Сделай его сам.
Проще простого -
File -> New .. -> ActiveX Library
File -> New .. -> ActiveX Control
Создаешь AX-библиотеку c AX-контролом, базирующемся на стандартном TTimer, регистрируешь библиотеку, подключаешь к VBA и пользуешь.