Есть некоторый шаблон в формате Excel, в котором уже вставлены
надписи. Требуется заполнять эти надписи данными из программы на
Delphi. Здесь встает вопрос: как обратиться к уже существующим
надписям ? Я делаю следующее.
Включаю в Excel запись макроса, заполняю надпись текстом. По строке мак-
роса, например ActiveSheet.Shapes('TeKcm 9').Select, узнаю имя надписи.
В Delphi пишу:
Е.ActiveWorkBook.ActiveSheet.Shapes('Текст 9').Select;
Е.ActiveWorkBook.ActiveSheet.Selection.Characters.Text := 'Текст';
Появляется ошибка "Не найден член группы".
Также хотелось бы узнать, как можно изменять имена надписей.
Для того чтобы изменять текст надписи, принадлежащей листу рабочей
книги Excel, нужно получить доступ к изменяемой надписи. Доступ можно
получить, используя имя или индекс объекта в коллекции Shapes. Послед-
ний вариант надежнее. Также надо учесть, что коллекция Shapes может со-
держать объекты не только типа TextBox, но и другие, например геометри-
ческие фигуры. Поэтому при загрузке списка имен объектов TextBox необ-
ходимо учитывать тип загружаемого объекта, т. е. свойство Туре элемента
коллекции Shapes.
Загрузим список имен объектов типа TextBox в компонент ListBoxl.
Получение списка имён надписей для листа рабочей книги
procedure TForml.Button3Click(Sender: TObject);
var a_:integer;
begin
ListBoxl.Items.Clear;
for a_:= 1 to E.ActiveSheet.Shapes.Count do
if E.ActiveSheet.Shapes.Item(a_).type = 17
then ListBoxl.Items.Add(E.ActiveSheet.Shapes.Item(a_).Name)
else ListBoxl.Items.Add('-');
end;
Чтобы не загружать имена объектов, не являющихся надписями, нужно
проверять тип объекта. Если свойство Туре загружаемого объекта равно 17,
то этот объект является надписью (TextBox) и его имя добавляется в список
компонента ListBoxl, в противном случае в список добавляется прочерк ('-').
После того как имена объектов TextBox загружены, можно получить доступ
к любому из этих объектов. В следующей процедуре, вызываемой при выбо-
ре элемента списка компонента ListBoxl, мы получаем ссылку на выбран-
ный пользователем объект TextBox (надпись), затем считываем его имя и
текст, который содержится в свойстве TextFrame этого объекта.
Считывание имени и текста выбранной надписи
procedure TForml.ListBoxlClick(Sender: TObject);
begin
TextBox:=E.ActiveSheet.Shapes.item(ListBoxl.Itemlndex+l);
Edit1.Text:=TextBox.Name;
Memol.Text:=TextBox.TextFrame.Characters.Text;
end;
С помощью считанных имени и текста надписи можно оценить эту инфор-
мацию, а также при необходимости изменить ее. Далее представлены фраг-
менты исходного текста процедур, позволяющих изменить содержание
свойства TextFrame, т. е. текст, отображаемый надписью, и имя объекта
TextBox. В обоих случаях можно использовать механизм обработки исклю-
чительных ситуаций, позволяющий корректно исправить ошибки пользова-
теля.
Редактирование текста и имени надписи
procedure TForml.MemolChange(Sender: TObject);
var text_:string;
begin
text_:=Memol.Text;
try
TextBox.TextFrame.Characters.Text:=Memol.Text;
except
Memol.Text:=text_;
end;
end;
procedure TForml.Button4Click(Sender: TObject);
begin
try
TextBox.Name:=Edit1.Text;
ListBoxl.Items.Strings[ListBoxl.Itemlndex]:=TextBox.Name;
except
end;
end;
Выбранный в приложении Delphi объект документа Excel можно выделить.
Для этого воспользуемся методом Select объекта TextBox в следующей про-
цедуре.
Выделение надписи
procedure TForml.Button5Click(Sender: TObject);
begin
try
TextBox.select;
except
end;
end;
Результат всех приведенных здесь действий показан на рис. П2.8.
Рис. П2.8. Работа с существующими объектами TextBox |