Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Borland - Instanz Application woher??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.05.2005, 20:16 Uhr
~MyName
Gast


Hi,

ich hab heute die ersten Schritte auf dem Borland Builder 6 hinter mir. Dabei ist mir aufgefallen das wenn man ein neues Projekt anlegt es gleich ein Objekt mit dem Namen Application in der WinMain gibt. Wie das allerdings funktioniert läßt mich rätseln, da es keine (offensichtliche) Instanz gibt. Kann mir vielleicht jemand sagen wie das funktioniert, bzw. ein paar Stichwörter geben um mal danach zu suchen.

greetz
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.05.2005, 23:27 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Das Application-Objekt ist AFAIK in der Forms-Unit definiert; ob Du das aber jemals zu Gesicht bekommst, ist fraglich, das gehört zur Delphi-VCL. Die passende Klasse ist TApplication, schaus Dir mal an...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.05.2005, 09:05 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)



Zitat von Bruder Leif:
...ob Du das aber jemals zu Gesicht bekommst, ist fraglich...

Ob du das jemals brauchen wirst ist fraglich!

Da du offensichtlich noch ein Anfänger bist (korrigiere mich bitte, sollte ich da falsch liegen) fällt mir nichts ein, wozu du die Definition dazu brauchen könntest. Willst du eine Komponente programmieren, das kannst du auch die Definition, und manuell verändern würde ich die VCL nicht!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.05.2005, 12:52 Uhr
~MyName
Gast


Hi,

mir gehts weniger um die definition der Klasse, vielmehr um folgendes. Die vom Builder angelegte WinMain sieht so aus.


C++:
WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();    // <- wo wurde das Objekt Application instanziert??
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
...

}



Meiner Vorstellung nach (deshalb vielleicht Anfänger ) müßte es so aussehen.



C++:
WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 TApplication Application; //<- Meine Vorstellung der ganzen Sache :)
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
...

}



greetz

Dieser Post wurde am 10.05.2005 um 22:01 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.05.2005, 14:17 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Müsste es nicht, da Application eine globale Instanz von TApplication ist, die irgendwo in den untiefen des VCL-Quellcodes allokiert wird... und übrigens: Selbst wenn es so währe, wie du es meinst, dann müsste es immer noch so aussehen:


C++:
WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 TApplication *Application = new Application(NULL);
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
}



Letzendlich ist die instanziierung, wie du sie oben siehst, irgendwo im Quellcode, den du mit vcl.h includierst!

Stell dir vor, dein Beispiel würde verwendet werden; Dann währe Application ein lokales Objekt der Funktion WinMain() und du könntest von nirgendwo in deinem Projekt darauf zugreifen -> Daher die globale Instanziierung!

Dieser Post wurde am 10.05.2005 um 14:20 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.05.2005, 16:27 Uhr
~MyName
Gast


Das ist wirklich ziemlich verwirrend für mich, da ich immer davon ausgegangen bin, das globale instanzierungen in der WinMain() erfolgen, da hier doch der Programmeinstiegspunkt ist. Um nun auf ein Globales Objekt aus einer Form heraus zuzugreifen würde es doch genügen einen global scope (::Application) zu benutzen. Würde nun die WinMain() verlassen werden, wäre doch das Programm zuende und das Objekt Application hätte keine Relevanz mehr.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.05.2005, 14:04 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Die WinMain() ist eine Funktion wie jede andere auch (nur eben, dass sie vom OS aufgerufen wird). In der WinMain() definierte Variablen bzw. instanziierte Objekte sind genauso lokal, wie sie es auch in anderen Funktionen währen. Daher kannst du aus anderen Funktionen auch nicht darauf zugreifen.

Du würdest ja auch nicht folgendes versuchen:

C++:
void test()   {
   int a;
}

void testB()  {
   int b = 2;
   int c = b+a;
}



Das hier hingegen würdest du jedoch vermutlich sofort als richtig erkennen (was es ja auch ist):

C++:
int a;
void TestB()   {
   int b = 2;
   int c = b+a;
}


Das Prinzip ist das gleiche. Das es die WinMain() ist, die Windows aufruft, ist reiner Zufall (sie hätte z.B. auch WindowsMain() heißen können). Genauso kannst du auch unter Linux eine WinMain() haben, nur dass die eben nicht bei Programmstart aufgerufen wird!

Fazit:
1) Lokal ist lokal und wird es immer bleiben.
2) Global ist globaler als lokal und wird es immer bleiben.
3) Globaler als global geht (in C++) nicht.

--------------
Und was das Verlassen der WinMain() betrifft: Das gilt für andere Funktionen schließlich genau so. Du würdest ja auch nicht folgendes machen, obwohl da auch die Test ja deiner Vorstellung nach gar nicht verlassen wird:

C++:
int Calctest() {
   return b%2;
}

void Test() {
   int b = 20;
   CalcTest();
}


Dieser Post wurde am 11.05.2005 um 14:07 Uhr von Reyx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.05.2005, 12:34 Uhr
~MyName
Gast


Okay, ich glaub ich habs. Was mir nicht ganz bewusst war (wobei schon so gemacht) das man ja auch Variablen vor der Main() definieren kann (ich dachte nur deklarieren) und somit auch Objekte instanzieren. Somit kann die Instanz des Application Objektes tatsächlich in den Tiefen der VCL Header liegen (leider in der Form noch nicht gefunden, aber egal ). Soweit so gut, danke erstmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: