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

Lazarus Pascal Discussion :

Récupérer une image dans le presse-papier


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Récupérer une image dans le presse-papier
    Bonjour à toutes et à tous,

    Je sais placer une image dans le presse-papier par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClipBoard.Assign(BmPCopy);
    "BmpCopy" est mon BitMap dans lequel est l'image.

    Je sais que l'image est dans le presse-papier car je peux la récupérer avec un logiciel de dessin.

    Mais je n'arrive pas à la récupérer dans mon programme par l'une des procédure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClipBoard.AssignTo(BmpCopy);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BmpCopy.Assign(ClipBoard);
    Apparemment, c'est lié au type d'image placé dans le presse-papier.

    Savez-vous comment faire ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre averti

    Profil pro
    dirlo
    Inscrit en
    Février 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : dirlo

    Informations forums :
    Inscription : Février 2008
    Messages : 83
    Points : 404
    Points
    404
    Par défaut
    Bonjour,

    J'aurais fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image.Picture.Assign(ClipBoard)
    Ça ne conviendrait pas pour toi?

    P@ric

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci "parhelie" pour cette proposition, mais le problème rest entier.

    NOTA : ce problème n'existe que sous Windows, sous Linux, ça fonctionne bien.

    Apparemment, ce n'est pas la technique de récupération du presse-papier qui est en cause, mais le type Mime qui n'est pas reconnu : j’obtiens le message suivant :

    Le problème est que je ne sais pas quel type employer.

    Ce que je fais est une transposition d'un programme que j'avais écrit avec DELPHI et qui fonctionne très bien. Dans ce programme le type est : "CF_BITMAP"

    Merci de votre aide.

    Pierre

  4. #4
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Arrives-tu à récupérer - dans ton application Lazarus - une image que tu viens de coller - à partir de ton application Lazarus - ?

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par CapJack Voir le message
    Arrives-tu à récupérer - dans ton application Lazarus - une image que tu viens de coller - à partir de ton application Lazarus - ?
    Non !

    Avec mon application Lazarus, je sais placer une image dans le presse-papier par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ClipBoard.Assign(MonBitMap);
    Je sais que cette image est dans la presse-papier car je peux la récupérer avec une autre application.

    Le problème, est que, apparemment, cette image a été mise dans le presse-papier au format "CF_BITMAP" et que lorsque je veux la charger à partir du presse-papier, Lazarus me dit :

    Il ne reconnait même pas ce qu'il vient de mettre !

    D'ailleurs, le problème est le même si je veux récupérer une image que j'ai mise dans le presse-papier à partir d'une autre application Windows (Paint, GIMP, PhotoEditor, ...)

    Merci de votre aide.

    Pierre

  6. #6
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonjour

    Essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormCreate(Sender: TObject);
    var
      BMP : TBitmap;
    begin
      BMP := TBitmap.Create;
      BMP.LoadFromClipboardFormat(CF_BITMAP);
      BmpCopy.Picture.Bitmap.Assign(BMP);
    end;
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  7. #7
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par DOLPat® Voir le message
    Bonjour

    Essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormCreate(Sender: TObject);
    var
      BMP : TBitmap;
    begin
      BMP := TBitmap.Create;
      BMP.LoadFromClipboardFormat(CF_BITMAP);
      BmpCopy.Picture.Bitmap.Assign(BMP);
    end;
    Merci pour cette proposition, mais elle ne fonctionne qu'à moitié. Hier, j'ai essayé tout un tas de solution, dont une proche de celle-ci, mais qui aussi ne fonctionne qu'à moitié. J'ai créé un rapport de bug (0020089) dont voici la traduction en français :

    Sous Windows XP,

    Si je transferts une image à partir d'une application Lazarus vers le presse-papier avec soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClipBoard.Assign(MyBitMap);
    soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyBitMap.SaveToClipboardFormat(PredefinedClipboardFormat(pcfBitMap));
    si j'utilise une application telle que : Paint, PhotoEditor, GIMP, ... Je retrouve mon image par le menu "coller", mais je ne peux pas la retrouver dans mon application Lazarus en utilisant : :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyBitMap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfXXX));
    où pcfXXX est l'une des valeurs prédéfinies.

    Maintenant, si je transferts une image au presse-papier à partir de mon application Lazarus avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyBitMap.SaveToClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitMap));
    je la retrouve dans mon application avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyBitMap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitMap));

    mais cette fois, je ne peux plus la retrouver avec le menu "coller" dans les applications telles que : Paint, PhotoEditor, GIMP, ...

    Il serait normal qu'il y ait une valeur de pdfXXX qui permette de retrouver mon image à la fois dans mon application Lazarus et dans les autres logiciels !

    Je considère ce problème comme un bug.


    Apparemment "CF_BITMAP" a le même comportement que "pcfDelphiBitmap".

    Merci de votre aide.

    Pierre

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si j'ai bien compris, le BitMap de Lazarus se veut indépendant du contexte, à la différence de celui de Windows. En regardant ici :
    http://www.lazarus.freepascal.org/in...ic=5979.5;wap2
    et là : http://forum.lazarus.freepascal.org/...?topic=11545.0
    je pense que tu peux essayer :
    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
      MyBitMap.SaveToClipboardFormat(PredefinedClipboardFormat(pcfBitMap));
     
      PictureAvailable:=false;
     
      if Clipboard.HasFormat(PredefinedClipboardFormat(pcfDelphiBitmap)) 
      then PictureAvailable:=true;
      if Clipboard.HasFormat(PredefinedClipboardFormat(pcfBitmap)) 
      then PictureAvailable:=true;
     
      if PictureAvailable 
      then begin
        ImageToEdit.Picture.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));
       MyBitMap.LoadFromClipboardFormat(PredefinedClipboardFormat(pcfDelphiBitmap));
      end
      else ShowMessage('wtf ?');
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci tourlourou pour cette proposition. Je m'étais aussi basé sur les liens que tu donnes.

    Malheureusement, la solution que tu proposes fait partie de celles que j'ai données précédemment (voir bug 0020089) et ne fonctionne pas.

    Merci de votre aide.

    Pierre

  10. #10
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par ChPr Voir le message
    J'ai créé un rapport de bug (0020089) dont voici la traduction en français
    Très bonne initiative.
    Y'a plus qu'à attendre un retour du Bug Tracker.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  11. #11
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    En attendant, après une petite demi-heure à me battre avec le code source de Lazarus, voilà une solution qui marche (enfin, chez moi...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     OnLoadGraphicFromClipBoardFormat(Bmp,ctClipBoard,CF_Bitmap);
    Ne m'en demandez pas plus...

  12. #12
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci CapJack pour cette solution. Malheureusement, comme les autres solutions, celle-ci ne fonctionne qu'à moitié, c'est-à-dire que le copier/coller fonctionne au sein de l'application Lazarus, mais si on ouvre le presse-papier avec une autre application (Paint, PhotoEditor, GIMP, ...), rien n'apparaît.

    Quelle version de Lazarus/Free Pascal as-tu ?

    Merci de votre aide.

    Pierre

  13. #13
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bizarre bizarre tout cela...
    Je viens d'essayer de coller une image à partir de Paint avec mon code d'origine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormCreate(Sender: TObject);
    var
      BMP : TBitmap;
    begin
      BMP := TBitmap.Create;
      BMP.LoadFromClipboardFormat( CF_BITMAP );
      Image1.Picture.Bitmap.Assign(BMP);
    end;
    Et cela fonctionne sans souci !
    J'ai juste ouvert Paint, gribouillé n'importe quoi, sélectionné toute l'image puis Ctrl-C pour la copier. Ensuite, j'ai lancé le code sous Lazarus et j'ai bien mon dessin dans le TImage...
    Idem en ouvrant un jpeg dans Paint.

    J'utilise Lazarus 0.9.31 r30288 FPC 2.4.3 et je compile en 64 bits

    [Edit] Même constat avec Photoshop: aucun souci, l'image est correctement importée.
    [Edit2] L'image que tu copie a bien une profondeur de couleur d'au moins 16 bits ??? ou bien c'est une image 256 couleurs avec une palette, auquel cas, les problèmes pourraient s'expliquer...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Oui DOLPat®, ce que tu fais fonctionne aussi chez moi (Lazarus 0.9.30 et FP 2.4.2), ce qui ne fonctionne pas, c'est la même chose mais dans le sens inverse, avec "CF_Bitmap", c'est à dire de Lazarus vers Paint ou autres.

    De tout ce que j'ai pu essayer, je n'ai jamais pu avoir les 3 modes d'échange suivants fonctionnels en même temps :

    - Copier de Lazarus --> Coller dans Paint
    - Copier de Lazarus --> Coller dans Lazarus
    - Copier de Paint --> Coller dans Lazarus

    Paint ou autre chose : Gimp, ...

    NOTA : quand on suit le parcours avec le débugger on s'aperçoit que, quelque soit la procédure employée (de toutes celles qui ont été citées dans ce fil par exemple), on passe pratiquement toujours dans les mêmes fonctions. Ce qui expliquerait que, quelque soit la solution envisagée, le problème est le même.

    Mais j'espère que je me trompe ...

    Merci de votre aide.

    Piezrre

  15. #15
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    La solution que j'ai proposée, je l'ai testée bien évidemment avec une image copiée dans Paint, puis collée dans l'application Lazarus ! Sinon ça n'avait aucun intérêt...

    Lazarus 9.30 (32 bits), fpc 2.4.2.

  16. #16
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Alors, j'ai refait quelques essais avec OnSaveGraphicToClipBoardFormat et OnLoadGraphicFromClipBoardFormat ; effectivement, c'est plus que bizarre...

    Étant donnée une fiche comportant 2 TImage, Image1 contenant un bitmap au démarrage, et Image2 vierge, et 3 TButton dont l'évènement "OnClick" est associé respectivement aux opérations "coller", "copier", "dupliquer", j'obtiens ça moi aussi :

    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
    // Coller application tierce -> Lazarus : OK
    procedure TTestPasToolsForm.Button1Click(Sender: TObject);
    begin
     OnLoadGraphicFromClipBoardFormat(Image2.Picture.Bitmap,ctClipBoard,CF_Bitmap);
    end;
     
    // Copier Lazarus -> application tierce
    // Pas ok, le bouton "coller" de Paint reste désactivé.
    // Comme si le format du bitmap n'était pas reconnu...
    procedure TTestPasToolsForm.Button2Click(Sender: TObject);
    begin
     OnSaveGraphicToClipBoardFormat(Image1.Picture.Bitmap,ctClipBoard,CF_Bitmap);
    end;
     
    // Dupliquer Lazarus -> Lazarus : OK
    procedure TTestPasToolsForm.Button3Click(Sender: TObject);
    begin
     OnSaveGraphicToClipBoardFormat(Image1.Picture.Bitmap,ctClipBoard,CF_Bitmap);
     OnLoadGraphicFromClipBoardFormat(Image2.Picture.Bitmap,ctClipBoard,CF_Bitmap);
    end;
    Comme si le format copié dans le presse-papier n'était pas standard.


    Edit : encore plus bizarre... si on fait directement appel à l'API de Windows (en ajoutant "windows" dans la clause uses), ça déclenche une erreur. Le handle encapsulé dans le TBitmap de Lazarus serait-il un standard HBitmap, ou un format "maison" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TTestPasToolsForm.Button2Click(Sender: TObject);
    begin
     //OnSaveGraphicToClipBoardFormat(Image1.Picture.Bitmap,ctSecondarySelection,CF_Picture);
     Clipboard.Open;
     if windows.SetClipboardData(windows.CF_BITMAP,Image1.Picture.Bitmap.Handle) = 0
        then ShowMessage('Error');
     ClipBoard.Close;
    end;


    Edit 2 : La nuit du presse-papier... nouveau thriller.

    Si j'ouvre/ferme le presse-papier avec l'API de Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     windows.OpenClipboard(Handle);
     if windows.SetClipboardData(windows.CF_BITMAP,Image1.Picture.Bitmap.Handle) = 0
        then ShowMessage('Error');
     windows.CloseClipboard;
    plus d'erreur, le bouton "coller" de Paint s'active, mais :



    Le handle de Bitmap fourni par Lazarus n'est pas au format Windows, selon moi. Lazarus peut interpréter les données reçues de Windows, mais pas les fournir dans le bon format attendu par Windows. À cause du multi-plateforme, il doit utiliser un format pointé par le Handle qui est "générique", ce qui expliquerait que le problème ne se pose pas dans d'autres environnements. Mais il devrait être capable de faire les conversions nécessaires, donc il y a souci. On doit pouvoir trouver une solution basée sur l'API.



    Edit 3 : C.Q.F.D. -> http://62.166.198.202/bug_view_advan...p?bug_id=12729
    Le bug est déclaré "fixed", mais manifestement il ne l'est pas.

  17. #17
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Bon, voilà un truc qui marche, mais c'est vraiment "usine à gaz" :

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    // Le type doit être Graphics.TBitmap, il existe un autre
    // TBitmap dans les types prédéfinis, qui est de type record !
    // Ou alors, mettre la clause windows AVANT Graphics.
    // Il faut transmettre le bitmap en 32 bits au presse-papier,
    // sinon on obtient une image noire...
     
    // Si l'image source contient des zones transparentes,
    // les zones correspondantes seront noires
    // dans l'application tierce.
     
    procedure CopyBmpToClipboard(const ABmp:Graphics.TBitmap);
    var
      hdcSrc, hdcDst: Windows.HDC;
      DstBitmap, OldSrcBitmap, OldDstBitmap: Windows.HBITMAP;
      bm : Windows.BITMAP;
    begin
      if not assigned(ABmp) then exit;
      hdcDst := Windows.CreateCompatibleDC(0);
      Windows.GetObject(ABmp.Handle,SizeOf(bm),@bm);
      //ShowMessageFmt('w=%d  h=%d  planes=%d  BitsPixel=%d',[bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel]);
      DstBitmap := Windows.CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,32,nil); // /!\
      //if DstBitmap=0 then ShowMessage('DstBitmap=0');
      OldDstBitmap := Windows.SelectObject(hdcDst,DstBitmap);
      //if OldDstBitmap=0 then ShowMessage('OldDstBitmap=0');
      if (Windows.BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight,
                         ABmp.Canvas.Handle, 0, 0, SRCCOPY) = False)
         then ShowMessage('Impossible de copier le bitmap dans le presse-papiers.');;
      Windows.OpenClipboard(0);
      Windows.EmptyClipboard;
      Windows.SetClipboardData(Windows.CF_BITMAP, DstBitmap);
      Windows.CloseClipboard;
      Windows.SelectObject(hdcDst, OldDstBitmap);
      Windows.DeleteDC(hdcDst);
    end;
     
    procedure CopyBmpFromClipboard(var ABmp:Graphics.TBitmap);
    var
      hdcSrc, hdcDst: Windows.HDC;
      SrcBitmap, DstBitmap, OldSrcBitmap, OldDstBitmap: Windows.HBITMAP;
      bm : Windows.BITMAP;
    begin
      if not assigned(ABmp) then exit;
      hdcSrc := Windows.CreateCompatibleDC(0);
      hdcDst := Windows.CreateCompatibleDC(0);
      Windows.OpenClipboard(0);
      SrcBitmap := Windows.GetClipboardData(Windows.CF_BITMAP);
      Windows.CloseClipboard;
      Windows.GetObject(SrcBitmap,SizeOf(bm),@bm);
      DstBitmap := Windows.CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,nil);
      OldSrcBitmap := Windows.SelectObject(hdcSrc,SrcBitmap);
      OldDstBitmap := Windows.SelectObject(hdcDst,DstBitmap);
      if (Windows.BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight,
                         hdcSrc, 0, 0, SRCCOPY) = False)
         then ShowMessage('Impossible de récupérer le bitmap du presse-papiers.');;
      ABmp.SetHandles(DstBitmap,0);
      Windows.SelectObject(hdcSrc, OldSrcBitmap);
      Windows.SelectObject(hdcDst, OldDstBitmap);
      Windows.DeleteDC(hdcSrc);
      Windows.DeleteDC(hdcDst);
      Windows.DeleteObject(SrcBitmap);
    end;
     
    // Coller application tierce -> Lazarus : OK
    procedure TTestPasToolsForm.Button1Click(Sender: TObject);
    var Bmp:Graphics.TBitmap;
    begin
    Bmp := Graphics.TBitmap.Create;
     CopyBmpFromClipBoard(Bmp);
     Image2.Picture.Bitmap.Assign(Bmp);
     Bmp.Free;
    end;
     
    // Copier Lazarus -> application tierce : OK, sauf transparence => noir
    procedure TTestPasToolsForm.Button2Click(Sender: TObject);
    begin
      CopyBmpToClipboard(Image1.Picture.Bitmap);
    end;
     
    // Dupliquer Lazarus -> Lazarus : OK
    procedure TTestPasToolsForm.Button3Click(Sender: TObject);
    var Bmp:Graphics.TBitmap;
    begin
     CopyBmpToClipboard(Image1.Picture.Bitmap);
     Bmp := Graphics.TBitmap.Create;
     CopyBmpFromClipBoard(Bmp);
     Image2.Picture.Bitmap.Assign(Bmp);
     Bmp.Free;
    end;

  18. #18
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bizarre bizarre tout cela. Chez moi, c'est deux procédures fonctionnent sans souci. Que ce soit pour:
    - copier de Lazarus ==> coller vers Lazarus
    - copier de Lazarus ==> coller dans Paint ou Photoshop
    - copier de Paint ou Photoshop ==> coller vers Lazarus

    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
    procedure TForm1.btnCollerClick(Sender: TObject);
    var
      BMP : TBitmap;
    begin
      BMP := TBitmap.Create;
      BMP.LoadFromClipboardFormat(CF_BITMAP);
      imgDestination.Canvas.Clear;
      imgDestination.Picture.Bitmap.Assign(BMP);
      imgDestination.Refresh;
    end;
     
    procedure TForm1.btnCopierClick(Sender: TObject);
    begin
      Clipboard.Open;
      Clipboard.Assign(imgSource.Picture.Bitmap);
      Clipboard.Close;
    end;
    Peut-être un bug dans l'unité Clipboard de Lazarus 0.9.30 qui a été corrigé dans la 0.9.31.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  19. #19
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Un truc de ouf ! Oubliez ce que j'ai dit précédemment. Pas que cela ne fonctionne pas, cela marche très bien tant que l'on lance l'application dans l'EDI. Dès que l'on lance directement l'exécutable, effectivement on arrive plus à coller... Vraiment un truc de ...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  20. #20
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Du coup tu m'as fait peur... j'ai essayé, mes deux fonctions marchent aussi en dehors de l'EDI. Ouff..

Discussions similaires

  1. charger, modifier et copier une image dans le presse-papier
    Par fatima erragoubi dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/03/2011, 09h09
  2. Réponses: 2
    Dernier message: 10/07/2008, 14h39
  3. Mettre une image dans le presse papier
    Par cyrilleG dans le forum Tcl/Tk
    Réponses: 4
    Dernier message: 06/02/2008, 22h28
  4. Réponses: 5
    Dernier message: 03/02/2004, 14h20
  5. Comment copier une image dans le presse papier.
    Par cprogil dans le forum Langage
    Réponses: 7
    Dernier message: 09/09/2003, 15h54

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