AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vpe

Ein Thema von oldWeasel · begonnen am 10. Mai 2013 · letzter Beitrag vom 4. Jul 2013
Antwort Antwort
oldWeasel

Registriert seit: 7. Jan 2013
16 Beiträge
 
#1

Vpe

  Alt 10. Mai 2013, 13:04
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Vpe

  Alt 10. Mai 2013, 13:46
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;
Miniaturansicht angehängter Grafiken
sz.jpg  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
oldWeasel

Registriert seit: 7. Jan 2013
16 Beiträge
 
#3

AW: Vpe

  Alt 10. Mai 2013, 17:53
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Vpe

  Alt 10. Mai 2013, 18:11
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).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
oldWeasel

Registriert seit: 7. Jan 2013
16 Beiträge
 
#5

AW: Vpe

  Alt 13. Mai 2013, 18:00
Ich danke dir,
Mit RenderWrite und nRenderHeight klappt das super.

Thx
Daniel
  Mit Zitat antworten Zitat
oldWeasel

Registriert seit: 7. Jan 2013
16 Beiträge
 
#6

AW: Vpe

  Alt 4. Jul 2013, 15:05
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)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 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