Soms heb je een raar effect, waarbij een text veld van jouw database query als ftMemo blob, en in een DBGrid zien we dan "(memo)" i.p.v. de werkelijk tekst.
Knap lullig en het verbaast me dat zowel Delphi als Lazarus geen simpelere oplossing ingebakken hebben ...
Anyhoo .. hoe lost je dit probleem op?
Optie 1 (beste) - Aanpassen van de SQL Query
Deze optie is stukken makkelijker, maar werkt misschien niet met iedere database engine.
Met een type cast gaan we een "Memo Blob" een gewone string worden.
Merk op : Dit kan een klein beetje anders zijn, afhankelijk van de gebruikte SQL Database. Het werkt met SQLite, MySQL, en voor zover ik weet ook met PostgreSQL.
Stel jouw query is:
SELECT
"Filename",
"Date"
FROM
"mytable";
En stel dat het veld "Filename" het probleem is dat als "(memo)" wordt weergegeven.
Met een simpele type cast (eventuele velden van de TQuery component verwijderen!) maken we de TEXT een VARCHAR als volgt:
SELECT
CAST( "Filename" as VARCHAR) as "Filename",
"Date"
FROM
"mytable";
Je zult nu de echte tekst zien en niet die maffe "(memo)".
Optie 2 - Met een OnGetText Event
Als eerste moeten we velden gaan toevoegen aan onze TQuery. Klik de TQuery met rechts aan en kies "Edit Fields".
In het opkomende venster klik je nu op de "+" knop om daarmee minstens het veld toe te voegen dat als "(memo)" wordt weergegeven.
Klik nu op het nieuwe veld, en je zult zien dat het een TMemoField is in de object inspector.
Klik de "Events" tab in de object inspector en dubbel klik de "OnGetText" event.
Voeg nu de volgende code toe in de procedure (uitgaande van: TQuery = qrySomeQuery, fieldname = "SomeField", wat een TMemoField maakt met de naam "qrySomeQuerySomeField"):
aText := Sender.AsString;
DisplayText:=true;
Dus we krijgen dan zoiets als dit, wat er voor zorgt dat (at runtime) we de echte tekst gaan zien i.p.v. "(memo)":
procedure TForm1.qrySomeQuerySomeFieldGetText(Sender: TField; var aText: string; DisplayText: Boolean);
begin
aText := Sender.AsString;
DisplayText:=true;
end;