IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Impression StringGrid saut lignes vides


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 478
    Par défaut Impression StringGrid saut lignes vides
    Bonsoir,
    Je cherche à imprimer un StringGrid mais pas les lignes dont le contenu d'une cellule est vide.
    Ce code ne m'imprime pas la ligne mais réalise tout de même un saut de ligne; ce que je ne souhaite pas.
    J'ai tenté plusieurs variantes à partir de ce code mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    procedure PrintGrid(sGrid: TAdvStringGrid);
    var
    X1, X2 : Integer;
    Y1, Y2 : Integer;
    TmpI : Integer;
    F : Integer;
    TR : TRect;
    begin
    Printer.Title:='blabla';
    Printer.BeginDoc;
    Printer.Canvas.Pen.Color:=0;
    Printer.Canvas.Font.Name:='Verdana';
    Printer.Canvas.Font.Size:=12;
    Printer.Canvas.Font.Style:=[fsBold, fsUnderline];
    Printer.Canvas.TextOut(0, 100, Printer.Title);
          begin
          For F:=1 to sGrid.ColCount-1 do
                begin
                  X1:=0;
                  For TmpI:=1 to (F-1) do
                    X1:=X1+5*(sGrid.ColWidths[TmpI]);
                  Y1:=300;
                  X2:=0;
                  For TmpI:=1 to F do
                    X2:=X2+5*(sGrid.ColWidths[TmpI]);
                  Y2:=450;
                  TR:=Rect(X1, Y1, X2-30, Y2);
                  Printer.Canvas.Font.Style:=[fsBold];
                  Printer.Canvas.Font.Size:=8;
                  Printer.Canvas.TextRect(TR, X1+50, 350, sGrid.Cells[F, 0]);
                  Printer.Canvas.Font.Style:=[];
                  For TmpI:=1 to sGrid.RowCount-1 do
                 if sGrid.cells[2,TmpI]<>'' then       // je teste ici si la cellule est vide
                   begin
                    Y1:=150*TmpI+300;
                    Y2:=150*(TmpI+1)+300;
                    TR:=Rect(X1, Y1, X2-30, Y2);
                    Printer.Canvas.TextRect(TR, X1+30, Y1+30, sGrid.Cells[F, TmpI]);
                   end;
                end;
          end;
    Printer.EndDoc;
    end;
    Merci 1000x pour vos suggestions
    PhilLU

  2. #2
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour.

    Ton saut de ligne provient des valeurs Y1 et Y2 qui sont déterminées par TmpI
    Or TmpI = la ligne en cours dans le stringgrid et non pas la ligne en cours à imprimer.
    Tu as donc besoin d'une variable contenant la position de la dernière ligne imprimée.

    Je n'ai pas le temps maintenant de corriger ton code, mais voici un conseil :
    Ton impression se fait par 1 colonne entière à la fois. Ceci ne permet pas de gérer les éventuels sauts de page !
    Donc ta boucle principale devrait être de Row 0 à RowCount - 1.
    Et dans cette boucle, la boucle des colonnes.

    Cordialement
    Thierry

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    j'abonde dans le sens de th.william sur le fait que la boucle principale devrait se faire sur les lignes
    de plus je ferais une fonction (même interne à la procédure) genre function islignevide(ligne : integer) : Booleanpour séparer la partie test de la partie impression

    [edit] une intervention urgente et je vois que je me suis fait griller par Philippe (logique ma réponse est restée en suspend au moins une heure
    bref son EmptyRow correspond à la fonction que j'avais en tête (je l'aurais quand même mise en fonction )

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    [edit] une intervention urgente et je vois que je me suis fait griller par Philippe (logique ma réponse est restée en suspend au moins une heure
    bref son EmptyRow correspond à la fonction que j'avais en tête (je l'aurais quand même mise en fonction )
    Je me suis fait grillé par Thierry pour à peu près la même raison...
    Sinon, tout à fait d'accord pour la fonction. On peut aussi placer la partie traitant de l'entête dans une autre fonction...
    Mais je laisse un peu de "TAF" à notre demandeur PhilLu

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par PhilLU Voir le message
    Merci 1000x pour vos suggestions
    Posez le problème de manière moins ambigu...
    En donnant un jeu d'essai et le résultat attendu par exemple !
    Et en nommant les variables de manière plus intelligibles...

    Citation Envoyé par PhilLU Voir le message
    Je cherche à imprimer un StringGrid mais pas les lignes dont le contenu d'une cellule est vide.
    Ce ne serait pas plutôt les lignes dont toutes les cellules sont vides ?

    Enfin d'après ce que j'ai compris, j'aurais écrit un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    procedure PrintGrid2(sGrid: TStringGrid);
    var
      X, Y: Integer;
      ACol, ARow: Integer;
      EmptyRow: Boolean;
      TR : TRect;
    begin
      Printer.Title:='blabla';
      Printer.BeginDoc;
      Printer.Canvas.Pen.Color := 0;
      Printer.Canvas.Font.Name := 'Verdana';
      Printer.Canvas.Font.Size := 12;
      Printer.Canvas.Font.Style := [fsBold, fsUnderline];
      Printer.Canvas.TextOut(0, 0, 'blabla');
     
      //
      Printer.Canvas.Font.Size := 8;
     
      // Entête
      Printer.Canvas.Font.Style:=[fsBold];
      X := 0;
      for ACol := 1 to sGrid.ColCount - 1 do
      begin
        X := X + ACol * 50;
        TR := Rect(X, Y, X + Printer.Canvas.TextWidth(sGrid.Cells[ACol, 0]), Y + 50);
        Printer.Canvas.TextRect(TR, X, 100, sGrid.Cells[ACol, 0]);
      end;
      // Contenu
      Printer.Canvas.Font.Style:=[];
      Y := 0;
      for ARow := 1 to sGrid.RowCount - 1 do
      begin
        //
        EmptyRow := True;
        for ACol := 1 to sGrid.ColCount - 1 do
          if sGrid.Cells[ACol, Arow] <> '' then
          begin
            EmptyRow := False;
            Break;
          end;
        if EmptyRow then
          Continue;
        //
        X := 0;
        Y := Y + 50;
        for ACol := 1 to sGrid.ColCount - 1 do
        begin
          X := X + 50 * ACol;
          TR := Rect(X, Y, X + Printer.Canvas.TextWidth(sGrid.Cells[ACol, ARow]), Y + 50);
          Printer.Canvas.TextRect(TR, X, Y, sGrid.Cells[ACol, ARow]);
        end;
      end;
      Printer.EndDoc;
    end;

Discussions similaires

  1. Supprimer les sauts de lignes vides
    Par MobyKDIK dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/08/2015, 08h55
  2. [XL-2010] Masquage de lignes vides avant impression
    Par benadry dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 01/10/2013, 12h07
  3. Réponses: 4
    Dernier message: 23/04/2013, 10h21
  4. Réponses: 23
    Dernier message: 02/05/2007, 14h52
  5. [CR .NET] Table croisée: compléter avec lignes vides
    Par kartben dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 29/06/2004, 10h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo