Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Vektor Format anzeigen/drucken (https://www.delphipraxis.net/102812-vektor-format-anzeigen-drucken.html)

Gruber_Hans_12345 16. Nov 2007 09:17

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
Ich habe nicht einmal die Komponenten installiert bekommen... :(

ich schon

ps.: übrigens tolle fehlerbeschreibung ...

xaromz 17. Nov 2007 13:14

Re: Vektor Format anzeigen/drucken
 
Hallo,

ich habe jetzt eine Routine, die Kerning berücksichtigt. Die Textdarstellung verlangsamt sich dadurch zwar etwas, aber nur um den Faktor 7-10 :wink: .
Die neue Version findet sich auf meiner Seite.

Gruß
xaromz

torud 17. Nov 2007 15:27

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von Gruber_Hans_12345
ps.: übrigens tolle fehlerbeschreibung ...

Ich muss zu meiner Schande gestehen, dass die Fehlermeldung wirklich nicht besonders aussagekräftig war, aber so wie ich den Ersteller verstanden habe, funktioniert der ganze Spass leider unter Delphi6 nicht - Schade!

Gruber_Hans_12345 17. Nov 2007 15:39

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von xaromz
Hallo,

ich habe jetzt eine Routine, die Kerning berücksichtigt. Die Textdarstellung verlangsamt sich dadurch zwar etwas, aber nur um den Faktor 7-10 :wink: .
Die neue Version findet sich auf meiner Seite.

Gruß
xaromz

super! :)

also die schrift funktioniert jetzt perfekt ...

kannst du mir mit dem drucken noch mal kurz helfen?
Ich versuche die Seite, die genau 210*297 ist, original auf den drucker auszugeben (den Offset habe ich schon ausgerechnet)

aber wie kann ich die seite nun verschieben?


Delphi-Quellcode:
function MarginToMM(const Value, dpi : integer) : Extended;
begin
    Result := ((Value * 254) / dpi) / 100;
end;

        temp.BeginDoc;

        grPrinter := TGPGraphics.Create(temp.Canvas.Handle);
        try
            grPrinter.SetPageUnit(UnitMillimeter);

            margin.x       := -MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX), GetDeviceCaps(Printer.Handle, LOGPIXELSX));
            margin.y       := -MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY), GetDeviceCaps(Printer.Handle, LOGPIXELSY));
            SVGImage1.SVG.PaintTo(grPrinter, Bounds, nil, 0);
        finally
            grPrinter.Free;
        end;

        temp.EndDoc;

xaromz 17. Nov 2007 16:32

Re: Vektor Format anzeigen/drucken
 
Hallo,

das Drucken ist immer so eine Sache... Ich verwende da folgende Routine:
Delphi-Quellcode:
type
  TDeviceCaps = record
    Name: WideString;
    Index: Integer;
    Width,
    Height,
    DPIX,
    DPIY,
    OffsetX,
    OffsetY: Integer;
    PhysicalWidth,
    PhysicalHeight: Integer;
    PixelWidth,
    PixelHeight: Real;
    Orientation: TPrinterOrientation;
  end;

function GetPrinterCaps: TDeviceCaps;
var
  DC: THandle;
  Caps: TDeviceCaps;
begin
  DC := Printer.Handle;
  Caps.Orientation   := Printer.Orientation;
  Caps.Index         := Printer.PrinterIndex;
  Caps.Name          := Printer.Printers[Caps.Index];
  Caps.Width         := GetDeviceCaps(DC, HorzSize); // mm
  Caps.Height        := GetDeviceCaps(DC, VertSize); // mm
  Caps.DPIX          := GetDeviceCaps(DC, LogPixelSX); // DPI
  Caps.DPIY          := GetDeviceCaps(DC, LogPixelSY); // DPI
  Caps.OffsetX       := GetDeviceCaps(DC, PhysicalOffsetX); // Pixel
  Caps.OffsetY       := GetDeviceCaps(DC, PhysicalOffsetY); // Pixel
  Caps.PhysicalWidth := GetDeviceCaps(DC, PhysicalWidth); // Pixel
  Caps.PhysicalHeight := GetDeviceCaps(DC, PhysicalHeight); // Pixel
  Caps.PixelWidth    := (Caps.Width / Printer.PageWidth);
  Caps.PixelHeight   := (Caps.Height / Printer.PageHeight);
  Result := Caps;
end;

function GetPageRect(const Width, Height: Integer;
  const Caps: TDeviceCaps; Center: Boolean = True): TRect;
begin
  Result.Left := -Caps.OffsetX;
  Result.Top := -Caps.OffsetY;
  Result.Right := Result.Left + Round(Width / Caps.PixelWidth);
  Result.Bottom := Result.Top + Round(Height / Caps.PixelHeight);

  if Center then
  begin
    if Result.Right < Caps.PhysicalWidth then
    begin
      Result.Left := (Caps.PhysicalWidth - Result.Right) div 2;
      Inc(Result.Right, Result.Left);
    end;

    if Result.Bottom < Caps.PhysicalHeight then
    begin
      Result.Top := (Caps.PhysicalHeight - Result.Bottom) div 2;
      Inc(Result.Bottom, Result.Top);
    end;
  end;
end;

