Autor Beitrag
commit_data
Hält's aus hier
Beiträge: 5


Delphi, C++-Builder, SQL, ORACLE, Access
BeitragVerfasst: Mo 29.08.11 11:13 
Hallo,

bin absoluter(!) C#-Anfänger und hab' da mal eine Frage.
Nichts Kompliziertes, aber es beschäftigt mich schon
seit einer Stunde. Ich wüßte, wie ich es in Delphi machen
müßte, aber C# ist ganz neu ... für mich.

die Facts:

- ich habe C#-Source für eine Applikation
- Programm läuft und läßt sich compilieren.
- ich will einigee kleine Modufikation einfügen
- das Programm soll nach Aufruf die in "Args" übergebene Parameter der Kommando-Zeile auswerten
- dafür gibt es im InterNetZ ein Beispiel
- habe versucht den Source zu adaptieren.
- sieht dann SO aus:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
static class Program
    {
        static void Main(string[] Args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            ...

            if (Args.Length > 0)
            {
                
                // Command line parsing
                Arguments CommandLine = new Arguments(Args);

                // Look for specific arguments values and display 
                // them if they exist (return null if they don't)

                                
                    if (CommandLine["XXXX"] != null)
                    Form1.cbName.Text = CommandLine["PORT"];


- spannend wird es "im Main" ab: if "(CommandLine["XXXX"] != null)"
- wenn, XXXX != null, dann soll der Parameter z.B. in ein "EditField" des Forms geschrieben werden
- dort kommt aber "großes Mecker !!!"

Error: An object reference is required for the nonstatic field, method, or property 'BlaBla.Form1.cbName.Text'

- wobei ich den access modifier der Komponente - testweise - schon von "privat" auf "public" gesetzt habe.
- sonst kommt : 'BlaBla.Form1.cbName' is inaccessible due to its protection level
- der Fehler tritt wohl nur auf, wenn ich aus "Main" heraus auf das FORM zugreifen möchte ?!?

Wer hat eine Idee, wie ich das Problem einfach lösen kann ???
(Wenn nötig kann ich noch mehr Code posten)

Vielen Dank !

Moderiert von user profile iconKha: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Titel geändert: "agrs" -> "args"
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.08.11 11:23 
Deine Form1 existiert noch nicht. Wenn das deine Hauptform ist wirst du sehen das die vermutlich erst im Aufruf von Application.Run() in deiner Main Methode erzeugt wird also nach deinem Code zur Parameterauswertung. Wenn du also auf diese Form zugreifen willst musst du die erst Erzeugen dann die gewünschten Zuweisungen machen und anschließend dann diese Instanz an Application.Run übergeben.
commit_data Threadstarter
Hält's aus hier
Beiträge: 5


Delphi, C++-Builder, SQL, ORACLE, Access
BeitragVerfasst: Mo 29.08.11 11:37 
Hallo Ralf


vielen Dank für die schnelle Antwort. Habe leider bei den ... (vgl. letzten Post) zu viel
"Kommentar" gelöscht. Das Form existiert wohl bereits, befor die Zuweisung der Parameter
kommt:

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

...

if (Args.Length > 0)
{

// Command line parsing
Arguments CommandLine = new Arguments(Args);
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.08.11 11:51 
Application.Run ist der eigentliche Programmlauf. Danach irgendetwas zu machen ist für die meisten Aufgaben zu spät. Wie bist du dort überhaupt an die Instanz gekommen? Da die Form direkt im Aufruf von Run erzeugt wird hast du eigentlich nicht so einfach eine Referenz auf die konkrete Form. Dir ist der Unterschied zwischen einer Klasse und der Instanz einer Klasse bewußt?

Es bleibt dabei - erzeugt dir die Form in einer Variablen, bearbeite die Form anhand deiner gelesenen Argumente, übergebe diese Variable an Application.Run(). Und verwende die Form Variable in der Main nicht mehr nach Application.Run() die ist dann ungültig(disposed).
commit_data Threadstarter
Hält's aus hier
Beiträge: 5


Delphi, C++-Builder, SQL, ORACLE, Access
BeitragVerfasst: Mo 29.08.11 11:59 
Sorry,

Montag-Morgen: noch ein kleiner Tipp-Fehler.
Statt "PORT" muß "XXXX" stehen. Also:

if (CommandLine["XXXX"] != null)
Form1.cbName.Text = CommandLine["XXXX"];


Noch einfacher kann man den Fehler generieren, indem
man/frau in einer DEMO dem Form1.Text in Main einfach
einen String zuweist.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 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());
            Form1.Text = "test";
        }
    }


ERROR: An object reference is required for the nonstatic field, method, or property 'System.Windows.Forms.Control.Text.get'

Vielen Dank !

Moderiert von user profile iconKha: C#-Tags hinzugefügt
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mo 29.08.11 12:03 
Wie Ralf im Post darüber schon gesagt hat liegt dein Problem darin das du den Unterschied zwischen Klasse und Objekt/Instanz nicht kennst und deswegen versuchst eine Property an einer Klasse aufzurufen.

Erzeuge ein Objekt deiner Formklasse. Lege das Objekt in einer Variablen ab. Setzte deine Werte an diesem Objekt und dann übergibst du es der Application.Run-Funktion.
commit_data Threadstarter
Hält's aus hier
Beiträge: 5


Delphi, C++-Builder, SQL, ORACLE, Access
BeitragVerfasst: Mo 29.08.11 12:19 
Vielen Dank,

folglich müßte es, wie nachfolgend anschaulich einleuchten dargestellt, implementiert werden, oder ;-) :

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form test = new Form1();
            test.Text = "test";
            Application.Run(test);
            
        }
    }


SänX a lot !!!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.08.11 13:10 
Ja.
commit_data Threadstarter
Hält's aus hier
Beiträge: 5


Delphi, C++-Builder, SQL, ORACLE, Access
BeitragVerfasst: Mo 29.08.11 15:38 
SänX, es läuft !