Announcement

Collapse
No announcement yet.

Eigene Image Komponente - Problem: Pixel in RaveUnits/Punkte umrechnen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigene Image Komponente - Problem: Pixel in RaveUnits/Punkte umrechnen

    Hallo,

    ich schreibe für Rave 5.0.8 BE eine Image Komponente mit verschieden Scalierungsmöglichkeiten des Bildes (keine, immer, wenn größer) sowie der Positionierung (center, topleft usw.) innerhalb der Komponente unter Beibehaltung des Seitenverhältnisses.

    Abgeleitet von der Klasse TRaveGraphicImage.

    Dazu habe ich die beiden Funktionen
    - PrintImage (zuständig für das Zeichnen beim Drucken)
    - PaintImage (zuständig für das Zeichnen im Rave Designer)

    überschrieben. (abgeschaut von der TRaveGIFImage Komponente)

    Die Funktion PaintImage im Designer funktioniert, da hier mit Pixeln gearbeitet wird.

    <PRE>
    procedure TRExRaveScaleImage.PaintImage(Canvas: TCanvas; Dest: TRect);
    var
    SourceRect: TRect; // Rechteck des Bildes
    DrawRect: TRect; // Zeichenrechteck
    begin
    SourceRect.Left:= 0;
    SourceRect.Top:= 0;
    SourceRect.Right:= ActiveImage.Width; // Breite des geladenen Bitmaps
    SourceRect.Bottom:= ActiveImage.Height; // Höhe des geladenen Bitmaps

    // Breite, Höhe und Position des Zeichenrechtecks im Zielrechteck(Dest) der Komponente berechnen

    DrawRect:= ScaleRectInto(SourceRect, Dest, Scale, ScalePos);

    // Das Bild an die berechneten Koordinaten zeichnen

    Canvas.StretchDraw(DrawRect, ActiveImage);
    end;
    </PRE>

    Bei der Funktion PrintImage habe ich das Problem, das mit RaveUnits bzw. Punkten gearbeitet wird und ich nicht dahinterkomme wie ich die Pixelwerte des Bitmaps in RaveUnits oder Punkte umrechnen kann!
    Deshalb wird das Bitmap immer zuklein dargestellt.
    Die Positionierung funktioniert.

    Die Funktion von Rave XU2D/YU2D bzw. XD2U/YD2U wandeln RaveUnits in Punkte und umgekehrt um:

    function XU2D(Pos: double): longint;

    Hilfe Text:
    Diese Methode konvertiert die horizontale Maßeinheit, die durch Eigenschaften Units und UnitsFactor definiert wird, in die Maßeinheit der Druckerzeichenfläche (Punkt).

    Für Units habe ich im Designer sowie in der RvSystem Millimeter eingestellt.

    <PRE>
    procedure TRExRaveImage.PrintImage(Report: TBaseReport; X1,Y1,X2,Y2: TRaveUnits);
    var
    SourceRect: TRect; // Rechteck des Bildes
    DestRect: TRect; // Zeichenrechteck
    IntoRect: TRect;
    X1_,Y1_,X2_,Y2_: TRaveUnits;
    begin
    // Bitmap Maße übernehmen (in Pixeln)
    SourceRect.Left:= 0;
    SourceRect.Top:= 0;
    SourceRect.Right:= ActiveImage.Width; // Breite des geladenen Bitmaps in Pixeln
    SourceRect.Bottom:= ActiveImage.Height; // Höhe des geladenen Bitmaps in Pixeln

    // Komponenten Maße übernehmen (Millimeter bzw.Inch werden in Punkte umgewandelt. siehe Funktionsbeschreibung oben)
    IntoRect.Left:= Report.XU2D(X1); // Left der Komponente (RaveUnits -> Punkte)
    IntoRect.Top:= Report.YU2D(Y1); // Top der Komponente (RaveUnits -> Punkte)
    IntoRect.Right:= Report.XU2D(X2); // Right der Komponente (RaveUnits -> Punkte)
    IntoRect.Bottom:= Report.YU2D(Y2); // Bottom der Komponente (RaveUnits -> Punkte)

    // Breite, Höhe und Position des Zeichenrechtecks im Zielrechteck(Dest) der Komponente berechnen

    DestRect:= ScaleRectInto(SourceRect, IntoRect, Scale, ScalePos);

    // Die Werte des Zeichenrechtecks wieder in RaveUnits umwandeln

    X1_:= Report.XD2U(DestRect.Left); // Left der Zeichenrechtecks (Punkte -> RaveUnits)
    Y1_:= Report.XD2U(DestRect.Top); // Top der Zeichenrechtecks (RaveUnits -> RaveUnits)
    X2_:= Report.XD2U(DestRect.Right); // Right der Zeichenrechtecks (RaveUnits -> RaveUnits)
    Y2_:= Report.XD2U(DestRect.Bottom); // Bottom der Zeichenrechtecks (RaveUnits -> RaveUnits)

    // Das Bild an die berechneten Koordinaten zeichnen

    Report.PrintBitmapRect( X1_, Y1_, X2_, Y2_, TBitmap(ActiveImage));
    end;
    </PRE>

    ich benutze:
    Delphi 7 Enterprice
    Rave 5.0.8 BE leider kein Sourcecode zum abschreiben!!

    Vielen Dank

    Roland

    PS. Komponente kann wenn sie fertig ist gerne weitergegeben werden. bei Interesse mail an [email protected]

  • #2
    Hallo nochmal,

    ich habe die Funktion
    TBaseReport.PrintBitmap(X,Y: double; ScaleX, ScaleY: double; Bitmap: TBitmap )
    gefunden. Das Problem ist jedoch das ich mit dieser Funktion keine zentrierte Ausgabe hinbekomme. Und da ich nur die BE Version habe, kann ich mir auch nicht den code dieser Funktion von Nevrona anschauen.

    Vielen Dank

    Rolan

    Comment

    Working...
    X