QuickReport
4 отговора
205 прегледа
QuickReport
Има ли идея някой как мога да обединя два отделни QuickReport-а с по една станица в трети QuickReport които да се добавят двете страници?
10x :)
10x :)
Re: QuickReport
Не знам с коя версия на QReport-a работиш - но виж дали имаш това TQRCompositeReport в лентата с компонентите. Мисля, че това ти трябва.
---

---
Re: QuickReport
Версията е 4.04 за Delphi 6 но проблема е, че когато вмъквам в CompositeReport страници от друг Report които е свързан към DataSet в CompositeReport-а остава само послдната страница която е генерирана посредством DataSet-a, a на мен ми трябва да изпатя две страници като един PrintJob за да ползвам Duplex режим на принтера.
Re: QuickReport
Моите съболезнования ;-)))) Това явно е нов бъг в Q4.04 - аз персонално намерих още една "изпростявка" - погледни (както предполагам имаш сорса) в
qrctrls.pas - и намери това
procedure TQRImage.Print(OfsX,OfsY : Integer);
има дефиниран един tempmap : TBitMap
if Stretch then <------------ ако флага ти е сетнат - вси4ко е ок ама ако не е .....
begin
QRPrinter.Canvas.StretchDraw(Dest, Picture.Graphic);
end
else
begin
IntersectClipRect(QRPrinter.Canvas.Handle, Dest.Left, Dest.Top, Dest.Right, Dest.Bottom);
DC := GetDC(QRPrinter.Canvas.Handle);
SavedDC := SaveDC(DC);
Dest.Right := Dest.Left +
round(Picture.Width / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.XFactor);
Dest.Bottom := Dest.Top +
round(Picture.Height / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.YFactor);
if Center then OffsetRect(Dest, (QRPrinter.XSize(Size.Width) -
round(Picture.Width / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.XFactor)) div 2,
(QRPrinter.YSize(Size.Height) -
round(Picture.Height / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.YFactor)) div 2);
tempmap := TBitmap.Create;
tempmap.Assign(Picture.Graphic); <------------- E те тука пуца много яко
;-))) това е с D7 - избора е да се включи флага за strech ;-)))
Някой си е оставил пръсчетата при тестването ;-)))
Явно въпреки, че се стараят да отстраняват много от старите грешки - успешно продуцират нови при това на доста важни места ;-)))
Порови се в кода може да намериш решение на проблема си - нищо чудно да е нещо от сорта на тази временна променлива.
Айде и успех.
---

