AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MDI Childfenster und Dataset Verhalten

Ein Thema von Jelly · begonnen am 17. Nov 2005 · letzter Beitrag vom 17. Nov 2005
Antwort Antwort
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 13:23
Ich erzeuge in einer MDI Anwendung über folgenden Code ein MDI Childfenster:
Delphi-Quellcode:
with TfrmWaermedienst.Create (Self) do begin
    Show ;
end ;
Im OnCreate des Childfensters erstelle mein Datenmodul mit einer Query und einer Datasource Komponente drauf.

dmWD := TdmWaermedienst.Create (Self) ; dmWD ist dabei im Private Teil der Childfensterklasse deklariert.

Auf der Form liegt dann nur noch ein DBGrid welches mit der Datasource aus dem Datenmodul verbunden ist.

Den Code sehe ich soweit als richtig. Bei jedem erneuten Erzeugen eines Childfenster wird gleich sein eigenes Datenmodul mit erzeugt, damit sich die beiden Fenster nicht die gleichen Queries teilen müssen.

Aber es klappt nicht so wie ich mir es vorstelle. Bewege ich mich im Grid eines Fenster hin und her, dann springt mir der Cursor auch im 2. Fenster. Wie ist denn das möglich, ich habe doch 2 Datenmodule?
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#2

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 14:07
Hi Jelly,

kann es sein, dass Du für beide Clientfenster die gleiche Vairable nimmst, auf die das Create läuft ?

Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 14:13
Nein, dmWD ist eine private Veriable innerhalb meiner Childformklasse.

Ich meine aber mittlerweilen dass es damit zusammenhängt, dass ich mein Grid bereits zur Designzeit der Datasource zuordne. Wenn ich nun im OnCreate meines Forms schreibe:
Grid.Datasource := dmWD.srcWDDaten ; dann klappts. Nur will ich das aber nun nicht für jedes datensensitive Element auf meiner Form machen müssen, dafür werden das später viel zu viele werden. SPrich, ich möchte zur Designzeit norma arbeiten können, und über den OI die Datasourcen zuordnen können, soll aber zur Laufzeit dann auch auf die richtige Datasource zugreifen... Ich glaube, ich werde mal versuchen im OnCreate des Forms alle Komponenten zu durchlaufen, und falls die Eigenschaft Datasource existiert, diese neu zuordnen. Nur weiss ich nicht so recht, wie ich das machen kann.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#4

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 14:57
Moin, moin,

Zitat von Jelly:
Im OnCreate des Childfensters erstelle mein Datenmodul mit einer Query und einer Datasource Komponente drauf.
da ich heute mit meiner XML-Lomponente kämpfe ist villeicht nicht mein bester Tag, aber eigentlich hast Du doch zur Designzeit eine Query auf dem Clientformnular, die Du im OnShow des Formulars aktivieren kannst. Zuvor weist Ihr noch die Datanbankanbindung im OnCreate zu. Das hängt ja jetzt etwas von den Zugriffskomponenten ab. Bei Zeos wäre es jetzt die Zuweisung auf eien TDatabasem die auf dem MDI-Form liegen würde.

Jede Query birngt ihren eigenen DataSet mit und damit ihren eigenen Positionszeiger.
Du hast jetzt einen Navigator im Childfenseter?

Das mit dem Durchlaufen ist normalerweise nicht nötig, da ist der Wurm noch dran gefesselt...



Grüße aus dem Norden / Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#5

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 15:07
Zitat von mschaefer:
Zuvor weist Ihr noch die Datanbankanbindung im OnCreate zu. Das hängt ja jetzt etwas von den Zugriffskomponenten ab.
Das mache ich im Moment so, und das klapp auch:
Delphi-Quellcode:
for i := 0 to ComponentCount-1 do begin
    if Components[i] is TDBGrid then begin
       src := (Components[i] as TDBGrid).DataSource ;
       src := dmWD.FindComponent (src.Name) as TDatasource ;
       (Components[i] as TDBGrid).Datasource := src ;
    end ;
end ;
So gehts mit dem DBGrid, und so gehts im Prinzip auch mit jedem anderem Control. Ich möchte aber obigen Code jetzt nicht für alle datensensitive Elemente einzeln erstellen müssen. Geht das nicht ein wenig kürzer. Das Problem liebt im Casten des Controls, um auf die Datasource zugreifen zu können.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#6

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 15:19
Ja, das machst Du aber nur, da Du die Query dynamisch erstellst. Nimm auf das Clientformualr eine Datasource und verbinde die Komponenten zur Desingzeit mit dieser Datasource. Wenn die Query auch zur Desingzeit auf dem Clientformualr lieft, brauchst Du die nur im OnCreate des Clients auf aktive zu schalten. Tücke: Zur Designzeit muß die Query active = false stehen, da dem Formular noch keine Variable zugewisen ist. Das spart von vorneherein das Durchlaufen und Casten.

Grüße (wir haben DP blauen Himmel) // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 15:32
Ich habe die Query auf dem Datenmodul, ebenso hatte ich die Datasource. Jetzt hab ich die Datasource auf mein Form gelegt, was sogar auch vielleicht besser ist. Damit habe ich zwar eigentlich noch dasselbe Problem beim Scrollen, jedoch kann ich das nun bequem so während der Laufzeit im OnCreate des Forms lösen:
Delphi-Quellcode:
for i := 0 to ComponentCount-1 do begin
    if Components[i] is TDatasource then begin
       src := (Components[i] as TDataSource) ;
       src.Dataset := dmWD.FindComponent(src.Dataset.Name) as TDataset ;
    end ;
end ;
Damit klappts dann.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#8

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 15:58
Sieht gut aus.

Wenn die Dinger unabhängig scrolen sollen, dann mußt Du allerdings die Query auch mit auf das Cleint ziehen. Die Query hält ihren eigenen DataSet. Query auf Datamodule gibt es übrigens auch oft. Da will man gerade das Erreichen, was Du beschrieben hast: mehrere Formulare auf dem gleichen Datensatz,

Denke das läuft bei Dir wohl ! Grüße // Martin


PS: DataSource auf dem Client ist auch sinnvoll, denn dadurch kann das Cleintformular im OnChange der Datasource auf einen Datensatzwechsel reagieren. Sonst würde das Ereignis nur im Datamodule auftreten, was meist wenig bringt, wenn visuelle Komponenten betroffen sind.
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 16:10
Zitat von mschaefer:
Wenn die Dinger unabhängig scrolen sollen, dann mußt Du allerdings die Query auch mit auf das Cleint ziehen. Die Query hält ihren eigenen DataSet. Query auf Datamodule gibt es übrigens auch oft. Da will man gerade das Erreichen, was Du beschrieben hast: mehrere Formulare auf dem gleichen Datensatz,
Und eben genau das wollte ich vermeiden, weil ich die Datenbankfunktionalität komplett ins Datenmodul auslagern will, und in der Form nur die Sachen angezeigt werden sollen. Das hat mich aber dazu gezwungen, dass die Dataset Eigenschaft meiner Datasource während der Designzeit auf das Dataset im Datenmodul gelinkt wurde. Ich benutze aber nun während der Laufzeit nicht diesselbe Instanz vom Datenmodul, sondern erzeuge mir das Datenmodul selbst per Hand im Oncreate des Forms, da es ja sonst schon von vorne herein zu Drucheinander kommt, sobald mehrere MDI Childs offen sind, und die alle auf die gleichen Datasets zugreifen.

Somit habe ich also ersteinmal zur Lufzeit auch einen statischen Bezug zum Datenmodul in Delphi, das ich eigentlich gar nicht benutze. Deshalb muss ich für jede Datasource die Dataset Eigenschaft während der Laufzeit nochmal neu anpassen, damit unterschiedliche Forms ihre Daten auch von unterschiedlichen Datenmodulintsanzen beziehen können. Und das klappt jetzt wunderbar mit obigem Code, bei dem ich für jede Datasource Kompo auf der Form die Dataset Eigenschaft entsprechend neu anpasse.

Zitat von mschaefer:
PS: DataSource auf dem Client ist auch sinnvoll, denn dadurch kann das Cleintformular im OnChange der Datasource auf einen Datensatzwechsel reagieren. Sonst würde das Ereignis nur im Datamodule auftreten, was meist wenig bringt, wenn visuelle Komponenten betroffen sind.
Das seh ich genauso.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#10

Re: MDI Childfenster und Dataset Verhalten

  Alt 17. Nov 2005, 16:11
Zitat von mschaefer:
Wenn die Dinger unabhängig scrolen sollen, dann mußt Du allerdings die Query auch mit auf das Cleint ziehen. Die Query hält ihren eigenen DataSet. Query auf Datamodule gibt es übrigens auch oft. Da will man gerade das Erreichen, was Du beschrieben hast: mehrere Formulare auf dem gleichen Datensatz,
Und eben genau das wollte ich vermeiden, weil ich die Datenbankfunktionalität komplett ins Datenmodul auslagern will, und in der Form nur die Sachen angezeigt werden sollen. Das hat mich aber dazu gezwungen, dass die Dataset Eigenschaft meiner Datasource während der Designzeit auf das Dataset im Datenmodul gelinkt wurde. Ich benutze aber nun während der Laufzeit nicht diesselbe Instanz vom Datenmodul, sondern erzeuge mir das Datenmodul selbst per Hand im Oncreate des Forms, da es ja sonst schon von vorne herein zu Drucheinander kommt, sobald mehrere MDI Childs offen sind, und die alle auf die gleichen Datasets zugreifen.

Somit habe ich also ersteinmal zur Lufzeit auch einen statischen Bezug zum Datenmodul in Delphi, das ich eigentlich gar nicht benutze. Deshalb muss ich für jede Datasource die Dataset Eigenschaft während der Laufzeit nochmal neu anpassen, damit unterschiedliche Forms ihre Daten auch von unterschiedlichen Datenmodulintsanzen beziehen können. Und das klappt jetzt wunderbar mit obigem Code, bei dem ich für jede Datasource Kompo auf der Form die Dataset Eigenschaft entsprechend neu anpasse.

Zitat von mschaefer:
PS: DataSource auf dem Client ist auch sinnvoll, denn dadurch kann das Cleintformular im OnChange der Datasource auf einen Datensatzwechsel reagieren. Sonst würde das Ereignis nur im Datamodule auftreten, was meist wenig bringt, wenn visuelle Komponenten betroffen sind.
Das seh ich genauso.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 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