Clipboard avec Ctrl + C [Résolu]

Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 15 sept. 2008 à 08:28 - Dernière réponse :
Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 16 sept. 2008 à 13:31
Bonjour à toutes et à tous,

Je me suis documenté sur la façon d'utiliser le clipboard en général et pris connaissance de tous les formats.

J'ai aussi examiné attentivement les sources excellentes de Mauricio et Caribensila à ce sujet.

Dans l'ensemble, je n'ai pas trouvé la façon logique de copier une image d'un dossier avec la commande Ctrl + C et de l'afficher dans une fiche Delphi pour ensuite la sauver dans un autre dossier.

Les formats de l'image avec la commande "PrintScreen" sont "CF_BITMAP, CF_DIB".

Par contre le format de l'image avec la commande Ctrl + C est "CF_HDROP" et c'est tout juste si on peut récupérer le chemin dans un Tedit.

Mais ce chemin est fictif puisque la commande "Imagetest.picture.loadfromfile(Tedit.text)" ne fonctionne pas !

Si dans le temps quelqu'un avait une idée cela me permettrait de boucler la compréhention sur le Clipboard.

Merci,

@+,

Cincap

[mailto: mailto:]
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 16 sept. 2008 à 09:01
3
Merci
"close_clipboard,
  unlock_memory;"

Ce sont en fait des labels. En Delphi il faut déclarer les labels. Les labels sont utilisés pour désigner les destinations des sauts des goto (Voir l'aide de Delphi).

Les gotos ne sont pas du tout obligatoires ici : on pourrait mettre des ifs. Mais je trouves ça plus joli avec des goto (Cependant, certaines personnes détestent les gotos).

C'est bizarre que ton compilo ne connaisse pas les gotos... Quelle version de Delphi as-tu ?

Version sans les goto :


<hr />
unit Unit1;interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    _pic: TPicture;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  hClipBoard: Cardinal;   // Handle sur les données du presse papier
  lpData: Pointer;        // Pointeur sur les données du presse papier
  nCharCount: Cardinal;   // Nombre de caractère du chemin
  lpPath: array of Char;  // Le chemin
  image: TPicture;        // L'image correspondant au chemin contenue dans le presse papier
begin
  _pic:= TPicture.Create;

  // Ouverture du presse papier
  if not OpenClipboard(Handle) then
  begin
    ShowMessage('Erreur lors de l''ouverture du presse papier');
    Exit;
  end;
 
  // Récupération d'un pointeur sur les données
  hClipBoard:= GetClipboardData(CF_HDROP);
  if hClipBoard <> 0 then
  begin
    // Blocage de la mémoire du presse papier
    lpData:= GlobalLock(hClipBoard);
    if lpData <> nil then
    begin
      // Test du nombre de chemins dans le presse papier
      if DragQueryFile(Integer(lpData), High(Cardinal), nil, 0) = 1 then
      begin
        // Récupération de la taille du chemin
        nCharCount:= DragQueryFile(Integer(lpData), 0, nil, 0);
        Inc(nCharCount);

        // Allocation d'un buffer de la taille du chemin
        SetLength(lpPath, nCharCount);

        // Récupération du chemin
        DragQueryFile(Integer(lpData), 0, PChar(lpPath), nCharCount);

        // Vérification de l'extension
        if LowerCase(ExtractFileExt(PChar(lpPath))) = '.bmp' then
        begin
          // Chargement et mise en place de l'image
          _pic.LoadFromFile(PChar(lpPath));
          image1.Picture:= _pic;

          GlobalUnlock(hClipBoard);
          CloseClipboard;
        end
        else
        begin
          ShowMessage('Seuls les fichiers d''extension .bmp sont supportés');
          GlobalUnlock(hClipBoard);
          CloseClipboard;
        end;
      end
      else
      begin
        ShowMessage('Il y a pas qu''un chemin dans la presse papier');
        GlobalUnlock(hClipBoard);
        CloseClipboard;
      end;
    end
    else
    begin
      ShowMessage('Echec du lock de la mémoire du presse papier');
      CloseClipboard;
    end;
  end
  else
  begin
    ShowMessage('Pas de données CF_HDROP dans le presse papier');
    CloseClipboard;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(_pic);
end;

end.

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
172
Date d'inscription
mardi 11 novembre 2003
Dernière intervention
13 octobre 2008
- 15 sept. 2008 à 11:53
0
Merci
Je ne suis pas sûr d'avoir bien compris ta question... Pourquoi passe tu par le ClipBoard?

Un simple CopyFile ne ferait-il pas l'affaire?
Commenter la réponse de Sat83
Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 15 sept. 2008 à 12:11
0
Merci
@ sat83, avec un simple copyfile ?

La commande Ctrl + C permet d'être récupérée par un copyfile et affichée dans un Timage, je ne vois pas.

En effet, l'application que je voudrai créée, est de pouvoir copier un fichier *.doc et l'afficher, copier et afficher un printscreen, et surtout n'importe ou avec l'exploreur, faire un ctrl + c sur l'image et l'afficher.

Je vais regarder la méthode du copyfile.

Merci,

@+,

Cincap

[mailto: mailto:]
Commenter la réponse de cincap
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 15 sept. 2008 à 14:56
0
Merci
Salut,

"Mais ce chemin est fictif puisque la commande "Imagetest.picture.loadfromfile(Tedit.text)" ne fonctionne pas !"

Ah bon ?

<hr />unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    _pic: TPicture;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  hClipBoard: Cardinal;   // Handle sur les données du presse papier
  lpData: Pointer;        // Pointeur sur les données du presse papier
  nCharCount: Cardinal;   // Nombre de caractère du chemin
  lpPath: array of Char;  // Le chemin
  image: TPicture;        // L'image correspondant au chemin contenue dans le presse papier
label
  close_clipboard,
  unlock_memory;
begin
  _pic:= TPicture.Create;

  // Ouverture du presse papier
  if not OpenClipboard(Handle) then
  begin
    ShowMessage('Erreur lors de l''ouverture du presse papier');
    Exit;
  end;

  // Récupération d'un pointeur sur les données
  hClipBoard:= GetClipboardData(CF_HDROP);
  if hClipBoard = 0 then
  begin
    ShowMessage('Pas de données CF_HDROP dans le presse papier');
    goto close_clipboard;
  end;

  // Blocage de la mémoire du presse papier
  lpData:= GlobalLock(hClipBoard);
  if lpData = nil then
  begin
    ShowMessage('Echec du lock de la mémoire du presse papier');
    goto close_clipboard;
  end;

  // Test du nombre de chemins dans le presse papier
  if DragQueryFile(Integer(lpData), High(Cardinal), nil, 0) <> 1 then
  begin
    ShowMessage('Il y a pas qu''un chemin dans la presse papier');
    goto unlock_memory;
  end;

  // Récupération de la taille du chemin
  nCharCount:= DragQueryFile(Integer(lpData), 0, nil, 0);
  Inc(nCharCount);
 
  // Allocation d'un buffer de la taille du chemin
  SetLength(lpPath, nCharCount);

  // Récupération du chemin
  DragQueryFile(Integer(lpData), 0, PChar(lpPath), nCharCount);

  // Vérification de l'extension
  if LowerCase(ExtractFileExt(PChar(lpPath))) <> '.bmp' then
  begin
    ShowMessage('Seuls les fichiers d''extension .bmp sont supportés');
    goto unlock_memory;
  end;

  // Chargement et mise en place de l'image
  _pic.LoadFromFile(PChar(lpPath));
  image1.Picture:= _pic;

unlock_memory:
  // Déblocage de la mémoire
  GlobalUnlock(hClipBoard);
close_clipboard:
  // Fermeture du presse papier
  CloseClipboard;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(_pic);
end;

end.

<hr />
Pour le reste de tes doléances, j'ai rien compris je pense.

Pour les .doc, simplement ouvrir le fichier en remplacement de l'affichage de l'image ?

Afficher une image lorsque l'utilisateur presse ctrl + C dans l'explorateur ?

Pour les copies d'écran, nombreuses sources sur ce site, que ce soit à base de simulation de pression de touche Impr écran, ou via BitBlt.
Commenter la réponse de cs_rt15
Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 15 sept. 2008 à 18:56
0
Merci
@ rt15, merci pour ta solution, mais j'ai une erreur en compilant au niveau de la variable "close_clipboard,
  unlock_memory;"


Ceci étant dit, je me répéte, en ce qui concerne le printscreen c'est ok, en ce qui concerne un fichier Word copié dans Word avec Ctrl + C, c'est ok.


Je parcours l'exploreur et je suis dans un dossier ou il y a des fichiers *.png, *.gif, *.jpg, *.bmp


Je choisis mon image.png ou monimage.bmp, je fais Ctrl + C et j'aimerai quelle s'affiche dans le Timage qui est sur ma fiche.

Voila voilou.

@+,

Cincap

[mailto: mailto:]
Commenter la réponse de cincap
Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 16 sept. 2008 à 09:53
0
Merci
Bonjour à toutes et à tous,

@ rt15, Chapeau mon ami, je pensais que ce ne serai pas possible sans devoir faire un copycoller de mon Tedit (qui affiche le chemin de l'image collée avec Ctrl + C) et puis de récupérer son chemin afin de charger mon Timage, avec cette solution illogique, peux importe le format d'image cela fonctionne aussi.

Je bricole sous D6 et XP

Je vois que ta solution se limite à l'extension *.bmp, si mon application permet d'afficher le .gif  .png et .jpg .jpeg, y a t'il quelque chôse à changer à part dans la ligne :
 // Vérification de l'extension
        if LowerCase(ExtractFileExt(PChar(lpPath))) = '.bmp' then....

J'ai essayé ceci même en ajoutant virgule ou point virgule etc..  mais sans succès :

 // Vérification de l'extension
        if LowerCase(ExtractFileExt(PChar(lpPath))) = '.bmp .jpg .png .gif' then...

Sinon merci déjà d'avoir répondu et d'avoir trouvé la solution asser rapidement.

Bonne journée,

@+,

Cincap

[mailto: mailto:]
Commenter la réponse de cincap
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 16 sept. 2008 à 10:09
0
Merci
Erf... Là je suis aussi sur D6/XP !

Pour le test de l'extension, il faut faire une simple comparaison de chaîne :

        // Vérification de l'extension
        lpExtension:= LowerCase(ExtractFileExt(PChar(lpPath)));
        if (lpExtension = '.bmp') or
           (lpExtension = '.png') or
           (lpExtension = '.gif') or
           (lpExtension = '.jpg') then
        begin

Et déclarer lpExtension comme String.
Commenter la réponse de cs_rt15
Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 16 sept. 2008 à 12:09
0
Merci
@ rt15,


Merci encore cela fonctionne correctement.

Tu as l'air surpris que j'ai D6 et que le 1er code ne fonctionne pas, mais je pense qu'il y a une erreur dans la déclaration de variable, je note tel que je le lis :

label
  close_clipboard,
  unlock_memory;

Curieux tu ne trouves pas ?

@+,

Cincap 

[mailto: mailto:]
Commenter la réponse de cincap
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 16 sept. 2008 à 13:13
0
Merci
Cette déclaration me paraît au contraire tout à fait correcte.

Encore une fois, ce ne sont pas des variables, mais des labels.

Si tu tapes label quelque part dans d6, que tu mets le curseur dessus et que tu presse F1, tu vas tomber sur la page qui détaille les labels et les gotos.

Notamment cette phrase :

Vous pouvez déclarer plusieurs labels à la fois :



label label1, ..., labeln;
Commenter la réponse de cs_rt15
Messages postés
490
Date d'inscription
dimanche 5 décembre 2004
Dernière intervention
6 avril 2009
- 16 sept. 2008 à 13:31
0
Merci
@ rt15, Autant pour moi, je ne connaissais pas cette déclaration, alors pourquoi une erreur à ce niveau, à moins que D6 édition personnelle ne le permet pas ou mal écrit.


Au fait, ta solution pourrait fonctionner en ajoutant CF_BITMAP et CF_ENHMETAFILE ?

Sinon, je viens de faire des test, cela fonctionne correctement, dire qu'il y a un certains temps que je cherchais.

@+,

Cincap

[mailto: mailto:]
Commenter la réponse de cincap

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.