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

Langage Delphi Discussion :

Problème clipboard format Cf_picture


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Problème clipboard format Cf_picture
    Bonjour,

    Je voudrai récupérer dans un bitmap une image contenue dans le clipboard au format cf_picture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                    BMP:= Tbitmap.Create;
                    try
                      BMP.PixelFormat:= pf24bit;
                      if ClipBoard.HasFormat(cf_Picture) then
                      begin
                        label2.Caption:= 'Picture';
                        BMP.LoadFromClipboardFormat(CF_PICTURE,ClipBoard.GetAsHandle(CF_BITMAP),0);
                    finally
                      BMP.Free;
                    end;
    Avec ce code j'ai pu m'assuré que le format du clipboard était bien de type cf_picture (label2). Mais j'ai un message "Format de presse-papiers non supporté"
    Comment récupérer l'image dans BMP ?

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    J'ai une petite question
    L'image en question, est un jpg ou un BMP ?

    A mon avis, si c'est un jpg, ça ne passera pas ...

    Fait un test comme suit avec un BMP pour voir déjà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BMP:= Tbitmap.Create;
    try
      BMP.PixelFormat:= pf24bit;
      if ClipBoard.HasFormat(CF_BITMAP) then
      begin
        label2.Caption:= 'Picture';
      BMP.LoadFromClipboardFormat(CF_BITMAP,ClipBoard.GetAsHandle(CF_BITMAP),0);
    finally
      BMP.Free;
    end;

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut C'est une image JPEG
    Je viens d'essayer avec
    BMP.LoadFromClipboardFormat(CF_BITMAP,ClipBoard.GetAsHandle(CF_BITMAP),0);
    Même problème même message.
    Mais alors pourquoi peut-on assigner à un BMP une image JPEG du type BMP.Assign(ImageJpeg) ?

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 824
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 824
    Points : 15 249
    Points
    15 249
    Par défaut
    Salut.

    Le code d'ero-sennin fonctionne très bien après avoir rajouté le "end;" qui manque, là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BMP:= Tbitmap.Create;
    try
      BMP.PixelFormat:= pf24bit;
      if ClipBoard.HasFormat(CF_BITMAP) then
      begin
        label2.Caption:= 'Picture';
        BMP.LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle(CF_BITMAP),0);
      end; //  <------- !
    finally
      BMP.Free;
    end;
    et avoir copié une image au format BMP dans le presse-papiers, par exemple en appuyant sur PrintScreen (Impr écran).

    Valà,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Jipété ,

    Citation Envoyé par Jipété Voir le message
    Salut.

    Le code d'ero-sennin fonctionne très bien après avoir rajouté le "end;" qui manque, là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BMP:= Tbitmap.Create;
    try
      BMP.PixelFormat:= pf24bit;
      if ClipBoard.HasFormat(CF_BITMAP) then
      begin
        label2.Caption:= 'Picture';
        BMP.LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle(CF_BITMAP),0);
      end; //  <------- !
    finally
      BMP.Free;
    end;
    et avoir copié une image au format BMP dans le presse-papiers, par exemple en appuyant sur PrintScreen (Impr écran).

    Valà,
    Oui, j'avais pas relu le code, j'avais juste modifié le CF_PICTURE en CF_BITMAP
    Sinon, bien vu

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Bonjour

    Problème toujours pas résolu, j'avais naturellement ajouté le end dans le code.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Le problème se pose autrement :
    Bonjour

    Dans le cas ou le format Clipboard est CF_PICTURE comment faire passer l'image contenue dans le clipboard dans un TBitmap ?

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Tu ne peux pas ajouter un Jpg dans un Bitmap sans faire une conversion au préalable car le jpg se charge dans un TPicture.

    Essaie avec un TImage et ce code, logiquement ça passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ClipBoard.HasFormat(CF_PICTURE) then
    begin
      label2.Caption:= 'Picture';
      Image1.Picture.Assign(Clipboard);
    end;

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Désolé
    Je viens de vérifier en traçant le format CF_PICTURE est bien reconnu et la condition est respectée mais à l'exécution de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.Assign(Clipboard);
    le message "format clipboard non supporté" est généré.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Si cela peut aider...
    Après avoir reconnu le format CF_PICTURE j'ai fait afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        for I := 0 to Clipboard.FormatCount-1 do
                          ListBox1.Items.Add(IntToStr(Clipboard.Formats[i]));
    J'obtiens la liste :
    8
    2
    17
    50038

  11. #11
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par colorid Voir le message
    Je viens de vérifier en traçant le format CF_PICTURE est bien reconnu et la condition est respectée mais à l'exécution de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1.Picture.Assign(Clipboard);
    le message "format clipboard non supporté" est généré.
    Chez moi ça fonctionne
    J'ai pris une image jpg sur le net, je l'ai ouvert avec paint, j'ai fait un copier, et j'arrive à l'ouvrir dans mon programme...

    Peux-tu nous montrer l'image en question stp ?

  12. #12
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    salut,
    j'ai testé le codé de ero et ça marche même avec les fichiers jpg.

    le message "format clipboard non supporté" est généré.
    c'est normal que tu obtiens ce message d'erreur car ton Clipboard est vide(peut-être il y a un texte mais pas d'image), il n'y a aucun élément dedans.

    teste ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Clipboard.Open;
      if (Clipboard.HasFormat(CF_BITMAP)) or
        (Clipboard.HasFormat(CF_PICTURE)) then
        label2.Caption:= 'Picture';
       Image1.Picture.Bitmap.Assign(Clipboard);//je récupère l'image dans  "Image1"
      Clipboard.Close;
    end;
    je pense que le mieux est de faire 2 procédures: une pour récupérer une image et l'autre pour récupérer un texte.
    pour le texte, on change "CF_BITMAP" ou "CF_PICTURE" par "CF_TEXT".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button3Click(Sender: TObject);
    var
     MyHandle: THandle;
    begin
      Clipboard.Open;
      if Clipboard.HasFormat(CF_TEXT) then
      begin
        MyHandle:=Clipboard.GetAsHandle(CF_TEXT);
        label2.Caption:= 'Texte';
        GlobalUnlock(MyHandle);
      end;
    end;
    A+

    NABIL74

  13. #13
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    je te propose une autre solution, c'est de surveiller le contenu du presse-papiers au moment de l'exécution de "copier".

    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
     private
       procedure Afficher_le_Presse_papiers(var Msg: TWMDrawClipBoard);
          message WM_DRAWCLIPBOARD;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      ClipboardWindow: HWND;
     
    implementation
      uses ClipBrd;
     
    {$R *.dfm}
     
    procedure TForm1.Afficher_le_Presse_papiers(var Msg: TWMDrawClipBoard);
    var
      MyHandle: THandle;
    begin
      Clipboard.Open;
      if IsClipboardFormatAvailable(CF_TEXT) or
         IsClipboardFormatAvailable(CF_BITMAP) then
      begin
        OpenClipboard(Form1.Handle);
        if IsClipboardFormatAvailable(CF_TEXT)then
        begin
          MyHandle:=Clipboard.GetAsHandle(CF_TEXT);
          label2.Caption:= 'Texte';
          GlobalUnlock(MyHandle);
        end;
        if IsClipboardFormatAvailable(CF_BITMAP) then
        begin
          label2.Caption:= 'Picture';
        end;
        CloseClipboard;
      end;
      SendMessage(ClipboardWindow, WM_DRAWCLIPBOARD, 0, 0);
    end;
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      CloseClipboard;
      ClipboardWindow:=SetClipboardViewer(Form1.Handle);
    end;
    testé et ça marche nickel !

    A+

    NABIL74

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 824
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 824
    Points : 15 249
    Points
    15 249
    Par défaut
    Yop !

    Pas le temps de tester, là, mais juste une question : c'est normal, tous ces Clipboard.Open ?
    Citation Envoyé par NABIL74 Voir le message
    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
     private
       procedure Afficher_le_Presse_papiers(var Msg: TWMDrawClipBoard);
          message WM_DRAWCLIPBOARD;
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
      ClipboardWindow: HWND;
    
    implementation
      uses ClipBrd;
    
    {$R *.dfm}
    
    procedure TForm1.Afficher_le_Presse_papiers(var Msg: TWMDrawClipBoard);
    var
      MyHandle: THandle;
    begin
      Clipboard.Open;
      if IsClipboardFormatAvailable(CF_TEXT) or
         IsClipboardFormatAvailable(CF_BITMAP) then
      begin
        OpenClipboard(Form1.Handle);
        if IsClipboardFormatAvailable(CF_TEXT)then
        begin
          MyHandle:=Clipboard.GetAsHandle(CF_TEXT);
          label2.Caption:= 'Texte';
          GlobalUnlock(MyHandle);
        end;
        Clipboard.Open;
        if IsClipboardFormatAvailable(CF_BITMAP) then
        begin
         Clipboard.Open;
          label2.Caption:= 'Picture';
        end;
        CloseClipboard;
      end;
      SendMessage(ClipboardWindow, WM_DRAWCLIPBOARD, 0, 0);
    end;
    Just curious,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Yop !

    Pas le temps de tester, là, mais juste une question : c'est normal, tous ces Clipboard.Open ?

    Just curious,
    Bien vu Jipété!
    Au fur et à mesure de mes testes, j'ai omis de supprimer le 2ème et le 3ème "Clipboard.Open" qui ne sont pas nécessaires(puisque que je l'ai déjà verrouillé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Clipboard.Open;
    //verrouiller le presse-papiers.
    .
    Clipboard.Close;
    //déverrouiller le presse-papiers
    c'est pour garder le verrouillage du presse-papiers(Clipboard) sur l'élément que nous avons copier.

    NABIL74

Discussions similaires

  1. Problème de format du clipboard
    Par colorid dans le forum Langage
    Réponses: 9
    Dernier message: 04/04/2011, 14h32
  2. Problème de format de currency
    Par gandf dans le forum C++Builder
    Réponses: 5
    Dernier message: 31/01/2005, 13h36
  3. Réponses: 14
    Dernier message: 06/08/2004, 15h12
  4. [CR8] Problème de Format d'affichage
    Par khabch dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 19/02/2004, 14h10
  5. Problème de Format de date
    Par titititi007 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/06/2003, 08h19

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