На этом шаге мы рассмотрим использование некоторых методов и свойств коллекции VBComponents.
Исследуем некоторые свойства и методы коллекции VBComponents. Свойство Count представляет собой количество элементов коллекции, точнее, суммарное количество модулей классов, форм, стандартных модулей и модулей документа. Чтобы добавить новый элемент коллекции VBComponents, используем метод Add. Единственным аргументом этого метода является числовая константа, определяющая тип создаваемого элемента. Например, создадим форму Microsoft, для этого в качестве аргумента метода Add используем константу vbext_ct_MSForm=3.
procedure TForm1.Button3Click(Sender: TObject); //Создание формы Microsoft const vbext_ct_MSForm=3; begin E.VBE.VBProjects.Item(1).VBComponents.Add(vbext_ct_MSForm); end;
Рисунки 1 и 2 иллюстрируют результат выполнения этой процедуры.
Рис.1. Редактор Visual Basic до выполнения процедуры
Рис.2. Редактор Visual Basic после выполнения процедуры
Для того, чтобы загрузить редактор Visual Basic, нужно выполнить Сервис | Макрос | Редактор Visual Basic.
Для добавления других типов модулей используем метод Add с другой константой в качестве аргумента. На практике в приложениях Delphi часто требуется создавать стандартные модули, содержащие тексты макросов. С чем это связано? В предыдущих шагах для работы с книгами Excel мы использовали методы, аргументы которых имеют совместимые типы данных для Excel и Delphi. При этом не возникало проблем при экспорте и импорте информации между приложением Delphi и рабочей книгой Excel. Совместимыми типами данных являются целые числа и числа с плавающей точкой, строка и дата. Данные, представляющие собой, например, массив точек, не могут передаваться из Delphi в Excel. В таких случаях мы используем возможность создания макроса средствами Delphi и передачи ему команды на выполнение. При этом макросы могут храниться в виде текстовых файлов и загружаться в проект VBE непосредственно перед выполнением и удаляться после окончания выполнения. Рассмотрим процедуру, которая демонстрирует эту возможность.
procedure TForm1.Button5Click(Sender: TObject); //Загрузка текста модуля из текстового файла begin if OpenDialog1.Execute then E.VBE.VBProjects.Item(1).VBComponents.Import(OpenDialog1.FileName); end;
Результат выполнения этой процедуры изображен на рисунках 1 (до выполнения) и 3 (после выполнения).
Рис.3. Процедура выполнена (модуль создан)
Как быть, если текст макроса, который требуется загрузить в проект и выполнить, создается в приложении? Для этого мы должны создать новый стандартный модуль. Используем метод Add(vbext_ct_StdModule), который возвращает ссылку на созданный объект CodeModule. Объект CodeModule содержит тексты макросов и методы работы с этими текстами. Используя метод AddFromString объекта CodeModule, загружаем текст макроса.
procedure TForm1.Button6Click(Sender: TObject); //Загрузка текста макроса из строки const vbext_ct_StdModule=1; var S:String; begin CM:=E.VBE.VBProjects.Item(1).VBComponents. Add(vbext_ct_StdModule).CodeModule; S:='Sub Новый_макрос()'+Chr(10)+Chr(13)+ 'MsgBox "Новый макрос"'+Chr(10)+Chr(13)+'End Sub '; CM.AddFromString(S); E.Run ('Новый_макрос()'); end;
В результате выполнения данной процедуры будет создан, а затем и выполнен новый макрос.
Рис.4. Выполение созданного макроса
В представленном примере мы рассмотрели и использовали только одно свойство элемента коллекции VBComponents - объект CodeModule.
Приведем полный текст приложения.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, CheckLst, Spin; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; OpenDialog1: TOpenDialog; Button5: TButton; Button6: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation var E: Variant; CM: Variant; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); //Создание объекта Excel и его визуализация begin E:=CreateOleObject('Excel.Application'); E.Visible:=True; end; procedure TForm1.Button4Click(Sender: TObject); //Создание рабочей книги begin E.WorkBooks.Add; end; procedure TForm1.Button2Click(Sender: TObject); //Получение номера версии VBE var Version: String; begin Version:=E.VBE.Version; MessageBox(handle,PChar(Version),'Номер версии Visual Basic',0); end; procedure TForm1.Button3Click(Sender: TObject); //Создание формы Microsoft const vbext_ct_MSForm=3; begin E.VBE.VBProjects.Item(1).VBComponents.Add(vbext_ct_MSForm); end; procedure TForm1.Button5Click(Sender: TObject); //Загрузка текста модуля из текстового файла begin if OpenDialog1.Execute then E.VBE.VBProjects.Item(1).VBComponents.Import(OpenDialog1.FileName); end; procedure TForm1.Button6Click(Sender: TObject); //Загрузка текста макроса из строки const vbext_ct_StdModule=1; var S:String; begin CM:=E.VBE.VBProjects.Item(1).VBComponents. Add(vbext_ct_StdModule).CodeModule; S:='Sub Новый_макрос()'+Chr(10)+Chr(13)+ 'MsgBox "Новый макрос"'+Chr(10)+Chr(13)+'End Sub '; CM.AddFromString(S); E.Run ('Новый_макрос()'); end; end.
На следующем шаге мы рассмотрим некоторые свойства и методы объекта CodeModule.