procedure TForm1.Print;
var
  R: TRect;
  Bounds: TGPRectF;
  Graphics: TGPGraphics;
  Caps: TDeviceCaps;
begin
  Caps := GetPrinterCaps;
  R := GetPageRect(Round(SVG.Width), Round(SVG.Height), Caps, False);
  Printer.BeginDoc;
  Bounds.X       := R.Left;
  Bounds.Y       := R.Top;
  Bounds.Width   := R.Right - R.Left;
  Bounds.Height  := R.Bottom - R.Top;

  Graphics := TGPGraphics.Create(Printer.Canvas.Handle);
  try
    Graphics.SetPageUnit(UnitPixel);
    Graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    SVG.PaintTo(Graphics, Bounds, nil, 0);
  finally
    Graphics.Free;
  end;
  Printer.EndDoc;
end;
Ob das bei Dir funktioniert, musst Du allerding selbst ausprobieren.

Gruß
xaromz

xaromz 17. Nov 2007 18:26

Re: Vektor Format anzeigen/drucken
 
Hallo,
Zitat:

Zitat von torud
Ich muss zu meiner Schande gestehen, dass die Fehlermeldung wirklich nicht besonders aussagekräftig war, aber so wie ich den Ersteller verstanden habe, funktioniert der ganze Spass leider unter Delphi6 nicht - Schade!

ich vermute mal, Du hast auf meiner Seite den Kommentar geschrieben. Gib doch mal die genaue Fehlermeldung an, dann kann man da vielleicht was machen.
Eventuell wäre dafür aber ein neuer Thread sinnvoll.

Gruß
xaromz

torud 18. Nov 2007 07:07

Re: Vektor Format anzeigen/drucken
 
Da liegst DU richtig. Eigentlich hatte ich doch schon die Fehlermeldung in Deinem Kommentarfenster geschrieben. Ich werde das Montag aber hier gern nochmal wiederholen, denn eigentlich wäre ich auch sehr an der Verwendung interessiert.

Mal nebenbei gefragt. Ist es eigentlich auch möglich andere Vektorgrafiken anzuzeigen? Ala *.ai von Adobe Illustrator?

xaromz 18. Nov 2007 08:44

Re: Vektor Format anzeigen/drucken
 
Hallo,
Zitat:

Zitat von torud
Da liegst DU richtig. Eigentlich hatte ich doch schon die Fehlermeldung in Deinem Kommentarfenster geschrieben. Ich werde das Montag aber hier gern nochmal wiederholen, denn eigentlich wäre ich auch sehr an der Verwendung interessiert.

das stimmt. Die Fehlermeldung war, dass NameValueSeparator nicht definiert ist. Ich vermute, der Fehler tritt in "WideStringList.pas" in Zeile 254 auf. Wenn ja, dann kannst Du die Zeile einfach auskommentieren.

Zitat:

Zitat von torud
Mal nebenbei gefragt. Ist es eigentlich auch möglich andere Vektorgrafiken anzuzeigen? Ala *.ai von Adobe Illustrator?

Klar ist das möglich. Du musst nur einen Parser für das Dateiformat schreiben und das Ergebnis irgendwie anzeigen :wink: . Die Arbeit werde ich mir aber momentan nicht machen. Freiwillige vor!

Gruß
xaromz

Gruber_Hans_12345 19. Nov 2007 07:33

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von xaromz
Hallo,

das Drucken ist immer so eine Sache... Ich verwende da folgende Routine:
Ob das bei Dir funktioniert, musst Du allerding selbst ausprobieren.

Gruß
xaromz

nein leider nicht, aber ich habe mir mal die SetBounds routine angeschaut, die verwendet ja x und y gar nicht ... zumindest sehe ich nix davon
daher wird das ganze dann ja auch sicher nicht um die ränder versetzt auf den drucker gezeichnet oder?

Bei mir ist auch die SVG.Height und SVG.Width beides 0, aber die proportionen stimmen bei mir ja beim drucken (wenn ich UnitMillimeter verwende)
mein SVG ist auch in millimeter ausgegben, und hat eine viewbox von genau 0,0,210,297

das problem ist nur, das die druckroutine das ganze in den druckbaren bereich druckt, und so habe ich einen versatz von 4 millimeter

Gruber_Hans_12345 19. Nov 2007 07:44

Re: Vektor Format anzeigen/drucken
 
so, habs nun hinbekommen, das er das ganz genau so druckt, wie es gehört ...

Delphi-Quellcode:
        bounds.X       := 0;
        bounds.Y       := 0;
        bounds.Width   := 210;
        bounds.Height  := 297;
        Printer.BeginDoc;

        Graphics := TGPGraphics.Create(Printer.Canvas.Handle);
        try
            Graphics.SetPageUnit(UnitMillimeter);
            Graphics.SetSmoothingMode(SmoothingModeAntiAlias);
            Graphics.TranslateTransform(-MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX), GetDeviceCaps(Printer.Handle, LOGPIXELSX)), -MarginToMM(GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY), GetDeviceCaps(Printer.Handle, LOGPIXELSY)));
            SVGImage1.SVG.PaintTo(Graphics, Bounds, nil, 0);
        finally
            Graphics.Free;
        end;

        Printer.EndDoc;
danke nochmal für alles und diese extrem geniale komponente!

Gruber_Hans_12345 19. Nov 2007 12:20

Re: Vektor Format anzeigen/drucken
 
hab noch ne frage ....

XML-Code:
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="210mm" height="297mm" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd"
viewBox="0 0 210 297"
 xmlns:xlink="&ns_xlink;">
der gibt mir nun im Corel den zusätzlichen Code oben "xmlns:xlink="&ns_xlink;"" mit aus
ich weiss nicht, warum, ich weiss nur, das er wenn das drinnen steht, die gesamte seite nicht parsen kann (es kommt rein gar nichts raus am schluß) ich muß diese zeile händisch rauslöschen, dann passt die seite perfekt

Was sollte dieser Parameter machen?

torud 19. Nov 2007 13:08

Re: Vektor Format anzeigen/drucken
 
So, also ich denke mal, dass ich alle Schritte durchgeführt habe. Also folgendes ist wohl installiert:

DirectX 9 Headers v1.0 (756 KB)
GDI+ v1.1 (108 KB)
MSXML 6 v1.2 (42 KB)

Danach wollte ich die

SVG-Bibliothek v0.65 (41 KB)

installieren, aber die benötigt wohl Teile aus der

Lists v1.0 (13 KB)!?

Also habe ich dass erstmal vorgezogen. Hier trat beim ompilieren folgender Fehler auf:

[Fehler] WideStringList.pas(254): Undefinierter Bezeichner: 'NameValueSeparator'

in der Zeile =>
Code:
FNameValueSeparator := WideChar(TStringList(Source).NameValueSeparator);
Also diese Zeile remarkt, compiliert und installiert. Danach habe ich dann die SVGPackage.dpk per Doppelklick aufgerufen und beim Compilieren diese Fehler erhalten:

[Fehler] SVGTypes.pas(34): 'END' erwartet, aber 'CLASS' gefunden
[Fehler] SVGTypes.pas(34): ';' erwartet, aber '(' gefunden
[Fehler] SVGTypes.pas(34): '=' erwartet, aber ')' gefunden
[Fehler] SVGTypes.pas(35): 'IMPLEMENTATION' erwartet, aber ';' gefunden
[Fehler] SVGTypes.pas(40): '.' erwartet, aber ';' gefunden
[Fehler] SVGTypes.pas(59): Undefinierter Bezeichner: 'TBounds'
[Fehler] SVGTypes.pas(69): ';' erwartet, aber 'IMPLEMENTATION' gefunden
[Fataler Fehler] SVG.pas(33): Verwendete Unit 'SVGTypes.pas' kann nicht compiliert werden

Dabei springt der Debugger in diese Zeile:

Code:
class operator Add(A, B: TSPoint): TSPoint;
Vielleicht hilft das JA!?

xaromz 19. Nov 2007 13:28

Re: Vektor Format anzeigen/drucken
 
Hallo,

da habe ich mit den Neuerungen von Delphi 2006 rumgespielt. Ich werde später eine neue Version hochladen, die auch unter älteren Delphi-Versionen kompiliert. Ich melde mich dann hier nochmal.

Gruß
xaromz

torud 19. Nov 2007 13:30

Re: Vektor Format anzeigen/drucken
 
Danke Dir schon jetzt!!!

xaromz 19. Nov 2007 13:52

Re: Vektor Format anzeigen/drucken
 
Hallo,

mir ist gerade aufgefallen, dass ich die neue Version schon hochgeladen hatte. Lad Dir nochmal die Version 0.65 runter.

Gruß
xaromz

torud 19. Nov 2007 14:04

Re: Vektor Format anzeigen/drucken
 
Ok, ich habs mir gezogen.

Wie kann ich jetzt ein SVG in einer TImage laden lassen???

Habe bis jetzt das hier installiert:
DirectX 9 Headers v1.0 (756 KB)
GDI+ v1.1 (108 KB)
MSXML 6 v1.2 (42 KB)
SVG-Bibliothek v0.65 (41 KB)
Lists v1.0 (13 KB)

Habe mir auch noch die SVGImage gezogen, aber wenn ich da eines der beiden Packages compilieren will, meckert der Kollege wieder.

vclactnband wird benötigt, konnte aber nicht gefunden werden...

kommt, wenn ich die SVGImagePackageD compilieren will...

Gruber_Hans_12345 19. Nov 2007 14:26

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
[Fehler] WideStringList.pas(254): Undefinierter Bezeichner: 'NameValueSeparator'

in der Zeile =>
Code:
FNameValueSeparator := WideChar(TStringList(Source).NameValueSeparator);


also einfach die zeile ersetzen mit

Delphi-Quellcode:
    FNameValueSeparator := WideChar('=');//TStringList(Source).NameValueSeparator);
dann funkt es (und ist glaub ich auch die einzige änderung, da man machen muß)

torud 19. Nov 2007 14:36

Re: Vektor Format anzeigen/drucken
 
Danke für deine Antwort...an dem Punkt sind wir zwar schon vorbei, aber ich werde es nochmal so compilieren, wie von Dir vorgeschlagen. Das aktuelle Problem ist die installation der SVG-Image, die ein vclactnband in den requires, hat, was , so glaube ich bei D6 noch nicht mit bei war...

Gruber_Hans_12345 19. Nov 2007 14:42

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
Danke für deine Antwort...an dem Punkt sind wir zwar schon vorbei, aber ich werde es nochmal so compilieren, wie von Dir vorgeschlagen. Das aktuelle Problem ist die installation der SVG-Image, die ein vclactnband in den requires, hat, was , so glaube ich bei D6 noch nicht mit bei war...

wirf einfach alle requires raus hab ich auch gemacht, er holt sich die meisten die er wirklich braucht eh wieder rein (und hat bei mir mit D6 funktioniert)

torud 19. Nov 2007 14:56

Re: Vektor Format anzeigen/drucken
 
Das nimmt irgendwie kein Ende. Jetzt findet er die DesignIntf.dcu nicht. Dann kann er mit GetFileVersion nix anfangen. Welches Package muss ich denn überhaupt compilieren und installieren??? Das mit D oder mit R am Ende!?

xaromz 19. Nov 2007 15:17

Re: Vektor Format anzeigen/drucken
 
Hallo,
Zitat:

Zitat von torud
Das nimmt irgendwie kein Ende. Jetzt findet er die DesignIntf.dcu nicht. Dann kann er mit GetFileVersion nix anfangen. Welches Package muss ich denn überhaupt compilieren und installieren??? Das mit D oder mit R am Ende!?

Die Packages brauchst Du beide. Das eine ist das Design-, das andere das Runtime-Package. Was das andere Problem angeht, so habe ich leider kein Delphi 6 und kann Dir deshalb leider nicht helfen :cry:.

Gruß
xaromz

torud 19. Nov 2007 15:21

Re: Vektor Format anzeigen/drucken
 
Naja aktuell hängt es ja nur noch am SVG-Image...

Gruber_Hans_12345 19. Nov 2007 15:41

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
Naja aktuell hängt es ja nur noch am SVG-Image...

und bei was hängst jetzt aktuell?

der design...?

füge einfach mal die designide.dcp manuell in die requires packages ein

torud 19. Nov 2007 15:47

Re: Vektor Format anzeigen/drucken
 
So, ich habs. Ich habe einfach mal die Dateien, die noch fehlten in einer anderen Delphi-Version gesucht und gefunden und dann die pas und dcu´s in den Komponenten-Ordner kopiert, von wo aus ich compiliert und installiert habe. Nicht ganz sauber, aber zumindest die SVG-image funzt jetzt endlich!!!

Jetzt muss ich nur noch herausbekommen, wie ich den Inhalt zur Laufzeit drehen und skalieren kann...

//Nachtrag
Ganz so einfach scheint es doch nicht zu sein, denn ich kann zwar zur DesignTime ein TSvgImage auf meinem Form platzieren, aber das Projekt lässt sich natürlich nicht kompilieren, da er mit der anderen SysUtils nicht klarkommt...

[Fehler] SysUtils.pas(16): Ungültige Compileranweisung: 'UNSAFE_TYPE'
[Fehler] SysUtils.pas(745): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(752): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(803): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(809): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(815): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(821): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(827): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(833): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(883): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(893): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1034): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1039): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1067): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1078): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1169): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1185): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(1191): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2197): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2199): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2205): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2207): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2215): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2217): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2397): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2652): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2661): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2679): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(2681): Deklaration erwartet, aber 'INLINE' gefunden
[Fehler] SysUtils.pas(6600): Undefinierter Bezeichner: 'VarToLStrProc'
[Fehler] SysUtils.pas(6600): Inkompatible Typen
[Fehler] SysUtils.pas(6601): Undefinierter Bezeichner: 'VarToLStrProc'
[Fehler] SysUtils.pas(7799): Undefinierter Bezeichner: 'VarToWStrProc'
[Fehler] SysUtils.pas(7799): Inkompatible Typen
[Fehler] SysUtils.pas(7800): Undefinierter Bezeichner: 'VarToWStrProc'
[Fehler] SysUtils.pas(13566): Undefinierter Bezeichner: 'SAccessViolationNoArg'
[Warnung] SysUtils.pas(13569): Symbol 'EStackOverflow' wird abgelehnt
[Fehler] SysUtils.pas(13574): Undefinierter Bezeichner: 'SVarInvalid'
[Fehler] SysUtils.pas(13829): Undefinierter Bezeichner: 'SAccessViolationArg3'
[Fehler] SysUtils.pas(14629): Undefinierter Bezeichner: 'CSTR_EQUAL'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'SysUtils.pas' kann nicht compiliert werden

Gruber_Hans_12345 19. Nov 2007 18:33

Re: Vektor Format anzeigen/drucken
 
@xaromz: habe noch eine frage

warum ist es eigentlich so, das wenn du einen text ausgibst, diesen immer gleich in einen Pfad umwandelst?
Geht das nur so?

Bin gerade dabei, das ich die SVG Grafik in ein PDF exportiere, und da verliere ich dann natürlich alle Text informationen, da die ja schon beim importieren in pfade gewandelt werden ... ich weiss zwar noch nicht, wie und was die pdf export engine dazu sagt, wenn ich mal einen GDI+ Text ausgebe, aber im moment hat ja noch nicht mal ein Adobe Acrobat eine chance, das ganze als text zu generieren ...

torud 19. Nov 2007 19:06

Re: Vektor Format anzeigen/drucken
 
Könnte mir nicht geholfen werden, indem ich schon vorkompilierte DCU´s nutze???

Gruber_Hans_12345 19. Nov 2007 20:29

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von Gruber_Hans_12345
@xaromz: habe noch eine frage

warum ist es eigentlich so, das wenn du einen text ausgibst, diesen immer gleich in einen Pfad umwandelst?
Geht das nur so?

Also geht auch anders, habe es hinbekommen, und sieht schon mal ganz gut aus ...

in der TKerningText.AddToGraphics ist noch ein Fehler drinnen, da muß das PrepareKerning mit dem Faktor verwendet werden, sonst passt der gezeichnete Text mit Kerning nicht ... (ist der abstand falsch)
Delphi-Quellcode:
function TKerningText.AddToGraphics(const Graphics: TGPGraphics;
  const Text: WideString; const Font: TGPFont; Origin: TGPPointF;
  const Format: TGPStringFormat; const Brush: TGPBrush): TStatus;
var
  P1, P2: PWideChar;
  Status: TStatus;
begin
  Status := Ok;
  if Text = '' then
  begin
    Result := Ok;
    Exit;
  end;
 
  PrepareKerning(Font, Graphics, TRUE); <<< hier gehört TRUE
und hier ist meine PaintToGraphics

Delphi-Quellcode:
procedure TSVGText.PaintToGraphics(Graphics: TGPGraphics);
var
  SF: TGPStringFormat;
  f : TGPFont;
  brush : TGPBrush;
  pointF   : TGPPointF;
  TGP : TGPMatrix;
  ClipRoot: TSVGBasic;
begin
  if FText = '' then
    Exit;

{$IFDEF DONT_USE_TEXT}
  inherited;
{$ELSE}
  SF := TGPStringFormat.Create(TGPStringFormat.GenericTypographic);
  SF.SetFormatFlags(StringFormatFlagsMeasureTrailingSpaces);

  pointF := MakePoint(X, Y - FFontHeight);

  f    := GetFont;
  try
    if Assigned(FClipPath) then
    begin
      if ClipURI <> '' then
      begin
        ClipRoot := TSVGBasic(GetRoot.FindByID(ClipURI));
        if Assigned(ClipRoot) then
        begin
          TGP := GetGPMatrix(ClipRoot.Matrix);
          Graphics.SetTransform(TGP);
          TGP.Free;
        end;
      end;
      try
        Graphics.SetClip(FClipPath);
      except
      end;
      Graphics.ResetTransform;
    end;

    TGP := GetGPMatrix(Matrix);
    Graphics.SetTransform(TGP);
    TGP.Free;

    Brush := GetFillBrush;
    if Assigned(Brush) and (Brush.GetLastStatus = OK) then
    try
        KerningText.AddToGraphics(Graphics, FText, f, pointF, SF, brush);
    finally
      Brush.Free;
    end;
  finally
    Graphics.ResetTransform;
    Graphics.ResetClip;
  end;
  f.Free;
  SF.Free;
{$ENDIF}
end;

Gruber_Hans_12345 19. Nov 2007 20:31

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
Könnte mir nicht geholfen werden, indem ich schon vorkompilierte DCU´s nutze???

wenn du mir sagst, welche dcu du benötigst, kann ich dir die schon irgendwie zukommen lassen ...
aber bei mir hat es mit D6 eigentlich fast keine probs beim installieren gegeben, den einen fehler in den widestrings raus, die requiered units ausmisten und dann lief das ganze schon fast ohne probs ...

xaromz 19. Nov 2007 23:00

Re: Vektor Format anzeigen/drucken
 
Hallo,
Zitat:

Zitat von Gruber_Hans_12345
warum ist es eigentlich so, das wenn du einen text ausgibst, diesen immer gleich in einen Pfad umwandelst?
Geht das nur so?

Das geht natürlich auch anders. Aber es ist so, dass in SVG Füllung und Rahmen einzeln definiert werden, und das ist nur mit Pfaden möglich.

Zitat:

Zitat von Gruber_Hans_12345
Bin gerade dabei, das ich die SVG Grafik in ein PDF exportiere, und da verliere ich dann natürlich alle Text informationen, da die ja schon beim importieren in pfade gewandelt werden ... ich weiss zwar noch nicht, wie und was die pdf export engine dazu sagt, wenn ich mal einen GDI+ Text ausgebe, aber im moment hat ja noch nicht mal ein Adobe Acrobat eine chance, das ganze als text zu generieren ...

GDI+-Texte sind im PDF kein Problem, schwierig wird's mit transparenten Texten. Die werden nämlich als Bitmap gezeichnet.

Zitat:

Zitat von Gruber_Hans_12345
in der TKerningText.AddToGraphics ist noch ein Fehler drinnen, da muß das PrepareKerning mit dem Faktor verwendet werden, sonst passt der gezeichnete Text mit Kerning nicht ... (ist der abstand falsch)

Nein, das False ist schon richtig an der Stelle. Wenn da ein True steht, werden bei mir die Buchstaben ineinander gezeichnet.

Gruß
xaromz

Gruber_Hans_12345 20. Nov 2007 07:33

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von xaromz
Zitat:

Zitat von Gruber_Hans_12345
in der TKerningText.AddToGraphics ist noch ein Fehler drinnen, da muß das PrepareKerning mit dem Faktor verwendet werden, sonst passt der gezeichnete Text mit Kerning nicht ... (ist der abstand falsch)

Nein, das False ist schon richtig an der Stelle. Wenn da ein True steht, werden bei mir die Buchstaben ineinander gezeichnet.

Gruß
xaromz

nein, ich habe es bei mir umgetellt, das ich texte immer direkt zeichnen lasse, damit die textinformationen im PDF erhalten bleiben, und wenn ich da FALSE drinnen lasse, dann habe ich statt 2mm abstand auf einmal 2cm abstand, gebe ich true rein, dann passt die asugabe 100% (genau so, wie wenn ich die text zuerst in pfade wandle)

edit: was dann natürlich nicht mehr funktioniert, ist wenn das SVG gestrecht werden soll, DANN werden wirklich die buchstaben übereinandergezeichnet ...

torud 20. Nov 2007 09:11

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von Gruber_Hans_12345
wenn du mir sagst, welche dcu du benötigst, kann ich dir die schon irgendwie zukommen lassen ...
aber bei mir hat es mit D6 eigentlich fast keine probs beim installieren gegeben, den einen fehler in den widestrings raus, die requiered units ausmisten und dann lief das ganze schon fast ohne probs ...

Guten Morgen,

ich habe nun folgendes getan. Ich lade mir die SVGImagePackageD und lösche dort direkt im Code vclactnband aus den reqiures. Dann will ich compilieren. Das scheitert dann aufgrund eines Fehlers. Der Compiler meckert, dass er GetFileVersion aus der Unit SVGImageList nicht kennt. Ich nehme mal an, dass das mit der neueren SysUtils zusammen hängt!?

Also ändere ich folgenden Code ab, da ich die IconListe nicht brauche sondern eigentlich nur das SVGImage brauche.
Aus
Code:
  if GetFileVersion(comctl32) >= ComCtlVersionIE6 then
    Result := SVGToIcon32(SVG)
  else
    Result := SVGToIcon24(SVG);
Wir dann
Code:
  //if GetFileVersion(comctl32) >= ComCtlVersionIE6 then
  //  Result := SVGToIcon32(SVG)
  //else
    Result := SVGToIcon24(SVG);
Nun schreibt mir der Compiler, dass er die Themes.dcu nicht finden kann. Diese gehört wohl auch nicht standardmäßig zu D6. Also wie gehts nun weiter?

Nachtrag
Es läuft nun!!! Danke!!!

torud 20. Nov 2007 10:17

Re: Vektor Format anzeigen/drucken
 
Ich habe noch was gefunden: Gradients werden leider noch nicht unterstützt...

getestet mit dieser Datei:

http://www.w3.org/TR/SVG/images/pservers/lingrad01.svg

Gruber_Hans_12345 20. Nov 2007 11:08

Re: Vektor Format anzeigen/drucken
 
habe noch ein gröberes problem ....

und zwar mit folgendem svg

Code:
<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="210mm" height="297mm" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd"
viewBox="0 0 210 297">
 <g id="Ebene_x0020_1">
  <metadata id="CorelCorpID_0Corel-Layer"/>
  <line fill="none" stroke="#AAA9A9" stroke-width="0.7056" x1="4" y1="29.04" x2="204" y2= "29.04" />
  <path fill="#131516" d="M65.4536 22.9805l0 3.6945 0.4196 0 0 -0.3359c0.1802,0.2647 0.4285,0.3971 0.7449,0.3971 0.3181,0 0.5908,-0.1249 0.8178,-0.3756 0.2273,-0.2502 0.341,-0.6049 0.341,-1.0633 0,-0.1934 -0.0269,-0.3748 -0.0809,-0.5441 -0.0537,-0.1701 -0.1284,-0.3148 -0.2235,-0.4347 -0.095,-0.1199 -0.2164,-0.2133 -0.3635,-0.2798 -0.1471,-0.0662 -0.3032,-0.0996 -0.4682,-0.0996 -0.2978,0 -0.5426,0.1206 -0.7345,0.3616l0 -1.3194 -0.4527 -0.0003 0 -0.0005zm0.631 1.59c0.1447,-0.172 0.3164,-0.2581 0.5153,-0.2581 0.197,0 0.3651,0.083 0.5037,0.2495 0.1386,0.1663 0.2083,0.4238 0.2083,0.7731 0,0.3405 -0.0724,0.5971 -0.2171,0.7691 -0.1448,0.1719 -0.3165,0.258 -0.5149,0.258 -0.2441,0 -0.438,-0.1168 -0.5808,-0.35 -0.0875,-0.1424 -0.1312,-0.3741 -0.1312,-0.6948 -0.0006,-0.326 0.0718,-0.5747 0.2167,-0.7468z"/>
  <line fill="none" stroke="#AAA9A9" stroke-width="0.7056" x1="4" y1="277" x2="204" y2= "277" />
 </g>
</svg>
die zweite linie wird nicht mehr richtig gedruckt (bzw alle linien, die nach dem path kommen, werden falsch gezeichnet)

aber nur, wenn ich das ganze in ein MetaFile zeichne, dem ich als Referenz einen HDC zu einem Drucker gebe ...

Delphi-Quellcode:
        FReferenceDC := CreateDC(ADriver, ADevice, nil, nil)
FCanvas := TMetafileCanvas.Create(FMetafile, FReferenceDC);

    SetMapMode(DC, MM_ANISOTROPIC);
    SetWindowExtEx(DC, Fpage_xres, Fpage_yres, nil);
    SetViewPortExtEx(DC, currX, currY, nil);
    SetViewPortOrgEx(DC, 0, 0, nil);
    SetWindowOrgEx(DC, 0, 0, nil);

hast du eine idee, woran das liegen kann?


edit:
also, es liegt irgendwie am pfad
folgender pfad funktioniert
Code:
<path fill="none" d="M80.2099 6.9461c-0.209,0 -0.3845,0.0697 -0.5269,0.2086 -0.1424,0.139 -0.2211,0.3249 -0.2363,0.5576l1.4992 0.0002c-0.0203,-0.2246 -0.0775,-0.3928 -0.172,-0.5049 -0.1453,-0.1743 -0.3332,-0.2615 -0.564,-0.2615z"/>
nach folgendem path sind alle linien falsch (sowohl direkt gezeichnete als auch die, die in Path umgewandelt wurden ...)
Code:
<path fill="#009FC6" d="M6.491 26.575c0.5687,0 1.0486,-0.4375 1.0486,-1.0127l0 -19.2078c0,-0.5546 -0.499,-0.9334 -1.0463,-0.9345 -0.5484,-0.0012 -1.0509,0.3479 -1.0509,0.9348l0 19.2451c0.0002,0.5699 0.4706,0.9751 1.0486,0.9751z"/>

Gruber_Hans_12345 20. Nov 2007 11:34

Re: Vektor Format anzeigen/drucken
 
