Problème de dll

Résolu
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009 - 9 févr. 2006 à 16:11
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 - 11 févr. 2006 à 23:03
Bonjour,

J'ai un problème de fonctionnement avec une dll qui a pour but très "basique" de souligner ou non un TLabel en fonction de la position de la souris (onMouseEnter ou onMouseLeave). J'utilise alors la propriété font.style du TLabel pour lui attribuer ou non la spécificité [fsunderline ou lui retirer].

Le bug se produit alors losque je désire fermer la fenêtre après avoir fait fonctionner les deux évènements du TLabel. A noter que le bug ne se produit pas si je désire par exemple modifier le caption du TLabel ou sa couleur à la place de son aspect souligné.

Voici le code :

fichier projet :


unit Unit1;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls ;


type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;


var
Form1: TForm1;


procedure lien_enter(Sender: TObject); StdCall; external 'dll\Project1.dll' name 'lien_enter';
procedure lien_leave(Sender: TObject); StdCall; external 'dll\Project1.dll' name 'lien_leave';


implementation


{$R *.dfm}


procedure TForm1.Label1MouseEnter(Sender: TObject);
begin
lien_enter(Sender);
end;


procedure TForm1.Label1MouseLeave(Sender: TObject);
begin
lien_leave(Sender);
end;



fichier dll :


library Project1;


uses
Windows, Controls, StdCtrls, SysUtils, Classes, Graphics;

{$R *.RES}


procedure lien_enter(Sender: TObject); StdCall;
begin
TLabel(Sender).Font.Style : = [fsUnderline];
end;


procedure lien_leave(Sender: TObject); StdCall;
begin
TLabel(Sender).Font.Style := [];
end;


exports
lien_enter, lien_leave;


begin


end.



Message d'erreur :


1er : L'instruction à"0x004284bb"" emploie l'adresse mémoire "0x00000000". La mémoire ne peut pas être "read".
2ème : Exception EAccessViolation dans le module Project1.exe dans 000284BB. etc...

Si quelqu'un peut m'aider...
Merci

Orélien.

1 réponse

cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
11 févr. 2006 à 23:03
Je vois bien ce que tu veux faire : c'est violent.

Le plus simple (et le plus propre) est d'exploiter CM_MOUSELEAVE et CM_MOUSEENTER. C'est d'ailleurs ce que tu fais indirectement.

A moins que tu veuilles travailler sur des handles. Dans ce cas, transformer TLabel en TStatic.

Bref, la solution n'est pas miraculeuse. Elle est simple et pas prise de tête : on n'utilise pas de DLL pour ce genre de trucs. J'en vois pas l'intérêt... autant développer un composant CLASS.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls ;
type
TForm1 = class(TForm)
Label1: TLabel;

private
procedure Highlight(Sender:TObject);
procedure UnHighlight(Sender:TObject);
end;

var Form1 : TForm1;
implementation
{$R *.dfm}
procedure TForm1.Highlight(Sender: TObject);
begin
(Sender as TLabel).Font.Style:=[fsUnderline];
end;
procedure TForm1.UnHighlight(Sender: TObject);
begin
(Sender as TLabel).Font.Style:=[];
end;
end.

Ainsi, sur chacun de tes labels, avec l'inspecteur d'objets, tu feras converger les propriétés OnMouseEnter et OnMouseLeave sur Highlight et UnHighlight.

Evite de faire : TLabel(Sender).Machin
Préfère : (Sender as TLabel).Machin
Pourquoi ?
Ca génèrera une exception si ton Sender n'est pas TLabel.
Question propreté.

Ou alors, c'est un problème de convention d'appel. Essaye de remplacer STDCALL par FAR.

C'est l'architecture de la stratégie qui bat de l'aile.

===========
Validez les réponses si ok...

ViewVite XP : HTML
3
Rejoignez-nous