![]() |
Application.Run
Hallo
Ich möchte Application.Run in einer eigenene Klasse haben. Ich weiss sollte man eigentlich nicht machen. Aber ich versuche es trotzdem 8) . Wie sieht aber der genaue ablauf ab, wann muss ich Run aufrufen?
Code:
constructor TMain.create();
begin //Applikation initialisieren Application.Initialize; initIntro(); //mIntro := TIntroThread.Create(False); initDataModule(); initScreens(); Application.Run; end; destructor TMain.destroy(); begin ... end; procedure TMain.initIntro(); begin Try Application.CreateForm(TIntroForm, IntroForm); IntroForm.Show; Except On E:Exception Do Begin ... End; End; end; |
Re: Application.Run
Moin,
kannst du mir bitte mal erklären was das für einen Sinn hat bzw. was du da eigentlich machen willst. Danke, Thorsten |
Re: Application.Run
Ich möchte eine eigene Klassen erstellen, welche alle Forms erzeugt (Application.create)
|
Re: Application.Run
Moin,
sorry vielleicht bin ich ja völlig auf dem Holzweg. ABER, es gibt nur ein Application-Object. Um die einzelnen Formulare zu erzeugen must du doch nicht CreateForm benutzen. Das erstellen aller Formulare zum Programmstart ist nicht sinnvoll, weil dann das Programm lange benötigt, um starten und es wird sehr viel Speicher benötigt. Es ist sinnvoller eine Instanz der jeweiligen Fenster zu erzeugen, wenn sie benötigt werden. OK, ich denke das hast du vor. Aber das geht doch viel einfacher. Über das Menü Project->Optionen kannst du festlegen, welche Formulare automatisch erzeugt werden sollen. Hier sollte sinnvollerweise nur das Hauptformular automatisch erzeugt werden. Alle anderen brauchen nur verfügbar sein. Dann kannst du in deinem Programm die einzelnen Instanzen erzeugen z.B. so...
Delphi-Quellcode:
und fertig...
procedure Auswahlfenster;
var Fenster:TFAuswahl; begin Fenster:=TFAuswahl.create(Self); try if Fenster.showmodal = mrOK then begin ... end; finally Fenster.release; end; end; Oder meinst du was anderes? MfG Thorsten |
Re: Application.Run
Hallo
Ja es geht in etwa diese Richtung. Bis jetzt habe ich es eben so gemacht, dass ich alle Forms mir CreateForm erzeugt habe. Wenn ich dann die entsprechende Form benötige, brauche ich nur noch Visible auf True zu setzen. Wenn man zwischen zwei Forms hin und her springt und den Dateninhalt der einten form nicht verlieren möchte, dann kann man nicht jedesmal mit create eine neue Form erzeugen. Ich bin mir da eben noch unschlüssig wie ich das lösen soll. Habe bis jetzt noch keinen gescheiten lösungsansatz. Bis jetzt sieht mein Programm in etwa so aus
Code:
program OffertClient;
uses Forms, OffertViewUnit in 'Gui\OffertViewUnit.pas' {OffertViewForm}, DataModule in 'DataModule\DataModule.pas' {DM: TDataModule}, EditViewUnit in 'Gui\EditViewUnit.pas' {EditViewForm}, ProgressbarViewUnit in 'Gui\ProgressbarViewUnit.pas' {ProgressBarViewForm}, IntroUnit in 'Gui\IntroUnit.pas' {IntroForm}, MainUnit in 'Gui\MainUnit.pas', IntroThreadUnit in 'Gui\IntroThreadUnit.pas'; {$R *.RES} begin TMain.create(); end.
Code:
unit MainUnit;
interface uses Windows,SysUtils,Forms,SystemFunc,Dialogs; type TMain = class(TObject) private mHasError : Boolean; mSys : TSystemFunc; procedure initIntro(); procedure initDataModule(); procedure initScreens(); procedure hasError(); public constructor create(); end; const APPLICATION_TITLE : String = 'Offert-System'; implementation uses DataModule,CsIntF, EditViewUnit, AboutDialogUnit, Preview, ProgressbarViewUnit, OffertViewUnit,IntroUnit; {** Der Konstruktor initialisiert und registriert alle nötigen Forms. Ebenfalls wird überprüft ob bereits ein Offert-System gestartet wurde. Ist dies der Fall, wird die Applikation beendet die gerade gestartet wurde. } constructor TMain.create(); var i : Integer; begin //Überprüft, dass nur eine Applikation pro PC gestartet wird. if ( FindWindow( Nil, PChar( APPLICATION_TITLE )) = 0 ) Then begin mHasError := False; //Applikation initialisieren Application.Initialize; Application.Title := APPLICATION_TITLE; initIntro(); //mIntro := TIntroThread.Create(False); initDataModule(); if(DM.DCOMConnection.Connected) Then IntroForm.ConnectionLabel.Caption := 'Connected ...'; Application.ProcessMessages; initScreens(); // Intro wird Angehalten if(not mHasError) Then begin IntroForm.StopIntro(); // Haupt-Fenster anzeigen. OffertViewForm.Show; end; Application.Run; end else begin Windows.Beep(500,250); MessageDlg( APPLICATION_TITLE + ' is not able to run twice on this PC.', mtError, [mbOK], 0); end; end; |
Re: Application.Run
Also....ich checks nicht:
Du willst alle Forms beim Start erzeugen, aber nicht im Quelltext des Projekts :spin: Warum eine eigene Klasse, wenn Du schon sowieso alle creations zusammenfasst. Welchen Vorteil versprichst du dir davon? |
Re: Application.Run
Moin,
ich weiss nicht warum du dir das Leben unnötig schwer machen möchtest. ich habe ja schon geschrieben wie eine einfache Lösung aussieht. Ich möchte hier mal auf dein Kommentar eingehen, das du auf Inhalte von Fenstern zugreifen möchtest. Also du hast eine Main-Form und nur die wird automatisch erzeugt. Alle anderen Fenster erzeugst du nur dann und nur solange du sie brauchst. Die Kommunikation zwischen den Fenster funtioniert mit Zugriff-Methoden oder auch schon direkt über den Konstruktor. Wenn du z.B. eine Datenbankanwendung hast, brauchst du überall die Komponente, über die der Datenbankzugriff erfolgt (ich nehme hier mal als Beispiel DBExpress). Also du hast jetzt eine Komponente (SQLConnection) auf dem Mainformular und musst diese natürlich den anderen Fenster auch zur Verfühgung stellen (und dies geschieht nicht über globale Varaiablen, weil man diese nicht braucht!). Die einzelenen Fensterklassen müssen also einen neuen Kontruktor bekommen: constrcutor create(AOwner:TComponent; SQLConnection:TSQLConnection); reintroduce; begin inherited create(AOwner); FSQLConnection:=SQLConnection; end; FSQLConnection ist dann eine private Variable in der jeweiligen Fensterunit, über die die Verbindung zu einer Datenbank erfolgen kann. Der Aufruf dieses Fensters sieht dann so aus:
Delphi-Quellcode:
so und nunnochmal zu deinem Datenübergabe bzw. bekomm Problem...
procedure Fenster;
var Fenster:TFenster; begin Fenster:=TFenster.create(Self, SQLConnection); try if Fenster.showmodal = mrOK then begin ... end; finally Fenster.release; end end; Mit Zugriffsmethoden konnen nun die Daten zum Fenster bzw. vom Fenster geholt werden. Im Publicteil der Fensterunit: : public procedure setData(Text:string); function getData:string; end; : und so gehts...
Delphi-Quellcode:
so kannst du alles machen, was du möchtest. Diese Vorgehenweise ist zukunftssicher. Du kannst unendlich viele Fenster realsieren. Die Kommunikation untereinander ist genau festgelegt, es gibt keine globalen Variablen, es wird nur soviel Speicher benutzt, wie gerade benötigt wird.
procedure Fenster;
var Fenster:TFenster; Data:string; begin Fenster:=TFenster.create(Self, SQLConnection); try Fenster.setData('hier sind die Daten für das Fenster'); if Fenster.showmodal = mrOK then begin Data:=Fenster.GetData; //und hier kommen die Daten aus dem Fenster zurück end; finally Fenster.release; end end; was willst du noch? So, ich denke ich habe jetzt genug auf dich eingeredet, wenn du es immer noch nicht einsiehst, dann kann ich es auch nicht ändern. Mehr als dir diese Ideen an die Hand geben kann ich nicht. Oder wie mein alter Lehrer immer sagte: Nimm es einfach an. Warum das Rad neu erfinden, andere haben sich da schon viel Mühe gegeben, um uns solche schönen Möglichkeiten an die Hand zugeben. Benutze sie doch einfach. MfG Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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