Laden...

Form überschreiben

Erstellt von alf468 vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.568 Views
A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren
Form überschreiben

Je nachdem ob der User Singleplayer oder Multiplayer auswählt soll eine andere Klasse geladen werden.Die Klassen habe ich jeweils in eine dll Datei geschrieben (ein komplettes Fenster) .Nun will ich aber dass sich kein neues Fenster öffnet sondern dass das alte Fenster mit dem Menü überschrieben wird. Also das gleiche als würde eine neue InitializeComponent() geladen werden.
Ich will hat diesen Übergangseffekt vermeiden wo sich ein Fenster schließt und ein neues öffnet.

@herbivore
Hatte mich verklickt X(

4.221 Beiträge seit 2005
vor 18 Jahren

Dann mach halt die Menüs dynamisch je nach Zustand (MenuItems adden oder removen)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Mit Menü waren Buttons gemeint wo halt der Modus drauf steht und nicht die Menübar.Aber das mit dem löschen war mir schon klar nur wie lade ich die neuen Komponenten in die Form?

4.221 Beiträge seit 2005
vor 18 Jahren

Wenn die Unterschiede minimal sind (z.B: ein Button mehr oder so) dann mach diesen einfach unsichtbar (Visible=false) und nur bei Bedarf sichtbar.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Ein komplett neue Oberfläche will ich erstellen ,deswegen ja auch die dll Datei

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Kann man einer Form keine andere Forum zuweisen?

4.221 Beiträge seit 2005
vor 18 Jahren

Original von alf468
Kann man einer Form keine andere Forum zuweisen?

Sorry ich will Dich ja wirklich nicht beleidigen, aber ich empfehle Dir mal ein gutes Buch über .Net und OO zu lesen, damit Du mal die Grundkonzepte der OO-Entwicklung kennenlernst und nachher selber weisst was grundsätzlich möglich ist und was nicht.... auch wie man solche Probleme anpackt.... Hier wäre z.B: eine gemeinsame BasisKlasse für die 2 Forms eine Möglichkeit .... oder die Implementierung der Gemeinsamkeiten über Interfaces

Ich helfe wirklich gerne bei konkreten Programmierproblemen.... aber das coden kann ich Dir auch nicht beibringen

Gruss
Programmierhans

Edit: Ergänzung:

Um Dich jetzt aber nicht ganz im Regen stehen zu lassen....

Mach doch das ganze Design auf einem UserControl

Dann kannst Du zur Laufzeit je nach Modus das eine oder andere UserControl auf das (leere)Form pappen...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Original von Programmierhans
Sorry ich will Dich ja wirklich nicht beleidigen, aber ich empfehle Dir mal ein gutes Buch über .Net und OO zu lesen, damit Du mal die Grundkonzepte der OO-Entwicklung kennenlernst ...

Ein Buch kannst jedem Empfehlen der eine Frage hat und sich damit selber auseinandersetzten soll.
Aber Danke für den Tipp mit dem UserControl mal schauen wie das so geht

M
329 Beiträge seit 2004
vor 18 Jahren

Original von alf468
Ein Buch kannst jedem Empfehlen der eine Frage hat und sich damit selber auseinandersetzten soll.
Aber Danke für den Tipp mit dem UserControl mal schauen wie das so geht

Das stimmt theoretisch, doch sind für C# nunmal grundlegende Kenntnisse in OO notwendig.

4.221 Beiträge seit 2005
vor 18 Jahren

Original von michaelschuler

Das stimmt theoretisch, doch sind für C# nunmal grundlegende Kenntnisse in OO notwendig.

In diesen sauren (hoffentlich nicht mostindischen) Apfel muss jeder beissen.... Wenn man die Grundkonzepte mal verstanden hat dann kommen die konkreten Fragen wo wir auch helfen können....

Fragen wie: Was ist eine Instanz ... eine Klasse ... Property ... Methode... Vererbung... Interface usw... Also alles Base-Knowledge sollte man sich selber erarbeiten (Kurs / Buch / Privatlehrer 8))

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
329 Beiträge seit 2004
vor 18 Jahren

Original von Programmierhans
In diesen sauren (hoffentlich nicht mostindischen) Apfel muss jeder beissen....

Mostindische Äpfel sind nicht sauer 😉

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Das ist mir klar und ich bin auch vertraut mit der OO 😉
Aber bei diesem Problem finde ich irgendwie keine Lösung und ich bin keiner von denen die direkt Fragen ohne vorher nachzudenken!!

Mir ist klar das wenn ich alles in eine Klasse schreibe es einfach ist die Form zu überschreiben.Aber ich habe nun mal eine 2.Klasse wo das 2.Fenster aufgebaut ist und dieses 2.Fenster möchte ich gerne in der 1.Form anzeigen lassen.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo alf468,

grundsätzlich kann man schon Controls von einem Fenster in eine anderes übertragen. Das folgende ist quasi eine Machbarkeitsstudie. Mit ist klar, dass es bei dir um zwei verschiedene Form-Klassen geht. Das ändert ja aber nichts prinzipielles. Ich denke am besten wäre es, alle zu übertragenden Controls auf ein Panel zu packen und nur das Panel zu transferieren.

Das du mit OO vertraut bist, sollte es kein Problem sein, meine Machbarkeitsstudie auf deinen konkreten Fall zu übertragen.


using System;
using System.Windows.Forms;
using System.Drawing;

public class MyWindow : Form
{
   const int iWidth      = 600;
   const int iHeight     = 480;
   const int iMargin     = 10;

   private Button   _pbDo;
   private MyWindow _mywin;

   public MyWindow (bool fFirst)
   {
      Control ctrlCurr;

      if (fFirst) {
         Text = "MyWindow 1";
      } else {
         Text = "MyWindow 2";
      }
      ClientSize = new Size (iWidth, iHeight);

      ctrlCurr = _pbDo = new Button ();
      ctrlCurr.Location = new Point (iMargin, iMargin);
      if (fFirst) {
         ctrlCurr.Location = new Point (iMargin, iMargin);
         ctrlCurr.Size = new Size (iWidth/2-2*iMargin, iHeight/2-2*iMargin);
         ctrlCurr.Text = "aus MyWindow 1";
         ctrlCurr.Click += new EventHandler (DoClick);
      } else {
         ctrlCurr.Location = new Point (iWidth/2+iMargin, iHeight/2+iMargin);
         ctrlCurr.Size = new Size (iWidth/2-2*iMargin, iHeight/2-2*iMargin);
         ctrlCurr.Text = "aus MyWindow 2";
      }
      Controls.Add (ctrlCurr);
   }

   protected void DoClick (Object objSender, EventArgs e)
   {
      if (_mywin == null) {
         _mywin = new MyWindow (false);
         _mywin.Show ();
         _mywin.Controls.Add (_pbDo);  // <== hier
      }
   }
}

abstract class App
{
   public static void Main (string [] astrArg)
   {
      Application.Run (new MyWindow (true));
   }
}

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

Hallo herbivore

Ein Form ist übrigens auch nur ein Control.... theoretisch kann man ein Form auf ein Form laden...

Form2 f2=new Form2();
this.Controls.Add(f2);

Hab's aber selber noch nie ausprobiert ... weil wer macht so was...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Programmierhans,

ein Form ein Control wie alle anderen, aber es ist gleicher als die anderen (sprich es geht nicht):

System.ArgumentException: Top-level control cannot be added to a control.

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

TopLevel=false;

😁

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

4.221 Beiträge seit 2005
vor 18 Jahren

Spiel mal damit rum herbivore



using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication10
{
	/// <summary>
	/// Summary description for Form1.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.Button button1;
		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();

			//
			// TODO: Add any constructor code after InitializeComponent call
			//
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			this.button1 = new System.Windows.Forms.Button();
			this.SuspendLayout();
			// 
			// button1
			// 
			this.button1.Location = new System.Drawing.Point(0, 0);
			this.button1.Name = "button1";
			this.button1.Size = new System.Drawing.Size(128, 64);
			this.button1.TabIndex = 0;
			this.button1.Text = "button1";
			this.button1.Click += new System.EventHandler(this.button1_Click);
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(120, 61);
			this.Controls.Add(this.button1);
			this.Name = "Form1";
			this.Text = "Form1";
			this.ResumeLayout(false);

		}
		#endregion

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

		private void button1_Click(object sender, System.EventArgs e)
		{
			Form1 frm=new Form1();
			frm.TopLevel=false;
			frm.Location=new Point(0,this.ClientSize.Height);
			this.ClientSize=new Size(this.ClientSize.Width+frm.ClientSize.Width,this.ClientSize.Height+frm.Height);
			this.Controls.Add(frm);
			frm.Show();
		}
	}
}



Edit:

Ich hoffe Du klickst jetzt nicht den ganzen Abend darauf rum herbivore 🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Programmierhans,

ok, überzeugt (auch ohne dein nettes Programm). Aber dann sollte man noch ein

FormBorderStyle = FormBorderStyle.None;

spendieren.

herbivore

I
1.739 Beiträge seit 2005
vor 18 Jahren

Das Problem dabei ist das Verhalten der Tabulatortaste(Man kommt nicht mehr raus).

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Eigentlich ganz logisch 😁
Wenn ich die ganze Form hinzufüge sieht das ja nicht so schön aus (Form im Form 🙂 ) ,deswegen habe ich mich lieber für das Panel entschieden.

Danke

I
1.739 Beiträge seit 2005
vor 18 Jahren

Alternativ kann man den Oberflächenentwurf auch (fast)ausschliesslich in Usercontrols unterbringen. Damit ist eine höhere Flexibilität möglich(zu Lasten eines höheren Aufwands).

4.221 Beiträge seit 2005
vor 18 Jahren

Original von ikaros
Alternativ kann man den Oberflächenentwurf auch (fast)ausschliesslich in Usercontrols unterbringen. Damit ist eine höhere Flexibilität möglich(zu Lasten eines höheren Aufwands).

genau (habe ich heute um 14:38 schon vorgeschlagen)... wobei halt der Aufwand wie Du auch sagst grösser ist... und z.B: DataBinding über ContainerGrenzen ist auch nicht ohne...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

4.221 Beiträge seit 2005
vor 18 Jahren

Original von alf468
Wenn ich die ganze Form hinzufüge sieht das ja nicht so schön aus (Form im Form 🙂 ) ,deswegen habe ich mich lieber für das Panel entschieden.

Nur so am Rand das war auch kein ernstgemeinter Rat.. aber um mal ein wenig draufrummzuklicken und Fenster innerhalb des Fensters über mehrere Stufen zu minimiern usw wär mal was ganz neues 🙂

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

3.728 Beiträge seit 2005
vor 18 Jahren
Mvc

Sowas lässt sich gut mit dem MVC Entwurfsmuster bauen. Je nach Kontext werden andere Views verwenden (z.B. UserControls die zur Laufzeit geladen werden).