Benutzer mit den meisten Antworten
Form erst anzeigen lassen und dann operation ausführen

Frage
-
Hallo,
ich bin neu in der Programmierwelt und bin langsam dabei größere Projekte zu erstellen.
Ist es irgendwie möglich, dass ich eine Form Anzeigen lasse und dann erst eine Operation durchführe? Bei mir ist es zurzeit leider so, dass die Form erst angezeigt wird, wenn meine "Startup" Methoden durchgelaufen sind. Diese lass ich dort starten wo auch die InitializeComponent() ist. Bitte um hilfe für einen Newbie ^_^
Antworten
-
Hey Ihr,
hab jetzt eine Lösung gefunden, die Lösung lautet Multithread bzw. einen neuen Thread damit aufmachen.
public VK_Mngr_startup() { Thread t1 = new Thread(new ThreadStart(test1)); InitializeComponent(); rtb_Control.Text = "VK Manager wird überprüft"; t1.Start(); }
So sieht der Startcode aus und weiter unten:public delegate void UpdateTextCallback(string text); private void UpdateText(string text) { rtb_Control.Text += text; rtb_Control.SelectionStart = rtb_Control.Text.Length; rtb_Control.ScrollToCaret(); }
Gruß, Manni
- Als Antwort markiert Manni92de Donnerstag, 26. Juli 2012 22:58
Alle Antworten
-
Hallo,
für Aktionen die erst starten sollen, wenn das Formular sichtbar ist, verwende das Shown-Ereignis.
Das tritt einmalig ein, wenn das Formular angezeigt wurde.Gruß Elmar
-
Hi,
Allerdings werden bei der anderen Form, die ich dann aufrufe nichts angezeigt, außer das Fenster. Ich meine, der Text wird da nicht angezeigt.
? Was hat das eine mit dem anderen zu tun?
Deine erste Frage hat Elmar beantwortet. Was Du nun wo wie machst, kann man ohne den entsprechenden Code nicht erkennen. Auch nicht, warum der "Text" (welcher Text?) in einem Fenster (welches Fenster?) nicht angezeigt wird.
Daher poste bitte den relevanten Code.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
Sorry, habe mich etwas unkenntlich ausgedrückt.
public partial class VK_Manager_Form : Form { public VK_Manager_Form() { InitializeComponent(); Startup check = new Startup(); check.Show(); while (check.test() != true) ; check.Close(); } }
So ist mein Startcode, wie man sieht will ich eine andere Form aufrufen. Die ist gedacht um die Programmkomponenten zu überprüfen und auf Updates zu prüfen. Zurzeit rufe ich dann eine Funktion auf, die einen Sleepthread von 5 Sekunden durchführt.
Wenn ich das Programm jetzt starte, so macht er diese 5 Sekunden Ruhe jedoch wird in der Form nur der Umriss angezeigt, obwohl dort Text stehen soll und ein Ladebalken angezeigt werden soll.
Hier der Screenshot :)
Gruß, Manni
-
Hallo Manni,
a) Du hast nicht, wie von Elmar empfohlen, das "Shown" Ereignis verwendet und dort deinen Code untergebracht.
b) Was soll das arme Formular auch machen, wenn Du es im Sprint im Kreis laufen lässt? Deine (absolut unnötige und überaus performancefressende) Schleife "while ( check.test() != true )" macht nichts anderes, als alles auszulasten. Daher wird die Benutzeroberfläche nicht mehr aktualisiert, weil das OS eben gar nicht mehr dazu kommt, den Thread was anderes machen zu lassen.
Lösung: Schmeiß bitte ganz schnell die komische Schleife da raus, setz den Code (mit Ausnahme von InitializeComponent()) in das Shown Ereignis deines Formulars und lass den Quatsch mit "Sleepthread". Ich hoffe mal für dich, dass Du da wirklich mit Thread.Sleep( ... ) arbeitest. Aber auch das brauchst Du hier nicht.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hey Ihr,
hab jetzt eine Lösung gefunden, die Lösung lautet Multithread bzw. einen neuen Thread damit aufmachen.
public VK_Mngr_startup() { Thread t1 = new Thread(new ThreadStart(test1)); InitializeComponent(); rtb_Control.Text = "VK Manager wird überprüft"; t1.Start(); }
So sieht der Startcode aus und weiter unten:public delegate void UpdateTextCallback(string text); private void UpdateText(string text) { rtb_Control.Text += text; rtb_Control.SelectionStart = rtb_Control.Text.Length; rtb_Control.ScrollToCaret(); }
Gruß, Manni
- Als Antwort markiert Manni92de Donnerstag, 26. Juli 2012 22:58
-
@All,
sorry für den Fullquote aber der muss ausnahmsweise mal sein.
hab jetzt eine Lösung gefunden, die Lösung lautet Multithread bzw. einen neuen Thread damit aufmachen.
public VK_Mngr_startup() { Thread t1 = new Thread(new ThreadStart(test1)); InitializeComponent(); rtb_Control.Text = "VK Manager wird überprüft"; t1.Start(); }
So sieht der Startcode aus und weiter unten:public delegate void UpdateTextCallback(string text); private void UpdateText(string text) { rtb_Control.Text += text; rtb_Control.SelectionStart = rtb_Control.Text.Length; rtb_Control.ScrollToCaret(); }
das soll nun eine Lösung sein für was? Was hat der obere Codeblock mit dem unteren Codeblock zu tun? Was in aller Welt soll dir hier ein neuer Thread was bringen?
Manni. Ganz ehrlich. Wenn Du nicht willens bist, die Hinweise, die man dir hier gibt, auch nur ansatzweise anzunehmen und Vorschläge anderer User ignoierst und dann voller Stolz absolut unsinniges Zeugs als "Lösung" präsentierst, wird das nix mit dem Entwickeln und/oder dem Fragen in den Foren.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi Steffan,
ich habe auch das mit dem Shown Ereignis genutzt, dafür an dieser Stelle einen Dank an den Elmar. Das was ich programmiert habe, ist so eine Art Updater und überprüft die Integrität der Dateien, dass man zu jederzeit abbrechen kann.
Das mit dem Startcode tut mir leid, da hab ich einen falschen Anweisungsblock erwischt, aber im prinzip stehen da weitere operationen.
private void test1() { if (Fehler == false) { StatusTextUpdate("\nÜberprüfe Internetverbindung .."); PB_PerformStep(); try { bool checkInternet = new Ping().Send("google.de", 500).Status == IPStatus.Success; if (checkInternet == true) { StatusTextUpdate(" OK - Internetverbindung besteht"); PB_PerformStep(); } } catch (Exception ex) { StatusTextUpdate(" Fehler! - Keine Internetverbindung"); Fehler = true; Fehlerart = 1; } } }