Autor Beitrag
LocalDeeJay
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Do 08.11.07 21:23 
Guten Abend liebe Community,

ich versuch mich gerade dabei, Methoden in Klassenbibliotheken auszulagern. Und find nicht raus wie das gehen soll.

Mein Status (Ich arbeite mit VS05):
Ich hab die Program.cs, die Form.cs und die AuslagerungsKlassenBibliothek VariousForms.cs.
In der Form.cs sind, so viel ich weiß, alle visuellen Objekte enthalten, die man auf dem Bildschirm darstellen will. Zum Beispiel ein Button. Oder, wie in meinem Fall, eine ProgressBar. Da es nun gut sein kann, das in der Form.cs sehr viele visuelle Objekte sind und man nun sicher nicht den ganzen Code in einer Form.cs haben möchte (ich zumindest nicht) würde ich ihn auf die VariousForms.cs auslagern.
Mein Problem ist nun: wie schieb ich die Daten hin und her?
Wenn ich in der VariousForms.cs auf die Objekte, zum Beispiel die ProgressBar, zugreifen möchte, so bekomm ich diese nicht angezeigt.

Mein Namespace heißt Daba:

Der Code sollte in etwa so aussehen:

ausblenden C#-Quelltext
1:
2:
3:
4:
public void setProgressData()
{
  Daba.Form1.ProgressBar.Minimum...;     //Wie das genau aussieht hab ich mir noch nicht angeschaut, daher auch die Punkte
}


Wäre sehr nett wenn ihr mir helfen könntet.

Mit freundlich Grüßen

_________________
Thomas Müller
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 08.11.07 23:04 
Was willst du nun auslagern - Komponenten oder Logik? Zu ersteren solltest du dir einmal UserControls in der Doku anschauen.
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Do 08.11.07 23:12 
Hey,

also ich will zum Beispiel ne ganze Klasse (Methoden, Attribute) in ne Klassenbibliothek schreiben und diese Klasse, also die Methoden in der Form.cs verwenden, das der Code nicht so dick ist.

Als vergleich vielleicht die Static Void Main in der Program.cs... Wenn man dort Funktionen und Klassen etc. schreibt und nurnoch die Funktionen in die Main mit der Logik schreibt, so ist der Code in der Main nicht so enorm wie wenn man die Funktionen weglässt.
Verstehst du was ich mein?!

Mit den UserControls meinst du gerade das mit der ProgressBar denk ich mal. Das ist ja nicht das Problem, mir gehts ja eher drum wie ich die Daten der einen Klassenbibliothek (VariousForms.cs) in die andere Klassenbibliothek (Form.cs) bekomme.

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 09.11.07 00:05 
Worauf Sebastian hinaus will:

Du hast Dein Problem gar nicht, wenn Du Logik und GUI sauber trennst. Die Klassen, die im Hintergrund werkeln, wissen nix von der GUI, sondern stellen GUI-unabhängige Schnittstellen zu Verfügung. Wenn Du einen Fortschritt anzeigen willst, kannst Du das z.B. so machen, dass die GUI eine Callback-Methode übergibt oder Deine Klasse ein Ereignis auslöst.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Fr 09.11.07 00:11 
OKeeeeeeeee *gg*
Gebt mir ein oder zwei Tage Zeit, dann arbeite ich mich da ein, schau nach deinen Begriffen und dann antworte ich wieder =)

Ich frag mich aber trotzdem wie du das meinst mit dem GUI und Logik trennen, denn ich hab das in etwa so gemeint, das man in der form.cs ne funktion aufruft, die in variousform.cs steht. Ich hab die Funktionen aber nichtmal in die form.cs bekommen. Was mich etwas verwundert hat. Auch wenn in der variousforms.cs alle klassen public waren.
Aber gut, so wird die GUI etwas getrennt... =)

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 09.11.07 00:21 
Nehmen wir als Beispiel eine Rechnung, die echt lange braucht und einen Fortschritt zurückgeben soll. Kannste mit einer Callback-Methode machen:

(Achtung, nur im Forum geschrieben, also wahrscheinlich einige Fehler drin ;-))
ausblenden in der Bibliothek
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public delegate void MyCallbackDelegate(int Current, int Total);

public class MyCalculator {
  public static int MySlowMethod (int OneSenselessParam, MyCallbackDelegate Callback)
  {
    for(int i = 0; i < SomeOtherVar; i++)
    {
      /* do some calculations */
      if (Callback != null)
        Callback(i, SomeOtherVar);
    }
  }
}


ausblenden in der Form
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public Form1 : Form {
  /* ... */
  public void SomeCallback(int Current, int Total)
  {
    progressBar1.Max = Total;
    progressBar1.Position = Current;
  }

  public void UseSlowMethod()
  {
    MyCalculator.MySlowMethod(10, SomeCallback);
  }
}


In der Biblitohek gibt es also eine Klasse mit einer Methode, die lange braucht. Dieser Methode übergibt man irgendwelche Parameter und eine Callback-Methode. Die Berechnungsmethode ruft dann ab und an mal die Callback-Methode auf, damit die GUI weiß, wie weit die Berechnung ist. Die GUI verarbeitet dann diese Fortschrittsmeldung in der SomeCallback-Methode, in diesem Fall wird ein ProgressBar aktualisiert. Es könnte aber auch irgendwas anderes gemacht werden, ohne dass die Berechnungsroutine davon weiß. Das geht nur die GUI an.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: So 11.11.07 12:11 
Ähm,

hä?

Also wenn des echt so funktioniert mit "Klassennamen aus der Klassenbibliothek . Methode aus der Klasse" dann hat mich letztens wohl mein Compiler vereppelt. Weil ich hab das auch schon versucht. (Hab früher in VB.Net geproggt und hab so die Daten von einer Maske in die andere geschoben, da ging das auch.)
Vllt hatte ich einen anderen Fehler.
Wärst du noch so freundlich mir das delegate zu erklären?
Ansonsten probier ich das mit der ProgBar nochmal wenn ich Zeit habe...
Vielen vielen Dank schonmal ;)

Thommy

_________________
Thomas Müller
JayK
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1013



BeitragVerfasst: So 11.11.07 13:00 
Delegates sind in der Online-Hilfe von Microsoft ziemlich gut erklärt, glaube ich.
Meine persönlich jetzt nicht genauer nachgeprüfte Erklärung ist: ein Delegate ist eine Abstraktion für Methoden, die bestimmte Typen als Argumente annehmen und einen bestimmten Rückgabewerttyp haben. Zum Beispiel kannst du dir ein Delegate1 für Methoden definieren, die int zurückgeben und als Argumente string, int, int, double (in der Reihenfolge und Anzahl) nehmen.
ausblenden C#-Quelltext
1:
delegate int Delegate1(string arg1, int arg2, int arg3, double arg4);					

Delegates sind Typen und können instanziiert werden, in dem man sie mit gegebenen Methoden konstruiert.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
int myMethod(string a, int b, int c, double d) { /* ... */ }
Delegate1 delegate1Instanz;
KonstruktorOderWasAuchImmer() 
{
  delegate1Instanz += new Delegate1(myMethod);
}

Das += ist da, weil einer Delegate-Instanz auch mehrere Methoden gleichzeitig gehören können. (Deshalb heißen die Dinger auch Multicast-Delegates).
Du kannst myMethod jetzt auch durch delegate1Instanz(...) aufrufen.
Angewandt wird das z. B. bei Callbacks, wie Christian sagte, und bei Events.

mfG
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Mi 14.11.07 18:54 
Hey Christian,

sorry für die späte Antwort, aber ich kam erst jetzt dazu, deine Aussage zu verarbeiten.

Also ich hab heute mittag, bevor ich deine Nachricht laß, noch etwas herumprobiert und hab es leider nicht hinbekommen.
Bei der Logik hapert es nicht, viel mehr am Compiler *gg*
Also ich will nur Werte austauschen, das darf ja nicht so schwer sein. Statische Klassen kann ich nicht instanziieren... zumindest nicht in einer anderen Datei. Obwohl es ja der selbe Namespace ist.
Ich häng wirklich fest und dein Beispiel versteh ich leider immernoch nicht =(

Thommy

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 14.11.07 19:03 
Zeig doch mal den Quellcode, der nicht funktioniert. Ich weiß sonst nicht, was ich Dir noch schreiben sollst, da musst Du schon konkreter werden :nixweiss:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Mi 14.11.07 20:17 
Okay, tut mir leid, aber es ist nicht leicht zu erklären. Mein eigentliches Problem hat nichts mit einer Progressbar zu tun. Kommt aber im Endeffekt auf das gleiche raus. In dem Code, den ihr unten findet geht es darum:

Ich habe eine Maske, in er man den Vor- und Nachnamen einlesen kann - per Textbox. Diese eingegebenen Daten möchte ich (nur zur Übung für ein späteres Projekt) in eine Datenbank einfügen. Da der Code der Datenbank jedoch in einer anderen Klassenbibliothek vorzufinden ist, und ich den eigentlichen Ablauf in der int main() abspielen möchte, benötige ich die Daten der Textboxen in der main (wo zur Zeit auch noch der Code der Datenbankfunktionen liegt).
Das Hauptproblem ist:
Wie bekomme ich die Daten von den Textboxen von der Form1 : Form in die int main()?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
namespace secondDataBaseProject
{
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }
        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Program instance = new Program();
            instance.Name(txtName.Text);
            instance.Vorname(txtVorname.Text);
       
        }
    }
}


Und hier die Funktionen, die in der Main stehen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
        public string Name(string pName)
        {
            return pName;
        }
        public string Vorname(string pVorname)
        {
            return pVorname;
        }


Und des Problem ist jetzt, wie krieg ich die Daten in die Main()...?!
Ich mein, geht des überhaupt das ich dann die Daten von instance in die Main bekomme? Mit nem Zeiger vielleicht? Oder wie würdest du/ihr des machen?
Wobei ich gerade seh, das es vielleicht geschickter wäre wenn ich versuche in der Main auf die Steuerelemente zuzugreifen. Wenn des geht.

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 14.11.07 20:25 
Du meinst jetzt nicht wirklich die Main() in der program.cs, oder? :gruebel: Ich sehe wirklich keinen Grund, warum man darin etwas tun sollte.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Mi 14.11.07 20:33 
ähm doch -_-
wahhh...
Oder eben die Daten in eine Klassenbibliothek rein die test.cs heißt. Da wo dann später vielleicht mal die Datenbankfunktionen stehen.
Ich will doch nur, wenn ich auf den Button1 (update) klicke, sollen die Daten in die Datenbankfunktionen geschrieben werden, so das ich diese wiederum in die Datenbank schreiben kann.
Ist der Gedanke so schlecht?!
Wie würdest du es denn dann machen?

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 14.11.07 20:45 
Die Funktion, welche die Daten in die DB schreiben soll, bekommt die Daten als Parameter. ;-)

Ich weiß wirklich nicht, wo genau das Problem liegt :nixweiss:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Mi 14.11.07 21:07 
Hö?
Also die Datenbankfunktion kriegt die Daten als Parameter, d.h. in dem Fall string name und string vorname...
Dann läuft das programm doch aber trotzdem in der form1 ab. Denn ich rufe die Funktion ja in der Form1 auf und dementsprechend wird die funktion auch in der form bearbeitet... oder nich?!

Ich glaub ich hab n kleines blackout :/

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 14.11.07 21:13 
Was meinst Du mit "in der Form1"? Im selben Thread?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Mi 14.11.07 21:22 
Wenn du meinst ich soll dén Text in den Textboxen als Parameter in die Funktion der Datenbank reinhauen ist das ja alles kein Problem.
hab ich halt public void databasefunction(string var1, string var2...);
Des würd ja funktionieren. Aber letztenendes muss ich die Funktion in der Form1 aufrufen, da ich keinen anderen weg habe um auf die Steuerelemente zuzugreifen. Das geschieht dann mit program.databasefunction(txtname.text...);
Dann läuft ja aber alles in der form1 ab...
Laufen die Programme nicht alle in einem thread?! Oder werden da mehrere geöffnet?! oO

_________________
Thomas Müller
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 14.11.07 21:32 
Dass irgendwas in der Form gemacht wird, ist irgendwie logisch, wozu wäre die sonst da? Ich kapier echt nicht, wo jetzt das Problem ist.

Und Threads: Wenn Du's nicht anders machst und keine Methoden benutzt, die asynchron laufen, geht alles in einem Thread.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Mi 14.11.07 21:38 
Ja des ist mir auch klar, aber iwie hab ich da glaub ne andere Vorstellung wie du...
Ich dachte einfach das ich ne Funktion schreibe, in der Program.cs, welche dann die Daten, die in die Windowsforms eingegeben wurden, in einer Variable speichern. Angenommen ich will die Daten der Form.cs in die Program.cs laden, die Daten dann in Variablen abspeichern und in mehreren Funktionen in der main verwenden. Geht das? Also das der aufruf quasi in der Main stattfindet ohne das man in der Form codes schreiben muss... Oder geht das nicht?

_________________
Thomas Müller
LocalDeeJay Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows XP, Windows Vista Ultimate
C/C++ (VS6.0, VS 2005), C# (VS 2005) , PHP (Adobe Dreamweaver CS3, Apache)
BeitragVerfasst: Do 15.11.07 21:00 
So, hab nun endlich ne Lösung. Und zwar genau nach deinen Angaben Christian. Zumindest hat sich des so angehört.
Wen's interessiert - der Code...

Hier die Form.cs:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
namespace secondDataBaseProject
{
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }
        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            DatabaseClass instanceTwo = new DatabaseClass();
            instanceTwo.transferData(txtVorname.Text, txtName.Text);
       
        }
    }
}


Hier die DatabaseClass.cs:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
namespace secondDataBaseProject
{
    class DatabaseClass
    {
        private static SqlConnection openDatabaseConnection()
        {
            SqlConnection connection = new SqlConnection();
            connection.ConnectionString = "Data Source=.\\SQLEXPRESS;" +
                                                                   "AttachDbFilename=C:\\Users\\thomas\\Documents\\DataBase.mdf;" +
                                                                   "Integrated Security=True;" +
                                                                   "Connect Timeout=30;" +
                                                                   "User Instance=True";
            try
            {
                connection.Open();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return connection;
            
        }
        public int transferData(string firstName, string lastName)
        {
            string strCommand = "INSERT INTO Professor(Vorname, Name) " +
                                                  "VALUES('" + firstName + "','" + lastName + "')";
            SqlCommand command = new SqlCommand(strCommand, openDatabaseConnection());

            try
            {
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return 0;
        }
    }
}


PS: Vielleicht hat ja noch jemand ne Idee, wie ich bei der Catch eine Messagebox ausgeben kann. Da ich nicht in der Form bin, kann ich auch keine erzeugen =(

_________________
Thomas Müller