Hi,
Ich teste aktuell die VPE zum generieren von Reporten,
leider hänge ich gerade an folgendem Problem.
Ich schreibe eine Unit die einen Report generiert, dort sind diverse felder die ich gut Positionieren kann,
das letzte Feld jedoch, ist ein Feld in dem ein Satz oder ein Aufsatz stehen könnte.
Kann ich irgendwie nach schreiben eines feldes die Position abfragen ? bzw. sehen wo ich nun entgültig stehen?
Sinn ist ich muss wissen ob ich vor dem Feld ein Pagebreak machen muss oder nicht.
Wenn ich Dich richtig verstehe könnte Dir nBottom in Verbindung mit RenderWrite weiter helfen.
Das ist halt nicht sehr komfortabel.
Ich hatte dem Hersteller mal einen SoftPageBreak vorgeschlagen. Man könnte dann einen solchen setzen und falls die nächste(n) Aktion(en) einen Seitenwechsel benötigen würden, sollte das Framework diesen hart einfügen. Sie wollten das aufnehmen, aber so häufig tut sich da scheinbar nichts...
Mal ein Beispiel anbei. Ich brauche da zwar keinen Seitenwechsel aber vielleicht findest Du eine Anregung.
procedure WriteGameParty(L, T, W, H: Double; GameParty: TodGameParty; RightFlag: Boolean); var
S: String;
SL, PL, PW: Double;
I, C: Integer;
Player: TodPlayer;
PlayerName: String; begin
StahliSportOptions.GamePaperPictures := gppLarge; with VPEStahliSport do begin if IsDoubleGame then
C := 2 else
C := 1; if odExist(GameParty.Team) then begin
BKGMode := VBKG_SOLID;
BKGColor := ColorLightness(clBlue, 235);
WriteBox(L, T, W, VFREE, '[N CE]' + GameParty.Team.LongName); if C = 2 then begin
T := T + 1; // H := H - 1; end else begin
T := T + 0.75; // H := H - 0.75; end;
BKGColor := clWhite;
BKGMode := VBKG_TRANSPARENT; end; for I := 1 to C do begin case I of
1: begin
Player := GameParty.Player1;
PlayerName := VPEPlayerName(Player, True, True); end;
2: begin
Player := GameParty.Player2;
PlayerName := VPEPlayerName(Player, True, True); end else begin
Player := nil;
PlayerName := ''; end; end; Write(L, T, W, VFREE, PlayerName);
ifnot odExist(GameParty.Team) then begin if Player <> nilthen
S := Player.GetClubName else
S := '';; if S = '' then
S := '';
TextColor := clGray; Write(L, nBottom, W, VFREE, '[N CE]' + S); end;
TextColor := clBlack;
WriteBox(L, T, W, nBottom, '');
T := nBottom; if StahliSportOptions.GamePaperPictures <> gppNone then begin
S := ''; if Player <> nilthen begin if Player <> PlayerBye then begin
S := PathTmp + 'PersonPicture' + Player.Person.odId + '.bmp';
Player.Person.PictureStream.SaveToFile(S); if C > 1 then begin
PW := (W / C) - (W / 10); ifnot RightFlag then
PL := L + Abs(W) - Abs(PW) else
PL := L;
Picture(PL, T, PW, PW, S); end else begin case StahliSportOptions.GamePaperPictures of
gppLarge: begin
PW := W;
PL := L;
Picture(PL, T, PW, PW, S); end;
gppSmall: begin
PW := W / 2; ifnot RightFlag then
PL := L + Abs(W) - Abs(PW) else
PL := L;
Picture(PL, T, PW, PW, S); end; end; end; end; end; end;
T := nBottom;
ifnot RightFlag then
SL := nRightMargin - 4 else
SL := nLeftMargin;
WriteBox(SL, nBottomMargin - 1.5, -4, -1.5, '[N CE S 10 I C Gray]Zeichen'); end; end; end;
begin with VPEStahliSport do begin // Margin := 1.3;
XC := nLeftMargin + ((nRightMargin - nLeftMargin) / 2);
T := nBottom + 0.25;
S := 'Spielzettel';
S := '' + S + '';
RenderWrite(0, 0, VFREE, VFREE, '[N S 12 CE I C White BC Gray U TO AO]' + S);
TW := nRenderWidth; // TH := nRenderHeight;
WriteBox(nLeftMargin, nTopMargin, nRightMargin, nBottomMargin, ''); Write(XC - (TW / 2), T, -TW, VFREE, '[N S 12 CE I C White BC Gray U TO AO]' + S); Write(XC - (TW / 2) + 0.01, T, -TW, VFREE, '[N S 12 CE I C Blue U T AO]' + S);
Y1 := T; // nBottom + 0.5;
PenSize := 0.01;
S := te.Sport.SportPlaceName; if S = '' then
S := 'Feld'; Write(nLeftMargin + 1, Y1, VFREE, VFREE, S + '-Nr.');
Y2 := nBottom;
WriteBox(nLeftMargin + 1, Y2, -1.5, -0.75, '');
Gibt es denn kein Befehl der mir die aktuelle Position anzeigt ?
Quasi letzter stand des Pointers left Top right Bottom ?
Das letzte Feld ist halt dynamisch, es kann einfach ein Wort drin stehen oder ein gesamter Text.
Ich muss halt schauen ob der Text überhaupt auf die Seite passt oder ich vorher ein pagebreak machen muss.
Wenn es ein Pagebreak gibt, muss ich erst den Header neu schreiben also einfach hart brechen schwierig.
In nBottom und nRight kannst Du nach einer Zeichenaktion die aktuelle Position abfragen.
Wenn Du also die nächste Zeile vertikal direkt bei nBottom (als oberen Rand) schreibst, dann sind beide Zeilen ohne Abstand untereinander.
Mit RenderWrite(0,0,Breite,Hoehe,MeinText) wird der Platzbedarf ermittelt (das Zeichnen wird nur simuliert).
Breite oder Hoehe sollte dann VFREE sein.
Mit nRenderHeight und nRenderWidth kannst Du dann den Platzbedarf ermitteln.
Davon abhängig kannst Du dann prüfen, ob die Seite genug Platz bieten (ich glaube über nBottomMargin).
Stahli http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
Hi Ho,
leider brauch ich nochmal hilfe bei der VP Engine ...
Ich Versuche einen großen Buchstaben auf ein Blatt zu bekommen, dieser soll im Hintergrund liegen, so das mein neuer Text drüber geschrieben wird.
alternativ ein bmp in den hintergrund oder ein Art Wasserzeichen einfügen.
Kann da jemand was zu sagen?
Gruß
Daniel
PS: erledigt ... die Reinfolge machts ... wenn einer trotzdem eine möglichkeit kennt, als stumpf
zweimal übereinander zu schreiben, würde ich mich freuen.
Geändert von oldWeasel ( 4. Jul 2013 um 15:10 Uhr)