![]() |
MDI Childfenster und Dataset Verhalten
Ich erzeuge in einer MDI Anwendung über folgenden Code ein MDI Childfenster:
Delphi-Quellcode:
Im OnCreate des Childfensters erstelle mein Datenmodul mit einer Query und einer Datasource Komponente drauf.
with TfrmWaermedienst.Create (Self) do begin
Show ; end ;
Delphi-Quellcode:
dmWD ist dabei im Private Teil der Childfensterklasse deklariert.
dmWD := TdmWaermedienst.Create (Self) ;
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? |
Re: MDI Childfenster und Dataset Verhalten
Hi Jelly,
kann es sein, dass Du für beide Clientfenster die gleiche Vairable nimmst, auf die das Create läuft ? Grüße // Martin |
Re: MDI Childfenster und Dataset Verhalten
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:
Delphi-Quellcode:
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.
Grid.Datasource := dmWD.srcWDDaten ;
|
Re: MDI Childfenster und Dataset Verhalten
Moin, moin,
Zitat:
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 |
Re: MDI Childfenster und Dataset Verhalten
Zitat:
Delphi-Quellcode:
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.
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 ; |
Re: MDI Childfenster und Dataset Verhalten
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 |
Re: MDI Childfenster und Dataset Verhalten
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:
Damit klappts dann.
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 ; |
Re: MDI Childfenster und Dataset Verhalten
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. |
Re: MDI Childfenster und Dataset Verhalten
Zitat:
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:
|
Re: MDI Childfenster und Dataset Verhalten
Zitat:
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz