![]() |
prozedur in Data Module auf andere Form anwenden
Hallo Alle,
mit einer Prozedur die von der Data Module Form, aufgrund eines Events ausgelöst wird, möchte ich ein Objekt (zb. ein TextEdit) in einer anderen Form füllen lassen. Das Problem ist mir schon länger ein Rätsel, konnte es aber bislang immer umgehen. Folgendes ist der Fall: In der Hauptform steht ein TextEdit. Über eine Modal-Form verbinde mit einer Datanbank (dessen Komponenten in der Data Module stehen), und öffne eine Query. Als after-open Event der Query sollte ein Wert in ein TextEdit der Haupform geschrieben werden. Obwohl es nirgends Fehlermeldungen gibt - wird das TextEdit nicht gefüllt
Delphi-Quellcode:
procedure TPCdmod.Q_TIMEAfterOpen(DataSet: TDataSet);
begin with PCchrt do // Hauptform begin cxTextEdit2.Text := PCdmod.Q_TIME['Min']; // geht nicht, aber keine Fehler end; end;
Delphi-Quellcode:
procedure TPCdmod.Q_TIMEAfterOpen(DataSet: TDataSet);
begin with PCchrt do // Hauptform begin Opentime; // Opentime ist in Public eingetragen end; end; //und in Hauptform: procedure TPCchrt.Opentime; begin showmessage(PCdmod.Q_TIME['Min']); // geht ! cxTextEdit2.Text := PCdmod.Q_TIME['Min']; // geht nicht und immer noch keine Fehler end;
Delphi-Quellcode:
// natürlich gehts mit einem button in der Hautform: procedure TPCchrt.cxButton4Click(Sender: TObject); // connect DB begin cxTextEdit2.Text := PCdmod.Q_TIME['Min']; end; |
Re: prozedur in Data Module auf andere Form anwenden
Versuch mal folgendes:
Delphi-Quellcode:
Gruß
TPCchrt.cxTextEdit2.Text := PCdmod.Q_TIME['Min'];
Application.ProcessMessages; Gerald |
Re: prozedur in Data Module auf andere Form anwenden
Hallo Gerald,
geht leider nicht. habe "Forms" in uses list für ProcessMessages getan, aber das TPCchrt akzeptiert er nicht (und ohne T geht's auch nicht) Daniele |
Re: prozedur in Data Module auf andere Form anwenden
Zitat:
Du musst PCchrt (Name Deiner Hauptform) in Deine uses-clause des datamoduls packen. |
Re: prozedur in Data Module auf andere Form anwenden
Das hatte ich natürlich auch schon drin...
|
Re: prozedur in Data Module auf andere Form anwenden
Wie sieht es so aus?
Delphi-Quellcode:
procedure TPCdmod.Q_TIMEAfterOpen(DataSet: TDataSet);
begin PCchrt.Opentime(PCdmod.Q_TIME['Min']); // Opentime ist in Public eingetragen end; //und in Hauptform: procedure TPCchrt.Opentime(const TimeStr: string); begin cxTextEdit2.Text := TimeStr; end; |
Re: prozedur in Data Module auf andere Form anwenden
Hallo Detlef,
leider nicht. macht mich wahnsinnig! zumal die showmessage tut und auch sonst keine Fehler
Delphi-Quellcode:
procedure TPCchrt.Opentime(const TimeStr: string);
begin cxTextEdit2.Text := TimeStr; // nok showmessage(TimeStr); // ok end; |
Re: prozedur in Data Module auf andere Form anwenden
Wird evtl cxTextEdit2.text zwar korrekt gesetzt aber anschliessend sofort durch einen andern Event überschrieben?
Hast du mal einen Breakpoint gesetzt und geschaut was passiert?
Delphi-Quellcode:
procedure TPCchrt.Opentime(const TimeStr: string);
begin cxTextEdit2.Text := TimeStr; showmessage(cxTextEdit2.Text); end; |
Re: prozedur in Data Module auf andere Form anwenden
Zitat:
Zitat:
log wie folgt: ... Breakpoint Call Stack: Log all stack frames Process DataPlotter.exe (2392) aPCchrt.TPCchrt.Opentime('08.08.2009 05:46:08') aPCdmod.TPCdmod.Q_TIMEAfterOpen(???) :004eee87 TDataSet.DoAfterOpen + $1B ... |
Re: prozedur in Data Module auf andere Form anwenden
Was zeigt das "showmessage" von Posting #8??
Setze einen Breakpoint VOR dem Aufruf des Datamoduls und füge "cxTextEdit2.Text" in die Liste der überwachten Ausdrücke ein. Dann geh mit F7 oder F8 in EINZEL-Schritten (ganz wichtig) durch das Programm und beobachte den Eintrag in der Liste. Poste mal Deine Initialisierung, d.h. den Teil, wo das Datamodul aufgerufen wird. Kann es sein, dass Du das Editfeld im Nachhinein nochmal anpackst? Gruß Gerald |
Re: prozedur in Data Module auf andere Form anwenden
'Morgen Gerald
Zitat:
Doch die textbox enthält nachwievor den Text dass ich nicht entfernt habe, nämlich 'cxTextEdit2'. Magic ?? meinst Du dies mit der Initialisierung?
Delphi-Quellcode:
Ich werde das mit dem debugging versuchen.
program DataPlotter;
uses Forms, aPCmain in 'aPCmain.pas' {PCmain}, aPCdmod in 'aPCdmod.pas' {PCdmod: TDataModule}, aPCchrt in 'aPCchrt.pas' {PCchrt}, aPCVars in 'aPCVars.pas', aPCconn in 'aPCconn.pas' {PCconn}; {$R *.res} begin Application.Initialize; Application.Title := 'DataPlotter'; Application.CreateForm(TPCmain, PCmain); Application.CreateForm(TPCdmod, PCdmod); Application.CreateForm(TPCchrt, PCchrt); Application.CreateForm(TPCconn, PCconn); Application.Run; end. |
Re: prozedur in Data Module auf andere Form anwenden
Zitat:
Du wirst doch wahrscheinlich in einem Event (onCreate oder onShow usw.) einer Form die Funktion im Datamodul aufrufen. Diese Procedure wäre interessant. Und ob danach noch einmal von irgendwo auf das Editfeld zugegriffen wird. Deswegen der Tip mit dem Debugger. |
Re: prozedur in Data Module auf andere Form anwenden
Ich verbinde zu der Datenbank über eine Modalform. Gleichzeitig (In der gleichen prozedur wie das Verbinden der DB), öffne ich die Query.
Beim öffnen der Query wird der Event AfterOpen ausgelöst. Beim debuggign bin ich noch nicht weiter gekommen. |
Re: prozedur in Data Module auf andere Form anwenden
Hab nun das mit dem debugger gemacht, allerdings blicke ich es nicht ganz durch.
hab die komponente 'Edit1' (um standardkomponenten zu nehmen) nun in die Watchlist genommen, aber die Meldungen sagen mir überhaup nichts (wahrscheindlich hab ich's auch falsch gemacht...) Ansonsten ist mir nichts verdächtiges aufgefallen. Aber mal ganz grunsätzlich: es sollte doch *prinzipiell* gehen, oder ? (aus einem event im datamodul an ein objekt in einer anderen Form etwas zu übergeben ? Es ist mir nicht bewusst das dies so abwägig sein könnte. Wie gesagt, dies ist mir schon früher aufgefallen, nur konnte ich immer umschiffen... |
Re: prozedur in Data Module auf andere Form anwenden
Zitat:
Du hast ein anderes Problem in deinem Code! Entweder: in einem anderen Event überschreibst du den Wert wieder. Oder: Der Aufruf der modalen Form ist nicht korrekt und erzeugt die Form zb 2mal. Also zeig mal den Aufruf der modalen Form |
Re: prozedur in Data Module auf andere Form anwenden
Um genau zu sein liegt die Edit (die zu füllen ist) nicht auf der Hauptform, sondern auf einer weiteren Form. Diese wird ins Hauptfenster eingebettet, sodass ich einen einzigen Rahmen und Menübalken habe (und beliebig mit weiteren Fenster erweiterbar ist - aber vielleicht liegt der Hund genau da vergraben...).
Daher wird die modale Form aus dem Menu auferufen mit folgendem Code:
Delphi-Quellcode:
procedure TPCmain.aConnectExecute(Sender: TObject);
begin PCconn.ShowModal; end; |
Re: prozedur in Data Module auf andere Form anwenden
Jetzt wird's aber langsam unübersichtlich :roll:
Zitat:
Was ist mit TPCmain? Wie und welcher Reihenfolge diese gestartet bzw. initialisiert werden verrätst Du nicht. Ebensowenig welches davon auf dem anderen liegt. Gehts auch etwas detailierter als mit isoloierten Codeschnipseln? Sonst fällt mir dazu nix mehr ein. Gruß Gerald |
Re: prozedur in Data Module auf andere Form anwenden
Liste der Anhänge anzeigen (Anzahl: 1)
Guter Einwand,
anbei ein demo mit den minimalsten Standardkomponenten. vielleich hilt das um das Gefüge zu klären. |
Re: prozedur in Data Module auf andere Form anwenden
Kann zwar das Demoprogramm nicht zum laufen kriegen, da ich interbase nicht installiert habe.
Was mir aber so auf den 1. Blick aufgefallen ist: Bei Programmstart erstellst du das Formular ein erstes Mal
Delphi-Quellcode:
und später erzeugst das Formular ein zweites Mal:
Application.CreateForm(TPCchrt, PCchrt);
Delphi-Quellcode:
procedure TPCmain.FormCreate(Sender: TObject);
begin FChart := TPCchrt.Create(Self); with ChartF do begin Parent := Self; align := alClient; Visible := True; end; // ClientWidth := 1300; end; |
Re: prozedur in Data Module auf andere Form anwenden
Danke, danke, danke !!!
Das muss zwar so sein (anders bekomme ich es nicht zum laufen), aber du hast mich drauf gebracht. anstatt:
Delphi-Quellcode:
geht es nun so:
procedure TPCdmod.D1BeforeConnect(Sender: TObject);
begin with PCchrt do begin Opentime('von: TPCchrt.Opentime, aus Event: TPCdmod.D1BeforeConnect - string müsste eigentlich in Edit1 stehen'); end; end;
Delphi-Quellcode:
Herzlichen Dank
procedure TPCdmod.D1BeforeConnect(Sender: TObject);
begin with PCmain.ChartF do <-- springender punkt begin // Opentime('von: TPCchrt.Opentime, aus Event: TPCdmod.D1BeforeConnect - string müsste eigentlich in Edit1 stehen'); // oder eben: Edit1.Text := 'Mistery Solved'; end; end; Daniele |
Re: prozedur in Data Module auf andere Form anwenden
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Daniele,
es macht für mich eigentlich keinen Sinn in einem Datenmodul irgendwelche Formulare einzubinden. Wenn ich innerhalb eines Datenmoduls dem Formular eine Rückmeldung geben muss, so mache ich dies, indem ich in dem Datenmodul ein Notifyevent erstelle. Es wird eine Procedur als Typ definiert und im Datenmodul wird eine entsprechende Property des Typs erstellt. Im Formular wird dann einfach eine entsprechende Prozedur erstellt und der Property des Datenmoduls zugewiesen. Schau doch einfach mal in beiliegendes Demoprojekt … Gruß Ralf |
Re: prozedur in Data Module auf andere Form anwenden
Hallo Ralf,
Cool!, herzlichen Dank für den wertvollen Tipp Daniele |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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-2025 by Thomas Breitkreuz