Wie wird bei der GUI Programmierung die main() Funktion ersetzt? Wichtig!!!
-
Leute,
ich habe gerade den absoluten Hänger...!!!Habe eine Klassenhierarchie, einen STL Vektor und eine main()
Meine main() sieht in etwa so aus:
// ... int main(int argc, char *argv[]) { char eingabe; Zentrale eine_zentrale(1.07,300); eine_zentrale.baueFiliale("Europaplatz 5 - 1194 Hamburg",500,0,0); eine_zentrale.baueFiliale("Brunnen Str 1 - 4252 Berlin",500,0,0); eine_zentrale.baueFiliale("Hauptstrasse 3 - 4557 Mein",500,0,0); eine_zentrale.setzeLiterpreis(1.08); do { eine_zentrale.kundenTanken(); cout << "\nSollen die Tankstellen geschlossen werden?(j/n)"; cin >> eingabe; } while(eingabe != 'j'); eine_zentrale.auswerten(); return 0; }
Nun soll dieses Konsolenprogramm durch eine Windows GUI ersetzt werden. Logischerweise kann und will und soll ich ja die Klassenhierarchie mit seinem Header und Quelldateien weiterverwenden.
Nur wie ersetze ich die main() Funktion?
-
Da es eine Windows GUI Anwendung ist gibt es kein main() sondern ein WinMain(). Ein Rechtsklick und dann "Header anzeigen(oder so ich hab grad keinen Builder zur Hand)" dann siehst du WinMain() deines Programms.
-
Ja, mir ist schon klar das es keine WinMain() gibt...
da eine GUI anwendung ereignisorientiert arbeitet, muss ich trotzdem doch zum beispiel wenn ich eine neue instanz eines objketes anlege auf diese instanz zugreifen, beispielsweise methoden für diese instanz aufrufen.
da aber bei GUI projekten mit dem B C++ builder alle ereignisfunktionen, beispielsweise für einen gedrückten button, in ___fastcall funktionen steht, verlieren doch erstellte instanzen ihre güldigkeit??
weiß nicht wie ich es ausdrücken soll
-
riennevaplus,
riennevaplus schrieb:
da aber bei GUI projekten mit dem B C++ builder alle ereignisfunktionen, beispielsweise für einen gedrückten button, in ___fastcall funktionen steht, verlieren doch erstellte instanzen ihre güldigkeit??
das Thema, mit dem Du Dich beschäftigen mußt, lautet "Scope" bzw. "Güligkeitsbereich" - speziell für Klassen.
Eine Member-Variable einer Klasse ist in allen ihren Methoden verfügbar. Die Klasse ist Dein Formular und Methoden sind z.B. die Ereignis-Handler.
In die Klassen-Deklaration gehört also Deine Variable vom Typ "Zentrale". Dann existiert die Variable "eine_zentrale" so lange, wie das Formular existiert. Und den Formular-Konstruktor könntest Du folgendermaßen erweitern__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner), eine_zentrale(1.07,300)
-
riennevaplus schrieb:
Ja, mir ist schon klar das es keine WinMain() gibt...
Hell, wer sagt denn sowas???
Ich schrieb:
Da es eine Windows GUI Anwendung ist gibt es kein main() sondern ein WinMain().
Wenn dir die Struktur der BCB GUI-Projekten noch nicht so ganz klar ist, solltest du dir vielleicht erst mal das da angucken:
http://bcb-tutorial.c-plusplus.net/
-
Danke dir erstmal dschensky...
Allerdings bin ich noch nicht ganz klar in welche Richtung ich jetzt was machen muss.
Ich habe in meiner (funktionierenden) Konsolenanwendung 2 Klassen:
Zentrale // es gibt immer nur eine Zentrale
und Filialen // hier kann es mehrere geben, die in einem STL Vektor, der wiederrum innerhalb Zentral gespeichert ist, gespeichert werden.
Allerdings soll das Zentral objekt erst zur Laufzeit erstellt werden, und danach beliebig viele Filialobjekte in den Vektor aufgenommen werden. Danach sollen verschiedene Methoden für die Filialobjekte ausgeführt werden.
Wie soll ich also die Filiale erst zur Laufzeit erstellen, obwohl sie schon in dem Klassendeklarationsteil des Formulars aufgeführt ist?
Wie kann ich das in etwa realisieren?
-
Tja, dann solltest du hald vielleicht die Instanzen als Member des passenden Formulars, eines Dokuments, als globale Variable (davon ist abzuraten) oder ähnliches erstellen...
-junix
-
riennevaplus schrieb:
Wie soll ich also die Filiale erst zur Laufzeit erstellen, obwohl sie schon in dem Klassendeklarationsteil des Formulars aufgeführt ist?
1. mit Zeiger-Variable arbeiten und das Objekt mittels new erstellen
2. (aber eigentlich 1.) Die Nase endlich in ein paar C++-Bücher stecken!!
-
nochmal danke, aber da mit den Büchern : Ich habe schon viele Grundlagenbücher durch, aber da ich jetzt mit GUI anfangen möchte, ist mir halt noch nicht ganz klar wie ich die Funktionalität meiner Konsolenanwendung in eine GUI packen kann? Wenn ihr möchtet, poste ich mal meine Konsolenanwendung und ihr sagt mal wie ich das in eine GUI umsetzen kann...
-
Bessere Variante: du erstellst zur Übung mal ein paar GUI-Anwendungen und experimentierst damit herum, um ein Grundverständnis für die Abläufe zu bekommen. Im Laufe dieser Experimente sollte sich auch schon die eine oder andere Idee für die Überführung deines bestehenden Codes ergeben.
Wenn du dann mit der Umsetzung einer dieser Ideen Probleme haben solltest kannst du hier gern nochmal konkrete Fragen stellen.
-
riennevaplus schrieb:
Wie wird bei der GUI Programmierung die main() Funktion ersetzt? Wichtig!!!
Du bist nicht wichtiger als andere. Hier ist alles gleich wichtig!!!
-
Amen
-
Eine etwas unverfrorene Reaktion eines HIlfesuchenden... zumal Webfritzi - auch wenn er sich im Ton vergriffen hat - recht hat...
Und nu is schluss mit OT
-junix
-
Tut mir leid, nur leider sind solche Reaktionen sinnlos und helfen keinem.
Sorry
-
riennevaplus schrieb:
Tut mir leid, nur leider sind solche Reaktionen sinnlos und helfen keinem.
Genau so wie deine Reaktion ala "Amen". Ende der Diskussion. Wenn du trotzdem noch den Bedarf weiterer Diskussionen verspüren solltest, eröffne einen THread im OT-Forum oder pack deine Argumente in ein EMail
-junix
-
@ Jansen
Habe mich jetzt schon länger damit beschäftigt, trotzdem ist mir nicht klar wie ich das bestehende Konsolenprogramm in eine GUI Anwendung überführen kann.
Hab mich auch schon tot gegoogled und nichts, aber auch gar nichts, gefunden...
Bin am verzweifeln.
-
Also wenn ich mir dein Code so angucken müssen z.b Sachen wie
cout << cin >>
usw weg! Das ist Konsole und hat nichts mit GUI zu tun. main() wird wie gesagt WinMain() usw...
-
Im Prinzip musst du die Programmlogik nochmals nachbauen... einfach überführen kannste ned... Wenn das Programm allerdings halbwegs nach den Regeln der Kunst geschrieben wurde, kannst du die meisten Libraries und Funktionen einfach übernehmen. Der Nachbau der Programmlogik dürfte dann das kleinste Problem sein...
Da - wie du schon selber erkannt hast - GUIs Event driven sind und nicht wie Konsolenanwendungen ablaufgesteuert sind, lässt sich die Applikation nicht ohne einen gewissen Aufwand umbauen...-junix
-
Hi,
wenn du gerne mal mit GUI programmierung anfagen willst(ich denke mal, dass du windows benutzt) dann schau dir doch mal http://www.winprog.net/tutorial/ an. Mit der VCL von Borland geht es zwar leichter, aber du hast, wenn du nur die VCL benutzt, kein wirkliches verständniss, wie Windows funktioniert. Desshalb schau dir doch mal dir Windows API an.
-
Am liebsten würde ich mein Konsolenprogramm hier mal posten...
Also ich erkenne schonmal das die komplette Ein und Ausgabe ersetzt werden muss..aber das Problem ist das ich in meinen Programm 2 Klassen habe
" Zentrale " und " Filiale "
In meiner Konsolen main() Funktion habe ich zunächst eine Zentrale erzeugt
Zentrale eineZenttrale(1.07,300)
dann habe ich über eine Methode "baueFiliale()" Filialen erzeugt und mittels this Zeiger eine Assoziation zur Zentrale erzeugt
Was folgte sind einige polymorphe Methoden zur Auswertung und Geschäftvorfälle mittels rand() Funktionen, die beispielsweise die Attribute Umsatz, Tankinhalt der einzelnen Filialen ändern.
Die Filialen habe ich in einen STL - Vektor gespeichert der auch innerhalb der Zentrale gespeichert wurde und mit .pushback() die filialobjekte gleich nach erzeugen in den Vektor gespeichert und ausschließlich über for() schleifen auf alle Objekte im Vektor zugegriffen.
Wie ihr seht ist das Beispiel ziemlich komplex und ich weiß nicht wie ich in der GUI die ObjektInstanzen und den Vektor und die Assoziationen implememntieren soll...
HILFE!!!