DBGrid StringGrid Memo-Inhalt anzeigen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von lzuser »

Win10, Laz1.6

Ziel: Ermittlung der vorhandenen Tabellennamen und mehr in einer SQLite-DB
Ausgangspunkt: SELECT * FROM sqlite_master
Ergebnis: Im verbundenen DBGrid steht in den Zellen (MEMO)
Das bedeutet für mich, dass hier ein mehrzeiliger Text ausgegeben werden sollte.
Fragen:
Warum benutzt SQLite hier diesen Datentyp - das ist doch für tbl_name nicht nötig?
Wie bekomme ich im DBGrid die gewünschte Anzeige?
Allgemeiner: Wie kann ich im DBGrid mehrzeilige Texte (also Memos) anzeigen/editieren?
Noch allgemeiner: Wie kann ich in einem StringGrid mehrzeilige Texte anzeigen/richtig editieren?

Zur letzten Frage habe ich schon einiges auch zu Delphi probiert, aber nichts hat wirklich funktioniert. Da dieses Problem aber offensichtlich schon viele beschäftigt hat, würde ich mich über ein wirlich funktionierendes Quelltext-Beispiel freuen.
Danke für eure Hilfe.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von mschnell »

Ich habe gerade exakt dasselbe Problem. Deshalb hoffe ich auf eine kompetente Antwort aus dem Forum...

Ich habe es mit Hilfe von Theo sehr leicht geschafft, das Memo-Feld des "aktuellen" Satzes in einem zusätzlichen TDBMemo anzuzeigen.

Bisher habe ich es nicht geschafft, einfach einen Text in eine - nicht mit der Datenbank verbundenen - Zelle eines DBGrids zu schreiben. Möglicherweise ist das nicht vorgesehen

-Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von wp_xyz »

Wie ist denn das Feld, das als (MEMO) im Grid erscheint, erzeugt worden? TEXT erscheint als (Memo), VARCHAR wird direkt angezeigt.

In dem beigefügten Projekt siehst du, wie man ein Memo-Feld (erzeugt als TEXT in der CreateTable-Anweisung) in einem separaten DBMemo editieren kann. Im Prinzip kann auch direkt im Grid editeren (man muss sich den Memo-Inhalt über einige Events aus der Tabelle ziehen - ich weiß gerade nicht, wie sie heißen). Aber gerade bei mehrzeiligem Text macht das wenig Sinn, es sei denn, du bist bereit, die Textausgabe im Grid neu zu schreiben, so dass die Zeilenumbrüche richtig angezeigt werden (was durchaus machbar ist). Aber dann hast du noch das Problem, dass ein Memo im Prinzip unendlich lang sein kann - Nun fällt die Entscheidung, wo der Text abgeschnitten wird, so dass die Zelle auf dem Bildschirm nicht die ganze Höhe einnimmt. Besser wäre m.E. eine saubere Entscheidung gegen Memos im Grid, so wie's Borland damals bei Delphi gemacht hat.
Dateianhänge
sqlite_example_memo.zip
(3.23 KiB) 243-mal heruntergeladen

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von lzuser »

Danke für dein Beispiel und die Datentyp-Unterscheidung.
Bisher habe ich immer MySQL benutzt.
Bei SQLite sind aber Datentypen und Befehlssatz doch wieder ein wenig anders.
Mir war deine Lösung mit dem extra DBMemo nicht fremd, trotzdem gut zu sehen, wenn es andere genauso machen.
Nur das ist nicht wirklich mein Ziel: Ich habe so 3 bis 5 kurze Informationen, die ich in einer Zelle untereinander darstellen möchte. Bei Terminprogrammen sieht man das häufig: 3 Termine untereinander in einer Zelle an einem Tag. Nun suche ich schon länger nach einem funktionierenden Beispiel, wie man das mit einem DBGrid machen kann. Notfalls könnte ich auch die Daten in einem normalen StringGrid selbst verwalten, aber ich benötige halt eine mehrzeilige Zelle,
Ergänzung: nur für die Darstellung, das Ändern könnte ich in ein Memo auslagern.
Gibt es sowas irgendwo?
Immer wieder vielen Dank fürs Helfen.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von wp_xyz »

Das Memo kann man im DBGrid anzeigen, indem man die entsprechende Zelle per OnDrawColumnCell selbst zeichnet. Dazu holt man sich den Memotext aus der Tabelle. Es ist sinnvoll, den Text noch so weit zu kürzen, dass er - wie von dir vorgeschlagen - max drei Zeilen hat. Natürlich muss man auch dafür sorgen, dass die Zeilenhöhe entsprechend ist. Siehe alles im beigefügten Demo-Projekt. (Das alles ist ziemlich schnell hingeschrieben, es kann sein, dass der Memo-Text bei Anwesenheit von Umlauten evtl. nicht richtig gekürzt wird).
Dateianhänge
dbgrid_wordbreak.zip
(3.94 KiB) 292-mal heruntergeladen

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von lzuser »

Späte Rückmeldung:
Danke für dein Beispiel.
Ich hab beim ersten Testen einige Teile deines Vorschlags übernommen und ein paar Ziele erreicht.
Da ich aber noch nie selbst mit DrawCell gearbeitet habe, möchte ich mir dafür erstmal ein bisschen Zeit nehmen um das besser zu verstehen. Ggf melde ich mich nochmal.
Danke nochmals für die viele Zeit.

Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von Flenser »

Ich stehe auch gerade vor dem Problem, dass ich in einer Access-DB Memos / Langer Text habe und diese in einem DBGrid anzeigen lassen möchte.

Ich habe die Prozedur "...OnDrawColumnCell..." aus "dbgrid_wordbreak.zip" eingebaut und sie läuft auch ohne Fehlermeldung durch. (Memo) erscheint nicht mehr, aber leider auch kein Text. Die Zelle wird leer angezeigt.

Ich glaube den Code prinzipiell verstanden zu haben, aber weiß leider nicht, warum DrawText nichts zeichnet.

In meinem Fall ist eine mehrzeilige Anzeige des DB-Eintrages gar nicht notwendig, der Eintrag könnte einfach als eine Zeile dargestellt werden. Kann man den Code
irgendwie vereinfachen oder gibt es generell eine einfachere Lösung?

Der Code von https://stackoverflow.com/questions/4809298/lazarus-dbgrid-showing-memo-as-the-value-of-string-fields-in-sqlite-3 hilft leider auch nicht...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von wp_xyz »

Code: Alles auswählen

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  field: TField;
  ...
begin
  field := DBGrid1.Columns[DataCol].Field;
  if field.DataType = ftMemo then begin
...

Dieser Codeauszug ist dem dgbrid_workbreak-Demo entnommen. Wie du siehst, wird das anzuzeigende Feld auf den Datentyp ftMemo geprüft. Wenn dein aktuelles Feld einen anderen Typ hat, bleibt die Zelle leer. Also: finde raus, was der Feldtyp ist und ändere die if-Abfrage entsprechend ab.

Für 1-zeilige Ausgabe rufst du einfach DBGrid1.Canvas.TextOut(varCellPadding, varCellPadding, s) auf, wobei s der String ist, der in dem Datenbank-Feld steht. varCellPadding entspricht dem in der Unit grids definierten Abstand des Zelltextes vom Zellrand.

Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Re: DBGrid StringGrid Memo-Inhalt anzeigen

Beitrag von Flenser »

Das Feld war ein Memo (in der DB Datentyp "Langer Text"). Wurde auch richtig erkannt, weil mit FillRect die Zelle überzeichnet wurde ("(Memo)" war weg)

Die Lösung mit TextOut funktioniert aber so wie es sein soll.

Vielen Dank

Antworten