Laden...

Forenbeiträge von Yoguto Ingesamt 25 Beiträge

21.09.2007 - 14:40 Uhr

Ich habe gerade nochmal nach dem Problem bei google gesucht und bin auf die Seite http://www.thescripts.com/forum/thread46816.html gestoßen. Das Beispiel unten auf der Seite habe ich so ausprobiert. Nun sieht das ganze so aus:


private void vhVncHandler_SupportEnded(object Sender, SupportEndedEventArgs e)
        {          
            this.fseFrmStatistikEntry = new frmStatistikEntry();
            Application.Run(fseFrmStatistikEntry);
        }

Mich würde nun interessieren warum das so funkionert. Vor allem irritiert mich, warum ich die gleiche Form im onclick-Ereignis des Contextmenus des Trayicons ohne Application.Run anzeigen kann.

21.09.2007 - 14:26 Uhr

Danke für den Hinweis.

21.09.2007 - 13:39 Uhr

Hat noch jemand eine Idee? Ich komme hier immer noch nicht weiter. Ich habe versucht das Formular in einem eigenen Thread über einen Backgroundworker zu öffnen, leider mit dem gleichen Ergebnis - das Fenster friert ein.

04.09.2007 - 13:11 Uhr

Oh, Sorry. Das war so nicht beabsichtigt. Im Konstruktor von MyApplicationContext wird es natürlich nicht nochmal ausgeführt.

04.09.2007 - 12:20 Uhr

Wie lesen ich denn den Thread aus? Konnte nichts darüber finden. Die Klasse VNCHandler verwendet einen extra Thread, VNC wird gestartet.

Hier die gesamte Klasse.


using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.Diagnostics;

namespace SupportTool.VncHandler
{
    public delegate void SupportEndedEventHandler(object Sender, SupportEndedEventArgs e);

    public class VncHandler
    {
        public event SupportEndedEventHandler SupportEnded;

        Process VNCProcess;
        User user;

        public void connectToHost(User user)
        {
            this.user = user;
            AutoItX3Lib.AutoItX3Class AutoIt = new AutoItX3Lib.AutoItX3Class();

            VNCProcess = Process.Start("C:\\Programme\\UltraVNC\\vncviewer.exe", user.hostname);
            VNCProcess.EnableRaisingEvents = true;
            VNCProcess.Exited += new EventHandler(this.VNCProcess_Exited);            

            while ((AutoIt.WinGetState(" Ultr@VNC Authentication", "") == 0) & (AutoIt.WinGetState("VNC Authentication", "") == 0)) ;
            AutoIt.ControlSetText(" Ultr@VNC Authentication", "", "Edit1", System.Environment.UserName);
            AutoIt.Send("{TAB}", 0);            
        }        

        private void OnSupportEnded(User user)
        {
            if (this.SupportEnded != null)
            {
                this.SupportEnded(this, new SupportEndedEventArgs(user));
            }
        }

        private void VNCProcess_Exited(object Sender, EventArgs  e)
        {
            OnSupportEnded(this.user);           
        }
    }
}

Kann es denn überhaupt etwas mit dem VNC-Prozess zu tun haben? Wenn das Ereignis Exited ausgelöst wird ist dieser doch schon beendet.

04.09.2007 - 11:39 Uhr

Ja. Die Nachrichtenverarbeitung läuft.

04.09.2007 - 11:24 Uhr

Hallo.

Ich habe ein Problem mit Events und dem Anzeigen von Formularen. Die Anwendung liest Daten eines Anrufers aus und startet VNC um den Anrufer zu supporten. Sie läuft im Hintergrund und hat ein Icon im Systray. Dazu habe ich die Klasse ApplicationContext verwendet. Nach dem VNC wieder geschlossen wurde soll ein Formular geöffnet werden. Dies friert aber direkt ein und zeigt keine Controls an.

Das ganze sieht in etwa so aus:



class MyApplicationContext : ApplicationContext
    {       
        NotifyIcon niIcon;
        VncHandler.VncHandler vhVncHandler;
        frmStatistikEntry fseFrmStatistikEntry;

        public MyApplicationContext()
        {
            this.createNotifyIcon();
            vhVncHandler = new SupportTool.VncHandler.VncHandler();
            vhVncHandler.SupportEnded += new SupportEndedEventHandler(vhVncHandler_SupportEnded);
            //Application.Run();
        }

        private void vhVncHandler_SupportEnded(object Sender, SupportEndedEventArgs e)
        {
            if (this.fseFrmStatistikEntry == null)
            {
                this.fseFrmStatistikEntry = new frmStatistikEntry();
                fseFrmStatistikEntry.Show();
            } 
        }
    }

