На этом шаге мы рассмотрим использование некоторых свойств и методов объекта CodeModule.
В примере предыдущего шага мы рассмотрели и использовали только одно свойство элемента коллекции VBComponents - объект CodeModule. Сам объект CodeModule содержит тексты макросов и набор методов и свойств, позволяющих манипулировать ими (таблица 1).
Свойство или метод | Тип | Назначение |
---|---|---|
AddFromFile | Метод | Загрузка текста из файла |
AddFromString | Метод | Загрузка текста из строки |
CountOfLines | Integer | Количество строк текста в программном модуле |
CountOfDeclarationLines | Integer | Количество строк текста в разделе описании |
InsertLines | Метод | Вставка текста из строки |
DeleteLines | Метод | Удаление текста из модуля |
Lines | Метод | Возвращение текста модуля |
ProcBodyLine | Integer | Номер первой строки процедуры |
ProcCountLines | Integer | Количество строк в процедуре |
ProcOfLine | String | Имя процедуры, содержащей строку с заданным номером |
ProcStartLine | Integer | Номер строки, с которой начинается заданная процедура |
Используя свойство Lines, получим текст модуля проекта на языке Visual Basic. Для этого воспользуемся следующей процедурой.
procedure TForm1.Button7Click(Sender: TObject); //Получение текста модуля var S:string; Y:Integer; begin //Количество элементов коллекции Y:=E.VBE.VBProjects.Item(1).VBComponents.Count; //Получить ссылку на последний элемент коллекции CM:=E.VBE.VBProjects.Item(1).VBComponents. Item(Y).CodeModule; S:=CM.Lines[1,CM.CountOfLines]; MessageBox(handle,PChar(S),'',0); end;
Перед тем как воспользоваться представленной процедурой, необходимо открыть рабочую книгу, которая должна содержать макросы, или создать макрос самостоятельно. При этом результат выполнения процедуры будет выглядеть так, как показано на рисунке 1.
Рис.1. Отображаем содержимое программного модуля
Приведем полный текст приложения.
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; Button7: 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); procedure Button7Click(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; procedure TForm1.Button7Click(Sender: TObject); //Получение текста модуля var S:string; Y:Integer; begin //Количество элементов коллекции Y:=E.VBE.VBProjects.Item(1).VBComponents.Count; //Получить ссылку на последний элемент коллекции CM:=E.VBE.VBProjects.Item(1).VBComponents. Item(Y).CodeModule; S:=CM.Lines[1,CM.CountOfLines]; MessageBox(handle,PChar(S),'',0); end; end.
На следующем шаге мы рассмотрим пример небольшого приложения.