Problème de dll [Résolu]

cs_orelien
Messages postés
137
Date d'inscription
dimanche 7 juillet 2002
Dernière intervention
11 janvier 2009
- 9 févr. 2006 à 16:11 - Dernière réponse : cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
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.
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
cs_grandvizir
Messages postés
1237
Date d'inscription
samedi 8 novembre 2003
Dernière intervention
3 septembre 2006
- 11 févr. 2006 à 23:03
3
Merci
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

Merci cs_grandvizir 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de cs_grandvizir

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.