static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyApplicationContext());
        }
    }

Ich habe mir hier schon diverse Einträge zu dem Thema "Einfrieren der Forms" durchgelesen, allerdings konnte ich keinen Zusammenhang mit diesem Problem herstellen. Liegt das Problem auch hier an Threads? Ich benutze hier ja nur einen.

Wenn ich das gleiche bei einem OnClick-Ereignis des Kontextmenus im Systray mache funktioniert es.

Vielen Dank für eure Antworten.

04.12.2006 - 19:47 Uhr

Vielen Dank, das wars.

03.12.2006 - 19:43 Uhr

Hallo allerseits,

ich habe ein Problem beim Auslesen des primary Keys einer Tabelle.

Meine Relation "Typen" enthält die Attribute Index, Parent, Name und Beschreibung, wobei Index der primary Key ist.

Mit folgenden Quellcode greife ich auf die Daten zu:


private string connString = "Data Source=.\\SQLEXPRESS;AttachDbFilename='C:\\Dokumente und Einstellungen\\Alex\\Eigene Dateien\\supporte.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True";
SqlConnection conn = new SqlConnection(connString);
cmdSub = "SELECT * From [Typen] WHERE [Parent] = 2;";
string sqlCmdSub = new SqlCommand(cmdSub, conn);
readerSub = sqlCmdSub.ExecuteReader();
if (readerSub.HasRows == true) //Schleife durch die Einträge
{
while (readerSub.Read())
{
System.Windows.Forms.MessageBox.Show(readerSub["Index"] as string);
}
}

Allerdings Zeigt mir die Messagebox immer eine leere Zeichenfolge an. Dies ist mit total unverständlich, alle anderen Werte lassen sich ausgeben.

Hat jemand ne Ahnung woran das liegt?

Vielen Dank

30.04.2006 - 01:57 Uhr

Danke für die Antwort.

Allerdings glaube ich, dass ich mich entweder nicht klar genug ausgedrückt habe oder du mich nicht richtig verstanden hast.

Mir geht es nicht darum zu verhindern, dass das Programm mehr mals gestartet wird. Ich möchte die Instanz von dem Formular AktualCall (also die MainForm) so erstellen, dass ich von der Methode CallIncoming darauf zugreifen kann.

So in etwa:


namespace telefontool
{
    class Program    
    { 
        AktualCall MainForm = new AktualCall(); //!!!!!!!!!!

        [STAThread]
        static void Main()
        {
            ...
            CallWatcher callwCallWatch = new CallWatcher();
            callwCallWatch.CallIncoming += new CallIncomingEventHandler(CallIncoming); //Verknüfung            
            Application.Run();            
        }

        private static void CallIncoming(object sender, CallIncomingEventArgs e)
        {
                       
            MainForm.labPhoneNumber.Text = e.TelNumber;
            MainForm.labUserName.Text = e.Name;
            MainForm.ShowDialog();
        }
    }
}

29.04.2006 - 23:14 Uhr

Hallo!

Ich schreibe ein Programm, dass im Hintergrund läuft und Daten eines Telefonanrufs aus einem externem Fenster abruft um dann bestimmte Optionen wie z.B. das aufschalten per VNC an zu bieten.

Dazu habe ich eine Klasse (CallWatcher) geschrieben, die die Daten aus dem Fenster ausliest und einige Ereignisse zur Verfügung stellt. Wenn z.B. ein Anruf angenommen wird soll das Formular der Klasse AktualCall angezeigt werden.
Wie ist es nun möglich für das ganze Programm nur eine Instanz der Klasse AktualCall zu erstellen um dann unter bestimmten Bedingungen das Formular anzeigen zu lassen. Wenn ich die Instanz der Klasse in Main erstelle kann ich ja nicht aus CallIncoming darauf zu greifen.

Was mich ausserdem wundert ist warum das Formular einfriert wenn ich MainForm.Show anstatt MainForm.ShowDialog verwende.


using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace telefontool
{
    class Program    
    {        

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);  
                     
            CallWatcher callwCallWatch = new CallWatcher();
            callwCallWatch.CallIncoming += new CallIncomingEventHandler(CallIncoming); //Verknüfung
            //MainForm.Show();
            Application.Run();            
        }

        private static void CallIncoming(object sender, CallIncomingEventArgs e)
        {
            AktualCall MainForm = new AktualCall();            
            MainForm.labPhoneNumber.Text = e.TelNumber;
            MainForm.labUserName.Text = e.Name;
            MainForm.ShowDialog();
        }
    }
}

29.04.2006 - 22:54 Uhr

Du könntest erst die Konsole öffnen und dann die Exe in der Konsole starten.

11.01.2006 - 16:05 Uhr

Nach erfolglosem googlen wende ich mich jetzt an euch.
Wie kann man alle Benutzer einer bestimmten Benutzergruppe aus der Active Directory auslesen?

Danke im Voraus.
Mit freundlichen Grüßen,

Yoguto

12.05.2005 - 23:41 Uhr

Ich habe auch noch eine Frage zu Mono.

Wie kann ich System.Windows.Forms unter Mono verwenden?

Ich bekomme immer diese Fehlermeldung:

[Task:File=/home/alex/Documents/programmierung/3-k-problem-6/MainForm.cs, Line=14, Column=-1, Type=Error, Description=The type or namespace name Windows&#39; could not be found in namespace System'(CS0234)

04.12.2004 - 17:04 Uhr

Ich habe jetzt festgestellt, dass nach ner gewissen Zeit, 5 Sekunden etwa, die GUI wieder läuft. Hab zu Testzwecken bisher immer nur eine URL überprüfen lassen. Ist zwar nicht so schön, könnte man aber mit _leben.

03.12.2004 - 17:45 Uhr

Vielen Dank für die schnelle Antwort. Jetzt habe ich deine Idee verstanden.

03.12.2004 - 17:14 Uhr

Hmm...ich verstehe deinen Ansatz noch nicht so ganz.
Könntest du mir da vielleicht etwas Code zu geben?

03.12.2004 - 16:47 Uhr

Die Eigenschaft Background gibt es nicht. Ich denke mal du meinst IsBackground.
Hab das jetzt auf true gesetzt. Leider friert die GUI immer noch ein.

03.12.2004 - 15:34 Uhr

Ich habe es jetzt wie in dem Beispiel gemacht.


private void miListepruefen_Click(object sender, System.EventArgs e)
{
   Thread t = new Thread(new ThreadStart(checkList));
    t.Start();
}

private void checkList()
{
    while (lvURLs.Items.Count > 0)
    {
        lviTemp = lvURLs.Items[0];
        URLs.Items.RemoveAt(0);
        AccountChecker urlToTest = new URLChecker();            
        if (urlToTest.checkURL(lviTemp.Text,lviTemp.SubItems [0].Text,lviTemp.SubItems[1].Text) == false)
        {
            lviTemp.SubItems.Add(urlToTest.getException());
            lvInvalidUrl.Items.Add(lviTemp);
        }
        else
        {
        lvValidUlrs.Items.Add(lviTemp);
        }			
    }
}

Leider funktioniert es immer noch nicht. Die Gui friert immer noch ein.

03.12.2004 - 07:23 Uhr

Kannst du mir vielleicht ein etwas genaueres Stichwort nennen? Threads ist ja ein ziemlich großes Thema.

02.12.2004 - 17:14 Uhr

Oh, du hast recht, war ein Denkfehler von mir, Sorry.

02.12.2004 - 16:57 Uhr

Hast Du Deine Funktion auch getestet?
Denn ich bin der Meinung, dass sie nicht richtig funktioniert.

Hab sie gerade getestet, und sie funktioniert.

02.12.2004 - 16:34 Uhr

Was hast du denn nun verwendet?

02.12.2004 - 16:25 Uhr

public static int SummeGeraderZahlenBis(int n) 
{
int iTempInt = 0;
while (iTempInt <= (n-2))
 {
 iTempInt = iTempInt + iTempInt + 2;
 }
return iTempInt;
}

02.12.2004 - 15:20 Uhr

Hallo

Ich habe in meinem Programm ein ListeView, das Urls enthält. Diese Urls werden alle nacheinander auf ihre Verfügbarkeit überprüft werden. Doch leider friert dabei die GUI ein. Erst, wenn alle URLs geprüft sind, ist die GUi wieder nutzbar. Hier der Code:

while (lvURLs.Items.Count > 0)
{
lviTemp = lvURLs.Items[0];
lviURLs.Items.RemoveAt(0);
URLChecker urlToTest = new URLChecker();
if (urlToTest.checkURL(lviTemp.Text,lviTemp.SubItems[0].Text,lviTemp.SubItems[1].Text) == false)
{
lviTemp.SubItems.Add(urlToTest.getException());
lvInvalidURLs.Items.Add(lviTemp);
}
else
{
lvValidURLs.Items.Add(lviTemp);
}
}

Wie kann ich das Einfrieren am besten beheben? Hat jemand eine Idee, wie ich mehrere Urls auf einmal überprüfen kann?

Vielen Dank