Peut-être usine à gaz en surface, mais peut-être qu'en arrière fond ce n'est pas plus compliqué que les procédures Free Pascal.
Je n'aurais jamais trouvé cela tout seul. Je suppose que tu es avant tout un expert Windows.
En tous cas, ça fonctionne parfaitement dans mon application dans laquelle j'ai créé une unité spécifique ou je te mentionne ainsi que le fil de la discussion.
Un grand merci à toi.
Pierre
@ CapJack : J'ai installé tes procédures et les tests que j'avais faits montraient que ça fonctionnait. Je n'avais pas tout testé. En fait ces procédures fonctionnent parfaitement si l'image est en 24 bits.
Si elle est en 32 bits, la copie vers un logiciel tierce se fait bien, mais le collage ne se fait plus dans mon application Lazarus.
C'est pourquoi je m'em... avec ces formats d'image. En modifiant le format d'images en 32 bits que je charge vers du 24 bits, alors tes procédures fonctionnent dans tous les cas.
Peut-être suffit-il de modifier des paramètres dans la procédure de collage pour que cela fonctionne dans tous les cas de figure avec des images en 24 ou 32 bits.
Cordialement.
Pierre.
Ben faut croire que tout comme pour le format TIF, Lazarus ne supporte pas le format 32 bits...
Dans
Essaie de remplacer
Code : Sélectionner tout - Visualiser dans une fenêtre à part procedure CopyBmpFromClipboard(var ABmp:Graphics.TBitmap);
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part DstBitmap := Windows.CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,nil);
(Je n'ai pas testé).
Code : Sélectionner tout - Visualiser dans une fenêtre à part DstBitmap := Windows.CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,24,nil);
Ben en fait si, apparemment, mais la couche système a encore quelques bugs apparemment, surtout sous Windows.
@CapJack : en remplaçant 32 par 24, dans un logiciel tierce on obtient une image vide (noire) et dans mon application je n'obtiens rien !
Ce qui est vraiment bizarre par ailleurs avec la valeur 32, c'est que lorsque dans mon appli, l'image est en 24 bits, ça fonctionne et lorsqu'elle est en 32 bits, ça fonctionne uniquement vers un logiciel tierce, mais pas dans mon appli.
J'avoue que ça m'enfume complètement .
Cordialement.
Pierre
'tention, c'est dans CopyBmpFromClipboard que je te disais de faire la modification, pas dans l'autre procédure.
Sinon, je viens de tester à nouveau, je n'arrive pas à reproduire l'erreur. Quand je copie une image dans Paint, qu'elle soit 24 bits ou 32 bits, png ou jpg, j'arrive à la coller dans Lazarus.![]()
Désolé, j'avais lu un peu trop vite.
Malgré tout, ça ne marche pas.
Avec une image 32 bits, j'ai essayé toutes les combinaisons avec 24, 32 et bm.bmBitsPixel dans CopyTo et CopyFrom (9 cas), aucun ne fonctionne. Je dois absolument passer à une image en 24 bits.
Sinon, quand tu dis :
Est-ce que tu sélectionnes l'image dans Paint, la copie et la passe dans Lazarus ou bien Paint te sert-il seulement à vérifier que tu la vois bien dans une tierce application ?
Des tests supplémentaires dans mon logiciel version Lazarus (qui fonctionnait parfaitement en version DELPHI) montrent qu'avec les valeurs que tu avais mises au départ dans les procédures copier/coller, cela ne fonctionne pas si je colle l'image dans celle d'où j'ai fait la copie mais qu'elle apparait sur une autre image, mais qu'elle disparait dès que je la déplace. Ma procédure de coller/déplacement n'a pourtant rien de sorcier :
C'est vraiment à s'arracher les cheveux (tout du moins ce qu'il en reste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CopyBmpFromClipboard(BmpCopy); {ta procédure} with Image.Picture.BitMap.Canvas do CopyRect(Rect(Org.X, Org.Y, Fin.X, Fin.Y), BmpCopy.Canvas, RectClpB {Affichage du collage} {Déplacement} Tant que pas à sa place, faire : Canvas.CopyRect(Rect(Org.X, Org.Y, Fin.X, Fin.Y), BmpFond.Canvas, Rect(Org.X, Org.Y, Fin.X, Fin.Y)); {replacement du fond d'image précédemment sauvegardé} Org.X:= Org.X+X-OrgZS.X; Org.Y:= Org.Y+Y-OrgZS.Y; Fin.X:= Fin.X+X-OrgZS.X; Fin.Y:= Fin.Y+Y-OrgZS.Y; Canvas.CopyRect(Rect(Org.X, Org.Y, Fin.X, Fin.Y), BmpCopy.Canvas, RectClpB);)
Cordialement.
Pierre
Ca veut alors dire que ce que tu retransferts vers l'application Lazarus n'est pas ce qui y a été copié, mais une mouture modifiée par Paint.
C'est téléchargeable ici. Voir le petit fichier texte qui est joint pour explication.
NOTA : Placer en commentaire le ligne 587 de l'unité FntrBase pour que le format d'image ne soit pas transformé en 24 bits par pixel.
Merci de votre aide.
Pierre
C'est bon, j'ai fini par réussir à le compiler. Il fallait que j'installe jauges.lpk, donc recompiler Lazarus, qui m'a encore fait des misères avec Win64/Win32 et compagnie (du coup j'ai compris d'où venait le message d'erreur au démarrage : apparemment des options de compilation du build de Lazarus... que j'avais jamais pensé à regarder)
Bref. Manque aussi AideHTML, mais bon, j'ai viré la référence.
Alors, je ne vois pas. Ça fait un quart d'heure que que j'ouvre des fenêtres dans ton soft, que je charge des images dans tous les formats et dans tous les sens, je coupe, je colle dans paint, je recolle en sens inverse. Tout marche !
Il y a sans doute quelque chose que je n'ai pas compris. C'est quoi exactement, la manip' qui foire ?![]()
Voici l'unité AideHTML que j'ai oubliée.
As-tu supprimé (ou commenté) la ligne 587
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
89
90
91
92
93
94
95
96
97
98 unit AideHTML; {Version 1.0 du 10/10/2009} {Cette unité permet d'afficher un fichier d'aide au format *.html dans le navigateur par défaut sans avoir à connaître lequel est-ce et où il se trouve. Elle fonctionne pour les environnements Windows et Linux. En cas de modif ou d'ajout d'environnement, soyez sympa de m'en faire part à pr.chauveau@free.fr. Trois procédures sont proposées : 1 - AideEnligne : à utiliser si le fichier d'aide possède le même nom que l'application mais avec l'extension .html et se trouve dans le répertoire de l'application (cas nominal), 2 - AideEnLigne(Nom_du_fichier) : à utiliser si le fichier d'aide a un nom différent de celui de l'application mais se trouve quand même dans son répertoire. Nom_du_fichier doit être le nom avec son extension. 3 - AideEnLigne(Rep_du_fichier, Nom_du_fichier) : à utiliser pour un fichier html dont le nom et/ou le répertoire n'ont rien à voir avec l'application. } {$mode objfpc}{$H+} interface uses {$IFDEF WIN32} Windows, {$ENDIF} Classes, SysUtils, Dialogs; procedure AideEnLigne; overload; procedure AideEnLigne(Fch: string); overload; procedure AideEnLigne(Rep, Fch: string); overload; implementation {$IFDEF UNIX} uses {$IF (lcl_major = 0) and (lcl_minor = 9) and (lcl_release < 27)} Process; {$ELSE} UTF8Process; {$ENDIF} {$ENDIF} procedure MessageErreur(Fch: string); begin MessageDlg('Le fichier "'+Fch+'" n''a pas été trouvé', mtWarning, [mbOK], 0); end; procedure Aide(Rep, Fch: string); {$IFDEF UNIX} var {$IF (lcl_major = 0) and (lcl_minor = 9) and (lcl_release < 27)} Prc: TProcess; {$ELSE} Prc: TProcessUTF8; {$ENDIF} {$ENDIF} begin {$IFDEF UNIX} {$IF (lcl_major = 0) and (lcl_minor = 9) and (lcl_release < 27)} Prc:= TProcess.Create(nil); {$ELSE} Prc:= TProcessUTF8.Create(nil); {$ENDIF} Prc.CurrentDirectory:= Rep; Prc.CommandLine:= 'xdg-open '+Fch; Prc.Execute; if Prc.ExitStatus <> 0 then MessageErreur(Fch); Prc.Free; {$ENDIF} {$IFDEF WIN32} if ShellExecute(0, 'open', PChar(Fch), nil, PChar(Rep), SW_SHOWNORMAL) <= 32 then MessageErreur(Fch); {$ENDIF} end; procedure AideEnLigne; begin Aide(ExtractFileDir(ParamStr(0)), ChangeFileExt(ExtractFileName(ParamStr(0)),'.html')); end; procedure AideEnLigne(Fch: string); begin Aide(ExtractFileDir(ParamStr(0)), Fch); end; procedure AideEnLigne(Rep, Fch: string); begin Aide(Rep, Fch); end; end.
qui transforme tout en 24 bits et qui fait que tout fonctionne ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part BitParPix(Image, pf24bit);
Cordialement.
Pierre
Windows 7 pro 64 bits.
Lazarus et fpc : idem, mais 32 bits.
Bon, demain soir j'essaierai de réinstaller la version 64 bits pour voir ce que ça donne, et après je testerai sous Windows XP (en VM).
Bon, ben j'ai eu juste le temps de tester sous XP dans une VM.
Mauvaise (ou bonne, suivant l'angle) nouvelle :
Ça marche très bien...
Alors, bon, j'avoue que je ne sais pas quoi penser, du coup...
Tu as pensé à faire toutes les mises à jour de XP (SP3 et tout le toutim...) ?
Chez moi je n'ai que XP SP2, mais franchement, cela m'étonnerait que ce soit ça.
Je confirme que chez moi, cela ne fonctionne pas avec une belle constance et moi non plus, je ne sais plus quoi penser ...
Si de ton côté, tu es sûr que tu es en mode 32 bits dans Lazarus, je ne vois pas quoi faire.
Cordialement.
Pierre
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager