C# und Gui Programmierung

ulukay

Banned
Thread Starter
Mitglied seit
19.07.2006
Beiträge
8.158
moin
programmiermaessig bin ich zwar kein totaler noob, aber ich HASSE gui programmierung. hab ich das letzte mal vor 10 jahren in der schule gemacht und da schon schlecht. ich versuche grad ein programm zu schreiben dass mir aus einer rennsimulation gewisse werte ausliest und ausgibt. mit einer c# command line anwendung hatte ich das innerhalb von ner stunde fertig. der gab mir schoen throttle, gear und rpm aus. nun versuche ich das in einem C# gui programm wiedergeben zu lassen UND BEISSE DABEI IN MEIN KEYBOARD. warum zum teufel kann ich auf ein label nicht von ueberall aus zugreifen? ich will verdammt noch mal doch nur den text aendern :(

zur vereinfachung wollt ich mal ein einfaches gui programm schreiben. in der main soll er in einer for schleife bis 10 zaehlen, jeweils 1 sec warten und den aktuellen wert von i ins label schreiben, und danach das programm beenden. ICH haette das rein logisch ja so programmiert.

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace simple_count_up
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            for (int i = 0; i < 11; i++)
            {
                label1.Text = i;
                System.Threading.Thread.Sleep(1000);
            }
            Application.Exit();
        }
    }
}

ein label namens label1 hab ich (grafisch idiotensicher) ins form1 gezogen.
aber erstens laesst sich der label1.text nicht aus der main bearbeiten. zweites (wenn ich de ganze for schleife wegnehme aus der main) beendet sich das programm nicht selber.

kann mich da mal jemand grob aufklaeren? warum ist das so beschissen unlogisch?

edit: nach ein bisl nachlesen hab ichs jetzt mal hinbekommen. den ranz muss man ja threaden :lol:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace counter2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Thread firstThread = new Thread(new ThreadStart(counter));
            firstThread.IsBackground = true;
            firstThread.Start(); 



            //counter();

        }
        delegate void IntParameterDelegate(int value); 
        public void Update_Label_Seconds(int value)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new IntParameterDelegate(Update_Label_Seconds), new object[] { value });
                return;
            }
            label1.Text = Convert.ToString(value);
        } 

        public void counter()
        {
            for (int i = 0; i < 11; i++)
            {
                System.Threading.Thread.Sleep(200);
                Update_Label_Seconds(i); 
                //label1.Text = Convert.ToString(i);
            }

        }

    }
      
    static class Program
    {
            
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }

}

ich werd euch hier im thread aber trotzdem weiternerven sobald ich wieder fragen habe ;)
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Scheinst es dir schon halbwegs beantwortet zu haben, aber du kannst das Label natürlich nicht aufrufen. Weil es in der Form1.cs deklariert ist, und das als private. Du hast es ja, wie du schon sagst, in der Form1.cs angelegt, nicht in der Program.cs. Ganz allgemein startest du mit der Program.cs ja nur die Form, ganz simpel. Wenn du schon aus der Entry-Klasse auf dessen Member zugreifen willst, musst du die entweder statisch machen oder die Form wenigstens nicht anonym instanziieren - wie soll das sonst auch gehen?!

Das hatte jetzt mit Threading ansich eigentlich nicht unbedingt was zu tun, eher mit objektorientierter Programmierung und den scopes.

Davon abgesehen - mit den threadsicheren Zugriffen auf die GUI Elemente sollte man übrigens sparsam umgehen, das kostet Zeit. Bei Anwendungen wo's auf Leistung ankommt kann das nerven. :)

*e* Manchmal sieht man ja den Wald vor lauter Bäumen nicht, im Endeffekt hast du ja sowas in der Art fabriziert:

Code:
public class Foo
{
	private string _name;
	
	public Name(string name)
	{
		_name = name;
	}
	
	public void TuEtwas
	{
		Console.WriteLine("My name is {0},_name);
	}
}

public class Program
{
	public static void main(string[] args)
	{
		new Foo("EinName").TuEtwas();
		_name = "Hallo"	 // <= Wie soll das gehen, _name ist ja im Scope von Foo
	}
}

Is' eigentlich klar, ne?

Hat dich der Compiler dabei nicht schon krass angemeckert? Das dürfte ja so eigtl. niemals kompillieren. :fresse:

*e* Und für den Fall, dass du Analoganzeigen nutzen willst verweise ich direkt mal auf http://www.codeproject.com/KB/miscctrl/A_Gauge.aspx?msg=1898385. Taugt m.E. gut, hab das für meine Diagnoseanwendung verwendet. Besser als den Scheiß selbst einzuhacken. ;)
 
Zuletzt bearbeitet:
Richtig, in deinem ersten Beispiel legst du die GUI schlafen :-)

Warum verwendest du nicht einen BackgroundWorker oder einen DispatcherTimer?
Und persönlich würde ich WPF anstatt WinForms verwenden.

mfg
aelo

edit:
Falls du deine usings noch mal aufräumen möchtest: System.Linq und System.Collections.Generic brauchst du nicht :-)
 
Zuletzt bearbeitet:
Meine persönliche Meinung dazu:
* Code ist wirklich sehr sauber von der UserInterface-Definition getrennt. (Empfehlung: MVVM Design pattern)
* XAML ist wirklich nicht schwer und es ist weniger aufwending als die UI in C# zu beschreiben.
* In Zukunft wird es immer mehr verwendet -> d.h. bei Bewerbungen sind Kenntnisse von WPF von Vorteil.
* Designer können mit Expression Blend ohne viel Ahnung vom Code selbst arbeiten.

Jemand anderer Meinung? Ist durchaus eine interessante Diskussion wert!

nice regards
aelo

edit: Gerade noch eingefallen: WPF verwendet DirectX und somit ist das Rendering schneller (spürt man natürlich bei einer 0815-App nicht...).
 
Zuletzt bearbeitet:
Ich persönlich denke nicht, dass WPF die bisheringen Windows Forms bei "Standardanwendungen" kurz- oder mittelfristig ablösen wird. Dafür ist der Umstieg von Forms zu WPF m.E. zu unangenehm bzw. der Einstieg in Forms zu einfach, denn wenn wir ehrlich sind - ein Großteil der "Forms Entwicklung" läuft im Designer ab. Denn die grafische Dynamik der meisten Anwendungen hält sich doch schwer in Grenzen.

Das WPF das deutlich modernere Konzept ist, da sind wir uns einig. Nur ist der Großteil der Anwendungen, die entwickelt werden, eben "08/15". Und da hat Forms m.E. keine Nachteile bzw. WPF keine nennenswerten Vorteile für den Normalentwickler.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh