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 :

[D6] Comment modifier la taille du Canvas d'un TImage ?


Sujet :

Composants VCL Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    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 664
    Points : 6 961
    Points
    6 961
    Par défaut [D6] Comment modifier la taille du Canvas d'un TImage ?
    Comment modifier la taille du Canvas d'un TImage ?

    J'ai retrouvé cette discution http://www.developpez.net/forums/d14...nvas-d-timage/, mais ça ne m'a pas aidé.
    Les dimensions du TPicture sont en lecture-seule, et je suppose qu'elles sont le reflet du TBitmap stocké dedans. Mais, dans mon cas, je n'ai pas d'image à charger. Je dessine juste dans son Canvas.

    Voici la création du TImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       ImageCurseur := TImage.Create(Self);
       ImageCurseur.Parent := PanelMarge;
       ImageCurseur.Height := PanelMarge.Height;
       ImageCurseur.Width := 17;
       ImageCurseur.Align := alLeft;      // <<<
       ImageCurseur.Canvas.Brush.Color := clWindow;
       ImageCurseur.Canvas.FillRect(Rect(0, 0, ImageCurseur.Width, ImageCurseur.Height));
       ImageCurseur.Canvas.Pen.Color := clBlue;
       ...
    Et son utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       ImageCurseur.Canvas.Brush.Color := clWindow;
       ImageCurseur.Canvas.FillRect(Rect(0, 0, ImageCurseur.Width, ImageCurseur.Height));
       ImageCurseur.Canvas.Brush.Color := clWhite;
       for i:=0 to Pred(_ListeLignes.Count) do
          ImageCurseur.Canvas.FillRect(Rect(0, ((i * HAUTEUR_PORTEE) + INIT_PORTEE - 3), ImageCurseur.Width, (i * HAUTEUR_PORTEE) + HAUTEUR_PORTEE - 3));
       ImageCurseur.Canvas.MoveTo(0, Y);
       ImageCurseur.Canvas.LineTo(ImageCurseur.Width, Y);
       ...
    La hauteur de son parent pouvant changer, avec l'alignement à alLeft la hauteur de TImage est bien modifiée.
    Mais, même en essayant de le répercuter sur le TBitmap, ça ne change rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       ImageCurseur.Picture.Bitmap.Height :=  ImageCurseur.Height;
       ImageCurseur.Picture.Bitmap.Width :=  ImageCurseur.Width;
    Comment modifier la taille du Canvas d'un TImage, sans devoir détruire et recréer le TImage ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ É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.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Lung Voir le message
    Comment modifier la taille du Canvas d'un TImage, sans devoir détruire et recréer le TImage ?
    c'est simple, un Canvas n'a pas de dimensions c'est comme si tu voulais connaître les dimensions d'un stylo, il n'en a pas, c'est la feuille de papier qui le limite dans son dessin.

    le Bitmap de TImage possède des dimensions qui ne sont pas forcément celles du TImage (voir Stretch), donc c'est à toi de redimensionner le bitmap.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    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 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    c'est simple, un Canvas n'a pas de dimensions c'est comme si tu voulais connaître les dimensions d'un stylo, il n'en a pas, c'est la feuille de papier qui le limite dans son dessin.
    Ah, ok.

    Citation Envoyé par Paul TOTH Voir le message
    le Bitmap de TImage possède des dimensions qui ne sont pas forcément celles du TImage (voir Stretch), donc c'est à toi de redimensionner le bitmap.
    Comment faire ?
    J'ai bêtement essayé ça, mais ça ne change rien (et je ne vois pas comment faire autrement):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       ImageCurseur.Picture.Bitmap.Height :=  ImageCurseur.Height;
       ImageCurseur.Picture.Bitmap.Width :=  ImageCurseur.Width;
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ É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.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Pourtant ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Image1.SetBounds(Image1.Left, Image1.Top, Image1.Width + 10, Image1.Height + 10);
      Image1.Picture.Bitmap.Width := Image1.Width;
      Image1.Picture.Bitmap.Height := Image1.Height;
      Image1.Canvas.TextOut(0, 0, format('%d x %d', [Image1.Width, Image1.Height]));
    end;
    sauf peut-être si ton TImage contient autre chose qu'un BITMAP

    Image1.Canvas retourne le Canvas de Image1.Picture.Bitmap, qui si l'image est vide, est créé automatiquement aux dimensions du TImage.

    par contre Image1.Picture.Bitmap retourne toujours un TBitmap, quitte à détruire l'image contenue dans le TImage si ce n'est pas un Bitmap, mais ne force pas ses dimensions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    // ici Image1 est vide (lors du premier clic)
      Image1.SetBounds(Image1.Left, Image1.Top, Image1.Width + 10, Image1.Height + 10);
    // Picture.Bitmap devient un TBitmap de taille nulle au départ, dont on change la largeur
      Image1.Picture.Bitmap.Width := Image1.Width;
    // maintenant on fixe la hauteur du bitmap
      Image1.Picture.Bitmap.Height := Image1.Height;
    // Image1.Canvas pointe sur Image1.Picture.Bitmap.Canvas
      Image1.Canvas.TextOut(0, 0, format('%d x %d', [Image1.Width, Image1.Height]));
    // le refresh se fait tout seul
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    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 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Pourtant ça fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Image1.SetBounds(Image1.Left, Image1.Top, Image1.Width + 10, Image1.Height + 10);
      Image1.Picture.Bitmap.Width := Image1.Width;
      Image1.Picture.Bitmap.Height := Image1.Height;
      Image1.Canvas.TextOut(0, 0, format('%d x %d', [Image1.Width, Image1.Height]));
    end;
    sauf peut-être si ton TImage contient autre chose qu'un BITMAP

    Image1.Canvas retourne le Canvas de Image1.Picture.Bitmap, qui si l'image est vide, est créé automatiquement aux dimensions du TImage.
    Effectivement, ton exemple fonctionne parfaitement bien.
    Mais dans mon application, non. L'erreur vient peut-être d'ailleur, mais je ne vois pas d'où.

    Mon TImage ne contient pas de bitmap. Il est créé dynamiquement sur un panel dans un TTabSheet, et je dessine dessus un trait et des lettres.
    Lorsque je génère dynamiquement le premier onglet, je vois bien le TImage.
    Nom : DVP - canvas.jpg
Affichages : 593
Taille : 70,9 Ko
    Au deuxième onglet, je suis obligé de minimiser et restaurer l'application pour voir le TImage.
    Au troisième onglet, je ne vois plus de TImage. Il est forcément créé, mais je ne sais pas s'il est mystérieusement invisible, ou si le Canvas a une taille nulle , ou ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       // Création.   
       ImageCurseur := TImage.Create(Self as TOngletMusique);
       ImageCurseur.Parent := PanelMarge;
       ImageCurseur.Height := PanelMarge.Height;
       ImageCurseur.Width := 17;
       ImageCurseur.Align := alLeft;
       ImageCurseur.Picture.Bitmap.Height := ImageCurseur.Height;      // << j'ai rajouté ça au cas où, mais ça ne change rien.
       ImageCurseur.Picture.Bitmap.Width := ImageCurseur.Width;      // << j'ai rajouté ça au cas où, mais ça ne change rien.
       ImageCurseur.Canvas.Brush.Color := clWindow;
       ImageCurseur.Canvas.FillRect(Rect(0, 0, ImageCurseur.Width, ImageCurseur.Height));
       ImageCurseur.Canvas.Pen.Color := clBlue;
       ImageCurseur.Canvas.Font.Name := 'Arial';
       ImageCurseur.Canvas.Font.Color := clBlue;
       ImageCurseur.Canvas.Font.Size := 8;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       // Utilisation.   
       ImageCurseur.Picture.Bitmap.Height := ImageCurseur.Height;      // << Je l'avais déjà ajouté, sans changement.
       ImageCurseur.Picture.Bitmap.Width := ImageCurseur.Width;      // << Je l'avais déjà ajouté, sans changement.
       ImageCurseur.Canvas.Brush.Color := clWindow;
       ImageCurseur.Canvas.FillRect(Rect(0, 0, ImageCurseur.Width, ImageCurseur.Height));
       ImageCurseur.Canvas.Brush.Color := clWhite;
       for i:=0 to Pred(_ListeLignes.Count) do
          ImageCurseur.Canvas.FillRect(Rect(0, ((i * HAUTEUR_PORTEE) + INIT_PORTEE - 3), ImageCurseur.Width, (i * HAUTEUR_PORTEE) + HAUTEUR_PORTEE - 3));
       ImageCurseur.Canvas.MoveTo(0, Y);
       ImageCurseur.Canvas.LineTo(ImageCurseur.Width, Y);
       ...
    Je ne vois pas ce qui pourrait causer ce phénomène ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ É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.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    panelMarge est créé dynamiquement par onglet également ? si tu lui colles un texte il apparaît bien ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    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 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    panelMarge est créé dynamiquement par onglet également ?
    Oui.

    Citation Envoyé par Paul TOTH Voir le message
    si tu lui colles un texte il apparaît bien ?
    J'ai carrément collé un bouton, et effectivement, quand je ne voyais rien, c'est le panel (père) qui n'était pas visible.
    J'ai surveillé sa position et sa taille pour chaque onglet, et ceux qui n'apparaissaient pas ont une largeur à 0 (en fait, elle serait même négative, si c'était possible).
    Et, tout ça par la faute du Align !
    et

    Apparemment, il ne faut pas compter sur le Align pour donner une dimension à un composant. Il faut donner soi-même les dimensions, et utiliser le align pour l'ancrage.
    Maintenant, pour ce composant, ça marche parfaitement. pour ton aide.
    Je vais creuser pour les autres ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ É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.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    tout à fait Align va jouer sur la position, mais si le composant est de largeur nulle il ne sera pas visible (sauf pour alClient évidemment)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    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 664
    Points : 6 961
    Points
    6 961
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    tout à fait Align va jouer sur la position, mais si le composant est de largeur nulle il ne sera pas visible (sauf pour alClient évidemment)
    Même avec Align à alClient, ça peut poser problème. J'ai eu un cas similaire dans un autre projet.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ É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.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

Discussions similaires

  1. Comment modifier la taille d'impression d'un Etat
    Par le_sniper dans le forum Access
    Réponses: 5
    Dernier message: 04/04/2006, 13h23
  2. Réponses: 2
    Dernier message: 20/02/2006, 16h06
  3. Comment modifier la taille de la page d'impression ?
    Par edam dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2005, 15h51
  4. Comment modifier la taille de la police dans Word ?
    Par djoao dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 11/12/2004, 12h49

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