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 :

[D2010] Pb sur l'agrandissement d'un TImage (bitmap)


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut [D2010] Pb sur l'agrandissement d'un TImage (bitmap)
    Dans mon outils de partitions (http://www.developpez.net/forums/d14...-fichier-midi/), je cherche à créer un aperçu avant impression.
    Chaque page A4, correspond à un TImage.
    Je dessine chaque partition dans une bitmap. Puis, j'agrandis le TImage courant de la hauteur de la dernière bitmap, et je dessine celle-ci au bas du TImage.

    Ca fonctionne bien, mais vers la cinquième page (environ : c'est aléatoire), lors de la quatrième ou cinquième bitmap, j'ai une erreur sur l'agrandissement du TImage courant.
    Le projet a provoqué une classe d'exception EOutOfResources avec le message 'Espace insuffisant pour traiter cette commande.'
    Je ne comprend pas pourquoi, puisque j'ai pu sans problème agrandir les TImage précédents (et même bien au-delà).
    J'ai regardé le gestionnaire de tâches, mais ça grimpe juste de 220 Mo avant de planter. Je suis loin d'avoir utilisé toute la mémoire disponible.

    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
    55
    56
    57
    58
    59
    60
    61
     
    const
       HAUTEUR_MAX = 4000;
    var
       nHauteur, i, nNbPages: Integer;
       BitmapImpression: TBitmap;
       Image: TImage;
    begin
     
    ...
     
          nHauteur := 0;      nNbPages := 1;
          FormApercuAvantImpression._ListeImages.Clear;
          FormApercuAvantImpression.AjouterImage;
          Image := (FormApercuAvantImpression._ListeImages[0] as TImage);
          Image.Height := 0;
     
          // Parcours des onglets.
          for i:=0 to Pred(PageControl.PageCount) do
          begin
             BitmapImpression := TBitmap.Create;
             try
                // Génération impression.
                (PageControl.Pages[i] as TOngletMusique).GenerationImpression(BitmapImpression);
     
                // Si hauteur maximum dépassée.
                if(nHauteur + BitmapImpression.Height) > HAUTEUR_MAX then
                begin
                   FormApercuAvantImpression.AjouterImage;
                   Image := (FormApercuAvantImpression._ListeImages[FormApercuAvantImpression._ListeImages.Count - 1] as TImage);
                   Image.Height := 0;
                   nHauteur := 0;      Inc(nNbPages);
                end;
     
                // Ajout de la partition générée sur l'image.
                Image.Height := Image.Height + BitmapImpression.Height;
                Image.Width := BitmapImpression.Width;
                try
                   Image.Picture.Bitmap.Height := Image.Height;      // <<< ERREUR ICI vers le cinquième tour.
                   Image.Picture.Bitmap.Width := Image.Width;
    //               Image.Canvas.Draw(0, nHauteur, BitmapImpression);
                   Image.Picture.Bitmap.Canvas.Draw(0, nHauteur, BitmapImpression);
                except
                   Break;
                end;
             finally
                BitmapImpression.Free;
             end;
     
             nHauteur := Image.Height;
     
    ...
     
          end;
     
    ...
     
       // Aperçu avant impression.
       FormApercuAvantImpression.ShowModal;
     
    ...
    Pour info, la procédure AjouterImage :
    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
     
    procedure TFormApercuAvantImpression.AjouterImage;
    const
       MARGE = 10;
    var
       Image: TImage;
    begin
       Image := TImage.Create(Self);
       Image.Parent := ScrollBox;
       Image.Left := 0;
       if _ListeImages.Count = 0 then
          Image.Top := 0
       else
          Image.Top := (_ListeImages[_ListeImages.Count - 1] as TImage).Top + (_ListeImages[_ListeImages.Count - 1] as TImage).Height + MARGE;
       Image.Height := 673;      Image.Width := 3500;
       _ListeImages.Add(Image);
     
    ...
    Qu'est ce que je n'ai pas compris dans l'utilisation du TImage ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Je suis tombé sur une discussion, qui suggérait d'augmenter la taille de la pile maximum. Je l'ai doublé, mais ça n'a rien changé.
    J'ai vu dans l'aide les procédures FreeImage et ReleaseHandle qui sont sensées gagner un peu de mémoire. Ça n'a rien changé non plus.

    Sur un forum, quelqu'un expliquait qu'il avait fait disparaitre cette erreur avec ce paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BitmapImpression.HandleType := bmDIB;
    Cette fois, je vais jusqu'à la page 11, à priori, sans erreur.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Windows] [XE7] Affectation d'un style à un Timage.Bitmap
    Par Invité dans le forum Composants FMX
    Réponses: 1
    Dernier message: 12/10/2014, 12h18
  2. Discussion sur l'agrandissement d'images
    Par millie dans le forum Contribuez
    Réponses: 11
    Dernier message: 15/04/2008, 15h35
  3. EInvalidGraphic sur chargement d'un jpeg dans un TImage
    Par tomtom7 dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/02/2007, 12h54
  4. Info bulle sur un TImage
    Par Dauphin dans le forum C++Builder
    Réponses: 4
    Dernier message: 30/09/2004, 13h56
  5. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06

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