wenn Parameter xy dann Form, ansonsten Konsolenanwendung



  • Hallo zusammen,

    Um Code-Redundanz zu vermeiden, würde ich gerne gewisse Elemente (Klassen) in einer Konsolen- sowie Formanwendung benutzen.

    Es sollte bspw. grundsätzlich eine Konsolenanwendung starten.
    Wenn nun Parameter mit übergeben werden (-gui) o.Ä. soll anstelle der Konsolenanwendung die Form gestartet werden.

    Wie kann ich dies am besten lösen?



  • Hallo

    Das geht nicht. Entweder ein Konsolen-Projekt oder ein VCL-Projekt. Du könntest theoretisch ein Konsolen-Projekt schreiben, das über die WinAPI auch GUI-Fenster starten kann, must dann aber auf die VCL verzichten.
    Du solltest deine Programm-Logik zunächst erstmal streng vom UI trennen, egal ob Konsole oder GUI. Dann kannst du diese Logik auch in ein separates Projekt sinnvoll auslagern, entweder DLL oder statische Library. Dieses Library-Projekt bindest du dann sowohl vom Konsolen- als auch vom VCL-Projekt ein.

    bis bald
    akari



  • Ahh okay. Schade, aber dennoch vielen Dank.



  • akari schrieb:

    Das geht nicht. Entweder ein Konsolen-Projekt oder ein VCL-Projekt.

    Das ist so nicht richtig.

    Es ist nicht möglich, eine einzelne Executable wahlweise als Konsolenanwendung oder ohne Konsolenfenster zu betreiben; das ist eine Einschränkung des Betriebssystems. Aber abgesehen davon geht alles. Eine Konsolenanwendung kann, wenn sie will, problemlos GDI-Handles, Fenster und Threads anfordern. VCL-Units in Konsolenanwendungen sind, technisch gesehen, überhaupt kein Problem. Es läßt sich lediglich nicht vermeiden, daß beim Start der Anwendung ein Konsolenfenster geöffnet wird.

    akari schrieb:

    Du solltest deine Programm-Logik zunächst erstmal streng vom UI trennen, egal ob Konsole oder GUI. Dann kannst du diese Logik auch in ein separates Projekt sinnvoll auslagern, entweder DLL oder statische Library. Dieses Library-Projekt bindest du dann sowohl vom Konsolen- als auch vom VCL-Projekt ein.

    Diesem Ratschlag hinwiederum kann ich auf ganzer Linie beipflichten 🙂



  • audacia schrieb:

    VCL-Units in Konsolenanwendungen sind, technisch gesehen, überhaupt kein Problem.

    Hallo,

    das will ich sehen => wie du den TButton in die Konsole bekommst! 😕
    VCL = Visual Component Library

    VlG



  • Hallo

    audacia meint natürlich nicht, einen Button auf das Konsolenfenster zu legen, sondern manuell eine TForm-Instanz zu erstellen und wie gewohnt dynamisch mit weiteren Komponenten zu bestücken.
    Allerdings weiß ich nicht ob TForm nicht noch den TApplication-Rahmen braucht und inweiweit dieser dann auch manuell aufgebaut werden kann. Wenns geht, war mein Urteil doch vorschnell.

    bis bald
    akari



  • RandomAccess85 schrieb:

    das will ich sehen => wie du den TButton in die Konsole bekommst! 😕

    Sogar derart haarsträubender Unfug sollte mit entsprechender Rechtevergabe möglich sein; das Konsolenfenster ist auch nur ein Fenster. Aber wie akari bereits treffend festgestellt hat, war es mir nicht um dergleichen zu tun, sondern ich wollte darauf hinweisen, daß der einzige Unterschied zwischen Konsolen- und GUI-Anwendungen nicht einmal in der Verfügbarkeit (-> AllocConsole() ), sondern lediglich in der grundsätzlichen Präsenz einer Konsole besteht. Der physische Unterschied besteht in einem Flag im PE-Header, anhand dessen der PE-Loader darüber befindet, ob er den Prozeß mit einer Konsole verbinden (und ggf. eine öffnen) soll oder nicht.

    akari schrieb:

    audacia meint natürlich nicht, einen Button auf das Konsolenfenster zu legen, sondern manuell eine TForm-Instanz zu erstellen und wie gewohnt dynamisch mit weiteren Komponenten zu bestücken.

    Es ist nicht einmal nötig, dafür wesentlich mehr Aufwand zu betreiben als bei einer normalen VCL-Anwendung. Einfach eine neue Konsolenanwendung mit VCL-Support erstellen, via Datei|Neu... ein Formular-Unit hinzufügen und den Quelltext von main.cpp durch das hier ersetzen (ungetestet):

    #include <vcl.h>
    #pragma hdrstop
    
    USEFORM ("Unit1.cpp", Form1)
    
    #include <tchar.h>
    
    int _tmain (void)
    {
        Application->Initialize ();
        Application->CreateForm (__classid (TForm1), &Form1);
        Application->Run ();
    }
    

    Das sollte erwartungsgemäß eine ganz gewöhnliche VCL-Anwendung erzeugen, die zufällig auch ein Konsolenfenster hat.

    RandomAccess85 schrieb:

    VCL = Visual Component Library

    Es entbehrt nicht einer gewissen Komik, daß du offenbar nicht willens oder in der Lage bist, dich hinreichend lange mit meinem Posting auseinanderzusetzen, um den Sinngehalt zu verstehen, aber zugleich meinst, mich das Lesen lehren zu müssen.



  • audacia|off schrieb:

    RandomAccess85 schrieb:

    VCL = Visual Component Library

    Es entbehrt nicht einer gewissen Komik, daß du offenbar nicht willens oder in der Lage bist, dich hinreichend lange mit meinem Posting auseinanderzusetzen, um den Sinngehalt zu verstehen, aber zugleich meinst, mich das Lesen lehren zu müssen.

    Absolut überflüssig 🙄 ! Aber wenn du meinst nachts 01:45 extra nochmal aufstehen zu müssen um sowas von dir zu geben, ist das natürlich dein Problem.

    VlG

    P.S.: Ich hasse großkotzige Menschen, die meinen, mit Lehrbuchwissen prahlen zu müssen und nebenbei sämtliche menschliche Züge abschalten 🙄



  • Ahh super, da hat sich ja noch etwas getan 🙂
    Hört sich jedoch komplizierter an, als es in eine Lib/DLL auszugliedern.



  • RandomAccess85 schrieb:

    Absolut überflüssig 🙄 ! [...]

    Du sagst es selbst.

    Edit: Ich will dazu noch kurz ein paar abschließende Worte verlieren.

    RandomAccess85 schrieb:

    Aber wenn du meinst nachts 01:45 extra nochmal aufstehen zu müssen um sowas von dir zu geben, ist das natürlich dein Problem.

    VlG

    P.S.: Ich hasse großkotzige Menschen, die meinen, mit Lehrbuchwissen prahlen zu müssen und nebenbei sämtliche menschliche Züge abschalten 🙄

    Deine Interpretation schien mir derart verquer, daß sich mir die Vermutung aufdrängte, du wolltest das mit Absicht falsch verstehen, oder du hättest meinen Post nur überflogen, anstatt ihn zu lesen. Beides ist kommunikativ natürlich nicht förderlich. Nun habe ich mich da anscheinend geirrt; wenn ich deine letzte Äußerung richtig interpretiere, muß ich mich tatsächlich derart mißverständlich ausgedrückt haben. Aber natürlich hättest du dann auch einfach ohne Konnotation nachfragen können, was ich denn eigentlich damit meine. Dann hätte ich vermutlich reagiert wie akari (oder, da er ohnehin schneller war, es bei seiner hinreichenden Antwort belassen).

    Aber wenn du meinst, großspurig auftreten und "mit Lehrbuchwissen prahlen zu müssen" - oder wie anders deutest du selbst denn Aussprüche wie "das will ich sehen" und "VCL = Visual Component Library"? -, dann brauchst du dich nicht wundern, wenn es mich ein wenig in den Fingern juckt, wenn ich nach einem langen, anstrengenden Tag noch meine Mails lese und dabei auf deine menschlichen Züge stoße.

    Eigentlich würde ich jetzt gerne mit "Arroganz muß man sich auch leisten können" abschließen - aber ich glaube, für heute reicht's. 😉 Zurück zum Thema.



  • 👎 🙄



  • Hallo

    Ich hoffe ich muß jetzt nicht hier die Mod-Keule rausholen. Ihr seid doch beide erfahrene Forumbenutzter, und solltest wissen, das in Internet-Foren verschiedenste Ansichten und Mißverständnisse aufeinanderprallen. Es bringt keinem was, soetwas persönlich zu nehmen. Schaltet also beide wieder einen Gang zurück und bauscht diese Gedankenlosigkeit, die ursprünglich ich eingeworfen habe, nicht weiter aus.

    bis bald
    akari


Log in to reply