![]() |
FlowChart-Inhalt in ein Metafile (EMF)...
Hallo zusammen,
benutze die FlowChart-Komponente von DevExpress. Möchte nun den Inhalt einer FlowChart-Ansicht in eine EMF-Datei exportieren. Benutze hierzu folgende Funktion:
Delphi-Quellcode:
Leider ist die EMF-Datei immer leer. Rufe ich die gleiche Funktion auf, angepasst auf ein TBitmap, dann funktioniert das Ganze.
function GetFlowChartMetaFile(FC: TdxFlowChart): TMetafile;
var H, W, NewW: Integer; AAlign: TAlign; ABorder: TBorderStyle; SInfo: TScrollInfo; R: TRect; mCanvas: TMetaFileCanvas; begin Result := TMetaFile.Create; try H := FC.Height; W := FC.Width; AAlign := FC.Align; ABorder := FC.BorderStyle; SendMessage(FC.Parent.Handle, WM_SETREDRAW, 0, 0); SendMessage(FC.Handle, WM_SETREDRAW, 0, 0); FC.Align := alNone; FC.BorderStyle := bsNone; SInfo.cbSize := SizeOf(SInfo); SInfo.fMask := SIF_RANGE; if GetScrollInfo(FC.Handle, SB_HORZ, SInfo) then NewW := SInfo.nMax - SInfo.nMin + 1 else NewW := 0; if GetScrollInfo(FC.Handle, SB_VERT, SInfo) then FC.ClientHeight := SInfo.nMax - SInfo.nMin + 1; if NewW > 0 then FC.ClientWidth := NewW; Result.mmWidth := FC.ClientWidth; Result.mmHeight := FC.ClientHeight; mCanvas := TMetaFileCanvas.Create(Result,0); mCanvas.Brush := FC.Brush; mCanvas.FillRect(FC.ClientRect); mCanvas.Lock; try FC.PaintTo(mCanvas.Handle, 0, 0); finally mCanvas.Unlock; FC.Width := W; FC.Height := H; FC.BorderStyle := ABorder; FC.Align := AAlign; SendMessage(FC.Parent.Handle, WM_SETREDRAW, 1, 0); SendMessage(FC.Handle, WM_SETREDRAW, 1, 0); R := FC.Parent.ClientRect; Windows.InvalidateRect(FC.Parent.Handle, @R, FALSE); R := FC.ClientRect; Windows.InvalidateRect(FC.Handle, @R, FALSE); end; except Result.Free; raise; end; end; //Aufruf der Funktion procedure... var MImage: TMetafile; begin mImage := GetFlowChartMetafile(dxFlowChartGraphic); mImage.SaveToFile('c:\Temp\test3.emf'); end; Kann mir bitte jemand sagen, was ich falsch mache, oder ob es einen anderen Weg gibt aus einer Chart-Komponente ein Metafile zu erzeugen? Bin für jede Hilfe sehr dankbar! Gruss Jan (Herbie) |
Re: FlowChart-Inhalt in ein Metafile (EMF)...
Da du den Code aus der knowledgebase von devexpress verwendest, kann der Fehler nur an deinen Änderungen liegen.
Nach dem mCanvas.Unlock fehlt mCanvas.Free. Grüße vom marabu |
Re: FlowChart-Inhalt in ein Metafile (EMF)...
Danke marabu,
hab mCanvas.Free eingebaut. Jetzt habe ich zumindest schon mal ein kleines weißes Rechteck in meiner EMF-Datei. Aber ohne Inhalt und viel zu klein. Ist mir schon klar, das ich scheinbar irgendetwas falsch mache, bloß was ? |
Re: FlowChart-Inhalt in ein Metafile (EMF)...
Ich habe deine FlowChart-Komponente nicht, aber bei mir funktioniert das hier:
Delphi-Quellcode:
Vieles von dem was du (bzw. die demo) machst ist ja nur das Aufblasen des Bildes und das Zurücksetzen der Änderungen. Die von dir erzeugte EMF-Datei müsste dir sagen, welche Dimensionen sie hat. Könnte ein Hinweis sein auf die Fehlerursache.
var
mf: TMetaFile; mfc: TMetaFileCanvas; begin mf := TMetaFile.Create; mfc := TMetaFileCanvas.Create(mf, 0); mfc.CopyRect( mfc.ClipRect, fcCanvas, Image.ClientRect); mfc.Free; mf.SaveToFile('c:\test.emf'); mf.Free; end; Grüße vom marabu |
Re: FlowChart-Inhalt in ein Metafile (EMF)...
@marabu - Wollte das Code-Beispiel von Dir ausprobieren. Hab jetzt aber mit Erschrecken festgestellt, das die FlowChart-Komponete keine Canvas-Eigenschaft besitzt.
Gibt es einen Weg, über den Handle des FlowCharts auf die Zeichenfläche zu kommen? Oder kann ich den Inhalt des FlowCharts mit "PaintTo" in ein anderes Delphi-Objekt zeichnen (TImage oder was wäre besser?) und erstelle von da aus dann das Metafile? |
Re: FlowChart-Inhalt in ein Metafile (EMF)...
Schau dir mal die Vererbungslinie von FlowChart an - eventuell musst du einen class hack benutzen um an die canvas property zu kommen. -- marabu
|
Re: FlowChart-Inhalt in ein Metafile (EMF)...
Habs jetzt mit dem weiter unten angegebenen Code hinbekommen - mit dem Problem, das die Grafik das erzeugte Metafile nicht komplett ausfüllt. Die Grafik "hängt" links oben in dem Metafile, aber rechts und unten ist ein größerer Bereich nicht belegt. Was muss ich denn einstellen/berechnen, damit die Grafik das Metafile komplett ausfüllt?
Vielen Dank für eure Hilfe!
Delphi-Quellcode:
Gruss
function GetFlowChartMetaFile(FC: TdxFlowChart): TMetafile;
var H, W, NewW: Integer; AAlign: TAlign; ABorder: TBorderStyle; SInfo: TScrollInfo; R: TRect; mCanvas: TMetaFileCanvas; begin Result := TMetaFile.Create; mCanvas := TMetaFileCanvas.Create(Result,0); try H := FC.Height; W := FC.Width; AAlign := FC.Align; ABorder := FC.BorderStyle; SendMessage(FC.Parent.Handle, WM_SETREDRAW, 0, 0); SendMessage(FC.Handle, WM_SETREDRAW, 0, 0); FC.Align := alNone; FC.BorderStyle := bsNone; SInfo.cbSize := SizeOf(SInfo); SInfo.fMask := SIF_RANGE; if GetScrollInfo(FC.Handle, SB_HORZ, SInfo) then NewW := SInfo.nMax - SInfo.nMin + 1 else NewW := 0; if GetScrollInfo(FC.Handle, SB_VERT, SInfo) then FC.ClientHeight := SInfo.nMax - SInfo.nMin + 1; if NewW > 0 then FC.ClientWidth := NewW; // Result.Width := FC.ClientWidth; Result.Height := FC.ClientHeight; //Result.mmWidth := FC.ClientWidth; //Result.mmHeight := FC.ClientHeight; mCanvas.Brush := FC.Brush; mCanvas.FillRect(FC.ClientRect); mCanvas.Lock; try FC.PaintTo(mCanvas.Handle, 0, 0); finally mCanvas.Unlock; FC.Width := W; FC.Height := H; FC.BorderStyle := ABorder; FC.Align := AAlign; SendMessage(FC.Parent.Handle, WM_SETREDRAW, 1, 0); SendMessage(FC.Handle, WM_SETREDRAW, 1, 0); R := FC.Parent.ClientRect; Windows.InvalidateRect(FC.Parent.Handle, @R, FALSE); R := FC.ClientRect; Windows.InvalidateRect(FC.Handle, @R, FALSE); mCanvas.Free; end; except Result.Free; end; end; Jan (Herbie) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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