DBGrid - bitte Kristallkugel herrichten

21/03/2011 - 13:14 von Nicole Wagner | Report spam
Hallo User,

mein Projekt entwickelt sich praechtig.
Danke allen, die mir mit Rat zur Seite gestanden haben.

Ich habe jetzt mein DBGrid, das intensiv bearbeitet wird.
Dort wird mehrfach gefiltert, dort werden Spalten gerechnet und es
werden die Zeilen bunt markiert.

Alles, was schon onCreate gefiltert, berechnet und gezeichnet wird,
passt sofort. D.h. das Grid sieht aus, wie ich will.

Was hingegen zur "spaeteren" Laufzeit also auf Menu-Trigger veranlasst
wird, wird nicht sofort dargestellt. Ich klicke z.B. "Zeilen
ausblenden" oder "dieses fuer jenes berechnen". Ersteres soll im
Filter-Ereignis bearbeitet werden, letzteres im Calc Ereignis.

Alle Ereignisse arbeiten auch "zur spàteren Laufzeit" wunschgemaess.
Allerdings SEHE ich das erst nach einigen Mausklicks.

Die Anzeige wird dann richtig, wenn ich mit dem Scrollbar einmal mein
DBGrid rauf- und runterscrolle. Danach erst stehen erst die Eintràge in
den Spalten und danach erst sind (weitere) Zeilen ausgeblendet.

Und jetzt kommt die Kristallkugel ins Spiel: Ich weiss nicht, welchem
Event ich mit diesen Scroll-Mausklicks nachhelfe. Bzw. wie ich dieses
ausloesen kann.

Probiert habe ich bis jetzt: Form.Refresh, Autocalc auf true zu setzen,
das CalcEvent oder das FilterEvent explizit aufzurufen. Nix.

Mein DB Grid aktualisiert sich nach wie vor nur nachdem es gescrollt
wurde. Einmal aus dem Bildschirm raus und wieder rein - passt perfekt.

Wie erreiche ich den Effekt auch ohne Scrollen?

(bitte kein DisableControls, das muss aktiv bleiben)

Liebe Gruesse,
Nicole
 

Lesen sie die antworten

#1 Joe Galinke
21/03/2011 - 15:33 | Warnen spam
Hallo Nicole,

vorab eine ernst gemeinte Bitte zur Wahl des Betreffs. Suche bitte eine
einigermaßen passende Kurzbeschreibung aus. Deine (zumindest früher) gerne
verwendeten Formulierung "für Experten" u.à. nützen weder Dir noch den
denjenigen die antworten wollen, aber "Kristallkugel" ist nicht besser.

Du stellt doch Fragen auf die Du eine Antwort erhoffst. Warum machst Du es
dann möglichen Antwortenden nicht so leicht wie nur irgend möglich?

"DbGrid, Ansicht aktualiseren" wàre z.B. ein Kandidat.

Weiter unten wirst Du lesen, dass es mit dem Grid aber nichts zu tun hat.
:-)

Nicole Wagner schrieb:

Was hingegen zur "spaeteren" Laufzeit also auf Menu-Trigger veranlasst
wird, wird nicht sofort dargestellt. Ich klicke z.B. "Zeilen
ausblenden" oder "dieses fuer jenes berechnen". Ersteres soll im
Filter-Ereignis bearbeitet werden, letzteres im Calc Ereignis.



Du meinst OnFilterRecord?

Ich vermute, Du schaltest DataSet.Filtered nicht mal auf False und wieder
auf True. Die Umschaltung braucht es aber.

Bzgl. OnCalcFields schaue Dir bitte nochmal die OH dazu an. Den Teil hatten
wir auch bereits.


OnCalcFields is triggered when:
A dataset is opened.
A dataset is put into dsEdit state.
A record is retrieved from a database


Das passiert in Deinem Szenario aber nicht. Abhilfe schafft u.a.
DataSet.Refresh. Wenn Du, wie ich vermute, TIBDataSet verwendest, dann
musst Du die Property RefrshSQL entsprechend füllen. TIbDataSet kann Dir
dabei über das Eigenschaftsmenü (rechte Maustaste / Dataset Editor /
Generate SQL) helfen.


(bitte kein DisableControls, das muss aktiv bleiben)



Ich wage zu unterstellen, dass Du nicht weiß worum es sich dabei handelt.

Warum soll das nicht empfohlen werden? Es würde eh nichts nützen.

Was heißt, es soll so bleiben? Wenn diese Funktion zum Einsatz kommt, dann
sicherlich (fast) immer mit kurzfristig spàter erfolgter Wiederaktivierung.

DisableControls soll lediglich verhindern, dass wàhrend bestimmter Vorgànge
die den Datensatzzeiger veràndern datenanzeigende Controls, wie z.B. das
DbGrid, nicht wild die Ansicht àndern. Deshlab erfolgt die Verwendung
eigentlich immer nach folgendem Muster;

DataSet.DisableControls;
try
//Beispiel
DataSet.First;
while not DataSet.Eof do begin
//Was auch immer
DataSet.Next;
end;
finally
DataSet.EnableControls;
end;


So, wenn man nun aber anschließend auf dem gleichen Datensatz stehen möchte
wie vorher verwendet man Bookmarks oder merkt sich den Wert des PKs und
versucht mit einem DataSet.Locate vor dem FINALLY dorthin zu navigieren.

Fazit:
a) DisableControls/EnableControls würde Dir im konkreten Fall also gar
nicht helfen, hàtte andererseits aber auch keine negativen Auswirkungen.

b) Du siehst, das ist wieder ein Fall in dem das Grid selbst gar keine
Rolle spielt. Dieses schlichte Db-Grid hat nichts mit den Zeilen zu tun die
angezeigt werden, nur mit der Art der Darstellung (Schrift, Farbe,
Hintergrund etc.).

Sollte es notwendig sein sich den aktuellen Datensatz zu merken und
anschließend dorthin zu navigieren betrachte ich diesen "Mehraufwand" an
Arbeit als so minimal, dass er keinerlei Entscheidungsüberlegung bedarf.


Gruß, Joe

Ähnliche fragen