Использование Visual Basic Editor. Свойства коллекции VBComponents

   
На этом шаге мы рассмотрим использование некоторых методов и свойств коллекции 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.

Текст этого приложения вместе с файлом macro.txt можно взять здесь (7,2 Кб).

   
На следующем шаге мы рассмотрим некоторые свойства и методы объекта CodeModule.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий