Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DataSet überschreibt Formatierungen (https://www.delphipraxis.net/191813-dataset-ueberschreibt-formatierungen.html)

Ykcim 22. Feb 2017 16:05

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

DataSet überschreibt Formatierungen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen,

ich bin mir nicht sicher, ob mein Problem in die Datenbank-Sparte oder zum allgemeinen Programmieren gehört.

Ich arbeite das erste Mal mit datensensitiven Komponenten und habe ein Problem mit der Formatierung. Ich lade die Daten in ein DataSource und habe ein DBGrid damit verbunden.
Die Daten werden sauber übertragen und ich habe in dem Grid die einzelnen Spalten formatiert.
Beim ersten Mal, wenn ich die Daten lade, sieht alles halbwegs gut aus (siehe Bild RICHTIG). Aber danach, also ab dem zweiten Laden wird die Formatierung nicht mehr berücksichtigt (siehe Bild FALSCH). Kennt jemand das Problem und hat jemand eine Idee?

Vielen Dank
Patrick

nahpets 22. Feb 2017 17:29

AW: DataSet überschreibt Formatierungen
 
Werde jetzt erstmal ein bisserl raten:

Vermutlich hast Du die "Titel" des DB-Grids in der Entwicklungsumgebung gesetzt.

Das was man dort einträgt, wird (sofern es mit der Ergebnissmenge des DataSets übereinstimmt) angezeigt.
Schließt man nun das Dataset, dann vergisst das DBGrid alle Informationen.

Öffnet man das Dataset, so erstellt das DBGrid aus den Informationen eine neue "Ansicht". Die Titel werden aus den Spaltennamen gebildet, die Spaltenbreite wird automatisch gesetzt, so dass die Daten passabel angezeigt werden können. Dies muss nicht zwingend mit den Wünschen von Entwickler und / oder Anwender übereinstimmen.

Wenn ich eine (aus optischer Sicht) statisch Anzeige in einem DBGrid wünsche, so speichere ich mir diese beim Programmende ab:

Delphi-Quellcode:
DBGrid1.Columns.SaveToFile(Format('.\%s.cfg',[DBGrid1.Name]));


und lade sie beim Programmstart wieder:
Delphi-Quellcode:
  s := Format('.\%s.cfg',[DBGrid1.Name]);
  if FileExists(s) then DBGrid1.Columns.LoadFromFile(s);
Solange kein
Delphi-Quellcode:
DBGrid1.Columns.Clear
aufgerufen wird, werden alle Daten in dem so gespeicherten "Outfit" angezeigt (übrigens unabhängig davon, ob das zur Datenmenge passt oder nicht. Was nicht passt, wird nicht angezeigt, kann also durchaus auch mal für Verwirrung sorgen.)

Nutze dieses Vorgehen eigentlich nur, wenn zur gesamten Programmlaufzeit nur eine Datenmenge im Grid angezeigt wird und Änderungen an den Daten ausschließlich über das Grid erfolgen.

Für wechselnde Datenmengen ist das so nicht geeignet.
Hier muss man dann nach dem Öffnen der Datenmenge jeweils selbst für die passende Beschriftung der Spaltenüberschriften und -breiten sorgen.

Ykcim 22. Feb 2017 19:20

AW: DataSet überschreibt Formatierungen
 
Hallo Stephan,

vielen Dank. Du hast richtig geraten. Ich habe die Einstellungen über den OI gemacht. Da die Daten in dem Grid sich tatsächlich nicht ändern und nur über dieses bearbeitet werden sollen, könnte Deine beschriebene Vorgehensweise interessant sein. Ich verstehe nur nicht, warum das Programm zur Laufzeit die Einstellungen verliert. Nach jedem Programm-Start wird es beim ersten Mal wieder richtig gemacht.
Ich will noch ein paar Sachen ausprobieren und melde mich dann mit Erfolg oder Misserfolgen.

Vielen Dank!
Patrick

nahpets 22. Feb 2017 19:36

AW: DataSet überschreibt Formatierungen
 
Wenn man eine Datenmenge schließt, werden auch die Einstellungen für Titel ... des Grids entfernt.

Zumindest bei Delphi 7 ist es so, dass in dem Moment, in dem man die Datenmenge schließt, im Grid nur noch eine leere Zelle mit 'nem leeren Titel steht.

Öffnet man nun die Datenmenge wieder, so wird aus der Datenmenge die Zahl der anzuzeigenden Spalten (incl. Titel), deren Breite und die anzuzeigenden Zeilen ermittelt.

Nur so ist sicherzustellen, dass z. B. bei 'ner Abfrage, die ja bei jeder Ausführung an anderes Select enthalten kann, immer die aktuellen Daten mit passenden Titeln angezeigt werden.

Beim ersten Öffnen einer Datenmenge gelten wohl noch die Einstellungen aus dem Objektinspektor.

Jasocul 23. Feb 2017 06:07

AW: DataSet überschreibt Formatierungen
 
Ich habe mir schon vor einer gefühlten Ewigkeit abgewöhnt, die Einstellungen für die Spalten im OI zu machen.
Bei mir werden die Einstellungen im AfterOpen des DataSets gemacht. Ist zwar ein wenig Tipp-Arbeit, aber eigentlich kaum mehr Aufwand, als das im OI zu machen.
Danach ist es egal, welches DBrid die Daten anzeigt oder ein DBGrid verschiedene Daten-Quellen abwechselnd anzeigt.

Ich habe sogar mal eine kleine Komponente gebastelt, mit der der Anwender die Darstellung einstellen kann. Ist aber beim Support natürlich etwas nervig, wenn die Spalten eine andere Reihenfolge haben oder nicht angezeigt werden.

rokli 23. Feb 2017 10:53

AW: DataSet überschreibt Formatierungen
 
Hallo Patrick,

Du kannst das Grid z. B. auf folgende Art und Weise einstellen:

Delphi-Quellcode:
   GridJahr.Columns[0].Title.Caption    := 'Monat';
   GridJahr.Columns[0].Title.Alignment   := taLeftJustify;
   GridJahr.Columns[0].Width            := 80;
   GridJahr.Columns[1].Title.Caption    := 'Teile ' + IntToStr(Jahr);  // aktuelles Jahr
   GridJahr.Columns[1].Title.Alignment   := taRightJustify;
   GridJahr.Columns[1].Width            := 80;
   GridJahr.Columns[2].Title.Caption    := 'Teile ' + IntToStr(Jahr - 1); // Vorjahr
   GridJahr.Columns[2].Title.Alignment   := taRightJustify;
   GridJahr.Columns[2].Width            := 80;
und die Feldinhalte so formatieren

Delphi-Quellcode:
// beachte die Indices!!
   TFloatField(qryJahr.Fields[1]).DisplayFormat := '##,###,##0';
   TFloatField(qryJahr.Fields[2]).DisplayFormat := '##,###,##0';
die Daten werden dann so ausgegeben:

Delphi-Quellcode:
   GridJahr.Columns[0].Field   := qryJahr.Fields[0];
   GridJahr.Columns[1].Field   := qryJahr.Fields[1];
   GridJahr.Columns[2].Field   := qryJahr.Fields[2];
Gruß

Slipstream 23. Feb 2017 11:21

AW: DataSet überschreibt Formatierungen
 
Zitat:

Zitat von Ykcim (Beitrag 1362347)
Beim ersten Mal, wenn ich die Daten lade, sieht alles halbwegs gut aus (siehe Bild RICHTIG). Aber danach, also ab dem zweiten Laden wird die Formatierung nicht mehr berücksichtigt (siehe Bild FALSCH). Kennt jemand das Problem und hat jemand eine Idee?Patrick

Wir machen das hier immer so:
  1. Persistente Felder im zuständigen Query anlegen: Rechtsklick auf das Query und alle Felder hinzufügen auswählen.
  2. Den Feldern im OI den jeweiligen Display-Text zuweisen.
  3. Die Felder im OI entsprechend ausrichten. Voreinstellung für Integer- und Floatwerte ist rechts-, für Strings linksbündig.
  4. Im DB-Grid ebenfalls alle Felder hinzufügen: Rechtsklick auf DB-Grid.
  5. Im DB-Grid die Einstellungen für Titel-Ausrichtung anpassen. Das gilt natürlich nur, wenn man die Reihenfolge der Felder nicht verändert.
Ansonsten: Per Code die entsprechenden Einstellungen vornehmen. Soll das Ganze flexibel sein (Reihenfolge der Felder ändern möglich) und dennoch immer dieselbe Spalte mit denselben Einstellungen angezeigt werden (zB Boolean-Felder immer mittig), kann man sich mit einer Stringliste und entsprechenden Values behelfen.

rokli 23. Feb 2017 11:39

AW: DataSet überschreibt Formatierungen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei persistenten Feldern kann man beispielsweise die Boolens Wert auch im OI setzen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz