AGB  ·  Datenschutz  ·  Impressum  







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

Application.Run

Ein Thema von day · begonnen am 7. Okt 2004 · letzter Beitrag vom 8. Okt 2004
Antwort Antwort
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#1

Application.Run

  Alt 7. Okt 2004, 19:40
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;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Application.Run

  Alt 7. Okt 2004, 21:29
Moin,

kannst du mir bitte mal erklären was das für einen Sinn hat bzw. was du da eigentlich machen willst.

Danke,
Thorsten
  Mit Zitat antworten Zitat
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#3

Re: Application.Run

  Alt 7. Okt 2004, 22:30
Ich möchte eine eigene Klassen erstellen, welche alle Forms erzeugt (Application.create)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Application.Run

  Alt 7. Okt 2004, 23:50
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:
procedure Auswahlfenster;
var Fenster:TFAuswahl;
begin
  Fenster:=TFAuswahl.create(Self);
  try
    if Fenster.showmodal = mrOK then begin
      ...
    end;
  finally
    Fenster.release;
  end;
end;
und fertig...

Oder meinst du was anderes?

MfG
Thorsten
  Mit Zitat antworten Zitat
day

Registriert seit: 10. Mai 2004
223 Beiträge
 
#5

Re: Application.Run

  Alt 8. Okt 2004, 19:46
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;
  Mit Zitat antworten Zitat
ipworks

Registriert seit: 27. Jul 2004
65 Beiträge
 
#6

Re: Application.Run

  Alt 8. Okt 2004, 19:54
Also....ich checks nicht:
Du willst alle Forms beim Start erzeugen, aber nicht im Quelltext des Projekts
Warum eine eigene Klasse, wenn Du schon sowieso alle creations zusammenfasst.
Welchen Vorteil versprichst du dir davon?
Peter
-------------------------------
mostly......pebkac
http://www.ipworks.de
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Application.Run

  Alt 8. Okt 2004, 21:58
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:
procedure Fenster;
var Fenster:TFenster;
begin
  Fenster:=TFenster.create(Self, SQLConnection);
  try
    if Fenster.showmodal = mrOK then begin
      ...
    end;
  finally
    Fenster.release;
  end
end;
so und nunnochmal zu deinem Datenübergabe bzw. bekomm Problem...

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:
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;
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.
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
  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:25 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