bmg4ever Geschrieben 6. Dezember 2004 Teilen Geschrieben 6. Dezember 2004 ich hab da nochmal ne kleine und wahrscheinlich ziemlich dämliche frage, aber... wie kann ich in einer Funktion neue Objekte jeglicher art (also einfachstes Beispiel eine integer variable) erstellen, weil sie halt erst von da an gebraucht wird. Das objekt muss nun aber von diesem moment an "global", also als instanz der entsprechenden Klasse verfügbar sein. ich will diese objekte (in meinem fall konkret sind es datanbanktools, wie sqladapter) halt auch erst speziell in einer funktion erzeugen und nicht schon vorher im code festlegen und dann in der funktion nur speziell intitalisieren, da der benutzer des geplanten programms diese komponenten evtl. nie benötigt. kann mir da vielleicht mal jemand ein Beispiel für eine integervariable coden: public class Form1 : System.Windows.Forms.Form { ..... private funktion1() { int i = 6; } ... private funktion2() { /*nach aufrufen von funktion1 soll i auch hier und in anderen funktionen verfügbar sein*/ } ... } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mister A Geschrieben 6. Dezember 2004 Teilen Geschrieben 6. Dezember 2004 Laut deinem Beispel muss i mindestens in der Form global definiert werden. Also dort wo auch die ganzen Controls des Formulars deklariert sind, musst du deinen integer bereitstellen. Eine andere möglichkeit wäre eine struktur mit öffentlichen statischen Mitgliedern, mit dere Hilfe du dann z.B. von mehreren Formularen drauf zugreifen/ diese nutzen könntest. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bmg4ever Geschrieben 6. Dezember 2004 Autor Teilen Geschrieben 6. Dezember 2004 erstmal danke mister (cooler nick ) aber täusch ich mich, oder hilft mir eine struktur hier nicht. die von der struktur erstellte instanz ist doch dann wieder nur lokal und wird beim beenden der funktion vom (manchmal doch nicht so tollen ) wastebasket des .NET Framework freigegeben. eigentlich war sinn und zweck der ganze sache einen kompletten datenbankzugriff zur laufzeit zu generieren, also kein element fest zu initialisieren. das dataset ist nun das entscheidende. es muss auch noch nach dem laden der datenbank existieren. so müsste ich im moment alles in eine funktion schreiben und das will ich auf gar keinen fall. ist es nicht möglich zur laufzeit neue "globale" bzw. klassenlokale objekte egal welcher art zu erzeugen ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Idexe Geschrieben 6. Dezember 2004 Teilen Geschrieben 6. Dezember 2004 naja wir wärs so ? public class Form1 : System.Windows.Forms.Form { private DataSet theSet = null; private funktion1() { theSet = new DataSet(...); } ... private funktion2() { theSet.tuWas(); } ... } meintest du so ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mister A Geschrieben 6. Dezember 2004 Teilen Geschrieben 6. Dezember 2004 Danke bmg4ever. ja, so ungefähr wie Idexe das gemacht hat, z.B... Das Problem was du dann hast ist, daß du verstärkt auf die Objekte achten musst, auf die du zugreifst, weil du nie weist ob es nicht "null" ist, würde ich sagen. Zur struktur: public struct Global { public static string DBName; //... } Damit solltest du über "Global.DBName" ohne Instanz zugreifen können. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bmg4ever Geschrieben 6. Dezember 2004 Autor Teilen Geschrieben 6. Dezember 2004 danke für eure bemühungen habs jetzt auch so gemacht, wie idexe, obwohl das ja nicht ganz das ist, was ich mir erhofft hatte. kann ich nun auch, wenn ich neue Komponenten für die Form (z.B. labels oder Buttons) zur leufzeit erzeugen will, diese nur global verfügbar machen, wenn sie mit ihrem namen entsprechend in der klasse vorgemerkt sind? oder erledigt sich das in einem solchen Fall durch die Zuweisung eines "parent" von alleine? kann ich leider erst morgen selber ausprobieren. hab zuhause kein .NET ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 6. Dezember 2004 Teilen Geschrieben 6. Dezember 2004 Hmm .. parent sollte eigentlich reichen: Button b = new Button(); b.Text = "Bla"; b.Size = new Size(40,20); b.Location = new Point(200,200); this.Controls.Add(; [/code] Kanns jetzt hier auch net testen, hab auch kein .NET hier Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mister A Geschrieben 7. Dezember 2004 Teilen Geschrieben 7. Dezember 2004 Ja, das geht. Ich mach das nicht mit Buttons sondern mit Labels, die ich zur Laufzeit erzeuge, aber diese sind dann (wenn fertig erstellt, als != null) verfügbar und man kann auch auf deren Events reagieren, wenn du das meinst. Allerdings musst du den entsprechenden events natürlich noch einen Handler zuweisen, der auf die dafür zuständige Methode verweist. Um das obige Bsp aufzugreifen: b.Click += new System.EventHandler(this.b_Click); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 7. Dezember 2004 Teilen Geschrieben 7. Dezember 2004 Wert-Typen (z.B. init) solltest Du immer möglichst frühzeitig initialisieren, z.B. im Konstruktor. Dein Vorhaben macht nur bei Referenz-Typen (z.B. Bitmap) Sinn, deren Objekte relativ viele Resourcen beanspruchen und die wirklich nur selten gebraucht werden. Einfach, wie bereits vorgeschlagen, eine Variable (Referenz) in der Klasse anlegen und anfangs mit null initialisieren. Du kannst Dir nun eine Init-Methode schreiben, die, wenn sie aufgerufen wird, die Objekte erzeugt, falls dies noch nicht geschehen ist. Diese Methode rufst Du dann einfach zu beginn jeder anderen Funktion auf, die die Objekte benötigt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Idexe Geschrieben 7. Dezember 2004 Teilen Geschrieben 7. Dezember 2004 kleiner Tipp: Wenn man auf das Set über ne Property zugreift und im get auf null prüft hat man das Problem an einer Stelle gelöst und man kann es nicht vergessen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.