qrctrls.pas - и намери това
procedure TQRImage.Print(OfsX,OfsY : Integer);
има дефиниран един tempmap : TBitMap
if Stretch then <------------ ако флага ти е сетнат - вси4ко е ок ама ако не е .....
begin
QRPrinter.Canvas.StretchDraw(Dest, Picture.Graphic);
end
else
begin
IntersectClipRect(QRPrinter.Canvas.Handle, Dest.Left, Dest.Top, Dest.Right, Dest.Bottom);
DC := GetDC(QRPrinter.Canvas.Handle);
SavedDC := SaveDC(DC);
Dest.Right := Dest.Left +
round(Picture.Width / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.XFactor);
Dest.Bottom := Dest.Top +
round(Picture.Height / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.YFactor);
if Center then OffsetRect(Dest, (QRPrinter.XSize(Size.Width) -
round(Picture.Width / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.XFactor)) div 2,
(QRPrinter.YSize(Size.Height) -
round(Picture.Height / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.YFactor)) div 2);
tempmap := TBitmap.Create;
tempmap.Assign(Picture.Graphic); <------------- E те тука пуца много яко
;-))) това е с D7 - избора е да се включи флага за strech ;-)))
Някой си е оставил пръсчетата при тестването ;-)))
Явно въпреки, че се стараят да отстраняват много от старите грешки - успешно продуцират нови при това на доста важни места ;-)))
Порови се в кода може да намериш решение на проблема си - нищо чудно да е нещо от сорта на тази временна променлива.
Айде и успех.
---
Re: QuickReport
Здравей отново,
Проблема се оказа съсвсем друг, значи тази тъпа контрола не си менжира правилно паметта и в един момент системата остава без свободна памет, което води до всевъзможни грешки. Явно доста хора имат проблем с memory leak в QuickReport (за справка виж Google :). CompositeReport работи толкова бавно, че чак ти се струва невероятно :) затова експортнах двете отделни страници към QRP файлове и след това ги обединих с функцията която съм постнал по-долу, но въпреки това пак не се освобождава заетата памет (поне работи бързо).
function Combine2QRP(dstFileName: string; srcFileName1 : String; srcFileName2 : String): integer;
var
plSrc, plDest: TQRPageList;
aMetafile: TMetafile;
aFileHeader: TQRFileHeader;
nIdx: integer;
begin
result := 0;
if FileExists(dstFileName) then
try
DeleteFile(dstFileName)
except
result := -1;
end;
if not FileExists(srcFileName1) then result := -2;
if not FileExists(srcFileName2) then result := -3;
if result = 0 then
begin
plSrc := TQRPageList.Create;
plDest := TQRPageList.Create;
//plDest.Stream.InMemory := True;
plDest.Stream := TQRStream.Create(100000);
with plSrc do
begin
//file 1
Clear;
LoadFromFile(srcFileName1);
aMetaFile := GetPage(1);
plDest.AddPage(AMetafile);
{ for nIdx := 1 to PageCount do
begin
aMetaFile := GetPage(nIdx);
plDest.AddPage(AMetafile);
end; }
//file 2
Clear;
aMetaFile.Free;
LoadFromFile(srcFileName2);
aMetaFile := GetPage(1);
plDest.AddPage(AMetafile);
{ for nIdx := 1 to PageCount do
begin
aMetaFile := GetPage(nIdx);
plDest.AddPage(AMetafile);
end; }
end;
with plDest.Stream do
begin
Position := 0;
Read(aFileHeader, SizeOf(TQRFileHeader));
aFileHeader.PageCount := plDest.PageCount;
Position := 0;
write(aFileHeader, SizeOf(TQRFileHeader));
end;
plDest.SaveToFile(dstFileName);
plDest.free;
plSrc.free;
aMetaFile.Free;
end;
end;
Проблема се оказа съсвсем друг, значи тази тъпа контрола не си менжира правилно паметта и в един момент системата остава без свободна памет, което води до всевъзможни грешки. Явно доста хора имат проблем с memory leak в QuickReport (за справка виж Google :). CompositeReport работи толкова бавно, че чак ти се струва невероятно :) затова експортнах двете отделни страници към QRP файлове и след това ги обединих с функцията която съм постнал по-долу, но въпреки това пак не се освобождава заетата памет (поне работи бързо).
function Combine2QRP(dstFileName: string; srcFileName1 : String; srcFileName2 : String): integer;
var
plSrc, plDest: TQRPageList;
aMetafile: TMetafile;
aFileHeader: TQRFileHeader;
nIdx: integer;
begin
result := 0;
if FileExists(dstFileName) then
try
DeleteFile(dstFileName)
except
result := -1;
end;
if not FileExists(srcFileName1) then result := -2;
if not FileExists(srcFileName2) then result := -3;
if result = 0 then
begin
plSrc := TQRPageList.Create;
plDest := TQRPageList.Create;
//plDest.Stream.InMemory := True;
plDest.Stream := TQRStream.Create(100000);
with plSrc do
begin
//file 1
Clear;
LoadFromFile(srcFileName1);
aMetaFile := GetPage(1);
plDest.AddPage(AMetafile);
{ for nIdx := 1 to PageCount do
begin
aMetaFile := GetPage(nIdx);
plDest.AddPage(AMetafile);
end; }
//file 2
Clear;
aMetaFile.Free;
LoadFromFile(srcFileName2);
aMetaFile := GetPage(1);
plDest.AddPage(AMetafile);
{ for nIdx := 1 to PageCount do
begin
aMetaFile := GetPage(nIdx);
plDest.AddPage(AMetafile);
end; }
end;
with plDest.Stream do
begin
Position := 0;
Read(aFileHeader, SizeOf(TQRFileHeader));
aFileHeader.PageCount := plDest.PageCount;
Position := 0;
write(aFileHeader, SizeOf(TQRFileHeader));
end;
plDest.SaveToFile(dstFileName);
plDest.free;
plSrc.free;
aMetaFile.Free;
end;
end;