Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Доступ к ячейкам в Afalinе XL Report

Автор: monsoon
Дата сообщения: 10.11.2004 13:33
Давно юзаю этот компонент под стройкой.
Все замечательно, но появилась необходимость подправить шаблон из программы.
В XL Report 4: Tips & Tricks (можно взять на их сайте) в 4 contentse есть пример для Delphi. Вот начало кода:

procedure TForm1.xlReport1DataSources0BeforeDataTransfer(DataSource: TxlDataSource);
var ISheet: IxlWorksheet;
IRange, Cell1, Cell2: IxlRange;
Fields: TFields;
C1, C2: string;
i, RowCount: integer;
begin
Fields := DataSource.DataSet.Fields;
IRange := DataSource.IRange;
IRange.Cells.Item[2, 1].Value := 'colsfit';

Как это реализовать в Buildere?
Пробовал так:
void __fastcall TForm1::xlReport1DataSources0BeforeDataTransfer(
TxlDataSource *DataSource)
{
// Xlreport::IxlRange IRange;
// OleVariant IRange;
// IRange=DataSource->IRange;
Xlreport::IxlRange IRange = DataSource->IRange;
IRange->Cells->Item[2,1]->Value='colsfit';
}
и по-другому (в закомментированных строчках)
но номер не проходит
Автор: monsoon
Дата сообщения: 29.07.2005 11:49
Сам вопрос задал, сам и отвечаю

void __fastcall TForm1::xlReport1DataSources0BeforeDataTransfer(
TxlDataSource *DataSource)
{
Xlreport::IxlRange IRange;
Variant my_range;
PropertyGet Range("Range");
PropertySet SetValue("Value");

IRange = DataSource->IRange;
my_range=IRange.Exec(Range<<"F2");
my_range.Exec(SetValue << "deletecolumn");
}

Ячейка F2 указывает на столбец F и 2 строку диапазона.
Если установлен XLReport OptionPack будет удален столбец F в отчете.


Есть еще вопрос как удалить макрос из отчета или хотя бы перевести для Builder пример на Delphil
procedure TForm1.xlReport1AfterBuild(Report: TxlReport);
var
i, Count: integer;
IModule: OLEVariant;
begin
Count := OLEVariant(Report.IWorkbook).VBProject.VBComponents.Count;
for i := Count downto 1 do
if OLEVariant(Report.IWorkbook).VBProject.VBComponents.Item(i).Type = vbext_ct_StdModule then begin
IModule := OLEVariant(Report.IWorkbook).VBProject.VBComponents.Item(i);
if OLEVariant(Report.IWorkbook).VBProject.VBComponents.Item(i).Name <> xlrModuleName then
IModule.Collection.Remove(IModule);
end;
end;

Но судя по первому вопросу ответа я не дождусь
Автор: ShIvADeSt
Дата сообщения: 01.08.2005 00:57

Цитата:
procedure TForm1.xlReport1AfterBuild(Report: TxlReport);
var
i, Count: integer;
IModule: OLEVariant;
begin
Count := OLEVariant(Report.IWorkbook).VBProject.VBComponents.Count;
for i := Count downto 1 do
if OLEVariant(Report.IWorkbook).VBProject.VBComponents.Item(i).Type = vbext_ct_StdModule then begin
IModule := OLEVariant(Report.IWorkbook).VBProject.VBComponents.Item(i);
if OLEVariant(Report.IWorkbook).VBProject.VBComponents.Item(i).Name <> xlrModuleName then
IModule.Collection.Remove(IModule);
end;
end;

Пишу на коленке, так как Бидлер не юзаю, но что сложного в переводе с Дельфи на Билдер?
procedure TForm1.xlReport1AfterBuild(Report: TxlReport); // это вроде примерно так же
int i, Count;
OLEVariant IModule;
{
Count=(OLEVariant)(Report->IWorkbook)->VBProject->VBComponents->Count;
for (i=Count; 1;i--)
if (OLEVariant)(Report->IWorkbook)->VBProject->VBComponents->Item(i)->Type == vbext_ct_StdModule)
{
IModule=(OLEVariant)(Report->IWorkbook)->VBProject->VBComponents->Item(i);
if (OLEVariant)(Report->IWorkbook)->VBProject->VBComponents->Item(i)->Name != xlrModuleName) IModule->Collection->Remove(IModule);
};
};
Насчет замены . на -> посмотри, возможно кое-где все таки должны остаться точки, в этих случаях компилятор ругнется. По поводу (OLEVariant)(Report->IWorkbook) вроде правильно, вторые скобки для того, чтобы преобразование было не для репорта, а его свойства. Знатоки С пусть меня поправят.
Автор: monsoon
Дата сообщения: 01.08.2005 09:40
ShIvADeSt
Спасибо за предложенный вариант.
На Count=(OLEVariant)(Report->IWorkbook)->VBProject->VBComponents->Count;
[C++ Error] Unit1.cpp(231): E2451 Undefined symbol 'OLEVariant'
[C++ Error] Unit1.cpp(231): E2288 Pointer to structure required on left side of -> or ->*

На Count=(OLEVariant)(Report->IWorkbook).VBProject->VBComponents->Count;
[C++ Error] Unit1.cpp(231): E2451 Undefined symbol 'OLEVariant'
[C++ Error] Unit1.cpp(231): E2316 'VBProject' is not a member of 'OleVariant'

На остальные замены . на -> первые две ошибки.
Если присвоить значение Count далее должно пойти по аналогии, т.е. добраться бы к VBProject.

Добавлено:
Поменял (OLEVariant) на (OleVariant), теперь на Count выдаются только вторые ошибки.
Автор: ShIvADeSt
Дата сообщения: 02.08.2005 00:44
monsoon
Тебе нужен первый вариант

Цитата:
Count=((OleVariant*)(Report->IWorkbook))->VBProject->VBComponents->Count;

Сейчас вроде должно работать. Составил по правилам С, вот только в этом месте Report->IWorkbook все равно не уверен, попробуй с точкой тоже.

Автор: monsoon
Дата сообщения: 02.08.2005 10:16
ShIvADeSt

Цитата:
Count=((OleVariant*)(Report->IWorkbook))->VBProject->VBComponents->Count;

[C++ Error] Unit1.cpp(222): E2031 Cannot cast from 'const OleVariant' to 'OleVariant *'

Цитата:
вот только в этом месте Report->IWorkbook все равно не уверен, попробуй с точкой тоже

Здесь все правильно. При написании кода Report->
Code Insight предлагает для выбора IWorkbook.

Один добрый человек прислал пример работы с макросом Excel в Builder.
Приладив, удалось получить Count таким образом:
Variant VBComps;
VBComps = Report->IWorkbook.OlePropertyGet("VBProject").OlePropertyGet("VBComponents");
Count = StrToInt(VarToStr(VBComps.OlePropertyGet("Count")));
т.е. до свойств VBComponents добрались, а дальше по аналогии.

Ни в первом случае при попытке изменения ячейки шаблона, ни во втором при удалении макроса, не получается почему-то прямая конвертация Delphi->Builder.
Если есть еще варианты с Count = OleVariant, опробую.

Страницы: 1

Предыдущая тема: Pascal.Поиск совершенного числа.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.