1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Von einer Klasse auf die Form zugreifen

Dieses Thema im Forum ".NET Windows Forms" wurde erstellt von Eroli, 29. März 2007.

  1. Eroli

    Eroli Erfahrenes Mitglied

    Hallo,

    ich hoffe mal, dass mir hier schneller geholfen werden kann, als in meinem "Stammforum":)

    Die benutzte Programmiersprache ist C# mit .NET 2.0

    Also ich habe eine Klasse erstellt und diese Klasse wird so aufgerufen
    Code (Text):
    1.  
    2. Klassenname Test1 = new Klassenname("Test", 50, 50, 25, new Point(20, 20), new Size(60, 20), "");
    3.  
    Der Konstruktor der Klasse sieht so aus:

    Code (Text):
    1.  
    2. public Klassenname(string Name, int Health, int Armor, int Speed, Point Position, Size Size, string Image)
    3.         {
    4.             m_Health = Health;
    5.             m_Armor = Armor;
    6.             m_Speed = Speed;
    7.            
    8.             Button btn = new Button();
    9.             btn.Name = String.Format("DynButton{0}", m_Count);
    10.             btn.Text = Name;
    11.             btn.Size = Size;
    12.             btn.Location = Position;
    13.             MapBox.Controls.Add(btn);
    14.         }
    15.  
    Die Klasse an sich erbt alles von der Form, von der Sie aufgerufen wird:
    Code (Text):
    1.  
    2. class Klassenname : Formname
    3.  
    Nun sollte der Button, der im Konstruktor erstellt wird, der PictureBox zugewiesen werden, aber es passiert nix. wieso?
    Falls ihr weitere Angaben braucht, nur zu.

    MfG,
    Eroli
    Zuletzt bearbeitet: 29. März 2007
  2. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Hi!

    Willkommen im Forum!

    Controls können immer nur ein Parent haben. Von daher würde der Button auch von deinem MapBox-Objekt verschwinden und nur auf dem ServerOptionsPanel-Objekt angezeigt werden. Wenn Du ihn auf beiden haben willst, musst leider 2 Buttons erstellen. Kannst aber deren Control.Click-Ereigniss mit ein und der selben Methode verknüpfen... ;)

    Btw: In dem [thread=248735][C#] Beim drücken eines Buttons Fensterinhalt ändern - Thread[/thread] könntest Dir evtl noch ein paar Anregungen holen. :)
  3. Eroli

    Eroli Erfahrenes Mitglied

    Ok, das bringt aber leider nix, denn auch wenn ich die zweite Zeile auskommentiere, so ist der Button nicht auf dem MapBox-Objekt vorhanden.
    Sonst noch ideen?

    Den Link gucke ich mir jetzt an.
    EDIT: Link angeguckt - hat mich aber weder angeregt noch hat er mir geholfen :D Sorry aber is so....


    Also, sonst noch Ideen wieso der Button nicht erscheint?
    Zuletzt bearbeitet: 29. März 2007
  4. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Was ist dein MapBox-Objekt im Detail? Also was für ein Typ von Control?

    Der Link beschreibt lediglich, wie man auf einfache Weise auf UserControls oder Forms zugreifen kann, sofern diese im Programm nur einmal vorhanden sind...

    Ach hier, ganz vergessen: Runtime Object Editor - The Code Project
    Damit kannst dir deine Controls zu Laufzeit anschauen. :)
    Zuletzt bearbeitet: 29. März 2007
  5. Eroli

    Eroli Erfahrenes Mitglied

    Es ist eine PictureBox. Also eine PictureBox in der man ein Bild sehen kann.
    Meinst du das?
  6. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Soweit ich weiß, unterstützt die PictureBox keine extra Controls. Da müsstest schon ein Panel hernehmen...

    Ich arbeite leider noch nicht mit .NET 2.0. von daher kenne ich alle neue Steuerelemente noch nicht so gut. :( Schau sie Dir alle genau an und ließ dich in die Topics auf der MSDN ein. Somit bekommst erst mal einen Überblick. Es gibt zudem wirklich viele CodeClips und Casts zu den neuen Controls. ;) Vielleicht findest ein Neueres bzw. Passenderes.
  7. Eroli

    Eroli Erfahrenes Mitglied

    Also ich glaube schon, dass die unterstützt werden, denn wenn ich den Code, der jetzt im Konstruktor der Klasse steht in die Ereignissmethode des Buttons schreibe, dann erscheint der Button.

    Nur so, mit dem Umweg über den Konstruktor, eben nicht.
  8. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Sorry, aber das hab ich jetzt nicht verstanden. :D Könntest Du das mal bitte besser formulieren? Welche Ereignisbehandlung von welchem Button?

    Wie währe es wenn Du mal ein simples Beispielprojekt machst. Und mir zeigst, was wie nicht geht. Ich schaue es mir heut Abend @home mal an. Da hab ich ein VS2005 Pro. :)
  9. Eroli

    Eroli Erfahrenes Mitglied

    Beispielprojekt halte ich für etwas übertrieben, kann ich dir aber gleich gerne machen.

    Also, so wie es dort http://www.tutorials.de/forum/1394981-post1.html beschrieben steht klappt es nicht.

    Schreibe ich den Code aus dem Konstruktor der Klasse, nun aber DIREKT in das OnClick Ereigniss irgendeines Buttons schreibe, dann erzeugt dieser BUtton mir die gewünschten Buttons:
    Code (Text):
    1.         private void button1_Click(object sender, EventArgs e)
    2.         {
    3.             //Creep Creep1 = new Creep("Test", 50, 50, 25, new Point(20, 20), new Size(60, 20), "");
    4.             Button btn = new Button();
    5.             btn.Name = String.Format("DynButton{0}", 2);
    6.             btn.Text = btn.Name;
    7.             btn.Size = new Size(60,20);
    8.             btn.Location = new Point(20,20);
    9.             MapBox.Controls.Add(btn);
    10.         }
    Der obige Code-Ausschnitt klappt also. Aber warum? Oder warum klappt der verlinkte Codeausschnitt nicht?
  10. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Ähm, ich hatte doch gesagt, dass bei
    Code (C#):
    1. MapBox.Controls.Add(btn);
    2. ServerOptionsPanel.Controls.Add(btn);
    der Button von deiner PictureBox (MapBox) verschwindet und dann auf dem ServerOptionsPanel-Objekt angezeigt wird. Das wird es wohl sein, weil Controls nur ein Parent haben können. Ansonsten muss ich leider passen.
  11. Eroli

    Eroli Erfahrenes Mitglied

    Hab den Codeausschnitt jetzt aktualisiert. Es klappt leider immer noch nicht...:mad:
  12. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Von daher hab ich auch vorgeschlagen mal eine simple kleine Demo zu machen, wo Du das verhalten besser nachvollziehen kannst. Entweder Du machst mal selber eine, was für dich wohl eher besser währe, allein der Übung wegen. Ich wüsste nicht was das schaden könnte. :) Und/Oder ich mach mich heut Abend mal dran, das auch mit .NET 2.0 auszuprobieren.
  13. Eroli

    Eroli Erfahrenes Mitglied

    So, ich bin jetzt doch endlich mal auf die gloreiche Idee gekommen das ganze mal zu debuggen.

    Dabei ist mir aufgefallen, dass durch den Aufruf der Klasse mit "new" eine neue Klasse erzeugt wurde - logisch. Da diese Klasse von Form 1 abgeleitet ist, wurde damit gleichzeitig eine neue Form erzeugt - will ich nicht.
    Diese Form hab ich dann anzeigen lassen und siehe da - der Button ist da. Nur wie kann ich das jetzt so hinbekommen, dass das alles auf einer Form geht?

    Wenn ich das mit dem Vererben weglasse, dann kennt er die PictureBox wieder nicht....

    Code (Text):
    1.  
    2. //Aufruf der Klasse aus Form 1 heraus:
    3.         private void button2_Click(object sender, EventArgs e)
    4.         {
    5.             CreateButtonClass test = new CreateButtonClass();
    6.             test.Show();
    7.         }
    8.  
    Code (Text):
    1.  
    2. //Klasse:
    3.     class CreateButtonClass : [COLOR="Red"]Form1[/COLOR]
    4.     {
    5.         public CreateButtonClass()
    6.         {
    7.             Button btn = new Button();
    8.             btn.Name = "TestButton";
    9.             btn.Text = "TestButton";
    10.             btn.Size = new Size(80, 40);
    11.             btn.Location = new Point(5, 5);
    12.             [COLOR="Blue"]pictureBox.Controls.Add(btn);[/COLOR]
    13.            
    14.         }
    15.     }
    16.  
    Um die Vererbung auszuschließen, lösche ich also das rot markierte. Dann meckert er aber beim compilieren beim blau markiertem:
    "PictureBox ist im aktuellen Context nicht vorhanden" --> logisch irgendwo.

    Wie mache ich das nun richtig?
  14. Eroli

    Eroli Erfahrenes Mitglied

    So, ich hägen dann mal hiermit das Demo-Projekt an.

    Ein Freund hat mir davon abgeraten. Er kennt sich sehr gut mit Programmierung aus und meinte, dass unter anderem die GDI viel zu langsam für soetwas wäre...

    Anhänge:

    • Demo.zip
      Dateigröße:
      32,5 KB
      Aufrufe:
      25
  15. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Danke für die Demo, so kann ich mir ein besseres Bild machen. Ich werde mir das mal anschauen. Aber am WE erst, für heute hab ich größeres Pensum vor mir.
    Was dein Freund gemeint hatte, hat absolut gar nichts mit dem aktuellen Fall zu tuen. Wenn GDI+ angeblich bei C# zu langsam währe, dann frage ich mich, warum es sogar UML- und Photo-Editoren in C# gibt, die lediglich auf GDI+ basieren. ;)
  16. Eroli

    Eroli Erfahrenes Mitglied

    Nein nein, das hast du falsch verstanden, bzw ich habe es falsch geschildert.

    Also mein Vorhaben sollte so ein Nachbau werden:
    http://novelconcepts.co.uk/FlashElementTD/

    nur halt mit Multiplayermodus und einigen Erweiterungen. Die laufenden Einheiten wollte ich durch sich bewegende PictureBoxes lösen(hier: Vorübung mit Buttons). Und hier meint er hakt es. Finde ich auch verständlich, denn wenn es da 200 PictureBoxes gibt, dann kann ich mir das schon vorstellen.....
    Wenn es 200 oder noch mehr FESTE Elemente wären, wäre das kein Problem, aber wenn die sich im Millisekunden takt bewegen, dann kann ich mir Probleme gut vorstellen.

    Neuer Lösungsansatz: Direct3D - nur da bin ich noch mit dem Aufwand am gucken, ob sich das überhaupt lohnt?!
  17. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Ahh, jetzt kommen wir der Sache schon mal näher. :) So ein Spiel lässt sich nur in Direct 3D performant realisieren. Zu Direx3D hab ich einiges an guten Links. Nur habe ich sie nicht hier. Ich Poste sie demnächst. Dabei hast auch einige Spiele... :)
    Zuletzt bearbeitet: 30. März 2007
  18. Eroli

    Eroli Erfahrenes Mitglied

    Super, danke - Ich warte gerne :D
  19. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Managed DirectX Links

    So hier die Belohnung für's warten. :D

    [thread=269646]Managed DirectX - Linkliste[/thread]
    Zuletzt bearbeitet: 30. März 2007
  20. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Beispiel wie man von einer Klasse auf die Form zugreifen kann

    So, ich hab mir nun auch deine Demo angeschaut. Bei Dir liegt nur ein kleines Verständnisproblem vor. :)

    Du hast lediglich den Typ deines Forms Form1 deiner Helferklasse CreateButtonClass vererbt. Somit hast Du bei dem instanzieren deiner CreateButtonClass lediglich eine neue erweiterte Instanz von deinem Form1 erzeugt. Und daher ist auch in dem Form1 nichts passiert

    Um nun auf die Objekte deines Form1 zugreifen zu können, benötigst Du eine Referenz auf die bereits vorhandene Instanz deines Form1. Die Referenz kannst Du auf verschiedene Arten bereit stellen.
    • Via Referenz im Konstruktor der CreateButtonClass, wenn sie permanent verwendet werden soll, sie quasi ständig im Programm benötigt wird.
      Code (C#):
      1. internal class CreateButtonClass_Reference
      2. {
      3.     Form1 m_form1;
      4.     Button m_newButton;
      5.  
      6.     public CreateButtonClass_Reference ( Form1 form1 )
      7.     {
      8.         this.m_form1 = form1;
      9.     }
      10.  
      11.     public void CreateButton ()
      12.     {
      13.         this.m_newButton = new Button();
      14.         this.m_newButton.Name = "TestButton";
      15.         this.m_newButton.Text = "TestButton";
      16.         this.m_newButton.Size = new Size( 80, 40 );
      17.         this.m_newButton.Location = new Point( 5, 5 );
      18.         this.m_newButton.Click += new EventHandler( m_button_Click );
      19.         this.m_form1.pictureBox.Controls.Add( this.m_newButton );
      20.     }
      21.  
      22.     void m_button_Click ( object sender, EventArgs e )
      23.     {
      24.         this.m_newButton.Dispose();
      25.     }
      26. }
    • Via Referenz einer statischen Methode oder Funktion die auf die PictureBox zugreifen soll.
      Code (C#):
      1. internal class CreateButtonClass_Static
      2. {
      3.     public static void CreateButton ( PictureBox pictureBox, EventHandler eventHandler )
      4.     {
      5.         Button newButton = new Button();
      6.         newButton.Name = "TestButton";
      7.         newButton.Text = "TestButton";
      8.         newButton.Size = new Size( 80, 40 );
      9.         newButton.Location = new Point( 5, 5 );
      10.         newButton.Click += new EventHandler( eventHandler );
      11.         pictureBox.Controls.Add( newButton );
      12.     }
      13. }
    • Oder Du verwendest den Singelton Pattern um das Form zur Verfügung zu stellen. Das bietet sich an, wenn ein Objekt nur einmal benötigt wird aber ständig verwendet werden soll.
      Code (C#):
      1. public partial class Form1 : Form
      2. {
      3.     #region Static Access
      4.  
      5.     static Form1 s_mainForm;
      6.  
      7.     public static Form1 GetInstance
      8.     {
      9.         get
      10.         {
      11.             if ( s_mainForm == null ) {
      12.                 lock ( typeof (Form1) ) {
      13.                     s_mainForm = new Form1();
      14.                 }
      15.             }
      16.             return s_mainForm;
      17.         }
      18.     }
      19.  
      20.     #endregion
      21.  
      22.     Button m_newButton;
      23.     CreateButtonClass_Reference m_createButtonClass_Reference;
      24.  
      25.     Form1 ()
      26.     {
      27.         InitializeComponent();
      28.     }
      29.  
      30.     void createButtonButton_Click ( object sender, EventArgs e )
      31.     {
      32.         this.m_newButton = new Button();
      33.         this.m_newButton.Name = "TestButton";
      34.         this.m_newButton.Text = "TestButton";
      35.         this.m_newButton.Size = new Size( 80, 40 );
      36.         this.m_newButton.Location = new Point( 5, 5 );
      37.         pictureBox.Controls.Add( this.m_newButton );
      38.         this.m_newButton.Click += new EventHandler( this.newButton_Click );
      39.     }
      40.  
      41.     void createButtonByReferenceButton_Click ( object sender, EventArgs e )
      42.     {
      43.         this.m_createButtonClass_Reference = new CreateButtonClass_Reference( this );
      44.         this.m_createButtonClass_Reference.CreateButton();
      45.     }
      46.  
      47.     void createButtonStaticButton_Click ( object sender, EventArgs e )
      48.     {
      49.         CreateButtonClass_Static.CreateButton( this.pictureBox, new EventHandler( this.newButton_Click ) );
      50.     }
      51.  
      52.     void createButtonBySingletonButton_Click ( object sender, EventArgs e )
      53.     {
      54.         CreateButtonClass_Static.CreateButton( GetInstance.pictureBox, new EventHandler( this.newButton_Click ) );
      55.     }
      56.  
      57.     void newButton_Click ( object sender, EventArgs e )
      58.     {
      59.         ((Control) sender).Dispose();
      60.     }
      61. }

    Anhänge:

    • Demo.zip
      Dateigröße:
      73,7 KB
      Aufrufe:
      12
    Zuletzt bearbeitet: 2. April 2007
    Eroli sagt Danke.

Diese Seite empfehlen