Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Как добавить таймер на форму в VBA редакторе   Найти похожие ветки 

 
Calibr2   (2006-07-14 11:39) [0]

Почему то в VBA редакторе нету компонента Timer, не подскажете где его взять?


 
Сергей М. ©   (2006-07-14 11:48) [1]


> где его взять?


Сделай его сам.

Проще простого -

File -> New .. -> ActiveX Library
File -> New .. -> ActiveX Control

Создаешь AX-библиотеку c AX-контролом, базирующемся на стандартном TTimer, регистрируешь библиотеку, подключаешь к VBA и пользуешь.


 
Calibr2   (2006-07-14 12:12) [2]

А можно поподробнее? Я чего то не нашел в ActiveXControl класс TTimer


 
TUser ©   (2006-07-14 12:18) [3]

Сергей предлагает тебе его сделать из delphi-компонента


 
Calibr2   (2006-07-14 12:54) [4]

Расскажите пожалуйста по подробнее как создать этот Timer и как связать его с VBA


 
Сергей М. ©   (2006-07-14 13:11) [5]

Тебе оно вообще зачем ?
Изложи задачу подробно ..
Есть предположение, что и без таймера можно обойтись.


 
Calibr2   (2006-07-14 13:41) [6]

Я хочу написать Скрипт на VBA чтоб при открытии Acad-овского документа открытый файл пересохранялся в мою папку(C:\Временный файлы\<Имя открытого файла>) и сохранялся каждую минуту, а тот файл пусть остается прежним. Если пользователь сохранит документ, то мой файл заменяет старый, если при закрытии документа пользователь в ответ на диалог сохранения нажмет "Нет", то мой пересохраненный файл удаляется.

Так вот Timer мне нужен только для того, чтоб каждую минуту сохранять документ.

Я знаю что в Acadе есть BackUp, но он не всегда срабатывает как надо, вот я и решил сделать такую программу.


 
Сергей М. ©   (2006-07-14 13:45) [7]

ACad вроде бы реализован как сервер автоматизации.

Если так, то никакие скрипты не нужны.

Пишется обычное делфи приложение, которое получает доступ к АКаду как к олей-серверу и с нужной периодичностью командует АКаду сохранить тот или иной открытый им документ в тот или иной файл.


 
Calibr2   (2006-07-14 14:33) [8]

Просто в Delphi для Акада в таймере не всегда срабатывает событие OnBeginClose поэтому нужно написать скрипт хотя бы для этого события, потому что если пользователь закроет документ после того как программа сохранила его, то запроса на сохранение не выйдет и данные будут потеряны, поэтому я должен организовать свой запрос, а я не знаю как из скрипта передать данные в Delphi-программу.


 
Сергей М. ©   (2006-07-14 14:42) [9]

И при чем в этом случае таймер ?


 
Calibr2   (2006-07-14 15:06) [10]

Тестируя этот пример раз 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 15:14) [11]

И что творится в OnTimer ?



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1154351795
Сатир
2006-07-31 17:16
2006.08.27
mp3 to midi converter


2-1154622398
HelloWord
2006-08-03 20:26
2006.08.27
MessageDig


9-1133498299
Fosgen
2005-12-02 07:38
2006.08.27
"Ошибка перечисления" из-за чего может возникать?


3-1149146961
vadim14
2006-06-01 11:29
2006.08.27
copy tables with metadata


1-1152706062
Kerk
2006-07-12 16:07
2006.08.27
TdxDBEdit + 7E6