Discussione:
Immagine su Tstringgrid
(troppo vecchio per rispondere)
Roberto Boriani
2021-07-08 11:02:23 UTC
Permalink
Buongiorno a tutti,
sono nuovo del gruppo ed anche alle prime armi con delphi.
Sto cercando di sviluppare una applicazione con delphi XE6.
Vorrei fare comparire in una colonna del Tstringrid una immagine (se associata al record che sto leggendo).
Come devo fare?
Grazie anticipate per chi volesse aiutarmi.
Finora sul web ho letto un po di cose e sto facendo così, ma non esce fuori niente come immagine:
....
....
type
TFelRegProCol = class(TFbasedb)
.......
Image2: TImage;
.......
procedure TFelRegProCol.leggilistecollegate;
begin
riga:=0;
colonna:=0;
maxcols:=0;
sg1.Cells[colonna,riga]:='Seq. Lista';
colonna:=colonna+1;
sg1.Cells[colonna,riga]:='N.Lis.Coll.';
colonna:=colonna+1;
sg1.Cells[colonna,riga]:='Partito';
colonna:=colonna+1;
sg1.Cells[colonna,riga]:='Sigla';
colonna:=colonna+1;
sg1.Cells[colonna,riga]:='Descrizione';
colonna:=colonna+1;
tablistecollegate.contalistecoll(codele, tipele, turno, codcandi);
n:=tablistecollegate.aqt.fieldbyname('totcol').asinteger;
setlength(ar1,n);
tablistecollegate.read_view_liscolcan(codele, tipele, turno, codcandi);
while tablistecollegate.aqt.Eof = false do
begin
riga:=riga+1;
colonna:=0;
.....
sg1.cells[colonna,riga]:=tablistecollegate.aqt.fieldbyname('par_descri').AsString;
colonna:=colonna+1;
if trimright(tablistecollegate.aqt.fieldbyname('par_icona').AsString) <> '' then
begin
Bitmap.LoadFromFile(trimright(tablistecollegate.aqt.fieldbyname('par_icona').AsString));
image2.Create(self);
image2.Picture.LoadFromFile(trimright(tablistecollegate.aqt.fieldbyname('par_icona').AsString));
ar1[riga-1]:=trimright(tablistecollegate.aqt.fieldbyname('par_icona').AsString);

sg1.canvas.StretchDraw(sg1.CellRect(colonna, riga),image2.Picture.Bitmap);
colonna:=colonna+1;
end;
if colonna > maxcols then
maxcols:=colonna;
tablistecollegate.aqt.Next;
end;
sg1.RowCount:=riga+1;
sg1.ColCount:=maxcols+1;
totlistecol:=riga;
autosize;
end;
Daniele
2021-07-09 10:06:01 UTC
Permalink
Ciao Roberto,
mi permetto di darti un paio di suggerimenti .....

1) Evita di usare colonna := Colonna + 1;
Dato che le colonne le imposti tu e, puo' essere, che domani devi
riarrangiare la griglia ... il tutto e' molto complicato.
Trovo, a titolo personale, mettere le colonne come costanti tipo

const ColLista = 1;
ColSigla = 4;

sg1.Cells[colLista,riga]:='Seq. Lista';
sg1.Cells[colLista,riga]:='Sigla';

2) Dato che qualcuno ha gia' avuto il tuo stesso problema e, molto
probabilmente, lo ha gia' risolto ... perche' non attingere ed
utilizzare quella soluzione?
Nello specifico, anche se poco aggiornato, ti consiglio il sito
www.torry.net
che e' una miniera di componenti ma, come divevo, poco aggiornato.
Per le griglie, cosi' su due piedi, ti suggerisco di dare un'occhiata
alla griglia che trovi in questo sito
www.scalabium.com
E' aggiornata, stabile, funziona bene ma (credo) e' un DBGrid.
Pregi: E' totalmente FREE e (quando la usavo) lavora bene ed e' facile
da capire.
Svantaggi: Forse e' solo una DBGrid e lavora solo con i data base.

La seconda, che ti suggerisco, e' la griglia delle TMS: AdvStringGrid.
Pregi: Per me molti, stabile, lavora bene e ha la versione DB Aware per
chi la vuole lavorare direttamente con i db
Svantaggi: E' Commerciale, quindi costicchia. Essendo scritta da TMS
c'e' chi dice peste e corna di questi componenti ... ma per il prezzo
che costano ... valgono quanto spendi.

C'e' una terza (super)griglia scritta da DevExpress.
Non usandola non so dirti pregi e difetti, ma costa molto ... tanto!
Hai comunque 30 giorni per valutarla

In caso di necessita' usa goole, inserendo
"delphi stringgrid bitmap"
ecco alcuni, delle decine di, risultati.

https://stackoverflow.com/questions/9924259/inserting-image-in-stringgrid-cell

https://stackoverflow.com/questions/61419682/how-do-i-properly-display-a-combined-image-in-a-delphi-tstringgrid-component


Buona navigazione

Ciao
Daniele
Alessandro B.
2021-07-09 11:58:42 UTC
Permalink
Ciao,

se vuoi farlo da codice devi intercettare e ridefinire l'evento
TDrawCellEvent = procedure (Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState) of object;
property OnDrawCell: TDrawCellEvent;

Io ho fatto la stessa cosa, ma per la DbGrid, quindi sono andato a ridefinire
procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); dynamic;

Trovi molto codice online se cerchi l'argomento
brunello
2021-07-09 16:07:40 UTC
Permalink
Avevo avuto un problema del genere ho estrapolato la parte che ti interessa e ho fatto questo semplice progetto di test lo trovi a questo indirizzo
https://u.pcloud.link/publink/show?code=XZQdPPXZkkt348GUctfzCkRzEX8TD4FlVbXV ciao
Alberto Salvati
2021-07-12 08:17:32 UTC
Permalink
Post by Roberto Boriani
Buongiorno a tutti,
sono nuovo del gruppo ed anche alle prime armi con delphi.
Ciao. Hai scelto un linguaggio praticamente morto.
Ti suggerisco, appena puoi di spostarti su altro, a prescindere da cosa possa essere "altro".
A parte ciò, la 1a cosa da tenere a mente quando lavori in delphi è che, a differenza di java e c#, NON HA IL GARBAGE COLLECTOR.
Quindi, in delphi, come in c e c++, tutto si crea e tutto si distrugge.
Post by Roberto Boriani
Sto cercando di sviluppare una applicazione con delphi XE6.
Preparati a qualche "scoppio".
Xe6 è sicuramente meno peggio di xe5 ma comunque scoppia...
Almeno non capita che tentando la build ti dice che il file exe è in uso, cosa che in xe5 capita una volta si e l'altra pure.
Post by Roberto Boriani
Vorrei fare comparire in una colonna del Tstringrid una immagine (se associata al record che sto leggendo).
.....come mai usi una tstringgrid per mostrare dati letti da un dataset e non una tdbgrid...??
Post by Roberto Boriani
colonna:=colonna+1;
Gli array in delphi (ma non solo...) oramai si usano molto poco in quanto SCOMODI.
Meglio usare una collection.
Visto che sei alle prime armi cerca nella guida TList e la sua versione generica.
Post by Roberto Boriani
n:=tablistecollegate.aqt.fieldbyname('totcol').asinteger;
setlength(ar1,n);
La lingua del software è l'inglese.
Ti suggerisco di abiutarti fin da subito a:

1) IGNORARE DOCUMENTAZIONI E TESTI IN ITALIANO (stanno scritte strunzate...)
2) nel codice usare nomenclature in inglese.

Questa forma non è sbagliata ma in delphi se ne usa una più standard
Post by Roberto Boriani
while tablistecollegate.aqt.Eof = false do
while NOT tablistecollegate.aqt.Eof


Non so interpretare esattamente cosa fa questa riga qua sotto ma a occhio intravedo un memory leak.
Se ne basta UNA, non serve crearla ongi volta: basta crearla una volta prima di entrare nel loop.
Se ne servono di più, crei una lista (vedi sopra) e NON UN ARRAY...!
Post by Roberto Boriani
image2.Create(self);
A.

Continua a leggere su narkive:
Loading...