C# Wenn Taste gedrückt wird, dann bild erscheinen

Richtig, normalerweise wird der Prozess nach schließen des Fensters auch beendet. Bin zu lange raus, um das im Detail sagen zu können, aber das Hide hatte ich auch schon im Verdacht.
 
Darlis schrieb:
Ah, hatte ich übersehen. Du rufst in deinem Passwort-Form nach Buttonclick this.Hide() auf. Versuch es mal mit Close().
Ne ich will ja das es so ist, wenn ich Name und Passwort eingegeben habe verschwindet die Loginform und dann erscheint mein Hauptform. Das Problem aber ist, wenn ich mein Hauptform schließe ist der Prozess von meinem Programm noch aktiv und das möchte ich nicht
 
Wenn Du satt this.Hide this.Close aufrufst verschwindet es doch auch. Hide versteckt nur, die Objekte bleiben erhalten. Close gibt alle Ressourcen frei.
 
  • Gefällt mir
Reaktionen: Paderman
Drexel schrieb:
Wenn Du satt this.Hide this.Close aufrufst verschwindet es doch auch. Hide versteckt nur, die Objekte bleiben erhalten. Close gibt alle Ressourcen frei.
Ne dan kommt mein hauptform erst garnicht. this.Hide gilt nur für mein Loginform. Wenn ich mein Programm starte kommt ja als ertes mein Loginform und wen ich mich da einlogge verschwindet es und mein Hauptform erscheint. Wenn ich das Programm starte kommt erst das Loginform und wenn ich es schließe verschwindet auch der Prozess aber bei meinem Hauptform bleibt der Prozess
 
Wieso kommt wenn Du auf der Login Form Close aufrufst das Main Form nicht mehr? Wird der ProZess dann komplett beendet oder was passiert?? Das kann sein, weil es in dem Moment kein Form mehr existiert.

Evtl. musst Du doch bei Hide bleiben, das Main Form aufrufen und dann per Invoke o.ä. auf dem Login Form Close aufrufen. Oder evtl. das Login Form an das Main Form übergeben und dann im Main Form auf dem Login Form Close aufrufen.

Oder Du machst es auf die harte Weise nach dem Schließen des Main Forms: Process.GetCurrentProcess().Kill(); Das würde ich aber nicht empfehlen. :)

Es ist auch nur rumraten was schiefgeht, da Du einen Code ja nicht komplett postest oder hochlädst. Evtl. solltest Du Dich mal ein bißchen in Windows Forms und dem Application State etc. einlesen, wenn Du damit arbeitest, 100%ig habe ich das auch nicht auf dem Schirm...
 
  • Gefällt mir
Reaktionen: Paderman
Ich hab gerade nochmal geguckt, wie ich das sonst löse:

Programm.cs
Code:
namespace test
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new formMain());


            // -- global variables


            // -- startup sequence
        }
    }
}

From1.cs (Hauptform):
Code:
namespace test
{
    public partial class formMain : Form
    {
        public formMain()
        {
            InitializeComponent();
            ReadConfig();


            // -- startup screen 
            SplashScreen splash = new SplashScreen();
            SplashScreen.ShowSplashScreen();


            // -- init hardware
            if (InitHardware() != 0)
            {
                SplashScreen.CloseSplashScreen();
                // exit completely
                Environment.Exit(-1);
            }


            SplashScreen.CloseSplashScreen();
        }

Form2.cs (Splashscreen)
Code:
namespace test
{
    public partial class SplashScreen : Form
    {
        private static Thread splashThread;
        public static ProgressBar SplashBar;
        public static SplashScreen screen;


        public SplashScreen()
        {
            InitializeComponent();
            SplashProgressBar.Minimum = 0;
            SplashProgressBar.Maximum = 9;
            SplashProgressBar.Value = 0;


            SplashBar = SplashProgressBar;
        }


        static public void ShowForm()
        {
            screen = new SplashScreen();
            Application.Run(screen);
        }


        static public void ShowSplashScreen()
        { 
            //show splash
            splashThread = new Thread(new ThreadStart(SplashScreen.ShowForm));
            splashThread.IsBackground = true;
            splashThread.SetApartmentState(ApartmentState.STA);
            splashThread.Start();
        }

        static public void updateProgress(int BarIncrement, string LabelContent)
        {
            screen.SplashProgressBar.Invoke((MethodInvoker)(() =>
            {
                screen.SplashProgressBar.Value += BarIncrement;
                
            }));


            if (LabelContent != null)
            {
                screen.labelSplashProgressBar.Invoke((MethodInvoker)(() =>
                {
                    screen.labelSplashProgressBar.Text = LabelContent;
                    screen.labelSplashProgressBar.Left = (screen.ClientSize.Width - screen.labelSplashProgressBar.Width) / 2;
                }));
            }


            screen.Invoke((MethodInvoker)(() =>
            {
                screen.Refresh();
            }));
        }


        static public void CloseSplashScreen()
        {
            splashThread.Abort();
        }

Ist jetzt halt ein Splashscreen statt einer Login Form, zeigt aber eigentlich das Grundprinzip. Ich gehe es halt quasi andersrum an und starte den Splashscreen von der Hauptform aus, bevor diese angezeigt wird. Könnte sein, dass das für deinen Fall problematisch ist, weil du ja mit der Splashscreen noch interargieren willst durch deine Passwortabfrage, dass mache ich hier nicht. Allerdings interagiere ich in sofern mit der zweiten Form. dass ich über die UpdateProgress Routine den Fortschrittsbalken weiter laufen lasse (input hierzu kommt aus der Hauptform aus der Funktion initHardware)

ber dadurch, dass ich vom Hauptform aus starte läuft der Hauptthread bereits und was ob die zweite Form auf ist oder nicht interessiert das Programm nicht viel.
 
Zuletzt bearbeitet:
Zurück
Oben