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 14:10 Uhr)