Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi FlowChart-Inhalt in ein Metafile (EMF)... (https://www.delphipraxis.net/44578-flowchart-inhalt-ein-metafile-emf.html)

Herbie 21. Apr 2005 07:39


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:
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;
Leider ist die EMF-Datei immer leer. Rufe ich die gleiche Funktion auf, angepasst auf ein TBitmap, dann funktioniert das Ganze.

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)

marabu 21. Apr 2005 08:18

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

Herbie 21. Apr 2005 08:51

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 ?

marabu 21. Apr 2005 11:53

Re: FlowChart-Inhalt in ein Metafile (EMF)...
 
Ich habe deine FlowChart-Komponente nicht, aber bei mir funktioniert das hier:
Delphi-Quellcode:
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;
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.

Grüße vom marabu

Herbie 21. Apr 2005 13:34

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?

marabu 21. Apr 2005 13:37

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

Herbie 22. Apr 2005 11:23

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:
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;
Gruss
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