toonytoun
Messages postés35Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention14 août 2007
-
28 juin 2007 à 16:48
toonytoun
Messages postés35Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention14 août 2007
-
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 ;)
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 29 juin 2007 à 14:08
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;
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 28 juin 2007 à 21:29
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;
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
@++
Vous n’avez pas trouvé la réponse que vous recherchez ?
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 29 juin 2007 à 10:16
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('');
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 29 juin 2007 à 14:41
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)
toonytoun
Messages postés35Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention14 août 2007 29 juin 2007 à 15:52
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
@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é .
cincap
Messages postés460Date d'inscriptiondimanche 5 décembre 2004StatutMembreDernière intervention 6 avril 20092 2 juil. 2007 à 14:09
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.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 3 juil. 2007 à 13:32
Tu viens de prouver ce que je disais à demi-mot ...
à savoir que : si on ne vous donne pas un exemple adapté à 200% à votre cas vous y preferez un "bricolage" certe les "bricolages" on en fait tous mais seulement quand il n'existe pas de solution plus élégente ou mieux adaptée.
Au delà de la méthode d'affichage qui fait un peut bordel (le hint s'affiche à chaques mouvements de la souris ... ) et des fuites de mémoires, ce qui m'étonne le plus c'est que des pros (une entreprise) accèptent d'integrer dans leurs applications ce genre de code ...
j'imagine alors le reste du code ...
@Cincap:
L'erreur sur laquelle tu as mis le doigt n'a rien à voir avec le code que j'ai proposé ici ...
Si tu avais pris le temps (2 secondes) de mettre un point d'arrêt dans l'unité concernée tu aurais pu remarquer que l'erreur vient de borland ... et plus exactement du TFileListBox.
Quand aucune sélection n'est faite ou que la liste est vide, ItemIndex renvoi -1
Jusque là rien d'anormal ...
Mais si la propriété MultiSelect est à True ItemIndex renvoi 0 et ce même si la liste est vide
toonytoun
Messages postés35Date d'inscriptionjeudi 28 avril 2005StatutMembreDernière intervention14 août 2007 3 juil. 2007 à 17:59
Desolé de t'avoir vexé Cirec mais je n'avais pas vu ton tout petit poste juste au dessus de celui de Dom je vais regarder attentivement ton exemple et essayer de l'adapter car effectivement comme tu le dis il y a des fuites memoires et des affichages un peu long a se declencher dans le cas ou j'utilise deux (voir plus) DBGrid identiques par leur comportement.
Pour ce qu est de l'entreprise c'est une application interne et non commercialisé ce qui limite tous de meme le champs des personnes pouvant voir les "petits bugs" mais effectivement ca n'excuse rien.Apres on me demande de faire quelque chose un composant en plus tel que celui que tu as pu faire dans ton exemple a integrer dans un projet de plus grande envergure et dont la durée est très très courte (je suis stagiaire) donc effectivement c'est con a dire mais la pression pousse aux bugs. Ce n'est pas pour autant que mon code est a jeter a la poubelle j'essaye au maximum de creer des fonctions generiques les plus petites possibles (tout en restant raisonnable, trop petit signifierait la perte de la lisibilité), je sais pas si c'est le bon moyen en tout cas si tu as (vous avez) des conseils pour programmer vite et bien en Delphi je suis preneur