Hi,
nachdem mir erklärt wurde ich wie Daten von Form 2 nach Form 1 bekomme, wollte ich fragen wie es umgekehrt geht. Also zb den Inhalt einer Textbox in Form 1, in den Inhalt einer Textbox in Form2 zu bekommen.
mfg
Hier dürftest du fündig werden.
Auch bei weiteren Fragen zum Thema C# kann ich dir diese Community nur ans Herz legen.
Du könntest deiner Form2 beim Erstellen die Form1 als Parameter übergeben:
Code:frm2 = new Form2(this); frm2.Show(this);ruft den Konstruktor von Form2 auf und übergibt sich selbst als Parameter.Code:new Form2(this)
In Form2 müsstest du dann eine
Form1 Variable erstellen:
(außerhalb jeder Methode, direkt in der class)Code:Form1 fMain;
Dann müsstest du den Konstruktor von Form2 so anpassen, dass er eine Form1 empfangen kann:
Jetzt kannst du über fMain auf die Form1 zugreifen.Code:public Form2 (Form1 f) { InitializeComponent(); fMain=f; }
Das Ganze ist dann recht analog zum umgekehrten Zugriff(von Form1 auf Form2)
http://forum.worldofplayers.de/forum...3&#post8570883
Da gibts verschiedene Möglichkeiten:
ShowDialog:
Verwende statt der Methode Show die Methode ShowDialog zum Anzeigen deiner Form:
Solange diese Form offen ist, kann der User nicht auf die anderen Forms zugreifen.Code:frm2.ShowDialog(this);
Eine weitere Möglichkeit wäre abzufragen, ob Form2 schon vorhanden ist:
Code:bool offen = false; //Variable die speichert ob eine entsprechende form gefunden wurde foreach (Form f in Application.OpenForms)//läuft alle Forms in der Liste der derzeit offenen Forms durch (foreach: für jedes Element des Typs Form in der Liste Application.OpenForms, wobei dieses Element Lokal in f gespeichert wird) { if (f is Form2)//wenn f vom Typ Form2 ist (da Form2 von Form geerbt ist, ist f auch vom Typ Form) { offen = true;//wir haben ein Fenster Form2 gefunden, das offen ist break;//verlässt den foreach Block, da ein weiteres Durchlaufen ja nicht mehr nötig ist } } if (!offen)//wenn offen false ist (also es keine Form2 gibt) { Form2 frm2 = new Form2(this); frm2.Show(this); }
Ok, danke.
Gibt es eine möglichkeit Dinge so zu speichern, das sie nach neustart des Programmes noch vorhanden sind?
ZB über eine Textdatei?
Und: Kann man Buttons per Befehl, ohne Visible, erschaffen?
ZB wenn man einen Button drückt soll jedesmal wenn man ihn Drückt ein anderer Button erschaffen werden.
Was genau meinst du?Und: Kann man Buttons per Befehl, ohne Visible, erschaffen?
ZB wenn man einen Button drückt soll jedesmal wenn man ihn Drückt ein anderer Button erschaffen werden.
Buttons direkt aus dem code erschaffen, also ohne den GUI(Oberflächen)-Designer?
Wenn ja (ubrigens macht deine Form1.Designer.cs kaum was anderes, da kannst du also auch gucken):
Im Erstellerbutton:
Als eigene Methode:Code:for (int i = 0; i < 5; i++)//for-schleife bis 5 { Button bt = new Button();//erstelle einen neuen Button bt.Location = new System.Drawing.Point(30*i+20, 2);//Buttonposition (x,y)-Kordinaten bt.Name = "B" + i.ToString();//der Name des Buttons bt.Size = new System.Drawing.Size(30, 20);//Breite und Höhe des Buttons bt.TabIndex = i;//Tabulatorindex (Reihenfolge, in der man beim drücken der Tabulatortaste durch die Controls geht) bt.Text = bt.Name;//Der Text auf dem Button, ich nehme hier einfach mal seinen Namen bt.UseVisualStyleBackColor = true;//irgendwas zum Zeichnen, eher irrelevant bt.Click += new System.EventHandler(this.BT_Click);//ruft beim Klicken die Funktion BT_Click auf. bt.BringToFront();//bringt den Button an die oberste Anzeigeebene this.Controls.Add(bt);//fügt den Button schließlich zur Form hinzu. }
Über diesen Namen können wir dann (wie in der Schomessage zu sehen), auch herausfinden, welcher Button geklickt wurde (obwohl alle Buttons beim Klicken die gleiche Methode aufrufen).Code:private void BT_Click(object sender, EventArgs e)//Funktion die beim Klicken unserer Klonbuttons aufgerufen wird (siehe oben) { MessageBox.Show(((Button)sender).Name + " geklickt!");//gibt eine Messagebox aus. Sender ist ein Parameter der Funktion. //Da er als object übergeben wird, müssen wir ihn mittels (Button)sender) in einen button umwandeln, sodass wir mit .Name auf seinen Namen zugreifen und diesen anzeigen lassen können }
Textdateien sind hier die einfachste Lösung.Gibt es eine möglichkeit Dinge so zu speichern, das sie nach neustart des Programmes noch vorhanden sind?
ZB über eine Textdatei?
Angenommen du hast 2 Buttons erstellt:
Einer speichert, der andere lädt.
Als using musst du nich System.IO; einbinden.
Ich lasse nun einfach mal die Zeit/Datum als string speichern (du kannst es dann natürlich auch auf andere Variablen übertragen):
Speichern:
Laden:Code:using (StreamWriter sw = new StreamWriter("test.txt"))//using ist praktisch um objekte automatisch zu schließen und zu entfernen. Der Streamwriter sw existiert nur innerhalb von using und wird automatisch //geschlossen (es ist wichtig Schreib/Lesestreams zu schließen). Beim Erstellen von Streamwriter habe ich hier mal die datei Angegeben, welche falls nicht vorhanden, erstellt wird. { sw.WriteLine(DateTime.Now.TimeOfDay.ToString());//Schreibt eine Zeile. DateTime.Now.TimeOfDay liefert die aktuelle Zeit, welche mit ToString in einen String umgewandelt wird (wir schreiben ja Strings) sw.WriteLine(DateTime.Today.Day.ToString());//gleiches, wie oben für den Tag }
Bei fragen zum Code kannst du ruhig fragen (einiges ist vielleicht nicht sehr Einsteigerfreundlich erklärt)Code:if (File.Exists("test.txt"))//existiert die Datei überhaupt? { using (StreamReader sr = new StreamReader("test.txt"))//Beim Konstruktor wird die Datei angegeben, welche gelesen werden soll. { string line;//lokale Variable zum speichern der eingelesenen Zeile while ((line = sr.ReadLine()) != null) //ReadLine() liefert die Zeile als string zurück. Dieser wird line zugewiesen und anschließend überprüft, ob überhaupt ein gültiger string vorliegt. //so wird die Datei von anfang bis Ende ausgelesen (die länge ist nicht bekannt und deshalb auch while + diese != null Abfrage { MessageBox.Show(line);//Gibt line aus } } }
Jop, das ganze funktioniert sehr gut und ist mit deiner Beschreibung nicht sonderlich schwer zu verstehen. Dafür schon mal vielen Dank.
Noch eine Frage: Wie kann man per Klick auf eine Picturebox das Bild der Picturebox ändern?
Wenn ich
eingebe und das Bild unter Form1.resx hinzugefügt habe ist der Pfad falsch.Code:Image img = Image.FromFile(Application.ExecutablePath + "\\Resources\\Name.gif"); pictureBox2.Image = img;
Wenn du Dateien als Resource einfügst, dann werden sie in die .exe eingebunden, sodass man sie nicht mehr zusätzlich mit dem Programm mitliefern muss.
Der Pfad ist falsch, da Application.ExecutablePath den Pfad der .exe liefert,
Der Resources-Pfad liegt aber einpaar Ordnerebenen darüber.
Du kannst Resourcen über Resources.resx hinzufügen.
Zugreifen kanst du dann über
PROJEKTNAME.Properties.Resources.NAME
(wie man darauf zugreift, wenn mans über Form1.resx einfügt, weiß ich spontan nicht).Code:pictureBox1.Image = picboxtest.Properties.Resources.c;
Bezüglich Sounds wäre interessant:
http://www.codeguru.com/csharp/cshar...icle.php/c6143
http://bytes.com/groups/net-c/521813...e-snd_resource
Und eine wirklich gute Seite mit vielen guten Artikeln:
http://www.codeproject.com/KB/audio-video/nbass.aspx
Versuchs mal damit:Kann man ein Form auf Vollbild machen, so das es wie ein Spiel etc aussieht (Keine Startleiste, Überschrift etc)?
http://www.codeproject.com/KB/cs/Ful...DotNetApp.aspx
Wenn du was Richtung Spieleentwicklung machen möchtest, dann solltest du dir mal XNA ansehen:
http://de.wikipedia.org/wiki/XNA_(Microsoft)
Nimmt einem wirklich sehr viel Arbeit ab.
Noch eins: Kann man herrausfinden was für eine Bildschrimauflösung benutzt wird?
Screen.PrimaryScreen.Bounds.Width ist die Breite und
Screen.PrimaryScreen.Bounds.Height die Höhe.
Wenn man was in Richtung Programmieren machen möchte, kommt man um Englisch nicht drumherum, da die allermeisten Beispiele unt Tuts auf englisch sindDanke für die Links, leider sind die Seiten auf Englisch, deshalb ist es schwer da Codes zu finden.![]()
Ok, danke. Englisch kann ich zumindest so gut das ich die da geschilderten Beispiele verstehe, nur wenn es dann ins "Fachjargon" geht habe ich da meine Probleme.
Ich habe es jetzt geschafft die Form zu Vollbild zu machen. Wie schaff ich es, das die Buttons, Labels etc mit mit dem maximieren des Forms gesteckt werden? Wenn das nicht geht: Wie schaff ich es das der Inhalt der Form zumindest zentriert ist?
Das müsstest du manuell machen.
Auf die Buttons & co kannst du über Name.Eigenschaft zugreifen und so
left/top/width/height anpassen.
Wenn die Controls auch beim manuellen Skalieren des Fensters durch den User umpositioniert werden sollen, dann mache die Skalierung innerhalb des Resize-Events deiner Form (Form auswählen, dann im Eigenschaftsfenster auf den Blitz und dann doppelt auf Resize klicken).
Es kann oft sinnvoll sein Controls in einen Container, wie Panel oder eine Groupbox zu packen(im Toolbox-Fenster zu finden):
Wenn man den Container verschiebt, dann verschiebt man die darin enthaltenen Controls gleich mit.
Mal ein (zugegebenermaßen unschönes (da mit konstanten Werten) auf die Schnelle aufgetriebenes) Beispiel:
Code:GBDataContent.Width = (this.Width -GBData.Width-20-12-8)/2; GBDataContent.Height = this.Height - 50; GBData.Left = GBDataContent.Left + GBDataContent.Width + 6; GBFilterContent.Width = GBDataContent.Width; GBFilterContent.Height = GBDataContent.Height; GBFilterContent.Left = GBData.Left + GBData.Width + 6; GBFilter.Left = GBData.Left; GBFegiltert.Left = GBData.Left; LBDataContent.Width = GBDataContent.Width - 20; LBDataContent.Height = GBDataContent.Height - 20; LBFilterContent.Width=LBDataContent.Width; LBFilterContent.Height = LBDataContent.Height;
Jo, nochmal danke.
Kann man machen, das sich 2 Buttons aufeinander zu bewegen?
Ich habe es mit:
Probiert, aber es geht nicht so wirklich.Code:private void timer2_Tick(object sender, EventArgs e) { if (button2.Location.X < button1.Location.X) { this.button2.Location = new Point(button2.Location.X + 1, button1.Location.Y); } if (button2.Location.X > button1.Location.X) { this.button2.Location = new Point(button2.Location.X - 1, button1.Location.Y); } } private void timer3_Tick(object sender, EventArgs e) { if (button2.Location.Y < button1.Location.Y) { this.button2.Location = new Point(button2.Location.X, button1.Location.Y + 1); } if (button2.Location.Y > button1.Location.Y) { this.button2.Location = new Point(button2.Location.X, button1.Location.Y - 1); } }
Bewegt sich button2 überhaupt nicht?
Sind timer2 und timer3 enabled?
Vom Code her müsste es gehen.
Einziger Fehler wäre, dass du für button2 die Y-Koordinate von button1 angibst:
button1.Location.Y
Bezüglich deines gelöschten Beitrags habe ich ein kleines Beispielprojekt gebastelt:
picboxtest.7z
Button 1 lässt sich mit der Maus verschieben, Button 2 bewegt sich auf Button 1 zu.
Das Prinzip ist relativ simpel:
B2 ist je eine gewisse Breite und Höhe von B1 entfernt.
Wenn man B2 nun jedesmal um ein 1 näher an B1 bringt, braucht man ja eine gewisse Anzahl an Bewegungen.
Innerhalb dieser Anzahl muss man auch die Höhenbewegung unterbringen.
Diese weicht aber in der Regel von der Breitenbewegung ab.
Man bildet also ein Steigungsdreieck:
(Y1-Y2)/(X1-X2)
Uns speichert es als float (Kommazahl).
Nun muss man je nach Bewegungsrichtung (Links/Rechts) diese Steigung zur Höhe hinzuaddieren bzw von der Höhe subtrahieren.
Problem: Die Position des Buttons wird in Ganzzahlen gespeichert (integer), wenn man also die Steigung hinzuaddiert, wird diese gerundet und man erhält nichts Brauchbares.
Mann muss die Höhe also in einer Floatvariablen verwalten und mit der Buttonpositions synchronisieren (dann macht das Runden auch Sinn).
Zu Strings wäre das hier interessant:Kann man Strings auslesen? ZB so das nur die ersten 4 Zeichen relevant sind?
http://www.dotnetcurry.com/ShowArticle.aspx?ID=189
Wenn du die ersten 4 Zeichen haben möchtest:
Code:neuerstring = deinstring.Substring(0, 4);Tut mir Leid, aber ich kenne keine (arbeite selbst nicht viel Mit XML außer zum "offenen" Speichern von Daten).Hast Du ein paar gute Links zu Anfänger Tutorials von XML? Bei Google finde ich nur Fortgeschrittenenzeug.