Capture d'une TStringGrid dans un bitmap

speedman31 Messages postés 7 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 24 avril 2009 - 21 avril 2009 à 22:54
speedman31 Messages postés 7 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 24 avril 2009 - 23 avril 2009 à 13:48
Bonjour,

J'ai réalisé une application pour établir le classement d'un petit concours que j'organise. Les résultats de ce concours sont affichés dans un TabSheet par l'intermédiaire d'une TStringGrid.
Afin de publier les résultats du concours sur ma page web, j'ai réalisé une petite procédure afin de capture le contenu de la TStringGrid, d'en faire une image GIF et de la mettre directement sur mon serveur HTTP.
Jusque là, tout va bien. Sauf que cette année, j'ai plus de joueurs et donc la TStringGrid s'affiche dans la TabSheet avec des ScrollBars, et donc seules les cellules visibles sont capturées, je ne parviens donc pas à faire une image avec l'ensemble de cellules de la grille (même en maximisant la fenêtre dans un écran 1280x1024).

Sauriez vous me dire s'il est possible de capturer le contenu d'une StringGrid (y compris les cellules non visibles) et d'en faire une image ?
Merci d'avance pour tout coup de main !
Pour info, voici ma procédure qui fonctionne uniquement sur les cellules visibles :

procedure TDlgRanking.GridCapture(grid: PDrawGrid; gifname: string);
var
  BmpDest : TBitmap;
  GIF : TGIFImage;
  CadreDest,CadreSrc,LastCell : TRect;
begin
Self.Repaint;
sleep(1000);
LastCell := grid^.CellRect(grid^.VisibleColCount+grid^.FixedCols,
                           grid^.VisibleRowCount+grid^.FixedRows);

CadreSrc := Rect(grid^.Left,grid^.Top,grid^.Width - (grid^.Width - LastCell.Right),
            grid^.Height - (grid^.Height - LastCell.Bottom));
CadreDest := Rect(grid^.Left,grid^.Top,grid^.Width - (grid^.Width - LastCell.Right),
            grid^.Height - (grid^.Height - LastCell.Bottom));
BmpDest := TBitmap.Create;
BmpDest.Height := CadreSrc.Bottom - CadreSrc.Top;
BmpDest.Width := CadreSrc.Right - CadreSrc.Left;
BmpDest.Canvas.CopyRect(CadreDest,grid^.Canvas,CadreSrc);
GIF := TGIFImage.Create;
GIF.ColorReduction := rmQuantizeWindows; //rmQuantizeWindows rmWindows256
GIF.DitherMode := dmFloydSteinberg; //dmFloydSteinberg dmNearest
GIF.Compression := gcLZW; //gcRLE
GIF.Assign(BmpDest);
GIF.SaveToFile(gifname+'.gif');
GIF.Free;
BmpDest.Free;
end;

6 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
22 avril 2009 à 08:52
Salut,

Idée : Pourquoi ne pas reprendre les données de la grille pour les dessiner sur une image que tu enregistres ensuite dans un gif ou autre ?

Simon
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 avril 2009 à 09:40
bonjour,
j'ai plus de joueurs et donc la TStringGrid s'affiche dans la TabSheet avec des ScrollBars, et donc seules les cellules visibles sont capturées, je ne parviens donc pas à faire une image avec l'ensemble de cellules de la grille (même en maximisant la fenêtre dans un écran 1280x1024).

Déjà, tu peux agrandir, ton StringGrid en runtime au fur et à mesure du nombre de joueurs, mais évidemment lorsque tu auras atteint la taille de l'écran, tu seras obligé de faire apparaître les Scrollbars..


On atteint donc ici la limite...


Il serait beaucoup plus logique de créer une table afin de gérer les joueurs
(ajout, modification et suppression)
et de les imprimer sous forme d'un état.

cantador
0
speedman31 Messages postés 7 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 24 avril 2009
22 avril 2009 à 23:12
J'ai essayé de copier le Canvas de la Grid dans un bitmap, en dimensionnant le bitmap à la taille globale de la grille.
ça fonctionne (le bitmap créé fait bien la taille totale de la grille mais la partie "non visible" de la grille reste blanche sur le bitmap), sauf qu'il faudrait que j'arrive à redimensionner la fenêtre parent à une taille > à celle de l'écran (enfin ma résolution qui est de 1280) et je n'y arrive pas ?
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 avril 2009 à 09:55
Tu peux aussi exporter les données du SG vers dans une TStringList et imprimer ensuite le tout en te servant de l'unité "Printers"...

cantador
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
23 avril 2009 à 13:36
Tu peux aussi créer un tableau sur ton serveur http et recopier les infos (si celles-ci ne comportent pas d'image), ça sera moins lourd qu'une image ?

Cordialement, Bacterius !
0
speedman31 Messages postés 7 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 24 avril 2009
23 avril 2009 à 13:48
Alors pour l'idée de la TStringList, en fait, j'ai déjà un tableau de String contenant toutes les infos à afficher dans la TStringGrid, je pourrais donc m'en servir pour l'exporter et ainsi avoir toutes mes données, le truc, c'est que j'aimerai que se soit plus présentable qu'un simple tableau de caractères ASCII vu que c'est pour ma page web.

Pour ce qui est de la création du tableau sur le serveur HTTP, là aussi, c'est une idée, mais j'ai peur que ça dépasse mes compétences pour la mise à jour du tableau par mon application. (surtout qu'en plus, mon site est en PHP et que le HTML est généré dans les pages contenant les résultats). D'autant plus que ce tableau doit être dynamique car d'une manche à l'autre, le nombre de joueurs varie, c'est pour cela que j'avais opté pour la capture Bitmap de mon logiciel.

Si cela vous parle plus, voici un lien vers mon site, plus spécialement sur la page dans lequel j'ai un lien vers l'image Bitmap produite par mon application:
http://webmaster.pronof1.free.fr/portail/modules.php?name=Content&pa=showpage&pid=3

Les trois captures de grille que vous verrez sont tronquées, il manque quelques joueurs à la fin ainsi que les colonnes de calcul des sommes et moyennes.

Bref, c'est pas simple mon truc....
0
Rejoignez-nous