Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Внизкто-нибудь делал отчёты, не с БД а со своих данных, с программы Найти похожие ветки
← →
cjiohobaji (2003-07-21 05:05) [0]Кто-нибудь когда-нибудь, делал отчёты с програмных данных, ??
Я пытаюсь найти оптимальный вариант составления отчёта по скорости и если получиться по гибкости, в голову ничего путного не приходит кроме как динамически создавать label"ы на QuickReport"е, но это же кошмар, у меня отчёт состоит из 20 разных страниц,
И еще вопрос можно ли в QuickReport"е Band размещать горизонтально? и чтоб данные располагались горизонтально?
Буду очень благодарен кто даст идею.
← →
Babay (2003-07-21 05:16) [1]А какие проблемы с динамикой?
Я всегда так делаю и никаких проблем.
Однако обленинило Вас программирование в Д. Пару сторок нацарапь уже в лом.
А насчет расположения горизонтально так данные в QR и так горизонтально (Справо налево и вниз) распологаются. Может ты имел ввиду вертикально (Сверху вниз направо)? так в лоб сделать нельзя, но динамика этот вопрос решает.
Удачи. :=))#
P.S. IMHO QReport прекрасное средство для отчетов. Что бы про него не говорили. Как тут выразился на форуме один человек надо просто уметь его готовить...
← →
cjiohobaji (2003-07-21 06:08) [2]Удалено модератором
Примечание: Личная переписка
← →
Babay (2003-07-21 06:38) [3]Вот пример(вырезка основных моментов) одного из моих отчетов. Данные лежат в StringGrid моей формы. На форме отчета Есть QRBand1 заголовка и QRBand2 типа rbDetail по высоте равный высоте строки отчета. Вот код
var
frmReportTable: TfrmReportTable;
Count:Integer;
implementation
procedure TfrmReportTable.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
Var I:Integer;
l,l1:TQrLabel;
s,s1:TQrShape;
left:Integer;
begin
.................
count:=0;
Left:=0;
for i:=1 to frmMain.stg.colcount-1 do begin
if frmMain.stg.ColWidths[i]>-1 then begin // скрытые столбики в отчет не идут
// это рамки ячеек заголовка
s:=TQrShape.Create(self);
s.Left:=Left;
s.Width:=frmMain.stg.ColWidths[i];// ширина клетки равна ширине столбика грида
s.Height:=20;s.Top:=40;
s.Pen.Width:=5;
s.Parent:=QRBand1;
// это рамки ячеек данных
s1:=TQrShape.Create(self);
s1.Parent:=QRBand2;
s1.Left:=Left;
s1.Width:=frmMain.stg.ColWidths[i];
s1.Height:=20;
// это лабельки заголовка таблицы
l:=TQrLabel.Create(self);
l.Parent:=QRBand1; l.AutoSize:=False;
l.Left:=Left+2;l.Width:=frmMain.stg.ColWidths[i]-3;
l.Top:=40+2;l.Alignment:=taCenter;
l.Caption:=frmMain.stg.Cells[i,0];
l.Transparent:=True;
l.Font.style:=l.Font.style+[fsBold];
// это лабельки для данных
l1:=TQrLabel.Create(self);
l1.Parent:=QRBand2; l1.AutoSize:=False;
l1.Left:=Left+2;l1.Width:=frmMain.stg.ColWidths[i]-3;
l1.Top:=2;
l1.Name:="L"+Inttostr(i); l1.Transparent:=True;
left:=Left+frmMain.stg.ColWidths[i];
end;
end;
end;
procedure TfrmReportTable.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
Var i:Integer;
l:TQRLabel;
begin
// Это расклада данных
for i:=1 to frmMain.stg.colcount-1 do begin
if frmMain.stg.ColWidths[i]>-1 then begin
L:=TQrLabel(FindComponent("l"+Inttostr(i)));
l.Caption:=frmMain.stg.Cells[i,count];
end;
end;
Inc(Count);
MoreData:=Count<frmMain.stg.RowCount;
end;
Работает довольно быстро. Хотя я не претендую на то что нету более хороших вариантов. Это так, как пример например. :=))#
← →
cjiohobaji (2003-07-21 07:40) [4]Не могу понять что происходит в строчке:
L:=TQrLabel(FindComponent("l"+Inttostr(i)));
с точки зрения ООП?
что такое L(он вроде бы нигде не описан), (Проблема в том что я пишу на Builder"e т. е. мне надо понять логику.), и вроде бы потом мы его не используем нигде.
Был бы признателен если бы вы пояснили смысл, т. е. все время жизни одного Label"а ?
мы его создаём, даём имя, дальше непонятно
Заранее благодарен
← →
Babay (2003-07-21 07:53) [5]L описано вот здесь смотри
Var
......
l:TQRLabel;// просто маленькая буква
в строке
L:=TQrLabel(FindComponent("l"+Inttostr(i)));
мы ищем лабель уже созданную ранее в процедуре QuickRep1BeforePrint там мы ей давали имя l1.Name:="L"+Inttostr(i);
а затем ее заполняем.
см хелп по FindComponent
L:=TQrLabel(... приведение типа к TQrLabel и присваивание указателя
а дальше смотри help по событию onNeedData для QR.
Еще посмотри примеры по QR поставляемые с билдером (надеюсь что они есть в поставке у Д точно есть) тама классный пример по этому делу есть. Я собственно с ним разобрался и все стало ясно как божий день. Удачи. Ежели че пиши... Помогу в силу своих знаний. (Но я пишу на Д так что необессудь...)
← →
Babay (2003-07-21 07:58) [6]Удалено модератором
Примечание: Личная переписка
← →
cjiohobaji (2003-07-21 10:21) [7]Большон спасибо
← →
Константин Ёпрст (2003-07-21 15:47) [8]// это рамки ячеек заголовка
...
// это рамки ячеек данных
...
Выглядит просто ужасно :(
В том же FreeReport/FastReport всё это делается куда как нативнее... Хотя бы те же рамки не надо рисовать - они-часть любого объекта (хочешь - ставь, не хочешь - отключай).
Для формирования отчётов из программных данных есть tfruserdataset, для отчётов с неизвестным наперёд числом столбцов - CrossTab.
Вобщем-то всё это и в QR можно приготовить - но, извините, тратить бОльшю часть времени в разработке проекта на вот такое приготовление?
в фасте это проще, быстрее, а по скорости формирования и печати вообще равных нет. Сейчас QR как страшный сон вспоминаю :)
← →
Просто Ёпрст (2003-07-21 17:16) [9]2 Константин Ёпрст & иже с ним
А можно в ванной спать - и не будет страшных снов.
А ещё можно приделать к велосипеду лыжи и кататься зимой.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c