oups, Le post précédent n'est pas passé
.
Mêmes symptômes qu'avant: un seul passage dans EditChanged au lancement de l'application test de ce composant. Voici l'essentiel du test...en couleurs ;)
type
// sous-classe créée pour modifier le comportement du tedit
TPersoEdit=class(TEdit)
private
protected
procedure WMMouseWheel(var Msg: TWMMOUSEWHEEL);message WM_MOUSEWHEEL;
public
published
end;
TPersoDBGrid =class(TDBGrid)
private//visible pour la seule TPersoDBGrid
{ Déclarations privées }
eRecherche:TPersoEdit;
procedure EditChanged(Sender:TObject);//déclaré sous PersoDBGrId
procedure selectTitre(Column: TColumn);
procedure triColonne(Column:TColumn);
protected//visible pour les seuls descendants de la TPersoDBGrid
{ Déclarations protégées }
procedure CellClick(Column: TColumn);override;//et pas overload car la methode surchargée est virtuelle
procedure TitleClick(Column:TColumn);override;
procedure DrawColumnCell(const Rect:TRect;DataCol:Integer;Column:TColumn;State:TGridDrawState);override;
//WMMouseWheel réagira aux messages de type roulette
procedure WMMouseWheel(var Msg: TWMMOUSEWHEEL);message WM_MOUSEWHEEL;
public//visible pour toutes les classes
constructor Create(Owner:TComponent);override;
destructor Destroy();override;
published//comme public mais visible en plus à la conception graphique
property ...
end;
procedureRegister;
implementation
var
nomDeChamp:string;
DataSet: TDataSet;
leftCellule,rightCellule:Integer;
constructor TPersoDBGrid.Create(Owner:TComponent);
begin
inherited Create(Owner);//Constructeur herité
//colorisations par défaut
//Instanciation d'une zone de saisie
eRecherche:=TPersoEdit.Create(Self);
with eRecherche do
begin
Parent:=self;
Ctl3D:=False;
Text:='';
Visible:=false;
end;
TEdit(eRecherche).OnChange:=EditChanged;
end;
destructor TpersoDBGrid.Destroy;
begin
eRecherche.Free;
Dataset.Free;
inherited Destroy;
end;
procedure TPersoDBGrid.TitleClick(Column:TColumn);
begin
//execution des fonctions attachées au tri
selectTitre(Column);//voir fonctions en bas de page
eRecherche.Visible:=True;
eRecherche.SetFocus;
triColonne(Column);//voir fonctions en bas de page
//execution de l'évènement du développeur si il est assigné
if Assigned(onTitleCLick)then onTitleclick(Column);
end;
procedure TPersoDBGrid.CellClick(Column: TColumn);
begin
with eRecherche do
begin
Text:='';
visible:=False;
Parent.SetFocus;
end;
end;
procedure TPersoDBGrid.DrawColumnCell(const Rect:TRect;DataCol:Integer;Column:TColumn;State:TGridDrawState);
begin
//si l'etat "selectionné" est trouvé dans le TGridDrawState pour une cellule
If gdSelected In State Then
Begin
//récupérer la position de la cellule selectionnée
leftCellule:=rect.Left;
rightCellule:=rect.Right;
//coloriser si les cellules concernées
//lancer la fonction de colorisation de l'entête et récupération du champ actif: selectTitre(Column);
End
Else//pour les cellules non sélectionnées
Begin
//cas des lignes à index pairs et impairs :coloriages
End; //appliquer l'operation de redessin
DefaultDrawColumnCell(rect,datacol,column,state);
end;
//gestion de la molettesur la grille si elle a le focus
procedure TPersoDBGrid.WMMouseWheel(var Msg: TWMMOUSEWHEEL);
begin
//...
end;
Exit;
end;
procedure TPersoEdit.WMMouseWheel(var Msg: TWMMOUSEWHEEL);
begin
self.Parent.SetFocus;
end;
procedure TPersoDBGrid.EditChanged(Sender:TObject);//déclaré sous PersoDBGrid
begin
if DataSet=nil then exit;
DataSet.Locate(nomDeChamp,eRecherche.Text,[loCaseInsensitive,loPartialKey]);
end;
procedure TPersoDBGrid.triColonne(Column:TColumn);
begin
//...
end;
procedure TPersoDBGrid.selectTitre(Column: TColumn);
var i:integer;
begin
//adaptation du TEdit nommé eRecherche à la colonne
with eRecherche do
begin
Left:=leftCellule;
width:=rightCellule-leftCellule;
Top:=0;
height:=-Column.Title.Font.Height;
Text:=Column.Title.Caption;
SelStart:=0;
SelLength:=30;
end;
nomDeChamp:=Column.FieldName;
//gestion de l'index de selection
//Gestion des couleurs des titres
end;
procedureRegister;
begin
RegisterComponents('Personnels',[TPersoDBGrid]);
end;
end.
rame, rame, rameurs, ramez....