Anmeldefenster versus <project>.cpp
-
Derzeit zeigen wir in unserer Anwendung zu Beginn ein Anmeldefenster an (Benutzer/Kennwort...), das vor dem eigentlichen Hauptfenster in der <project>.cpp geöffnet wird, und bei Bedarf die Methode abbricht.
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { ... // Die für das Login relevanten Datenmodule öffnen... Application->Initialize(); Application->CreateForm(__classid(TdmDatenbank), &dmDatenbank); ... if(!TFormAnmeldung::AnmeldeBenutzer()) return 0; // Startfenster anzeigen ...
Das funktioniert an sich gut, nur wird bei jedem Hinzufügen/Entfernen einer Form oder eines Datenmoduls diese Datei neu generiert - jedesmal muss man also die Datei wieder herstellen (Dank Subversion zwar unproblematisch aber nervig).
Gibt es eine sinnvolle andere Stelle um etwas vor der Anzeige des Hauptfensters durchzuführen, ohne die häufige Korrektur? Und wenn ja, wo wäre die sinnvollste Stelle hierfür?
-
Wird die Datei wirklich neu erstellt? Ich kenne das Problem, daß die IDE manchmal eigenen Code überschreibt, aber im Allgemeinen läßt sie meine Änderungen drin. (Welche Version benutzt du gleich noch?)
Ich umgehe das Problem meist, indem ich meine Extrafunktionalität in eine Funktion auslagere. Den einen Funktionsaufruf läßt die IDE dann drin, weil er hinreichend simpel ist, um sie nicht zu verwirren.
void beforeStartup (void); // nur Deklarationen void beforeShutdown (void); WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TdmDatenbank), &dmDatenbank); beforeStartup (); Application->Run(); beforeShutdown (); } ... } // ---------------------[...]--- void doYourThing (void) { if(!TFormAnmeldung::AnmeldeBenutzer()) // Was ist das, Telegramm-Denglisch? ExitProcess (0); showSplashScreen (); }
-
audacia schrieb:
Wird die Datei wirklich neu erstellt? Ich kenne das Problem, daß die IDE manchmal eigenen Code überschreibt, aber im Allgemeinen läßt sie meine Änderungen drin. (Welche Version benutzt du gleich noch?)
a) Die Datei wird nahezu komplett neu geschrieben (Nur wenige Ausnahmen).
b) RadStudio 2007** Umstieg auch nach längerer Phase noch nicht möglich (DB-Komponenten müssen noch ausgetauscht und die Zugriffe auf diese massiv angepasst werden; Bei ein paar weiteren Komponenten sind zwar Änderungen nötig aber wenigstens abschätzbar). Aber XE2 liegt bereit, und der nächste Versuch steht die nächsten Monate an...
-
asc schrieb:
a) Die Datei wird nahezu komplett neu geschrieben (Nur wenige Ausnahmen).
Das ist seltsam und mir unbekannt.
In diesem Fall könntest du in einer separaten .cpp-Datei mit #pragma startup eine Routine vor der WinMain()-Funktion ausführen lassen. Die VCL sollte zu diesem Zeitpunkt bereits initialisiert und benutzbar sein (Application->Initialize() führt nur zum Aufruf einer CORBA-/COM-spezifischen Initialisierungsprozedur und tut bei dir idealerweise nichts). Allerdings wirst du dann in den Projektoptionen zumindest das Hauptformular auf "manuelle Erstellung" setzen und dafür in deiner Init-Funktion Application->CreateForm() aufrufen müssen.
asc schrieb:
* Umstieg auch nach längerer Phase noch nicht möglich [...]
Schon gut, ich dränge dich nicht dazu
Ich bezweifle ohnehin, daß sich an der Code-Management-Logik viel geändert hat. Die ist bekanntermaßen überaltert und muß dringend durch etwas brauchbareres ersetzt werden. Die Entwickler würden das vermutlich lieber auf der Grundlage des deutlich flexibleren Structure-Pane-Parsers machen - vielleicht passiert's irgendwann einmal. Aber in XE2 ist alles noch beim Alten.
Edit: sachlichen Fehler bzgl. Application->Initialize() korrigiert