Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi prozedur in Data Module auf andere Form anwenden (https://www.delphipraxis.net/148877-prozedur-data-module-auf-andere-form-anwenden.html)

danieleh 10. Mär 2010 07:38


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;

GHorn 10. Mär 2010 08:16

Re: prozedur in Data Module auf andere Form anwenden
 
Versuch mal folgendes:

Delphi-Quellcode:
TPCchrt.cxTextEdit2.Text := PCdmod.Q_TIME['Min'];
Application.ProcessMessages;
Gruß
Gerald

danieleh 10. Mär 2010 08:38

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

GHorn 10. Mär 2010 10:19

Re: prozedur in Data Module auf andere Form anwenden
 
Zitat:

geht leider nicht.
habe "Forms" in uses list für ProcessMessages getan
:gruebel:

Du musst PCchrt (Name Deiner Hauptform) in Deine uses-clause
des datamoduls packen.

danieleh 10. Mär 2010 10:25

Re: prozedur in Data Module auf andere Form anwenden
 
Das hatte ich natürlich auch schon drin...

DeddyH 10. Mär 2010 10:28

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;

danieleh 10. Mär 2010 11:36

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;

fatalerror 10. Mär 2010 11:53

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;

danieleh 10. Mär 2010 12:30

Re: prozedur in Data Module auf andere Form anwenden
 
Zitat:

Wird evtl cxTextEdit2.text zwar korrekt gesetzt aber anschliessend sofort durch einen andern Event überschrieben?
wird es nicht. klappt auch nicht wenn etwas bereits im edit steht und dies zu löschen versuchen(zb PCchrt.Edit1.Text:=''). ps. hab nun auch mit standardkomponenten versucht

Zitat:

Hast du mal einen Breakpoint gesetzt und geschaut was passiert?
hab ich, bin zwar kein spezialist im debugging, aber mir ist nichts besonderes aufgefallen, ausser das der Wert korrekt übergeben wurde
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
...

GHorn 11. Mär 2010 07:37

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

danieleh 11. Mär 2010 08:18

Re: prozedur in Data Module auf andere Form anwenden
 
'Morgen Gerald


Zitat:

Was zeigt das "showmessage" von Posting #8?
Extrem seltsam: ist mir erst jetzt aufgefallen. showmessage der textbox zeigt korrekt '08.08.2009 05:46:08'
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:
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.
Ich werde das mit dem debugging versuchen.

GHorn 11. Mär 2010 08:32

Re: prozedur in Data Module auf andere Form anwenden
 
Zitat:

meinst Du dies mit der Initialisierung?
Nö.

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.

danieleh 11. Mär 2010 10:25

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.

danieleh 11. Mär 2010 12:21

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...

fatalerror 11. Mär 2010 12:41

Re: prozedur in Data Module auf andere Form anwenden
 
Zitat:

Zitat von danieleh
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 ?

ja das ist problemlos möglich und funktioniert auch bei dir: Wie du selbst sagst, wird mittels showmessage der korrekte Wert angezeigt, was beweist, dass es funktioniert.

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

danieleh 11. Mär 2010 12:55

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;

GHorn 11. Mär 2010 14:11

Re: prozedur in Data Module auf andere Form anwenden
 
Jetzt wird's aber langsam unübersichtlich :roll:

Zitat:

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, ....
Wir wissen bis jetzt, dass es folgendes gibt: TPCdmod, TPCchrt, TPCconn.
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

danieleh 11. Mär 2010 18:20

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.

fatalerror 11. Mär 2010 19:01

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:
Application.CreateForm(TPCchrt, PCchrt);
und später erzeugst das Formular ein zweites Mal:

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;

danieleh 11. Mär 2010 20:22

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:
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;
geht es nun so:

Delphi-Quellcode:
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;
Herzlichen Dank
Daniele

Rallef 11. Mär 2010 21:18

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

danieleh 12. Mär 2010 06:55

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