Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Vpe (https://www.delphipraxis.net/174794-vpe.html)

oldWeasel 10. Mai 2013 12:04

Vpe
 
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.

Gruß
Daniel

stahli 10. Mai 2013 12:46

AW: Vpe
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.
Delphi-Quellcode:
procedure TodGame.ExportVPE;
var
  T: Double;
  S: String;
  TW, TH, XC, Y1, Y2, YGP: Double;
  I, C: Integer;
  H, W: Double;
  SP: TodSetPoints;

  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);

            if not odExist(GameParty.Team) then
              begin
                if Player <> nil then
                  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 <> nil then
                  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);
                            if not 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;
                                  if not 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;

            if not 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, '');

      S := CourtName;
      RenderWrite(0, 0, VFREE, VFREE, S);
      // TW := nRenderWidth;
      TH := nRenderHeight;
      Write(nLeftMargin + 1, Y2 + (0.75 / 2) - (TH / 2), -1.5, VFREE, '[N CE]' + S);
      PenSize := 0.03;

      {
        PenSize := 0.01;
        Write(nLeftMargin + 5, Y1, VFREE, VFREE, 'Beginn');
        WriteBox(nLeftMargin + 5, nBottom, -4, -0.75, '');
        if StartTime > 0 then
        S := FormatDateTime('dd.mm.yyyy, hh:nn', StartTime) + ' Uhr'
        else
        S := '';
        RenderWrite(0, 0, VFREE, VFREE, S);
        TW := nRenderWidth;
        TH := nRenderHeight;
        Write(nLeftMargin + 5, Y2 + (0.75 / 2) - (TH / 2), -4, VFREE, '[N CE]' + S);
        PenSize := 0.03;
      }

      Y1 := nBottom + 0.5;
      PenSize := 0.01;
      S := 'Spiel';
      RenderWrite(0, 0, VFREE, VFREE, S);
      TW := nRenderWidth;
      // TH := nRenderHeight;
      Write(XC - (TW / 2), Y1, VFREE, VFREE, S);
      Y2 := nBottom;

      S := Self.GameName(False);
      RenderWrite(0, 0, VFREE, VFREE, S);
      // TW := nRenderWidth;
      TH := nRenderHeight;
      Write(XC - 1, Y2 + (0.75 / 2) - (TH / 2), -2, VFREE, '[N CE]' + S);
      WriteBox(XC - 1, Y2, -2, -0.75, '');
      PenSize := 0.03;

      YGP := Y2;
      S := ':';
      RenderWrite(0, 0, VFREE, VFREE, S);
      TW := nRenderWidth;
      TH := nRenderHeight;
      C := GetMaxSetCount(Numerator);
      H := 5 / C;
      W := 2.25;
      if H > 2 then
        H := 2;
      for I := 0 to C - 1 do
        begin
          SP := GamePoints.SetPointsList.SetPoints(I);
          Y1 := nBottom + 0.2;
          S := ':';
          Write(XC - (TW / 2), Y1 + (H / 2) - (TH / 2), VFREE, VFREE, S);
          if Assigned(SP) then
            S := SP.SetPoint1.Text
          else
            S := '';
          Write(XC - W - 0.25, Y1 + (H / 2) - (TH / 2), -W, -H, '[N CE]' + S);
          WriteBox(XC - W - 0.25, Y1, -W, -H, '');
          if Assigned(SP) then
            S := SP.SetPoint2.Text
          else
            S := '';
          Write(XC + 0.25, Y1 + (H / 2) - (TH / 2), -W, -H, '[N CE]' + S);
          WriteBox(XC + 0.25, Y1, -W, -H, '');
        end;

      W := 6;
      PenSize := 0.01;
      WriteGameParty(nLeftMargin + 0.5, YGP, -W, -7, GamePartyContainer1.GameParty, False);
      WriteGameParty(nRightMargin - W - 0.5, YGP, -W, -7, GamePartyContainer2.GameParty, True);
      PenSize := 0.03;
    end;
end;

oldWeasel 10. Mai 2013 16:53

AW: Vpe
 
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.

stahli 10. Mai 2013 17:11

AW: Vpe
 
Also nochmal genauer.

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).

oldWeasel 13. Mai 2013 17:00

AW: Vpe
 
Ich danke dir,
Mit RenderWrite und nRenderHeight klappt das super.

Thx
Daniel

oldWeasel 4. Jul 2013 14:05

AW: Vpe
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz