Sichtbarkeitsproblem?

ElDoc

Grünschnabel
Hallo liebe Tutorianer...

Mein Problem ist sicher für erfahrene Programmierer wohl fast schon zu lächerlich, darauf zu antworten, aber ich versuche es dennoch mal.
Ich hoffe, Ihr habe Rücksicht mit jemanden, der aus dem sequenzielen Bereich kommt :).

Das Problem ist folgendes:
Ich habe 3 Klassen.
- Hauptklasse mit der Main
- Processklasse zum Verarbeiten
- GUI zum Einlesen von Dateiennamen

Die GUI ist nur zum Einlesen der Dateinamen gedacht und soll diesen der Processklasse übergeben.
Und genau da besteht mein Problem.
Ich kann von der Processklasse nicht darauf zugreifen, um an den Dateinamem zu gelangen.

Der Code sieht wie folgt aus:

MAIN:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace DataProcessor
{
    class Program
    {
        static void Main()
        {
            
                InputGUI i1 = new InputGUI();
                Application.EnableVisualStyles();
                Application.Run(input1);
                string str_fName = input1.Met_Fname;
                Processclass = new Processclass(fname);
             }
        
    }
}

PROCESSKLASSE:
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace DataProcessor
{
    public class Processing
    {


        private String fileName;

        public Processing(String fname)
        {
            this.fileName = fname;
        }

//AB HIER SCHON ÖFTER VERSUCHT; AN DEN DATEINAMEN ZU KOMMEN

    }
}

GUI-KLASSE
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace DataProcessor
{
    public partial class InputGUI : Form
    
    {

        public InputGUI()
        {
            InitializeComponent();
        }


        private String fName;
        
        public String Fname
        {
            get
            {
                return fName;
            }
            set
            {
                                   fName = value;
             }
        }
                
        private void b1_Load(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "TXT Datei (*.txt)|*.txt|"
                                + "Alle Dateien (*.*)|*.*";
            ofd.Title = "Öffnen der Text Datei";

            try
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    Fname = ofd.FileName;
                    
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
                              
    }
}


Wäre toll, wenn jemand einen Anfänger wie meiner einer helfen könnte.

Lieben Gruß,
El
 
Also hier mal der überarbeitete Code

Input nur das Load Evet hinzugefügt und ein this.Close() wenn du fertig bist.

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

namespace DataProcessor
{
    public partial class InputGUI : Form
    {

        public InputGUI()
        {
            this.Load += new EventHandler(b1_Load);
        }


        private String fName;

        public String Fname
        {
            get
            {
                return fName;
            }
            set
            {
                fName = value;
            }
        }

        private void b1_Load(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "TXT Datei (*.txt)|*.txt|"
                                + "Alle Dateien (*.*)|*.*";
            ofd.Title = "Öffnen der Text Datei";

            try
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    Fname = ofd.FileName;
                    this.Close();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

    }
}


Jetzt dein Main:

Nur [STAThread] hinzugefügt. und die Variablennamen angepaßt.
Er macht das Gui auf.
Und wenn er fertig ist und sich die GUI geschlossen hat liest er die Variable (den stzring aus)
diesen Namen übergibt er nach Processing und fertig.
Jetzt kannst du im Process Klasse deine Variable "fileName" benutzen
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace DataProcessor
{
    class Program
    {
        [STAThread]
        static void Main()
        {

            InputGUI i1 = new InputGUI();
            Application.EnableVisualStyles();
            Application.Run(i1);
            string str_fName = i1.Fname;
            DataProcessor.Processing process = new DataProcessor.Processing(str_fName);
        }

    }
}


Hoffe das hilft dir weiter ..


mfg
Martin
 
Hallo Martin.
Erstmal tausend Dank für die Superschnelle Hilfe.

Leider ist mein Problem noch nicht gelöst.

Zum einen springt das Programm gleich nach dem Start in den "Open File Dialog", wenn ich das hier einsetze:

Code:
public InputGUI()
        {
            this.Load += new EventHandler(b1_Load);
        }

Und zum anderen scheine ich irgendwie zu unerfahren zu sein, von der Processklasse auf den Dateinamen zuzugreifen.
Müssen die Getter und Setter als einzelne Methoden gesetzt sein oder wie komme ich daran?
Nichtmals die Testweise Ausgabe des Dateinamens in einer Messagebox funktioniert.
Ich meine mich vage an den Möglichkeiten in Java erinnern zu können, wo man mit "Klassenname"."getDingsda();" an sowas heranging.

Gruß,
El

P.s.: Dank deines [STAThread] funktioniert der Debugger aber schonmal wieder :)
 
Hi,

zum einen ...
Sollte er nicht gleich den Dialog öffnen ?
Was sollte er tun ?

zum anderen ...
du hast doch deine Processklasse erstellt...
und du hast den string mitgegeben.

Was soll die klasse machen ? Wozu dient sie ?

Macht die Klasse nun selbst was damit ?
Oder legst du die Klasse nur an und willst dann von deiner Main Klasse aus drauf zugreifen.
das get und set in der processklasse kannst du noch erweitern ...
Das hier kommt mit in die Processklasse und ersetzt private String fname;

Code:
  private String fname;
        
        public String FileName
        {
            get
            {
                return fname;
            }
            set
            {
                 fname= value;
             }
        }

Der Rest bleibt.
Jetzt kannst du den String in der Klasse verwenden ..
angenommen nach dem Konstruktor rufst du irgendeine Methode auf
z.B.

Code:
public Processing(String fname)
        {
            this.fileName = fname;
            //new
            ShowName();
        }

private void ShowName()
{
       MessageBox.Show(FileName);
}


Oder du kannst aus der Main drauf zugreifen ...

Code:
 [STAThread]
        static void Main()
        {

            InputGUI i1 = new InputGUI();
            Application.EnableVisualStyles();
            Application.Run(i1);
            string str_fName = i1.Fname;
            DataProcessor.Processing process = new  DataProcessor.Processing(str_fName);
             MessageBox.Show(process.FileName);
        }



hoffe geholfen zu haben
Martin
 
Tausend Dank, Martin

Manchmal sieht man echt den Wald vor lauter Bäumen nicht. :)
War so blind, das sollte eigentlich bestraft werden. ;)

Anfängerfehler halt.
Hab da ein wenig was durcheinandergewürfelt.

Zu deinen Fragen:

- Es gibt einen Dialog zum Öffnen und Speichern von Dateien.
- Die Processklasse soll die Daten verarbeiten.


Vielen herzlichen Dank nochmal.
Dank dir war der Tag gerettet.

Lieben Gruß,
El
 
Ich habe im Verlauf leider noch etwas unglückliches festgestellt.

Das Laden etc klappt nun und der Speichern-Dialog ist auch schon auf einem Button gelegt und funktioniert.
Allerdings beendet sich die GUI nache dem Laden und ein Speichern ist dann natürlich nicht mehr möglich.
Die GUI nochmals aufzurufen wäre nicht ratsam, oder?
 
okay ich geh mal davon aus das in deinem Dialog noch ein wenig mehr ist als der OpenFileDialog bzw beim speichern der SaveFileDialog.

Ist das richtig ? (Buttons usw.)

Angenommen du machst den Laden Dialog auf.
Der öffnet sich und gibt der den Namen einer Datei zurück.

In deinem Processing verarbeitest du das ganze.

Was möchtest du jetzt speichern ?

Die selbe Datei ?
Also lädst du den Text aus der Datei raus, änderst ihn und willst ihn nun wieder abspeichern ?


Sind Laden und Speichern ein und das selbe Form also das InputGUI.
Nur mit 2 Buttons ?
Oder sind das 2 getrennte Forms ?


Wenn es ein und das selbe Form ist, wäre es durchaus denkbar den Dialog aufzumachen und wieder zu schließen.
Und für das speichern ebenfalls wieder aufmachen und dann wieder schließen.
Beim Aufmachen übergibst du einfach den Dateinamen wieder. z.B. im Konstruktor.


Wenn du es für das Laden aufmachst übergibst du einfach nen Leerstring "" oder String.Empty.

Aufruf
Code:
InputGUI i1 = new InputGUI(""); //für das Laden
bzw
InputGUI i1 = new InputGUI(fileName); //für das Speichern


und der Konstrukor
Code:
public InputGUI(string fileName)
        {
           Fname = fileName;
        }


Jetzt hast du beim öffnen des Dialogs für das Speichern auch den ursprünglichen Dateinamen.

Ich hoffe ich habe das ganze richtig verstanden.

Falls ich etwas falsch angenommen habe, erklär es mir :)


mfg
Martin
 
Zurück