Visualizzazione e modifica dei campi MEMO nella TDBGrid di Delphi

 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 trucco in più) …

TMemoField

I campi Memo vengono utilizzati per rappresentare testo lungo o combinazioni di testo e numeri. Quando si creano applicazioni 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.

Sebbene sia possibile visualizzare i contenuti di un campo MEMO in un componente TDBMemo, in base alla progettazione, TDBGrid visualizzerà solo “(Memo)” per i contenuti di tali campi.

Per visualizzare effettivamente del testo (dal campo MEMO) nella cella DBGrid appropriata, è sufficiente aggiungere una semplice riga di codice …

Ai fini della discussione successiva, supponiamo di avere una tabella di database denominata “TestTable” con almeno un campo MEMO denominato “Dati”.

OnGetText

Per visualizzare il contenuto di un campo MEMO nel controllo DBGrid, è necessario allegare una semplice riga di codice nell’evento OnGetText del campo. Il modo più semplice per creare il gestore di eventi OnGetText consiste nell’usare l’editor dei campi in fase di progettazione per creare un componente di campo persistente per il campo memo:

  1. Collega il tuo componente discendente TDataset (TTable, TQuery, TADOTable, TADOQuery ….) alla tabella del database “TestTable”.
  2. Fare doppio clic sul componente del set di dati per aprire l’editor dei campi
  3. Aggiungere il campo MEMO all’elenco dei campi persistenti
  4. Seleziona il campo MEMO nell’editor Campi
  5. Attiva la scheda Eventi nell’Object Inspector
  6. Fare doppio clic sull’evento OnGetText per creare il gestore eventi

Aggiungi la riga di codice successiva (in corsivo sotto):

procedura TForm1.DBTableDataGetText (
Mittente: TField;
var Text: String;
DisplayText: Boolean);
iniziare
Testo: = Copia (DBTableData.AsString, 1, 50);

Nota: l’oggetto dataset si chiama “DBTable”, il campo MEMO si chiama “DATA” e quindi, per impostazione predefinita, il TMemoField connesso al campo database MEMO si chiama “DBTableData”. Assegnando DBTableData.AsString al parametro Text 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.

Modifica su un modulo separato

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 utilizzando un componente TMemo.
Per semplicità, apriremo una finestra di modifica quando INVIO viene premuto “su” un campo MEMO in un DBGrid.
Usiamo l’evento KeyDown di un componente DBGrid:

procedura TForm1.DBGrid1KeyDown (
Mittente: TObject;
var Key: Word;
Shift: TShiftState);
iniziare
se Chiave = VK_RETURN allora
iniziare
se DBGrid1.SelectedField = DBTableData allora
con TMemoEditorForm.Create (nil) do
prova
DBMemoEditor.Text: = DBTableData.AsString;
ShowModal;
DBTable.Edit;
DBTableData.AsString: = DBMemoEditor.Text;
infine
Gratuito;
fine;
fine;
fine;

Nota 1: “TMemoEditorForm” è un modulo secondario contenente un solo componente: “DBMemoEditor” (TMemo).
Nota 2: “TMemoEditorForm” è stato rimosso dall’elenco “Moduli di creazione automatica” nella finestra di dialogo Opzioni progetto.

Vediamo cosa succede nel gestore di eventi KeyDown di DBGrid1:

  1. Quando un utente preme il tasto INVIO (stiamo confrontando il parametro Key con il codice della chiave virtuale VK_RETURN) [Key = VK_RETURN],
  2. Se il campo attualmente selezionato in DBGrid è il nostro campo MEMO (DBGrid1.SelectedField = DBTableData),
  3. Creiamo il TMemoEditorForm [TMemoEditorForm.Create (nil)],
  4. Invia il valore del campo MEMO al componente TMemo [DBMemoEditor.Text: = DBTableData.AsString],
  5. Visualizza il modulo in modo modale [ShowModal],
  6. Quando un utente termina la modifica e chiude il modulo, dobbiamo mettere il dataste in modalità Modifica [DBTable.Edit],
  7. Per poter assegnare il valore modificato al nostro campo MEMO [DBTableData.AsString: = DBMemoEditor.Text].

Nota: se stai cercando altri articoli correlati a TDBGrid e suggerimenti per l’uso, assicurati di visitare: “TDBGrid al MAX” raccolta di suggerimenti.