Hint par ligne de DBGRID [Résolu]

toonytoun 35 Messages postés jeudi 28 avril 2005Date d'inscription 14 août 2007 Dernière intervention - 28 juin 2007 à 16:48 - Dernière réponse : toonytoun 35 Messages postés jeudi 28 avril 2005Date d'inscription 14 août 2007 Dernière intervention
- 3 juil. 2007 à 17:59
Salut a tous,

PROBLEME du jour : je souhaite afficher un hint différent (à partir des informations de la ligne selectionnée) en fonction de la ligne du DBGRID survolé par ma souris... j'ai trouvé très peu d'indications et ca me semble plus que très galère voir même impossible...

Si quelqu'un d'entre vous a déja eu ce problème (même si vous ne l'avez pas eu d'ailleurs) et qu'il a une solution il reglera un problme que personne de ma boite n'a reussit a resoudre ;)

Merci par avance
Afficher la suite 

23 réponses

Répondre au sujet
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 14:08
+3
Utile
OK Cirec,
Le but du jeu c'était sur un DBGrid
Je remet tout le code de façon plus propre (même si c'est du bricolage... (mais ça marche ...)) ;
var
  Form1: TForm1;


  aLigne:TstringList;
implementation


{$R *.dfm}


procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  ScrPt, GrdPt: TPoint;
  Cell: TGridCoord;
begin
  if not (Sender is TDBGrid) then exit;




  ScrPt := Mouse.CursorPos;
  GrdPt := (Sender as TDBGrid).ScreenToClient(ScrPt);
  Cell  := (Sender as TDBGrid).MouseCoord(GrdPt.X, GrdPt.Y);
  if cell.y>=0 then begin
    (sender as tdbgrid).Hint:=aligne[cell.y];
    (sender as tdbgrid).ShowHint:=true;
  Application.ActivateHint(Mouse.CursorPos);
  end;
end;


procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var  Cell: TGridCoord;
begin
  cell:=(Sender as TDBGrid).MouseCoord(Rect.Left+1, rect.Top+1);
  aligne[cell.y]:=Field.AsString;
end;


procedure TForm1.FormShow(Sender: TObject);
var i:integer;
begin
Aligne:=TstringList.Create;


for i:=0 to 100 do
  Aligne.add('');


end;

Dom
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dominique.stock
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 28 juin 2007 à 17:20
0
Utile
Bonjour à tous,

@toonytoun, voir  :

PostMessage( DBGrid1.Handle, WM_NCMOUSEMOVE, HTVSCROLL, 0);

@+,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
Utilisateur anonyme - 28 juin 2007 à 21:08
0
Utile
Salut

@Cincap : je pense que tu as pas cerné la question .

@ToounyToon : Le composant DBgrid n'admet pas cette propriété par défaut. Deux solutions s'offrent à toi :

1)Utiliser un TLabel sur l'évenement OnMouse du DBGrid; que tu personnalises en fonction de la position de la souris.

2)Dérivé le composant DBgrid : pour cela il ya un source de Nono 40.

Quoi qu'il en soit ca ne risque pas d'étre évident à faire.

Ps : il existe surment des composants tout fait te permettant de faire ca.

@+
Commenter la réponse de Utilisateur anonyme
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 28 juin 2007 à 21:29
0
Utile
Bonjour,
J'ai pas delphi sous la main , mais un truc comme ça :
procedure TForm1.DBGrigMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  ScrPt, GrdPt: TPoint;
  Cell: TGridCoord;
begin
  if not (Sender is TDBGrid) then exit;
  ScrPt := Mouse.CursorPos;
  GrdPt := (Sender as TDBGrid).ScreenToClient(ScrPt);
  Cell  := (Sender as TDBGrid).MouseCoord(GrdPt.X, GrdPt.Y);
  if Cell.Y = 0  then
  begin
    (Sender as TDBGrid).Hint := 'Varie selon X ou Y ';
    (Sender as TDBGrid).ShowHint := true;
  end else (Sender as TDBGrid).ShowHint := False;
end;

Dom
Commenter la réponse de dominique.stock
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 29 juin 2007 à 07:18
0
Utile
Bonjour à tous,

@ Francky23012301, tu as raison; je pensais qu'il utilisait une TTable et un TDataSet pour l'affichage dans le DBGrid et dans le TTable, il aurait utilisé l'évènement AfterScroll.

@ Toonytoun, sinon voici un lien intéressant : http://www.delphifr.com/code.aspx?ID=20400

Avec le projet, une unité pour affichage d'un hint avec la position de la souris.

@+,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
Utilisateur anonyme - 29 juin 2007 à 08:25
0
Utile
@Dominique : fonctionne pas ta procédure

Ch'avait que tu étais précis comme mec mais là if Cell.Y = 0  then, tu m'épates .

J'arrette de te taquiner : si le nombre de champs ou d'enregistrement varie au cours du temps, ou s'ils sont tres important (genre 10 000 enregistrement), ca va pas etre tres comode meme avec un Case Of  .

Mais c'était une excellent idée : dommage quelle soit pas exploitable. Le mieux est que notre amis aille chercher un DBGrid customisé sur la toile

@++
Commenter la réponse de Utilisateur anonyme
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 10:16
0
Utile
Sinon, :
var
Aligne :tstringList;

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  ScrPt, GrdPt: TPoint;
  Cell: TGridCoord;
begin
  if not (Sender is TDBGrid) then exit;
  ScrPt := Mouse.CursorPos;
  GrdPt := (Sender as TDBGrid).ScreenToClient(ScrPt);
  Cell  := (Sender as TDBGrid).MouseCoord(GrdPt.X, GrdPt.Y);
  (sender as tdbgrid).Hint:=aligne[cell.y]; 
    (sender as tdbgrid).ShowHint:=true;
end;


procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var  Cell: TGridCoord;
begin
  cell:=(Sender as TDBGrid).MouseCoord(Rect.Left+1, rect.Top+1);
  aligne[cell.y]:=Field.AsString;  // l'info qui doit être affiché dans le hint de la ligne ....
// si il n'est pas dessiner : TDBgrid(sender).fieldByName('tt').asstring ....
end;


procedure TForm1.FormShow(Sender: TObject);
var i:integer;
begin
Aligne:=TstringList.Create;
for i:=0 to 100 do  // je sais c'est pas trés propre, le nombre de ligne afficher par le dbgrid
  Aligne.add('');


end;
Dom
Commenter la réponse de dominique.stock
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 10:19
0
Utile
modif:
 if cell.y>=0 then begin
  (sender as tdbgrid).Hint:=aligne[cell.y];
    (sender as tdbgrid).ShowHint:=true;
  end;

Ca marche: Par contre pas trés réactif

Dom
Commenter la réponse de dominique.stock
toonytoun 35 Messages postés jeudi 28 avril 2005Date d'inscription 14 août 2007 Dernière intervention - 29 juin 2007 à 10:30
0
Utile
Merci beaucoup je testerais ca lundi, (j'e l'aurais bien testé aujourd'hui mais vu mon etat de forme actuel ca attendra lundi) et je viendrai valider

Merci encore pour toutes vos réponses, c'est ce qui fait que j'adore ce forum :-)
Commenter la réponse de toonytoun
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 10:30
0
Utile
Là c'est plus réactif :

 if cell.y>=0 then begin
  (sender as tdbgrid).Hint:=aligne[cell.y];
    (sender as tdbgrid).ShowHint:=true;
  Application.ActivateHint(Mouse.CursorPos);
  end;

Dom
Commenter la réponse de dominique.stock
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 10:33
0
Utile
@Francky23012301
le premier code, je l'ai pris sur la toile en Russe  ... et j'avais pas pu le tester ....

par contre le suivant est de moi en me servant du premier et de
http://nono40.developpez.com/sources/source0035/  de nono40
pour l'activateHint ....

Dom
Commenter la réponse de dominique.stock
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 29 juin 2007 à 12:29
0
Utile
Salut,

et si je te donne une réponse (que personne n'a trouvé dans ta boite ni ailleur) c'est toi qui va te faire mousser ... devant les autres

et je ne pense pas que la version donné par Nono40 soit satisfaisante !

à suivre ...
 
@+
Cirec

Commenter la réponse de Cirec
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 29 juin 2007 à 13:12
0
Utile
Voilà

c'est ici que ça se passe :

http://www.delphifr.com/code.aspx?ID=43288

 
@+
Cirec

Commenter la réponse de Cirec
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 29 juin 2007 à 14:41
0
Utile
Salut Dom,

je sais que la demande portait sur un TDBGrid

et l'exemple que je donne est suffisement complet pour pouvoir l'adapter à un TDBGrid (le principe reste le même)

Je ne vais quand même pas lui mâcher tout le travail ...

Sinon, l'avantage de ce code c'est qu'il reproduit parfaitement le comportement normal d'un Hint ce qui n'est pas le cas avec celui que tu proposes.

à savoir ton code affiche un hint à chaques mouvements de la souris ... (réaffichage à chaques pixels et dans la même cellule)

Dans mon code tant que la souris reste dans la cellule le hint reste affiché (jusqu'à la fin du delai)
et ne change que si le pointeur change de cellule
Ne se réaffiche pas si le pointeur n'a pas quitté la cellule
Ne s'affiche pas si la cellule est en mode Edit (ce qui pourrait être gênant pour la saisie)
 
@+
Cirec

Commenter la réponse de Cirec
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 14:54
0
Utile
En effet, un mixte des deux fera certainement l'affaire ....

Dom
Commenter la réponse de dominique.stock
toonytoun 35 Messages postés jeudi 28 avril 2005Date d'inscription 14 août 2007 Dernière intervention - 29 juin 2007 à 15:52
0
Utile
l'interet n'etant pas de me faire mousser mais de faire ce que l'on me demande je serai d'abord super content d'avoir trouver une solution. après en ce qui concerne mon moussage personnel sachant que je leur est demandé a tous ils savent très bien que je suis pas un master pro of delphi et que la seule chose que j'ai demandé a mon taf c'est d'avoir une connection a internet pour pouvoir poser des questions sur des forums (et plus particulierement celui ci qui je trouve surclasse les autres).

Apres je trouve ca plus interressant de faire la publicité du forum que de faire la mienne personnellement, et puis toute personne qui tapera la meme chose sur google pourra facilement le trouver maintenant sur la toile grace a tous vos commentaires car effectivement a part les reponses que vous m'avez donné j'ai pas trouver grand chose sur le net, en posant cette question c'est toi que je fais mousser vis a vis de tous les delphiens de la toile ;)

En tout cas merci a toi, a dom et a tous les autres qui ont participé je validerai lse reponses apres test lundi

bon we a tous et merci encore
Commenter la réponse de toonytoun
Utilisateur anonyme - 29 juin 2007 à 15:56
0
Utile
@Dominique : désolé si je t'ai vexé. Ce n'étais pas le but recherché. Malgré que ta proposition était intélligente, tu me semblais mal barré par cette méthode. J'avais vu le source de Nono 40 mais elle me semblait admettre certain ptits problèmes

@Cirec : je m'attendais à une difficulté plus importante. Comme quoi les apparences sont trompeuses. C'est du bon boulot que vous avez proposé .

@+
Commenter la réponse de Utilisateur anonyme
dominique.stock 446 Messages postés vendredi 7 novembre 2003Date d'inscription 8 octobre 2008 Dernière intervention - 29 juin 2007 à 16:18
0
Utile
Pas de problème Francky ...

Ce méfier des mails ou message écrits, des fois ils ne reflètent pas tout à fait le ton voulu ....  d'où l'intérêt des "smiley"

Bon WE

Dom
Commenter la réponse de dominique.stock
cincap 490 Messages postés dimanche 5 décembre 2004Date d'inscription 6 avril 2009 Dernière intervention - 2 juil. 2007 à 14:09
0
Utile
Bonjour à tous,

@ cirec, j'espère que tu vas bien, je constate en utilisant ton unité (CustomFileCtrl.pas ou autre), que si avec le composant "TfileListbox", sa propriété "Multiselect" est à true, on obtient une erreur en le survolant avec la souris dans le cas ou le mask de ce composant affiche une extension définie ex: *.avi et que l'on se rend dans un répertoire ou dossier ou il n'y a pas ces fichiers avec cette extension. 

@+,

Cincap

[url]mailto:/url
Commenter la réponse de cincap
toonytoun 35 Messages postés jeudi 28 avril 2005Date d'inscription 14 août 2007 Dernière intervention - 2 juil. 2007 à 14:24
0
Utile
Réponse de Dom acceptée, ça marche nikel ;)

Merci encore.
Commenter la réponse de toonytoun

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.

Hint par ligne de DBGRID - page 2