cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 2009
-
15 sept. 2008 à 08:28
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDerniè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.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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 ?
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;
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 15 sept. 2008 à 12:11
@ 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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 16 sept. 2008 à 09:53
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.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 16 sept. 2008 à 10:09
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
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 16 sept. 2008 à 12:09
@ 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 :
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 16 sept. 2008 à 13:13
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.
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 16 sept. 2008 à 13:31
@ 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.