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

C++Builder Discussion :

Affichage d'une form dans une nouvelle form


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 93
    Points : 46
    Points
    46
    Par défaut Affichage d'une form dans une nouvelle form
    Cette tâche en soit est très simple mais j'obtiens l'erreur suivante.

    Dans ma dll, j'ai les pages suivantes :
    ImageG.cpp
    et
    ListeImagesrapport.cpp

    Lors du clic sur une image de ma liste je veux pouvoir l'afficher en grand dans une nouvelle fenêtre
    J'ai donc crée la page ImageGrand.cpp, et l'ai ajouté au projet
    puis j'ai ajouté dans le code TFListeImagesRapport

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "ImageG.h"
     
    ...
     
    void __fastcall ::liste_imageDblClick(TObject *Sender)
    {
    ImageGrand->Show();
    }
    et donc quand je double clic sur mon image, j'ai l'erreur suivante :
    Access Violation at address 400EE72E in module 'vcl60.bpl'. Read of address 000002EC.

    La page ImageGrand contient juste un label pour le moment.

    Merci d'avance si vous voyez d'ou cela vient

  2. #2
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour
    l'appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ImageGrand->Show();
    nécessite qu'une instance de <imageGrand> a été créeé au préalable

    d'autre part dans le code ci-dessous qui a il avant les ::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall ::liste_imageDblClick(TObject *Sender)
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    Si j'ai suivi à peu près..... un truc comme ça devrait être ta solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "ImageG.h"
     
    ...
     
    void __fastcall TFListeImagesRapport::liste_imageDblClick(TObject *Sender)
    {
        TImageG *ImageGrand = new TImageG(NULL);
        ImageGrand->Show();
    }
    En d'autres mots, il faut que ta fonction liste_imageDblClick soit membre de ta classe (fiche) TFListeImageRapport, et ensuite avant de pouvoir afficher ta seconde fiche, il faut l'instancier, sinon c'est comme si tu demandais à ton prog d'afficher qqch qui n'existe pas.

    Voilou

  4. #4
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour
    le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TImageG *ImageGrand = new TImageG(NULL);
        ImageGrand->Show();
    crée une nouvelle instance de la fenêtre

    si on veut utiliser l'instance crée statiquement
    et en admettant que <ImageGrand> soit le nom de la fiche exportée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // dans le .h de la fiche <ImageGrand>
    extern PACKAGE TImageGrand *ImageGrand;
    // pour l'affichage
    ImageGrand->Show();
    la fiche étant contenue dans une DLL il est nécessaire qu'une instance de cette fiche soit construite au préalable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ImageGrand =TImageGrand(NULL)
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  5. #5
    Membre régulier
    Profil pro
    Concepteur traitement de signal
    Inscrit en
    Août 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Concepteur traitement de signal
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2004
    Messages : 192
    Points : 106
    Points
    106
    Par défaut
    je ne crois pas que l'affichage de la fiche se fasse via un dll, les deux fiches sont dans un dll qui sera utilisé ultérieurement c'est pas ça ?
    Bref ça change pas grand chose.

    En effet, dans mon "code" je crée dynamiquement la fiche, j'avais écrit aussi la possibilité de la créer statiquement, mais je me suis retenu, je suis dans une passe dynamique en ce moment

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    J'ai trouvé une solution !

    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
    void __fastcall TFListeImagesRapport::liste_imageDblClick(TObject *Sender)
    {       TListItem *ListItem;
     
            if (liste_image->SelCount != 0)
            {       liste_image->Visible = false;
                    int j = liste_image->Selected->Index;
     
                    // Si l'image est déjà affectée: on efface
                    if (img != NULL)
                            delete img;
     
                    // Attribution de l'image
                    Image1->Parent = this->Parent;
                    Image1->Top = 0;
                    Image1->Left = 0;
                    img =image(j);
                    Image1->Picture->Bitmap = img;
                    Image1->Height = 800;
                    Image1->Width = 800;
                    // Affichage
                    Image1->Visible = true;
                    // On affecte la fonction de double clic retour (réaffichage de la liste / on cache la grande image) à Image 1
                    Image1->OnDblClick = Image1DblClick;
     
                    DragImgBtn->Parent = Parent;
                    DragImgBtn->Visible = true;
                    DragImgBtn->Left = Parent->Width -  DragImgBtn->Width;
                    DragImgBtn->Tag = j;
            }
     
            TVisualisationGdeImg * tmp = new TVisualisationGdeImg(this);
            img->Height = 800;
            img->Width = 800;
            tmp->ChargerImage(img);
            tmp->ShowModal();
            tmp->Release();
    }

    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
    void __fastcall TVisualisationGdeImg::ChargerImage(Graphics::TBitmap* img)
    {       if (img)
            {       // Chargement de l'image
                    Image->Picture->Bitmap = img;
     
                    // Resize de la fenêtre en fonction de l'image, dans la limite de 70% de la hauteur de l'écran et 70% de la largeur
                    if ( Image->Picture->Bitmap->Width < (int)(Screen->Width*0.7))
                            Width = Image->Picture->Bitmap->Width+ 20 ;
                    else
                            Width = (int)(Screen->Width*0.7);
     
                    if ( Image->Picture->Bitmap->Height < (int)(Screen->Height*0.7))
                            Height = Image->Picture->Bitmap->Height + 40;
                    else
                            Height = (int)(Screen->Height*0.7);
                    Image->Visible = true;
            }
    }

    Il me reste juste à dimensionner l'image pour qu'elle fasse 800 par 800 et s'affiche entièrement dans la fenêtre...

    Merci pour votre aide

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    Enfin la je voudrais qu'elle conserve ses proportions d'origine mais qu'elles soient aux alentours de 800 par 600
    Je cherche
    Merci encore

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    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
    void __fastcall TFListeImagesRapport::liste_imageDblClick(TObject *Sender)
    {       TListItem *ListItem;
     
            if (liste_image->SelCount != 0)
            {       liste_image->Visible = false;
                    int j = liste_image->Selected->Index;
     
                    // Si l'image est déjà affectée: on efface
                    if (img != NULL)
                            delete img;
     
                    // Attribution de l'image
                    Image1->Parent = this->Parent;
                    Image1->Top = 0;
                    Image1->Left = 0;
     
                    Image1->Proportional = true;
                    Image1->Center = true;
                    Image1->Stretch = true;
     
                    img =image(j);
                    Image1->Picture->Bitmap = img;
                    Image1->Picture->Bitmap->Width = 500;
                    Image1->Picture->Bitmap->Height = 400;
                    // Affichage
                    Image1->Visible = true;
                    // On affecte la fonction de double clic retour (réaffichage de la liste / on cache la grande image) à Image 1
                    Image1->OnDblClick = Image1DblClick;
     
                    DragImgBtn->Parent = Parent;
                    DragImgBtn->Visible = true;
                    DragImgBtn->Left = Parent->Width -  DragImgBtn->Width;
                    DragImgBtn->Tag = j;
            }
     
            TVisualisationGdeImg * tmp = new TVisualisationGdeImg(this);
            tmp->ChargerImage(Image1->Picture->Bitmap);
            tmp->ShowModal();
            tmp->Release();
    }
    Image1->Proportional = true;
    Image1->Center = true;
    Image1->Stretch = true;

    Image1->Picture->Bitmap->Width = 500;
    Image1->Picture->Bitmap->Height = 400;

    J'ai esssayé avec ca mais j'ai des bandes blanches autour.
    Quelqu'un sait comment élargir l'image ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 93
    Points : 46
    Points
    46
    Par défaut
    Je suis sur la bonne voie avec le code suivant :

    Mais le problème c'est que l'image est déformé donc si j'ai une image disproportionné (plus haute que large ou beaucoup plus large que haute), j'aurai une image qui ne ressemble pas à grand chose.
    Je pensais que la propriété strecth conserverait les dimensions d'origine.

    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
        if (liste_image->SelCount != 0)
            {       //liste_image->Visible = false;
                    int j = liste_image->Selected->Index;
     
                    // Si l'image est déjà affectée: on efface
                    if (img != NULL)
                            delete img;
     
            img =image(j);
     
            Image1->Picture->Bitmap = img;
     
            Image1->Parent = this->Parent;
            Image1->Proportional = true;
            Image1->Stretch = true;
            Image1->AutoSize = false;
            Image1->Height = 500;
            Image1->Width = 600;
            Image1->Picture->Bitmap->Height = 500;
            Image1->Picture->Bitmap->Width = 600;
            Image1->Canvas->StretchDraw(TRect(0,0,600,500),GdesImages.at(j)->GetTampon());
            TVisualisationGdeImg * tmp = new TVisualisationGdeImg(this);
            tmp->ChargerImage(Image1->Picture->Bitmap);
          //  tmp->Height = 500;
         //   tmp->Width = 600;
            tmp->ShowModal();
            tmp->Release();             }

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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