Clipboard avec Ctrl + C

Résolu
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 - 15 sept. 2008 à 08:28
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre 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:]

10 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 sept. 2008 à 09:01
"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.
3
Rejoignez-nous