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]
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]
Comment