Openpicturedialog et raccourci.lnk [Résolu]

Messages postés
7
Date d'inscription
vendredi 20 août 2010
Dernière intervention
11 septembre 2010
- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 7 sept. 2010 à 22:08
bo'your !

ça ne semble pas avoir été soulevé ;
c'est peut-être juste à moi que ça arrive...
Bref,
le composant openpicturedialog plante, sérieusement!, lorsque :
on clique un raccourci.lnk

C'est tout.
Mais c'est plate.

Nos images sont dans différents dossiers, alors on se fait des *.lnk pour sauter d'un dossier à l'autre. Normal.

openpicturedialog , c'est mignon, il y a un aperçu et tout,
mais si tu as le malheur de cliquer un lien.lnk, wow, la cata !

En attendant de tenter de corriger l'unité dialogs.pas
(j'peux-tu faire ça? ça corrigerait le composant?)
j'utilise openfiledialog. Il n'y a pas d'aperçu mais on peut dblCliquer les lnk et naviguer sans crasher.

Suis-je la seule à qui c'est arrivé ?

aYez du bon temps,
jM cLapp
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
Salut,

bon c'est tout simple ... ça plante en mode Debug mais en exécution tout fonctionne à merveille

j'ai mis sur le bureau un raccourci vers une image jpg située dans le répertoire "Mes Images"
un TButton, un TImage et bien sur un TOpenPictureDialog .... le code qui suit:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;


tu compiles et tu lances l'exe en dehors de l'IDE ...

quand tu cliques sur le lien il n'y a pas d'aperçu (normal) mais si tu mets le style en "Miniatures" on a bien la vignette de l'image au dessus du lien et en double cliquant dessus l'image est ouverte dans le TImage !!


[hr]@+Cirec
[hr]

Merci Cirec 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
c'est un peu fort quand même !!

je ne devrais pas avoir à vous expliquer les bases de la programmation ... il y a assez de tutoriels sur le net à ce sujet

[b]on appelle ça la gestion d'exceptions:

/bet on peut gérer les exceptions de deux manières ...
(pour un pgm démarré en dehors de l'IDE)
la standard (l'utilisateur est averti de l'erreur)
et la silencieuse (l'utilisateur n'est pas averti)

en mode Debug (dans l'IDE) il n'existe pas d'exception silencieuse ... même si tu l'as explicitement programmé, l'erreur sera quand même déclenché par le Débogueur de l'IDE !!!

c'est exactement ce qu'il se passe ici ... donc non c'est pas un bug ... c'est volontaire, ça permet au programmeur de gérer l'erreur en interne sans perturber le fonctionnement du programme.

Démo (les mêmes composants que pour la démo précédente):
tu compiles et tu lances en dehors de l'IDE et il n'y aura pas d'erreur ... à l'inverse dans l'IDE tu auras une erreur[hr]procedure TForm1.Button1Click(Sender: TObject);

[b]begin
  try
    /bImage1.Picture.LoadFromFile('ImageBidon.bidon')
  [b]except

  end/b;
end;
[hr]
Par contre ce code déclenchera une erreur en dehors et deux erreurs dans l'IDE !!! [hr]procedure TForm1.Button1Click(Sender: TObject);

[b]begin
  try
    /bImage1.Picture.LoadFromFile('ImageBidon.bidon')
  [b]except
    raise/b;
  end;
end;
[hr]

Voilà ... maintenant si tu découvres vraiment ça à l'instant je te conseille d'étudier la chose de suite avant même de poursuivre ton dev.
en programmation on ne peut pas espérer comprendre le fonctionnement d'un objet où composant sans avoir étudier les bases

[hr]@+Cirec
[hr]

Merci Cirec 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
3
Merci
Bonjour,

Ce genre de bug donne très souvent lieu à l'ouverture d'un incident. Et c'est le cas ici.

Le composant semble avoir été corrigé en version 12, Delphi 2009.

Sinon, si tu as une version pro, tu dois pouvoir modifier le code du contrôle, dernier message ici.

Merci cs_rt15 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
oui oui ... mais ...

la mise à jour D2009 ne résout le problème qu'à moitié ... seul les raccourcis pointant vers une Image ne déclenche pas d'exception et affichent une miniature ... les raccourcis vers un répertoire plantent toujours de la même manière.

.. si l'on veut résoudre le faux problème il faut reprendre légèrement le code du "TOpenPictureDialog"
et pour ceux qui ne possèdent pas les sources il y a ceci:
[hr]{—————————————————————————————————————————————————————————————————————————}

{ Unit    : crExtDlgs.pas                                                 }
{ Comment : Corrige le pseudo bug de TOpenPictureDialog                   }
{            avec les raccourcis *.lnk                                    }
{                                                                         }
{    Date : 07/09/2010 20:49:22                                           }
{  Author : Cirec http://www.delphifr.com/auteur/CIREC/311214.aspx        }
{—————————————————————————————————————————————————————————————————————————}
{ Last modified                                                           }
{    Date : 07/09/2010 21:38:10                                           }
{  Author : Cirec http://www.delphifr.com/auteur/CIREC/311214.aspx        }
{—————————————————————————————————————————————————————————————————————————}
unit crExtDlgs;

[b]interface
uses /bWindows, SysUtils, Classes, Graphics, ExtCtrls, ExtDlgs, Buttons;
[b]type
/b{ TOpenPictureDialog }

  TOpenPictureDialog =   class (ExtDlgs.TOpenPictureDialog)
  [b]private
    /bFSavedFilename: string;
    FPaintPanel: TPanel;
    FPreviewButton: TSpeedButton;
  [b]protected
    procedure /bDoSelectionChange; override;
  [b]public
    constructor /bCreate(AOwner: TComponent); override;
  end;

[b]implementation
uses  /bComObj,    //     pour IUnknown;
      ActiveX,  //     pour IPersistFile
      ShlObj,   //     pour IShellLink
      Consts;   //

function GetLinkTarget(LinkPath: string): string;
[b]var
    /bAnObj    : IUnknown;
    ShLink   : IShellLink;
    PFile    : IPersistFile;
    Buffer   : array [0..MAX_PATH-1] of Char;
    Data     : TWin32FindData;
[b]begin
  /bResult : = EmptyStr;

  AnObj :=  CreateComObject(CLSID_ShellLink);
  ShLink := AnObj  as  IShellLink;
  PFile : = AnObj as IPersistFile;

  PFile.Load(PWChar(WideString(LinkPath)), STGM_READ);

  SHlink.GetPath(@Buffer, MAX_PATH, Data, SLGP_UNCPRIORITY);
  Result       :=  StrPas(@Buffer);
end ;
{ TOpenPictureDialog }


constructor TOpenPictureDialog.Create(AOwner: TComponent);
[b]begin
  inherited /bCreate(AOwner);
  FPreviewButton : = TSpeedButton(FindComponent('PreviewButton'));
  FPaintPanel :=  TPanel(FindComponent('PaintPanel'));
end ;

procedure TOpenPictureDialog.DoSelectionChange;
[b]var
  /bFullName, FileExt, lnkFileName: string;
  ValidPicture: Boolean;

  function ValidFile(const FileName: string): Boolean;
  [b]begin
    /bResult : = FileGetAttr(FileName) <> -1;
  end;

[b]begin
  /bFullName :=  FileName;
   if  FullName <> FSavedFilename [b]then
  begin
    /bFSavedFilename : = FullName;
    if CompareText(ExtractFileExt(FullName), '.lnk') =  0  then   // Do not localize
    [b]begin
      /blnkFileName : = GetLinkTarget(FullName);
      FileExt :=  LowerCase(ExtractFileExt(lnkFileName));
      ValidPicture := FileExists(lnkFileName)  and  ValidFile(lnkFileName);
      if ValidPicture and (Pos(FileExt, Filter) > 0) [b]then
        /bFullName : = lnkFileName;
    [b]end
    else
      /bValidPicture :=  FileExists(FullName)  and  ValidFile(FullName);
    if ValidPicture [b]then
    try
      /bImageCtrl.Picture.LoadFromFile(FullName);
      PictureLabel.Caption : = Format(SPictureDesc,
        [ImageCtrl.Picture.Width, ImageCtrl.Picture.Height]);
      FPreviewButton.Enabled :=  True;
      FPaintPanel.Caption := '';
    [b]except
      /bValidPicture := False;
     end ;
    if not ValidPicture [b]then
    begin
      /bPictureLabel.Caption : = SPictureLabel;
      FPreviewButton.Enabled :=  False;
      ImageCtrl.Picture :=  nil ;
      FPaintPanel.Caption : = srNone;
    end;
  end;
end;

end.
[hr]
Dans l'unité qui l'utilise il faut juste ajouter "crExtDlgs" après l'unité originale "ExtDlgs"

[b]uses
  /bWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ExtDlgs, crExtDlgs;

le reste ne change pas



[hr]@+Cirec
[hr]

Merci Cirec 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de Cirec
0
Merci
Plutôt que de faire parler de toi une fois de plus, pourrais tu lire l'aide de ton IDE ?

Touche F1


TOpenPictureDialog affiche une boîte de dialogue de sélection de fichier graphique.

Unité

ExtDlgs

Description

TOpenPictureDialog affiche une boîte de dialogue Windows modale permettant de sélectionner et d'ouvrir des fichiers graphiques. Ce composant est similaire à TOpenDialog mais inclut une zone de prévisualisation rectangulaire. Si l'image sélectionnée peut être lue par TPicture, elle est affichée dans la zone de prévisualisation ; les types de fichiers supportés sont les fichiers bitmap (.BMP), les icônes (.ICO), les métafichiers Windows (.WMF) et les métafichiers Windows étendus (.EMF). Si l'image sélectionnée ne peut pas être affichée, "(Aucun)" apparaît dans la zone de prévisualisation.

Si l'utilisateur sélectionne un fichier de type non reconnu, TPicture déclenche une exception EInvalidGraphic.


A ma connaissance un fichier lnk à ma connaissance n'est pas un fichier de type graphique donc avant de dire que ce composant ne fonctionne pas ou parler de débeugage il serait peut etre bien de se renseigner à quoi sert ce dit composant.

Au passage même si ton fichier lnk était de type graphique, il ne serait pas pris en compte : C'est marqué dans l'aide.

Dis donc toi entre ton source tout pourris, et ta question sur la base de registre, il serait peut etre bien d'allez lire le règlement
Commenter la réponse de Utilisateur anonyme
0
Merci
Oh là camarade Cirec : Notre amie n'a pas précisé que son raccourci pointait vers un fichier Jpeg mais vers un dossier d'ou ma remarque .
Commenter la réponse de Utilisateur anonyme
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
Oh là camarade Francky : On s'en tape puisque, si le lnk pointe sur un répertoire, ben un double clique l'ouvre, dans le TOpenPictureDialog, bien sur toujours en dehors de l'IDE


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
0
Merci
Oui camarade Cirec sauf que je suis pas sur qu'elle est son aperçu (j'ai pas testé ) ?
Commenter la réponse de Utilisateur anonyme
Messages postés
7
Date d'inscription
vendredi 20 août 2010
Dernière intervention
11 septembre 2010
0
Merci
merci Francky, de vous donner tant de peine (citations en exergue, épanchement abondant, etc.) c'est vraiment gentil.
Trop chou.

Votre réponse suggère que OpenPictureDialog "plante", génère une exception EInvalidGraphic, que c'est normal et c'est tout.
On pourrait y même y lire que c'est "à quoi sert ce dit composant"...

Même en relisant 2 fois ("A ma connaissance un fichier lnk à ma connaissance (...)") on n'y voit pas comment guérir l'objet.
Je suis quand même heureuse d'apprendre que j'ai déJà fait parler de moi. Je vais rougir ; pas riche, mais célèbre !
Merci quand même.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Attention, attention, débutants qui cherchez une solution

Oyez (enfin, lisez) l'information pertinente, nécessaire et suffisante :

[b]
"bon c'est tout simple ... ça plante en mode Debug mais en exécution tout fonctionne à merveille"/b

Ben voiLà ! Merci ceric.
Je vous le confirme, pour l'avoir immédiatement testé, en dehors de l'IDE évidemment, c'est au poil. Tiguidou, je dirais.

(Je n'ai donc pas le choix d'accorder ma "Rép. acc." à ceric)
Merci encore.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Il faudra que j'épluche l'aide de mon IDE pour voir si vraiment on nous y instruit que ce composant ne fonctionne pas en mode Debug.

Merci encore sincèrement,
jMcLapp

ps : oui, tiguidou. aH, sitoutétaittiguidou...
.
Commenter la réponse de cLapp
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
ps:
mon pseudo c'est Cirec
et non Ceric
... merci
Commenter la réponse de Cirec
0
Merci
Marie,

Sans vouloir te vexer tu devrais changer d'attitude car là tu ne te rends pas service. Si tu commences à te manifester ainsi sur CS à part te faire voler dans les plumes comme cela a été le cas, tu n'arriveras à rien d'autre.

Plutôt que de développer un projet tu devrais peut être apprendre les bases et apprendre à te servir de l'aide.

Quand aux sources, on ne poste pas n'importe quoi et je suis pas sur que ton source a été du gout de tout le monde : Preuve en est, qu'il a été désactivé sur le champs.

Que tu sois une petite rigolote c'est une chose, mais maîtrise la chose un minimum car :

1)Ton humour décalé est peut être pas du gout de tout le monde (Et à mon avis, il n'y a pas que moi qui doit défriser : Preuve en est Cirec qui semble lui aussi pas très content de ton intervention)

2)Tu as tendance à prendre les autres pour des cons : Et là ca devient beaucoup plus désagréable.

3)Tu risques plus de passer pour une quiche qu'autre chose

openpicturedialog , c'est mignon, il y a un aperçu et tout
Ce genre de chose a du en faire sourire plus d'un
Commenter la réponse de Utilisateur anonyme

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.