begin process at 2010 02 10 03:08:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

Clipboard avec Ctrl + C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Clipboard avec Ctrl + C

lundi 15 septembre 2008 à 08:28:29 | Clipboard avec Ctrl + C

cincap

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:
lundi 15 septembre 2008 à 11:53:34 | Re : Clipboard avec Ctrl + C

Sat83

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?
lundi 15 septembre 2008 à 12:11:48 | Re : Clipboard avec Ctrl + C

cincap

@ 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:
lundi 15 septembre 2008 à 14:56:26 | Re : Clipboard avec Ctrl + C

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

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

Ah bon ?


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.

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.
lundi 15 septembre 2008 à 18:56:10 | Re : Clipboard avec Ctrl + C

cincap

@ 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:

mardi 16 septembre 2008 à 09:01:45 | Re : Clipboard avec Ctrl + C

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !

"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 :


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.

mardi 16 septembre 2008 à 09:53:53 | Re : Clipboard avec Ctrl + C

cincap

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:
mardi 16 septembre 2008 à 10:09:30 | Re : Clipboard avec Ctrl + C

rt15

Membre Club Administrateur CodeS-SourceS

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.

mardi 16 septembre 2008 à 12:09:54 | Re : Clipboard avec Ctrl + C

cincap

@ 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:

mardi 16 septembre 2008 à 13:13:22 | Re : Clipboard avec Ctrl + C

rt15

Membre Club Administrateur CodeS-SourceS

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;


1 2

Cette discussion est classée dans : ctrl, image, commande, cf, clipboard


Répondre à ce message

Sujets en rapport avec ce message

Utilisation de CLIPBOARD [ par iocha ] Bonjour à tous,Une petite question :Comment récupérer un texte enrichi (Saisi dans WORDPAD en RTF) dans un Richedit, en passant par le presse papier Présence d'une image dans le clipboard [ par yvessimon ] Bonjour,Avant de copier une image du clipboard vers un composant image comment tester la présence ou non d'une image dans le clipoard ?, et éventuelle Une image dans une scene OpenGL [ par Laskar ] Je cherche desespérement un exemple de la commande glDrawPixels d'OpenGL. Le but est de placer une image dans le fond de mon viewport. J'utilise le co image dans un rich edit sans clipboard [ par chookoo ] Voilà. Je veux placer une image dans un rich edit sans avoir a utiliser le clipboard si possible. Une autre solution est possible. Utiliser le clipboa Copier une image ClipBoard / D6 [ par bshaka ] Bonjour à tous,J'utilise le compo WebBrowser pour naviguer, dans même fenêtre, je sélectionne et copie une image :          Form1.WebBrowser2.ExecWB ( DBImage et table Paradox / D6 [ par bshaka ] Bonjour à Tous,Var     Image      : TJpegImage;     PicMem     : TMemoryStream;     Pict       : TPicture;begin     PicMem := TMemoryStream.Create;    touches ctrl+c et ctrl+v ??? [ par PhilLU ] Bonjour,Alors que j'utilise Delphi 7 pro (licence officielle) depuis sa sortie, j'ai subitement un problème:Les touches de raccourci utilisées dans l' commande SendStr du composant ICS TWSocket [ par mimimou ] Bonjour a tous, J essaye depuis quelques jours a tranferer un fichier .ini entre les composants ICS WSocket1 et WSocketThrdServer1 sur Delphi 2007, m importer une image sur une forme [ par dunith ] Bonjour j'ai dans mon fichier SRC, un répertoire Image bmp, où j'ai mes images: les leds orange, vert , rouge..... et ma question comment importer ce


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,281 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales