Affichage et modification des champs MEMO dans TDBGrid de Delphi

 Si vous développez des applications de base de données avec des tables contenant des champs MEMO, vous remarquerez que, par défaut, le composant TDBGrid n'affiche pas le contenu d'un champ MEMO dans une cellule DBGrid.

Cet article donne une idée de la façon de résoudre le problème de ce TMemoField (avec quelques astuces supplémentaires)…

TMemoField

Les champs mémo sont utilisés pour représenter un texte long ou des combinaisons de texte et de nombres. Lors de la création d'applications de base de données à l'aide de Delphi, l'objet TMemoField est utilisé pour représenter un champ mémo dans un ensemble de données. TMemoField encapsule le comportement fondamental commun aux champs qui contiennent des données texte ou une longueur arbitraire. Dans la plupart des bases de données, la taille du champ Mémo est limitée par la taille de la base de données.

Bien que vous puissiez afficher le contenu d'un champ MEMO dans un composant TDBMemo, par sa conception, le TDBGrid affichera uniquement "(Mémo)" pour le contenu de ces champs.

Afin d'afficher réellement du texte (du champ MEMO) dans la cellule DBGrid appropriée, vous n'aurez qu'à ajouter une simple ligne de code…

Aux fins de la discussion suivante, supposons que vous ayez une table de base de données nommée "TestTable" avec au moins un champ MEMO nommé "Data".

OnGetText

Pour afficher le contenu d'un champ MEMO dans DBGrid, vous devez attacher une simple ligne de code dans le champ OnGetText un événement. La façon la plus simple de créer le gestionnaire d'événements OnGetText consiste à utiliser l'éditeur de champs au moment du design pour créer un composant de champ persistant pour le champ mémo:

  1. Connectez votre composant descendant TDataset (TTable, TQuery, TADOTable, TADOQuery…) à la table de base de données "TestTable".
  2. Double-cliquez sur le composant de l'ensemble de données pour ouvrir l'éditeur de champs
  3. Ajoutez le champ MEMO à la liste des champs persistants
  4. Sélectionnez le champ MEMO dans l'éditeur de champs
  5. Activez l'onglet Événements dans l'inspecteur d'objets
  6. Double-cliquez sur l'événement OnGetText pour créer le gestionnaire d'événements

Ajoutez la ligne de code suivante (en italique ci-dessous):

procédure TForm1.DBTableDataGetText (
Expéditeur: TField;
var Text: String;
DisplayText: Boolean);
commencer
Texte: = Copier (DBTableData.AsString, 1, 50);

Remarque: l'objet d'ensemble de données est appelé "DBTable", le champ MEMO est appelé "DATA", et par conséquent, le TMemoField connecté au champ de base de données MEMO est appelé "DBTableData". En attribuant DBTableData.AsString à la Texte paramètre de l'événement OnGetText, nous demandons à Delphi d'afficher TOUT le texte du champ MEMO dans une cellule DBGrid.
Vous pouvez également adapter la largeur d'affichage du champ mémo à une valeur plus appropriée.

Remarque: étant donné que les champs MEMO peuvent être assez GRANDS, c'est une bonne idée de n'en afficher qu'une partie. Dans le code ci-dessus, seuls les 50 premiers caractères sont affichés.

Modification sur un formulaire séparé

Par défaut, le TDBGrid n'autorise pas la modification des champs MEMO. Si vous souhaitez activer l'édition "sur place", vous pouvez ajouter du code pour réagir à une action de l'utilisateur qui affiche une fenêtre distincte qui permet l'édition à l'aide d'un composant TMemo.
Par souci de simplicité, nous allons ouvrir une fenêtre d'édition lorsque vous appuyez sur ENTRÉE "sur" un champ MEMO dans un DBGrid.
Utilisons le Touche Bas événement d'un composant DBGrid:

procédure TForm1.DBGrid1KeyDown (
Expéditeur: TObject;
var Key: Word;
Shift: TShiftState);
commencer
si Key = VK_RETURN alors
commencer
si DBGrid1.SelectedField = DBTableData alors
avec TMemoEditorForm.Create (nil) do
essayer
DBMemoEditor.Text: = DBTableData.AsString;
ShowModal;
DBTable.Edit;
DBTableData.AsString: = DBMemoEditor.Text;
enfin
Gratuit;
fin;
fin;
fin;

Note 1: le "TMemoEditorForm" est une fiche secondaire contenant un seul composant: "DBMemoEditor" (TMemo).
Remarque 2: le "TMemoEditorForm" a été supprimé de la liste "Création automatique de formulaires" dans la boîte de dialogue Options du projet.