MEMO-velden weergeven en bewerken in Delphi's TDBGrid

Als u databasetoepassingen ontwikkelt met tabellen die MEMO-velden bevatten, zult u merken dat de TDBGrid-component standaard niet de inhoud van een MEMO-veld in een DBGrid-cel toont.

Dit artikel geeft een idee hoe dit probleem van TMemoField kan worden opgelost (met nog een paar trucs) ...

TMemoField

Memovelden worden gebruikt om lange tekst of combinaties van tekst en cijfers weer te geven. Bij het bouwen van database-applicaties met Delphi wordt het TMemoField-object gebruikt om een ​​memoveld in een dataset weer te geven. TMemoField omvat het fundamentele gedrag dat veel voorkomt bij velden die tekstgegevens of willekeurige lengte bevatten. In de meeste databases is de grootte van het Memoveld beperkt door de grootte van de database.

Hoewel u de inhoud van een MEMO-veld in een TDBMemo-component kunt weergeven, zal de TDBGrid volgens ontwerp alleen "(Memo)" weergeven voor de inhoud van dergelijke velden.

Om wat tekst (uit het MEMO-veld) daadwerkelijk in de juiste DBGrid-cel weer te geven, hoeft u alleen een eenvoudige regel code toe te voegen ...

instagram viewer

Laten we voor de volgende discussie aannemen dat u een databasetabel met de naam "TestTable" hebt met ten minste één MEMO-veld met de naam "Data".

OnGetText

Om de inhoud van een MEMO-veld in de DBGrid te tonen, moet u een eenvoudige regel code in de velden van het veld toevoegen OnGetText evenement. De eenvoudigste manier om de OnGetText-gebeurtenishandler te maken, is om tijdens het ontwerpen de Fields-editor te gebruiken om een ​​persistente veldcomponent voor het memoveld te maken:

  1. Verbind uw TDataset-afstammingscomponent (TTable, TQuery, TADOTable, TADOQuery ...) met de "TestTable" -databasetabel.
  2. Dubbelklik op het gegevenssetonderdeel om de Fields-editor te openen
  3. Voeg het MEMO-veld toe aan de lijst met persistente velden
  4. Selecteer het MEMO-veld in de Fields-editor
  5. Activeer het tabblad Gebeurtenissen in de Objectcontrole
  6. Dubbelklik op de OnGetText-gebeurtenis om de gebeurtenishandler te maken

Voeg de volgende regel code toe (hieronder cursief gedrukt):

procedure TForm1.DBTableDataGetText (
Afzender: TField;
var Tekst: String;
DisplayText: Boolean);
beginnen
Tekst: = kopiëren (DBTableData. AsString, 1, 50);

Opmerking: het gegevenssetobject wordt "DBTable" genoemd, het MEMO-veld wordt "DATA" genoemd en daarom wordt het TMemoField dat is verbonden met het MEMO-databaseveld standaard "DBTableData" genoemd. Door toe te wijzen DBTableData. AsString naar de Tekst parameter van de OnGetText-gebeurtenis, vertellen we Delphi om ALLE tekst uit het MEMO-veld in een DBGrid-cel weer te geven.
Je kan ook pas de DisplayWidth aan van het memoveld naar een meer geschikte waarde.

Opmerking: aangezien MEMO-velden vrij GROOT kunnen zijn, is het een goed idee om slechts een deel ervan weer te geven. In de bovenstaande code worden alleen de eerste 50 tekens weergegeven.

Bewerken op een apart formulier

Standaard staat de TDBGrid het bewerken van MEMO-velden niet toe. Als u "op zijn plaats" bewerken wilt inschakelen, kunt u wat code toevoegen om te reageren op een gebruikersactie die een apart venster toont waarin bewerken met een TMemo-component mogelijk is.
Eenvoudigheidshalve openen we een bewerkingsvenster wanneer ENTER wordt ingedrukt "op" een MEMO-veld in een DBGrid.
Laten we de gebruiken Toets neer gebeurtenis van een DBGrid-component:

procedure TForm1.DBGrid1KeyDown (
Afzender: TObject;
var Sleutel: Word;
Shift: TShiftState);
beginnen
als Key = VK_RETURN dan
beginnen
als DBGrid1.SelectedField = DBTableData dan
met TMemoEditorForm. Maak (nihil) doen
proberen
DBMemoEditor. Tekst: = DBTableData. AsString;
ShowModal;
DBTable. Bewerk;
DBTableData. AsString: = DBMemoEditor. Tekst;
Tenslotte
Vrij;
einde;
einde;
einde;

Opmerking 1: de "TMemoEditorForm" is een secundair formulier dat slechts één component bevat: "DBMemoEditor" (TMemo).
Opmerking 2: de "TMemoEditorForm" is verwijderd uit de lijst "Formulieren automatisch maken" in het dialoogvenster Projectopties.

Laten we eens kijken wat er gebeurt in de KeyDown-gebeurtenishandler van DBGrid1:

  1. Wanneer een gebruiker op de ENTER-toets drukt (we vergelijken de parameter Key met de VK_RETURN virtuele sleutelcode) [Sleutel = VK_RETURN],
  2. Als het momenteel geselecteerde veld in de DBGrid ons MEMO-veld is (DBGrid1.SelectedField = DBTableData),
  3. We maken het TMemoEditorForm [TMemoEditorForm. Maak (nihil)],
  4. Verzend de waarde van het MEMO-veld naar de TMemo-component [DBMemoEditor. Tekst: = DBTableData. AsString],
  5. Toon het formulier modaal [ShowModal],
  6. Wanneer een gebruiker klaar is met bewerken en het formulier sluit, moeten we de dataste in de bewerkingsmodus plaatsen [DBTable. Bewerk],
  7. Om de bewerkte waarde terug te kunnen toewijzen aan ons MEMO-veld [DBTableData. AsString: = DBMemoEditor. Tekst].

Opmerking: als u op zoek bent naar meer TDBGrid-gerelateerde artikelen en gebruikstips, ga dan naar: "TDBGrid naar de MAX"tips verzamelen.

instagram story viewer