![]() |
Folge von Diagrammen in FastReport ?
Hallo,
folgendes Problem: (Delphi2007, FastReport, W32, no Database) Ich habe eine 3D Matrix (i,j,k) und will deren k Ebenen (i,j) in k gleichen Diagrammen mit FastReport abbilden. In den normalen Forms kein Problem, aber wie bekomme ich diese k x (i,j)-Ebenen in k frxChart´s von frxReport (in einen k-seitigen Bericht) hinein? Ich will für k Ebenen in einem Bericht k gleichartige Diagramme, auf jede Seite ein Diagramm, bekommen. Aus den Demos bin ich hier nicht schlau geworden. Vielen Dank EB |
Re: Folge von Diagrammen in FastReport ?
Hallo,
Mit einer Folge von Diagrammen meinte ich soetwas wie die Zeilen in einer Tabelle, eine Zeile entspricht bei mir ein Diagramm. Als Diagrammtyp wollte ich ein 2D-Diagramm z=f(x,y) abbilden. Danke EB |
Re: Folge von Diagrammen in FastReport ?
Hallo,
damit mein Problem etwas verständlicher wird, werde ich nun etwas Programmcode beifügen.
Delphi-Quellcode:
procedure TF_Haupt.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean); begin eof := frxUserDataSet1.Tag > Bild.Bildzahl; end; procedure TF_Haupt.frxUserDataSet1First(Sender: TObject); begin frxUserDataSet1.Tag := 1; end; procedure TF_Haupt.frxUserDataSet1GetValue(const VarName: string; var Value: Variant); var i, j, k: integer; WertX, WertY: array of integer; WertZ: array of array of single; begin setlength(WertZ, DoseMatrix.Xdim + 2, DoseMatrix.Ydim + 2); setlength(WertX, DoseMatrix.Xdim + 2); setlength(WertY, DoseMatrix.Ydim + 2); // if VarName = 'Bild' then // begin // for j := 1 to Bild.Ydim do // begin // for i := 1 to Bild.Xdim do // begin // Value[i, j, frxUserDataSet1.Tag] := Bild.GrauMatrix[i, j, // frxUserDataSet1.Tag] * 65793; // end; // end; // end; if VarName = 'Dose' then begin for j := 1 to DoseMatrix.Ydim do begin for i := 1 to DoseMatrix.Xdim do begin WertZ[i, j] := DoseMatrix.Matrix[i, j, frxUserDataSet1.Tag].RelWert; end; end; Value := WertZ; end; if VarName = 'DoseX' then begin for i := 1 to DoseMatrix.Xdim do begin WertX[i] := i; end; Value := WertX; end; if VarName = 'DoseY' then begin for j := 1 to DoseMatrix.Ydim do begin WertY[j] := j; end; Value := WertY; end; end; procedure TF_Haupt.frxUserDataSet1Next(Sender: TObject); begin frxUserDataSet1.Tag := frxUserDataSet1.Tag + 1; end; procedure TF_Haupt.frxUserDataSet1Prior(Sender: TObject); begin frxUserDataSet1.Tag := frxUserDataSet1.Tag - 1; end; Nun einige Fragen dazu: 1. Kann ich für ein 2D-Chart der Form Z=f(x,y) in der Variable Value von frxDserDataSet1.Chart1 nur eindimensionale Arrays übergeben ? 2. Mir ist immer noch nicht klar: muss für eine no Database Anwendung ins Masterband4 von frxReport eine 0 oder 1 hinein ? 3. Wenn ich im FastReport k 2D-Diagramme aus der Matrix A(k,y,k) abbilden möchte, wo bringe ich den frxUserDataSet1.Tag unter ? ich werde noch 2 jpg´s nachsenden. Danke E.B. |
Re: Folge von Diagrammen in FastReport ?
Liste der Anhänge anzeigen (Anzahl: 1)
Nachsendung vom jpg Chart:
EB. |
Re: Folge von Diagrammen in FastReport ?
Liste der Anhänge anzeigen (Anzahl: 1)
Nachsendung des jpg´s Masterband.
(Beim Senden von zwei jpg´s kommt bei mir TimeOut, deshalb getrennte Sendung) Danke für Verständnis EB. |
Re: Folge von Diagrammen in FastReport ?
Also ich habe TfrxChart selten benutzt aber ich glaube das du die Datenquelle von Chart und die vom MasterData trennen musst.
Grund der Chart brauch ein 2 Zweidimensionales Feld zum Anzeigen und eine Tabelle ist Zweidimensionales und du willst ja eine 3. Dimension haben also eine 2 Tabelle. |
Re: Folge von Diagrammen in FastReport ?
Danke für die Antwort,
Hier noch ein kleiner Zusatz: Beim Compilieren und Laufenlassens des obigen Chaos´ kommt folgende Fehlermeldung: Im Project P_EB....exe ist eine Exception der Klasse EVariantTypeCastError mit der Meldung 'Varianre des Typs (Array Integer) konnte nicht in Typ (String) konvertiert werden' aufgetreten. Ich glaube, dass Eure Glaskugel jetzt mehr sagen kann. Danke EB. |
Re: Folge von Diagrammen in FastReport ?
Danke Frank,
wie aber trenne ich Datenquelle des Chart von Masterband und wie kriege ich elegant die Daten für ein 3D Diagramm z:=f(x,y) in das Chart von frxReport ? Da muß es doch einen Weg geben, denn sonst macht mein gewünschter Diagrammtyp in frxReport keinen Sinn. Danke EB. |
Re: Folge von Diagrammen in FastReport ?
Zitat:
-- Andreas |
Re: Folge von Diagrammen in FastReport ?
Hallo Andreas,
Dein Vorschlag mit dem Auslagern in ein bmp ist sehr gut, aus meinem Programm funktioniert das auch komplikationsfrei. Nur wie bekomme ich die Latte von Bmp#s zur Laufzeit ins frxReport ? Mein Wunsch wäre es, k Bilder auf k Seiten des Reports zu bekommen, je seite ein Bild. Vielen Dank EB. |
Re: Folge von Diagrammen in FastReport ?
Zitat:
- dateibasierend, wie angedeutet - direkt auf den Report-Canvas malen - im onGetValue-Event ein Bitmap/Dateiname übergeben Das hängt halt von Deinen Bedingungen ab und wieviel Arbeit Du da investieren willst. Schau Dir vielleicht auch einmal die Demos von FR an. -- Andreas |
Re: Folge von Diagrammen in FastReport ?
zum Thema Masterband von Chartdaten trennen:
- Chart Daten wie gehabt - Masterband auf [nicht zugeordnet] und Anzahl Datensätze 1 (Dann gibt´s das Masterband nur 1 mal mit einem Chart) ...ich hoffe, das nicht falsch verstanden zu haben :hi: |
Re: Folge von Diagrammen in FastReport ?
nochmal zu direkter Diagrammbildung in frx (direkte Datenübertragung in TFrxChartView):
wie übertrage ich denn eine 2D Matrix an Werten ins frxChart ? All meine Versuche endeten in Fehlermeldungen. (Siehe Code oben). Muß ich etwa die 2D-Matrix in einen 1D-Vektor übersaetzten und dann wieder im frx zusammensetzen? Wie gene ich im 2D-Fall (k 2D-Diagramme) mit dem UserDataSet.tag um ? Danke EB. |
Re: Folge von Diagrammen in FastReport ?
Hallo,
Was bedeuten TfrxChartView().SaveToMetaFile, TfrxChartView().SaveToStream oder TfrxChartView().LoadMetaFile, TfrxChartView().LoadStraem Danke EB |
Re: Folge von Diagrammen in FastReport ?
ich frage deshalb nochmal wegen des direkten Zugriffs auf FrxChart, da der Transfer über Picture1 Bitmap von der Bildqualität zu schlecht ist.
EB |
Re: Folge von Diagrammen in FastReport ?
Zitat:
Wenn also die/das exportierte Bitmap zu schlecht aufgelöst ist, vergrößere vor dem Export z.B. den Diagramm-Canvas und schalte insbesondere in FR stretching und dergleichen aus. -- Andreas |
Re: Folge von Diagrammen in FastReport ?
Liste der Anhänge anzeigen (Anzahl: 1)
Gut und Danke neo4a,
dann machen wir es so! Wie würdest Du es machen? Ich habe imFastreport Developer schon eine Seite (Page4) mit einem Masterband (MasterData4) und einem Image (Picture1) eingerichtet. Nun will ich aus meinem Delphiprogramm in meinem FR Report z.B 104 2D-Diagramme mit jeweils einer TContourSeries erzeugen (Den DiagrammTyp habe ich unten angehangen) Dazu habe ich FastReport 4.0 Programmer´s manual auf Seite 9-10 interessanten Code gefunden
Delphi-Quellcode:
Kann ich diesen Code nicht irgendwo gebrauchen ?
frxReport1.Clear
frxReport1.DataSet.Add(frxReport1); Page := TfrxDataPage.Create(frxReport1); Page.CreateUniqueName; Page.SetDefaults; Page.Orientation := poLandscape; Band := TfrxReportTitle.Create(Page); Band.CreateUniqueName; Band.Top := 0; Band.Height := 20; Memo :=TfrxMemoView.Create(Band); Memo.CreateUniqueName; Memo.Text := 'Hello'; Memo.Height := 20; Memo.Align := baWidth; DataBand := TfrxMasterData.Create(Page); DataBand.CreateUniqueName; DataBand.Top :=100; DataBand.Height := 20; Memo.DataSet := frxDBDataSet1; Memo.DataField := 'CustomNo'; Memo.SetBounds(0,0,100,20); Memo.Align := haRight; frxReport1.ShowReport; Frage nur, wo bringe ich diesen am Besten in meinem Delphiprogramm unter ? Vielen Dank EB. |
Re: Folge von Diagrammen in FastReport ?
Mit Dateien:
1. Erzeugst Du Deine 108 Diagramme und speicherst sie in einem Verzeichnis Deines Vertrauens. 2. im OnBeforePrint des Databands (FR-IDE) schreibst Du
Delphi-Quellcode:
3. im onGetValue Deines Reports (Delphi-IDE) schreibst Duif FINALPASS then begin fn:=[DIAGRAMM]; if fn>'' then Picture.Loadfromfile(fn); end;
Delphi-Quellcode:
Mit DB:
if uppercase(ParName)='DIAGRAMM' then begin
ParValue:=''; c:=Format(MainForm.AppDataDir+'Diagramm%d.bmp',[nr]); if FileExists(c) then ParValue:=c; end; 1. Erzeuge Deine 108 Diagramme und speichere Sie in einem Blob-Feld der passenden Tabelle 2. Verknüpfe die Tabelle mittels Master-Detail-Beziehungen 3. Referenziere Tabelle und Feld im tfrxPictureview Mit Code: 1. Erstelle alle Seiten aus Delphi heraus ohne visuelles Design. -- Andreas |
Re: Folge von Diagrammen in FastReport ?
Danke neo4a,
was ist die Variable c in Deinem ersten Beispiel, und was bedeutet die Funktion Format und was steht in nr ? Danke EB |
Re: Folge von Diagrammen in FastReport ?
Hallo heo4a,
hast Du Dir den Code so vorgestellt ? Hier irgendwo werden die 104 Diagramm im Hauptprogramm erzeugt und abgespeichert:
Delphi-Quellcode:
Dann kommt der Code in der FastReport-IDE unter dem gewünschten Masterband4:
. . .
for k := 1 to Bild.Bildzahl do begin CH_Bild1.Refresh; CH_Bild1.SaveToBitmapFile('G:\Daten_XP\Eigene RAD\EB_PDF_Arc\Daten\Pat\Test' + IntToStr(k) + '.bmp'); end; . . .
Delphi-Quellcode:
Und nun die für mich rätselhafte Stelle im OnGetValue in der Delphi-IDE:
procedure MasterData4OnBeforePrint(Sender: TfrxComponent);
begin if FINALPASS then begin fn:= [DIAGRAMM]; if fn>'' then Picture.LoadFromFile(fn); end; end;
Delphi-Quellcode:
Natürlich läuft der Code nicht bei mir. Der Debugger steht bei OnGetValue.
. . .
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TF_Haupt.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean); begin eof := frxUserDataSet1.Tag > Bild.Bildzahl - 1; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TF_Haupt.frxUserDataSet1First(Sender: TObject); begin frxUserDataSet1.Tag := 1; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TF_Haupt.frxUserDataSet1GetValue(const VarName: string; var Value: Variant); var i, j, k: integer; c: string; begin if UPPERCASE(VarName) = 'DIAGRAMM' then begin Value := ''; c := format('G:\Daten_XP\Eigene RAD\EB_PDF_Arc\Daten\Pat\Test' + IntToStr(frxUserDataSet1.tag) + '.bmp',[frxUserDataSet1.tag]); if FileExists(c) then Value := c; end; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TF_Haupt.frxUserDataSet1Next(Sender: TObject); begin frxUserDataSet1.Tag := frxUserDataSet1.Tag + 1; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ procedure TF_Haupt.frxUserDataSet1Prior(Sender: TObject); begin frxUserDataSet1.Tag := frxUserDataSet1.Tag - 1; end; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ . . . Variable c habe ich einfach als String deklariert. ? Habe ich das mit frxUserDataSet1.Tag richtig gemacht ? Wieso muß ich fn nicht deklarieren, was bedeuten DIAGRAMM und FINALPASS ? Vielen Dank für weitere Hilfe EB. |
Re: Folge von Diagrammen in FastReport ?
Zitat:
Zitat:
Zitat:
DIAGRAMM ist der Variablennamen, der zur Laufzeit im onGetValue belegt wird. Wenn Du ihn in der FR-IDE nicht vorher irgendwie mit einem Dummy-Wert belegst, wird die Druckvorschau in der IDE nicht funktionieren. Überhaupt funktioniert das alles nur zur Laufzeit Deiner App. Willst Du das auch zur Designzeit haben, sehe ich einen Weg über FR-UDF, aber ich denke, da Du derzeit noch nicht die Bedeutung von FINALPASS kennst ( FR-Systemvariable, die anzeigt, dass bei einem 2-Phasen-Report der 2. Lauf läuft), kommt dieser Weg noch etwas früh für Dich. Vielleicht noch einmal zum Prinzip: FR löst im Script die Variablennamen auf. Das können Datenfelder oder lokale oder globale Variablen sein. Solange alles im FR-Report passiert, müssen alle Varibalen dort deklariert und belegt sein, ansonsten gibt's Meldungen. onGetValue stellt nun dem Programmierer einen Mechanismus zur Verfügung, bei dem zur Laufzeit des Programmes der Wert außerhalb des FR-Reports belegt, verändert, gesetzt werden kann. Damit kann man Dinge machen, die man innerhalb FR nicht kann, weil man z.B. keinen Zugriff auf andere Delphi-Komponenten usw. hat. -- Andreas |
Re: Folge von Diagrammen in FastReport ?
Hallo Andreas,
vielen Dank für Deine ausführliche Antwort, Ich will nicht nerven, bin aber ein absoluter FR-Anfänger. Daher meine weitere Fragerei: Also kann ich die Procedures ...frxUserDataSet1First, ...frxUserDataSet1Next ... usw wegschmeissen? Wie werte ich dann die RecNo / nr in OnGetValue aus, wenn ich irgendwann im Delphiptogramm eine Liste von Bmp+s derart Bild1 Bild2 ... Bild104 erzeugt habe. Vielen Dank EB. |
Re: Folge von Diagrammen in FastReport ?
Wenn Du den frxUserDataSet1 an Dein FR-Databand hängst, übernimmt FR die Steuerung für Dich und dann geht es so:
Delphi-Quellcode:
if uppercase(ParName)='DIAGRAMM' then begin
ParValue:=''; c:=Format(MainForm.AppDataDir+'Diagramm%d.bmp',[frxUserDataSet1.RecNo]); if FileExists(c) then ParValue:=c; end; -- Andreas |
Re: Folge von Diagrammen in FastReport ?
Hallo Andreas,
nimm es mir nicht übel, es läuft so noch nicht bei mir. Entsprechend meines ProgrammCodes:
Delphi-Quellcode:
kennt mein Compiler nicht die Worte ParName und ParValue.
procedure TF_Haupt.frxUserDataSet1GetValue(const VarName: string;
var Value: Variant); var i, j, k: integer; c: string; begin if UPPERCASE(VarName) = 'DIAGRAMM' then begin Value := ''; c := format('G:\Daten_XP\Eigene RAD\EB_PDF_Arc\Daten\Pat\Diagramm%d.bmp',[frxUserDataSet1.RecNo]); if FileExists(c) then Value := c; end; end; Entsprechend meines Codes habe ich dafür VarName und Value genommen. Nun kennt mein Compiler auch nicht MainForm.AppDataDir. Unter F_Haupt. kennt er auch nicht AppDataDir Also habe ich da mit
Delphi-Quellcode:
versucht = Negativ.
'G:\Daten_XP\Eigene RAD\EB_PDF_Arc\Daten\Pat\'
Dann heißen meine abgespeicherten Bilder Test1 Test2 . . . Test104 Anstelle
Delphi-Quellcode:
habe ich
'G:\Daten_XP\Eigene RAD\EB_PDF_Arc\Daten\Pat\Diagramm%d.bmp'
Delphi-Quellcode:
genommen = Negativ.
'G:\Daten_XP\Eigene RAD\EB_PDF_Arc\Daten\Pat\Test%d.bmp'
Trotz Deiner ausführlichen Hilfe bei mir noch wildes probieren. Und dann noch ein Hinweis, in der FR-IDE habe ich im Masterband4 ein Bild Picture1 platziert, das ich nutzen wollte. Letzte Frage, Wo werden denn die Bilder im FR geladen ? Ich häre Dir für weitere geduldige Hilfe dankbar EB. |
Re: Folge von Diagrammen in FastReport ?
Wahrscheinlich findet er die Datei nicht. Das kann man leicht debuggen.
Ansonsten stammt der Code-Auszug aus (m)einer App, die ich vor Jahren mit FR2 entwickelt habe. Die offensichtlichen Anpassungen wollte ich Dir überlassen. Ich kann Dir sagen, dass das, was Du willst, mit FR4 umzusetzen ist, weil etwas ähnliches seit langem bei mir läuft. Erwarte aber bitte nicht meinen Ehrgeiz, Dir eine ready-to-go-Lösung zu liefern. Dafür denke ich leider zu kommerziell ;) -- Andreas |
Re: Folge von Diagrammen in FastReport ?
nur noch eine kurze Frage:
Zitat:
Er kann dieses folgendermaßen zur Laufzeit nicht auflösen ..kann typ Array nicht als String auflösen... Irgendwie muß ich aus DIAGRAMM das DataField, das ich im unstehendem Code als c übergeben habe, herausholen. Zitat:
Andreas war mir bei aller vorher geleisteter Unterstützung nur noch die Erklärung des Klammerausdrucks [...] schuldig. Meine Bankdaten werde ich nicht preisgeben, dafür aber Lob und Wertschätzung. EB |
Re: Folge von Diagrammen in FastReport ?
Hallo,
nach langen Mühen habe ich es endlich geschafft, eine Reihe von Bildern in einem FR4 Report auszugeben. Bin mit der Lösung auch ganz zufrieden. Ich habe festgestellt, dass man dazu alles aus der Delphi IDE steuern kann, also keinerlei Code in der FR4 IDE benötigt. Den benutzten Code habe ich unten angehangen.
Delphi-Quellcode:
Dazu fiel mir nur eine alte Frage aus Studienzeiten ein:
procedure TForm1.FormCreate(Sender: TObject);
begin sl := TStringList.Create; sl.Add('G:\Path\Test1.bmp'); sl.Add('G:\Path\Test2.bmp'); sl.Add('G:\Path\Test3.bmp'); sl.Add('G:\Path\Test4.bmp'); sl.Add('G:\Path\Test5.bmp'); sl.Add('G:\Path\Test6.bmp'); sl.Add('G:\Path\Test7.bmp'); sl.Add('G:\Path\Test8.bmp'); sl.Add('G:\Path\Test9.bmp'); end; procedure TForm1.Button1Click(Sender: TObject); begin FrxReport1.PrintOptions.Printer := 'Acrobat PDFWriter'; FrxReport1.FileName := 'G:\Path\TargetDoc.pdf'; StringDS.RangeEnd := reCount; StringDS.RangeEndCount := sl.Count; frxReport1.ShowReport; end; procedure TForm1.frxReport1BeforePrint(c: TfrxReportComponent); var Pict: TfrxPictureView; Name: string; begin if c is TfrxPictureView then begin Name := TfrxPictureView(c).Name; if Name = 'Picture1' then begin Pict := TfrxPictureView(c); Pict.Picture.LoadFromFile(sl[StringDS.RecNo]); end; end; end; Wieviel Versuche benötigt ein Affe, um "Romeo und Julia" auf einer Schreibmaschine zu tippen. Vielen Dank an Euch alle, neo4a darf diesen Code auch unentgeldlich benutzen. Eine Frage habe ich trotzdem noch: Zur Laufzeit in der Reportvorschau. Wenn ich den Printdialog zum Speichern der 'TargetDOC.pdf' aus der Druckvorschau heraus öffne, wird im Speicherdialog schon der richtige Dateiname 'TargetDOC.pdf' angezeigt, jedoch nicht der richtige Pfadname 'G:\Pfad'. Stattdessen steht dort 'C:\Dokumente und Einstellungen\Benutzer\Eigene Dateien'. Wie bekomme ich dem Speicherdialog unter der Reportvorschau den richtigen Pfadnamen beigebogen ? Viel Spass beim Knobeln und Frohe Ostern EB |
Re: Folge von Diagrammen in FastReport ?
kannst du mal ein bsp posten wie der chart am ende aussehen soll?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz