Se stai sviluppando applicazioni di database con tabelle contenenti campi MEMO, noterai che, per impostazione predefinita, il componente TDBGrid non mostra il contenuto di un campo MEMO all'interno di una cella DBGrid.
Questo articolo fornisce un'idea di come risolvere il problema di TMemoField (con qualche altro trucco) ...
I campi memo sono usati per rappresentare testi lunghi o combinazioni di testo e numeri. Quando si creano applicazioni di database utilizzando Delphi, l'oggetto TMemoField viene utilizzato per rappresentare un campo memo in un set di dati. TMemoField incapsula il comportamento fondamentale comune ai campi che contengono dati di testo o lunghezza arbitraria. Nella maggior parte dei database, la dimensione del campo Memo è limitata dalla dimensione del database.
Mentre è possibile visualizzare il contenuto di un campo MEMO in un componente TDBMemo, in base alla progettazione TDBGrid visualizzerà solo "(Memo)" per il contenuto di tali campi.
Per visualizzare effettivamente del testo (dal campo MEMO) nella cella DBGrid appropriata, dovrai solo aggiungere una semplice riga di codice ...
Ai fini della prossima discussione, supponiamo di avere una tabella di database denominata "TestTable" con almeno un campo MEMO denominato "Dati".
Per mostrare il contenuto di un campo MEMO nel DBGrid, è necessario collegare una semplice riga di codice nel campo OnGetText evento. Il modo più semplice per creare il gestore eventi OnGetText è utilizzare l'editor Fields in fase di progettazione per creare un componente di campo persistente per il campo memo:
Aggiungi la riga di codice successiva (in corsivo di seguito):
procedura TForm1.DBTableDataGetText (
Mittente: TField;
var Text: String;
DisplayText: Boolean);
inizio
Testo: = Copia (DBTableData.AsString, 1, 50);
Nota: l'oggetto del set di dati si chiama "DBTable", il campo MEMO si chiama "DATA", e quindi, per impostazione predefinita, il TMemoField collegato al campo del database MEMO si chiama "DBTableData". Assegnando DBTableData.AsString al Testo parametro dell'evento OnGetText, diciamo a Delphi di visualizzare TUTTO il testo dal campo MEMO in una cella DBGrid.
È inoltre possibile adattare DisplayWidth del campo memo a un valore più appropriato.
Nota: poiché i campi MEMO possono essere abbastanza GRANDI, è una buona idea mostrarne solo una parte. Nel codice sopra, vengono visualizzati solo i primi 50 caratteri.
Per impostazione predefinita, TDBGrid non consente la modifica dei campi MEMO. Se si desidera abilitare la modifica "sul posto", è possibile aggiungere del codice per reagire a un'azione dell'utente che mostra una finestra separata che consente la modifica mediante un componente TMemo.
Per semplicità apriamo una finestra di modifica quando si preme INVIO "su" un campo MEMO in un DBGrid.
Usiamo il KeyDown evento di un componente DBGrid:
procedura TForm1.DBGrid1KeyDown (
Mittente: TObject;
var chiave: Word;
Maiusc: TShiftState);
inizio
if Key = VK_RETURN quindi
inizio
se DBGrid1.SelectedField = DBTableData quindi
con TMemoEditorForm.Create (zero)
provare
DBMemoEditor.Text: = DBTableData.AsString;
ShowModal;
DBTable.Edit;
DBTableData.AsString: = DBMemoEditor.Text;
infine
Gratuito;
fine;
fine;
fine;
Nota 1: "TMemoEditorForm" è un modulo secondario contenente solo un componente: "DBMemoEditor" (TMemo).
Nota 2: il "TMemoEditorForm" è stato rimosso dall'elenco "Crea automaticamente moduli" nella finestra di dialogo Opzioni progetto.