Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.





Share:
Notifications
Clear all

Lazarus - Hoe fix je een Database field dat als (memo) in een DBGrid verschijnt  

  RSS

 Hans
(@hans)
Noble Member Admin
Lid geworden: 7 jaar geleden
Berichten: 1542
19 april 2016 1:48  

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; 

ReageerCitaat
 Hans
(@hans)
Noble Member Admin
Lid geworden: 7 jaar geleden
Berichten: 1542
26 mei 2020 14:02  

Merk op:

casting naar varchar schijnt niet (meer) te werken.

Wat wel werkt is casting naar een CHAR.

Echter, met recente Lazarus Pascal versies heb je dit niet meer nodig als je het "GetText" event van een field gebruikt voor conversie naar een string.


ReageerCitaat
Share: