AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi FlowChart-Inhalt in ein Metafile (EMF)...
Thema durchsuchen
Ansicht
Themen-Optionen

FlowChart-Inhalt in ein Metafile (EMF)...

Ein Thema von Herbie · begonnen am 21. Apr 2005 · letzter Beitrag vom 22. Apr 2005
Antwort Antwort
Herbie

Registriert seit: 23. Jul 2004
Ort: Augsburg
14 Beiträge
 
Delphi 6 Enterprise
 
#1

FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 21. Apr 2005, 08:39
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)
Jan Herbert
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 21. Apr 2005, 09:18
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
  Mit Zitat antworten Zitat
Herbie

Registriert seit: 23. Jul 2004
Ort: Augsburg
14 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 21. Apr 2005, 09:51
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 ?
Jan Herbert
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 21. Apr 2005, 12:53
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
  Mit Zitat antworten Zitat
Herbie

Registriert seit: 23. Jul 2004
Ort: Augsburg
14 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 21. Apr 2005, 14:34
@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?
Jan Herbert
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 21. Apr 2005, 14:37
Schau dir mal die Vererbungslinie von FlowChart an - eventuell musst du einen class hack benutzen um an die canvas property zu kommen. -- marabu
  Mit Zitat antworten Zitat
Herbie

Registriert seit: 23. Jul 2004
Ort: Augsburg
14 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: FlowChart-Inhalt in ein Metafile (EMF)...

  Alt 22. Apr 2005, 12:23
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)
Jan Herbert
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz