Hvis du utvikler databaseapplikasjoner med tabeller som inneholder MEMO-felt, vil du merke at TDBGrid-komponenten som standard ikke viser innholdet i et MEMO-felt i en DBGrid-celle.
Denne artikkelen gir en ide om hvordan du løser problemet med TMemoField (med noen flere triks) ...
TMemoField
Notefelt brukes til å representere lang tekst eller kombinasjoner av tekst og tall. Når du bygger databaseapplikasjoner som bruker Delphi, brukes TMemoField-objektet til å representere et memo-felt i et datasett. TMemoField innkapsler den grunnleggende oppførselen som er vanlig for felt som inneholder tekstdata eller vilkårlig lengde. I de fleste databaser er størrelsen på Memo-feltet begrenset av størrelsen på databasen.
Selv om du kan vise innholdet i et MEMO-felt i en TDBMemo-komponent, viser TDBGrid bare "(Memo)" for innholdet i slike felt ved å designe.
For å faktisk vise litt tekst (fra MEMO-feltet) i den aktuelle DBGrid-cellen, trenger du bare å legge til en enkel kodelinje ...
La oss si at du har en databasetabell som heter "TestTable" med minst ett MEMO-felt med navnet "Data" for den neste diskusjonen.
OnGetText
For å vise innholdet i et MEMO-felt i DBGrid, må du legge ved en enkel kodelinje i feltets OnGetText begivenhet. Den enkleste måten å opprette OnGetText-hendelsesbehandleren er å bruke Fields-redigereren på designtidspunktet for å lage en vedvarende feltkomponent for memo-feltet:
- Koble din TDataset-etterkommerkomponent (TTable, TQuery, TADOTable, TADOQuery ...) til databasen "TestTable".
- Dobbeltklikk på datasettkomponenten for å åpne Fields-redigereren
- Legg til MEMO-feltet i listen over vedvarende felt
- Velg MEMO-feltet i Fields-redigereren
- Aktiver kategorien Hendelser i objektinspektøren
- Dobbeltklikk på OnGetText-hendelsen for å opprette hendelsesbehandleren
Legg til neste kodelinje (kursiv nedenfor):
prosedyre TForm1.DBTableDataGetText (
Avsender: TField;
var Tekst: String;
DisplayText: Boolean);
begynne
Tekst: = Copy (DBTableData. AsString, 1, 50);
Merk: datasettobjektet heter "DBTable", MEMO-feltet kalles "DATA", og derfor kalles TMemoField som er koblet til MEMO-databasefeltet som standard "DBTableData". Ved å tildele DBTableData. AsString til Tekst parameteren for OnGetText-hendelsen, ber vi Delphi om å vise ALLE teksten fra MEMO-feltet i en DBGrid-celle.
Du kan også tilpasse DisplayWidth av notatfeltet til en mer passende verdi.
Merk: Siden MEMO-felt kan være ganske STORE, er det lurt å bare vise en del av det. I koden over vises bare de første 50 tegnene.
Redigering på et eget skjema
Som standard tillater ikke TDBGrid redigering av MEMO-felt. Hvis du vil aktivere "på plass" redigering, kan du legge til en kode for å reagere på en brukerhandling som viser et eget vindu som tillater redigering ved hjelp av en TMemo-komponent.
For enkelhets skyld åpner vi et redigeringsvindu når ENTER trykkes "på" et MEMO-felt i et DBGrid.
La oss bruke KeyDown hendelse av en DBGrid-komponent:
prosedyre TForm1.DBGrid1KeyDown (
Avsender: TObject;
var Nøkkel: Word;
Skift: TShiftState);
begynne
hvis nøkkel = VK_RETURN da
begynne
hvis DBGrid1.SelectedField = DBTableData da
med TMemoEditorForm. Opprett (null) gjør
prøve
DBMemoEditor. Tekst: = DBTableData. AsString;
ShowModal;
DBTable. Redigere;
DBTableData. AsString: = DBMemoEditor. Tekst;
endelig
Gratis;
slutt;
slutt;
slutt;
Merknad 1: "TMemoEditorForm" er en sekundær form som bare inneholder en komponent: "DBMemoEditor" (TMemo).
Merknad 2: "TMemoEditorForm" ble fjernet fra listen "Auto-create forms" i dialogboksen Project Options.
La oss se hva som skjer i DBGrid1s KeyDown-hendelsesbehandler:
- Når en bruker trykker på ENTER-tasten (sammenligner vi nøkkelparameteren til VK_RETURN virtuell nøkkelkode) [Nøkkel = VK_RETURN],
- Hvis det valgte feltet i DBGrid er vårt MEMO-felt (DBGrid1.SelectedField = DBTableData),
- Vi oppretter TMemoEditorForm [TMemoEditorForm. Opprett (null)],
- Send verdien av MEMO-feltet til TMemo-komponenten [DBMemoEditor. Tekst: = DBTableData. AsString]
- Vis skjemaet modalt [ShowModal],
- Når en bruker avslutter med redigering og lukker skjemaet, må vi sette datastoffet i redigeringsmodus [DBTable. Redigere],
- For å kunne tilordne den redigerte verdien tilbake til vårt MEMO-felt [DBTableData. AsString: = DBMemoEditor. Tekst].
Merk: Hvis du er ute etter flere TDBGrid-relaterte artikler og brukstips, må du huske å besøke: "TDBGrid til MAX"tipssamling.