Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как добавить таймер на форму в 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 и пользуешь.


Наверх

Титульная страница Поиск, карта сайта Написать письмо