Gestion du focus ?

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 13 avril 2003 à 18:32
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 13 avril 2003 à 21:47
Salut à tous !

Je cherche à coder un éditeur (un peu comme SynEdit, mais en plus léger) pour la gestion du code C/C++, mais je me heurte à un petit problème pour la gestion du focus...

J'ai dérivé à partir de TCustomControl, pour avoir un Canvas et la possibilité de recevoir le focus, mais je ne sais pas comment gérer le focus au sein de ce composant (hormis l'appel à Focused pour savoir si on le détient ou non)...

Pour le moment mon code ressemble à çà (et oui, il faut bien commencer, lol) :

type
TCodeEditor = class(TCustomControl)
private
protected
procedure RFocus(var Msg: TMessage); message WM_SETFOCUS;
procedure LFocus(var Msg: TMessage); message WM_KILLFOCUS;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
published
property Name;
property Tag;
end;

implementation

procedure TCodeEditor.RFocus(var Msg: TMessage);
begin
Invalidate;
end;

procedure TCodeEditor.LFocus(var Msg: TMessage);
begin
Invalidate;
end;

constructor TCodeEditor.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// initialisations
end;

destructor TCodeEditor.Destroy;
begin
// finalisations
inherited Destroy;
end;

procedure TCodeEditor.Paint;
begin
Canvas.Brush.Color := clWindow;
Canvas.FillRect(Canvas.ClipRect);
if Focused then Canvas.DrawFocusRect(Canvas.ClipRect);
end;

Ce qui me fait un carré blanc, avec le focus si j'appelle SetFocus, qui perd le focus si je clique sur un bouton (je n'ai utilisé ClipRect que pour me faciliter la tache pour l'instant, il va de soi que je ne l'utiliserais pas ainsi par la suite)... mais qui ne le reçoit pas si je clique dessus ou que je presse tab :(

Accessoirement, j'aimerais savoir s'il existe une fonction pour dessiner une bordure au composant (comme pour TMemo : style 9x ou Xp selon la présence ou non du XPManifest...) ? Et aussi, comment gérer les scrollbars : dois-je créer deux barres (et si oui, de quel type : TScrollBar ou TControlScrollBar ?) ou utiliser une TScrollBox ?

J'ai cherché des informations là dessus sur google toute l'après midi mais je n'ai rien trouvé de probant ... Et les recherches sur delphifr ne m'ont guère avancé non plus :(

Donc si vous avez des sources ou de la doc susceptibles de m'aider, merci d'avance de me le faire savoir ;)

Gab's :o)

PS: je souhaite coder ce composant pour deux raisons... tout d'abord parce que le SynEdit bugge parfois sous Win98 (la police fait n'importe quoi), et çà fait longtemps que je souhaite coder un truc dans ce genre ;p

4 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
13 avril 2003 à 19:02
Pour une telle utilisation, est-ce bien judicieux de partir de TcustomControl comme base pour dériver un composant ayant les fonctionnalités que tu décris ?
Si tu as le poster avec la hiérarchie de la VCL, tu t'apercevras que tu peux t'affranchir de tous ces petits problèmes.

Le bug que tu mentionnes dans les composants SynEdit est-il encore présent dans la version 1.1 du 12/07/2002 ?
May Delphi be with you
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
13 avril 2003 à 19:58
J'ai bien le poster mais je crois que les TMemo sont limités à 64Ko sous Win98, ce qui ne m'arrange pas vraiment, et je suppose qu'il en est de meme pour les TCustomMemo (je suppose que tu fais allusion à ce composant comme ancêtre pour le mien ?) De plus j'aimerais essayer de tout faire plus ou moins moi même, c'est mon premier composant aussi "ambitieux" et il n'y a que comme çà qu'on apprend... A condition d'avoir un point de départ ;p lol

Et j'utilise la version 1.1 du 12/07/2002, donc je peux te confirmer que ce bug est bien présent, mais curieusement que sous Win98, sous les NT il fonctionne impeccablement... En l'occurence, si je devais bosser sous NT cela ne me dérangerait pas outre mesure mais ce n'est pas le cas :(
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
13 avril 2003 à 21:18
Un code source qui ferait plus de 64 Ko ?
Daprès un article paru dans The Delphi magazine de janvier 2002, 64 Ko est la limite par défaut même sous Win NT et 2000.
Pour pallier à ce problème, il suffit, je cite "de changer la valeur de la propriété MaxLength avant d'écrire la première ligne dans le contrôle".
Pour preuve, on donne la taille maximum admise par la méthode LoadFromFile qui est de 2 Go - 16 octets sauf si la propriété MaxLength est celle par défaut, soit 64 Ko.
NB : cette remarque était faite à propos du composant TRichEdit, descendant indirect de TCustomMemo.
La valeur maximum admise pour MaxLength est donc de $7FFFFFF0.
Si ça peut aider...
May Delphi be with you
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
13 avril 2003 à 21:47
Surement pas en C, mais je suppose qu'en HTML (ou plutot php/asp) ce doit etre assez vite atteint, et j'aimerais inclure d'autres langages ensuite (bah oui, pkoi pas lol)...

Pour ce qui est du memo, sous 98 il "bloque" une fois les 64Ko atteints, alors que sous NT il semble s'adapter, puisqu'il continue de stocker le texte (ce qui vaut pour tous les descendants du TCustomMemo)...

Par contre les memo n'ont pas de propriété Canvas, ce qui risque d'être assez embêtant pour faire un éditeur de code (j'aimerais y inclure la coloration du code), j'ai bien trouvé un code qui crée un DC pour colorier une ligne dans le memo mais çà me semble un peu lourd comme solution :-/

Je vais continuer à chercher un peu puis si je ne trouve rien, je partirais d'un TCustomMemo je pense... Je décortique tant bien que mal un code russe (TColorMemo), qui est dérivé de TCustomControl et semble très réussi vu les démos, l'ennui étant que je ne parle pas russe !!! lol

Merci de ton aide en tout cas ;)
0
Rejoignez-nous