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

 Delphi Discussion :

Récuperer sur une autre fiche avec un Timage, plusieurs formats !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut Récuperer sur une autre fiche avec un Timage, plusieurs formats !
    Bonjour à toutes et à tous,

    J'ai une première fiche ou j'éffectue un drag and drop compatible avec les formats, *.jpg et *.bmp.

    Cela fonctionne et je souhaiterai avec la seconde fiche, récupérer ans un Timage le contenu du Timage de ma 1ère fiche.

    Dans le oncreate de ma 2ième fiche je place ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    image1.picture := form1.image1.picture
    Cela fonctionne avec uniquement le format *.bmp.

    Je pensais adapter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Var
    lpExtension : String;
    lpPath: array of Char;  // Le chemin
    begin
    lpExtension:= LowerCase(ExtractFileExt(PChar(lpPath)));
            if (lpExtension = '.bmp') or
              (lpExtension = '.jpeg') or
               (lpExtension = '.jpg') then
            begin
     
    ........
    Mais cela ne fonctionne pas.

    Merci d'avance de votre aide.

    @+,

    Cincap

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    attention!

    image1.Picture := form1.Image1.Picture

    tu cherche à remplacer l'instance de image1.Picture par celle de image1 dans form1!
    ce n'est pas bon et peu provoquer des erreurs de violation d'accés ou des fuite memoire.

    il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image1.Picture.Assign(form1.Image1.Picture);
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     images1.Picture.Graphic.Assign(form1.Image1.Picture.Graphic);

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @ Dr. Who, tu as raison, sur le projet en question qui est une ébauche, c'était fait mais je recopie toujours le code de mes notes ou essais qui ne sont pas corrigées.

    Sinon, il me reste le format Wmf qui est un TMetafile et me cause le problème du drag and drop.

    En sachant que les autres formats fonctionnent avec ceci :

    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
     
    procedure TFormtest2.PanelImageDrop(var Msg: TWMDROPFILES) ;
    var
       numFiles : longInt;
       buffer : array[0..MAX_PATH] of char;
     
     BMPLoaded : boolean;
     NewH, NewW, OldSBM : integer;
     
     MYWMF : TMetafile ;
    begin
       BMPLoaded := false;
       numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
       if numFiles > 1 then
       begin
         ShowMessage('Vous pouvez copier une seule image à la fois !') ;
       end
       else
       begin   
       DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
         try
           Imagetest1.picture.LoadFromFile(buffer) ; //Résultat du drag and drop
     
     
     BMP := TBitmap.Create;
     
     BMPLoaded := true;
     
     
    try
     
     BMP.pixelformat := pf24bit;
     
     BMP.Assign(imagetest1.picture.Graphic);
     
    ........
    //Traitement du résultat
    ....
    Je n'arrive pas à insérer le "TMetafile.create"

    @+,

    Cincap

  4. #4
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    il est vrai qu'on peut faire :

    Bitmap.Assign(Picture.Graphic)

    mais dans certains cas ... c'est la cata ... ça ne marche pas.

    une autre solution etant de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Bitmap.Width := Picture.Graphic.Width;
    Bitmap.Height := Picture.Graphic.Height;
    Bitmap.PixelFormat := pf32bit;
    Bitmap.Canvas.Draw(0,0,Picture.Graphic);

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonjour à toutes et à tous,

    @ Dr. Who, ton explication est tout à fait logique, j'avais même réalisé une procédure pour la sauvegarde en plusieurs formats.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure WMFToBMP(WMF : TMetafile; BMP : TBitmap);
    begin
      BMP.Width := WMF.Width;
      BMP.Height:= WMF.Height;
      BMP.PixelFormat := pf32bit;
      BMP.Canvas.Draw(0,0,WMF);
    end;
    Mais dans mes tests, je n'avais pas éffacé la ligne du "Bmp.assign" donc erreur.

    Par contre, même si cela fonctionne, ce code ne me parraît pas correct au sujet de l'emplacement du Try, qu'en penses tu ?

    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
    
    .......
    begin
       BMPLoaded := false;
    
       numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
       if numFiles > 1 then
       begin
         ShowMessage('Vous pouvez copier une seule image à la fois !') ;
       end
       else
       begin
         DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
         try
           Imagetest1.picture.LoadFromFile(buffer) ;
    
     BMP := TBitmap.Create;
    
     BMPLoaded := true;
    
      try
    
     Bmp.Width := imagetest1.Picture.Graphic.Width;
     Bmp.Height := imagetest1.Picture.Graphic.Height;
     Bmp.PixelFormat := pf32bit;
     Bmp.Canvas.Draw(0,0,imagetest1.Picture.Graphic);
    
    
     //BMP.Assign(imagetest1.picture.Graphic); //Ne pas utiliser
    
      if BMPLoaded then
          begin
    
    ..............
    Merci pour tes conseils judicieux.

    @+,

    Cincap

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    alors try s'utilise comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    { appel de méthode d'initialisation d'une action critique }
    try
      { traitement }
    finally
      { appel de méthode de finalisation d'une action critique }
    end;

    exemple :

    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
     
    Objet := TObjet.Create;
    try
      Objet.Traitement;
    finally
      Objet.Free;
    end;
     
     
     
     
    Success := false;
    with TFileStream.Create(FileName, fmCreate) do
    try
      repeat
        RB := Read(Buffer, MaxBufferSize);
        Traitement(Buffer);
      until RB < MaxBufferSize;
      Success := true;
    finally
      Free;
    end;
     
     
     
    ListBox1.Items.BeginUpdate;
    try
      ListBox1.Items.Clear;
      for N := 0 to Max-1 do
        ListBox1.Items.Add(IntToStr(N));
    finally
      ListBox1.Items.EndUpdate;
    end;
     
     
     
     
    Buffer := AllocMem(Size);
    try
      Traitement(Buffer);
    finally
      FreeMem(Buffer, Size);
    end;

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 453
    Points : 1 337
    Points
    1 337
    Par défaut
    @Dr. Who, dans le cas de figure 1, avec ce code, je récupère le copy/coller, j'éffectue le traitement sans exception, mais à la fermeture de l'application j'obtiens une exception dans le cas de figure 2, alors que la aussi, le copy/coller et le traitement fonctionne.

    Cas de figure 1 :

    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
     
    begin
       numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
       if numFiles > 1 then
       begin
         ShowMessage('Vous ne pouvez déplacer un seul fichier image à la fois !') ;
       end
       else
       begin
         DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
         try
           Imagetest1.Picture.LoadFromFile(buffer) ;
         except
           on EInvalidGraphic do ShowMessage('Ce format n''est pas supporté !') ;
         end;
       end;
    end; (*PanelImageDrop*) }
    Cas de figure 2 :

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    begin
       BMPLoaded := false;
     
       numFiles := DragQueryFile(Msg.Drop, $FFFFFFFF, nil, 0) ;
       if numFiles > 1 then
       begin
         ShowMessage('Vous ne pouvez déplacer un seul fichier image à la fois !') ;
       end
       else
       begin
         DragQueryFile(Msg.Drop, 0, @buffer, sizeof(buffer)) ;
         try
           Imagetest1.Picture.LoadFromFile(buffer) ;
         except
           on EInvalidGraphic do ShowMessage('Ce format n''est pas supporté !') ;
         end;
         end;
     
       BMP := TBitmap.Create;
       BMPLoaded := true;
     
      try
     
     Bmp.Width := imagetest1.Picture.Graphic.Width;
     Bmp.Height := imagetest1.Picture.Graphic.Height;
     Bmp.PixelFormat := pf24bit;
     Bmp.Canvas.Draw(0,0,imagetest1.Picture.Graphic);
     
     
     //BMP.Assign(image1.picture.Graphic);
     
      if BMPLoaded then
          begin
     
         NewW := 640;
         NewH := 480;
     
            end;
     
            { enfin on vas injecter BMP dans le bitmap de Image1 (autosize = true) }
            with Imagetest1.Picture.Bitmap do
            begin
              { on definit les nouvelles dimensions }
              width       := NewW ;
              height      := NewH;
              { on travail en couleurs 24bpc }
              pixelformat := pf24bit;
     
              { on sauvegarde l'ancien mode de redimension du canvas }
              OldSBM := GetStretchBltMode(Canvas.Handle);
     
              { et on le definit en mode HALFTONE }
              SetStretchBltMode(Canvas.Handle, HALFTONE);
     
              { on dessine l'image }
              StretchBlt( Canvas.Handle, 0, 0, NewW, NewH,
                          BMP.Canvas.Handle, 0, 0, BMP.Width, BMP.Height,
                          SRCCOPY);
     
              { on restaure le mode de redimensionnement du canvas }
              SetStretchBltMode(Canvas.Handle, OldSBM);
            BMP.Assign(imagetest1.picture.bitmap);
     
            imagetest1.Picture.Assign(bmp);
     
            end;
     
        finally
          { on libere BMP }
          BMP.Free;
     
        end;
        { on rafraichi Image1 }
        Imagetest1.Refresh;
     
    end; (*PanelImageDrop*)
    Pourtant cela me semble correct ?

    Après test, c'est le format wmf qui crée l'exception en quittant.

    Enfin il s'agissait d'un oubli de référence de l'instance Bmp : Tbitmap.

    Donc je cloture.

    @+,

    Cincap

Discussions similaires

  1. [XL-2007] SOMME.SI sur une autre feuille avec recherche précise
    Par Nutella14 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 18/07/2014, 16h54
  2. Réponses: 1
    Dernier message: 14/03/2014, 15h19
  3. Faire une pause sur une autres fiche.
    Par Yepazix dans le forum Débuter
    Réponses: 8
    Dernier message: 10/04/2010, 22h39
  4. Réponses: 5
    Dernier message: 30/06/2009, 23h21
  5. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58

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