hmmm, ich sehe gerade, das sobald ich einen path verwenden (Egal welchen - aber sobald der gezeichnet wird (der erste pfad oben hat fill="none" und wird deshalb nicht gezeichnet), dann passt das zeichnen von linien gar nicht mehr

ich zeichne zuerst das svg in ein TGPGraphic, dann mache ich ein
ResetTransform, ResetClip und ein erneutes ScaleTransform, aber die Linie (Die ich manuell zeichne ist nicht mehr dort, wo sie hingehört) das zeichnen des pfades hat irgendetwas verstellt, das ich mit diesen befehlen oben nicht mehr korrigieren kann ...


[edit]also, sobald ich wieder einen text ausgebe (aber nur mit DrawString, dann funktioniert das ganze wieder) also irgendwie kommt mir das ganze sehr komisch vor

torud 20. Nov 2007 13:57

Re: Vektor Format anzeigen/drucken
 
Ich habe mal noch eine kleine Frage. Das Drehen des SVG´s kann ich ja über
Delphi-Quellcode:
SVGImage1.SVG.Angle:=1
erledigen. Hat es einen Grund, warum der Angle nicht einfach von 1-360° geht? Und von wo nach wo geht denn der Angel im Falle des SVG´s? Ich nehme mal an von 0 - ?

Gruber_Hans_12345 20. Nov 2007 14:00

Re: Vektor Format anzeigen/drucken
 
Zitat:

Zitat von torud
Ich habe mal noch eine kleine Frage. Das Drehen des SVG´s kann ich ja über
Delphi-Quellcode:
SVGImage1.SVG.Angle:=1
erledigen. Hat es einen Grund, warum der Angle nicht einfach von 1-360° geht? Und von wo nach wo geht denn der Angel im Falle des SVG´s? Ich nehme mal an von 0 - ?

hast mal probiert ob der angel in rad angegeben werden muß? (also 0-2PI) (ohne testen, aber wäre logisch ...)

xaromz 20. Nov 2007 16:56

Re: Vektor Format anzeigen/drucken
 
Hallo,

Zitat:

Zitat von torud
Ich habe noch was gefunden: Gradients werden leider noch nicht unterstützt...

Eigentlich schon... ich werde die Tage mal schauen, was da schiefläuft.

Zitat:

Zitat von Gruber_Hans_12345
hast mal probiert ob der angel in rad angegeben werden muß? (also 0-2PI) (ohne testen, aber wäre logisch ...)

Genau.

Zitat:

Zitat von Gruber_Hans_12345
hmmm, ich sehe gerade, das sobald ich einen path verwenden (Egal welchen - aber sobald der gezeichnet wird (der erste pfad oben hat fill="none" und wird deshalb nicht gezeichnet), dann passt das zeichnen von linien gar nicht mehr

Muss ich mir ansehen. Das Problem kenne ich so nicht.

Zitat:

Zitat von Gruber_Hans_12345
nein, ich habe es bei mir umgetellt, das ich texte immer direkt zeichnen lasse, damit die textinformationen im PDF erhalten bleiben, und wenn ich da FALSE drinnen lasse, dann habe ich statt 2mm abstand auf einmal 2cm abstand, gebe ich true rein, dann passt die asugabe 100% (genau so, wie wenn ich die text zuerst in pfade wandle)

edit: was dann natürlich nicht mehr funktioniert, ist wenn das SVG gestrecht werden soll, DANN werden wirklich die buchstaben übereinandergezeichnet ...

Kannst Du mir da mal ein Bild (SVG + Screenshot) anhängen? Welche Schrift verwendest Du?

Gruß
xaromz

Gruber_Hans_12345 20. Nov 2007 19:06

Re: Vektor Format anzeigen/drucken
 
Liste der Anhänge anzeigen (Anzahl: 3)
das svg file

XML-Code:
<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="210mm" height="297mm" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd"
viewBox="0 0 210 297">
 <g id="Ebene_x0020_1">
  <metadata id="CorelCorpID_0Corel-Layer"/>
  <line fill="none" stroke="#AAA9A9" stroke-width="0.7056" x1="4" y1="29.04" x2="204" y2= "29.04" />
  <path fill="#131516" d="M65.4536 22.9805l0 3.6945 0.4196 0 0 -0.3359c0.1802,0.2647 0.4285,0.3971 0.7449,0.3971 0.3181,0 0.5908,-0.1249 0.8178,-0.3756 0.2273,-0.2502 0.341,-0.6049 0.341,-1.0633 0,-0.1934 -0.0269,-0.3748 -0.0809,-0.5441 -0.0537,-0.1701 -0.1284,-0.3148 -0.2235,-0.4347 -0.095,-0.1199 -0.2164,-0.2133 -0.3635,-0.2798 -0.1471,-0.0662 -0.3032,-0.0996 -0.4682,-0.0996 -0.2978,0 -0.5426,0.1206 -0.7345,0.3616l0 -1.3194 -0.4527 -0.0003 0 -0.0005zm0.631 1.59c0.1447,-0.172 0.3164,-0.2581 0.5153,-0.2581 0.197,0 0.3651,0.083 0.5037,0.2495 0.1386,0.1663 0.2083,0.4238 0.2083,0.7731 0,0.3405 -0.0724,0.5971 -0.2171,0.7691 -0.1448,0.1719 -0.3165,0.258 -0.5149,0.258 -0.2441,0 -0.438,-0.1168 -0.5808,-0.35 -0.0875,-0.1424 -0.1312,-0.3741 -0.1312,-0.6948 -0.0006,-0.326 0.0718,-0.5747 0.2167,-0.7468z"/>
  <line fill="none" stroke="#AAA9A9" stroke-width="0.7056" x1="4" y1="277" x2="204" y2= "277" />
  <text x="26.82" y="288.035" fill="#131516" font-weight="normal" font-size="2.8222" font-family="Arial">Bei Zahlungsverzug werden 1% Verzugszinsen pro Monat berechnet.</text>
 </g>
</svg>
habe dir die 3 pdfs mit angehängt, zweimal wegen dem kerning und einmal wegen dem path problem

mit folgendem code kann ich den Canvas (oder wie auch immer man das bei GDI+ nennt) wieder reparieren, danch funktionieren die normalen Linien wieder (ohne dem sehen normale einfache Linien sie wo oben im SVG definiert falsch aus)
und es ist auch egal, ob die Linie im SVG gezeichnet wird, oder ob ich die danach manuell auf das GPGraphic zeichne, er hat immer ein problem damit
Delphi-Quellcode:
Font   := TGPFont.Create('Arial', 8);
    Font.GetLogFontW(Graphics, LF);
    Font.Free;

xaromz 20. Nov 2007 19:59

Re: Vektor Format anzeigen/drucken
 
Hallo,

ich glaube, es liegt an diesem Teil:
Delphi-Quellcode:
  SetMapMode(DC, MM_ANISOTROPIC);
  SetWindowExtEx(DC, Fpage_xres, Fpage_yres, nil);
  SetViewPortExtEx(DC, currX, currY, nil);
  SetViewPortOrgEx(DC, 0, 0, nil);
  SetWindowOrgEx(DC, 0, 0, nil);
Damit manipulierst Du das Koordinatensystem im GDI. GDI+ verwendet aber ein eigenes Koordinatensystem, das mit dem GDI nur bedingt zu tun hat. Ich vermute, diese beiden kollidieren irgendwie. Das dürfte auch der Grund für den Kerning-Fehler sein. PrepareKerning geht nämlich davon aus, dass der DC, von dem die Auflösung geholt wird, aud MM_TEXT steht. Da müsste man also je nach MapMode unterschiedliche Faktoren nehmen.

Gruß
xaromz

PS: Es gibt eine neuer Version, die das Problem mit dem Gradient löst, und ein neues Demoprogramm, bei dem der Zoom endlich besser arbeitet.

Gruber_Hans_12345 20. Nov 2007 20:13

Re: Vektor Format anzeigen/drucken
 
ja, es liegt an dem teil, meine frage ist, aber warum?

ich kann linien zeichnen, texte ausgeben, alles ohne probleme funktioniert mit dem koordinatensystem perfekt, aber sobald ein path dabei ist, sind alle linien dahinter kaput, texte funktionieren wieder
wenn ich dann systematisch vor jeder ausgabe im GDI+ den teil mit dem logischen Font reinschreibe, dann passen fast alle pfade (ein einziger wird nicht an der richtigen stelle gezeichnet) - aber das sagt eigetnlich ja aus, das es kein problem mit dem koordinatensystem ist, sondern ein nebeneffekt - würde ich sagen ...

und das problem mit dem kerning (also dem , true und ,false) hat nix damit zu tun, dann auch auf dem bildschirm, ohne den ganzen mapmode und co gibt es das selbe problem, nur nicht ganz so gravierend, da passt es nur um den faktor 1.8 nicht


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.
Seite 2 von 3     12 3      

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