Laden...

"Objektverweis wurde nicht auf eine Objektinstanz festgeleg" beim Kopieren in Form mit Basisklasse

Erstellt von ChrisProg vor 6 Jahren Letzter Beitrag vor 6 Jahren 6.867 Views
ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren
"Objektverweis wurde nicht auf eine Objektinstanz festgeleg" beim Kopieren in Form mit Basisklasse

Hallo Zusammen,

Ich versuche gerade mir ein Formular-Basisklassen-System aufzubauen, also eine Basisform, von der die anderen Formen abgeleitet werden - das klappt soweit wunderbar ...

Will ich nun aus anderen Forms mehrere Objekte (Panel, Textboxen, Label, etc.) per Strg+C u. Strg+V einkopieren erhalte ich immer folgende Fehlermeldung:> Fehlermeldung:

Fehler beim Verarbeiten dieses Befehls.
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Kopiere ich nur ein Obkejt funktioniert es (außer bei Panel) 🤔

Gibt es eine Möglichkeit die Entwicklungsumgebung für solche Fälle in den Debug-Mode zu bekommen, um den Fehler eventuell zu korrigieren oder was kann ich sonst tun, damit ich wieder mehrere Objekte gleichzeitig kopieren kann - das spart doch einiges an Zeit ...

MfG Christian

16.806 Beiträge seit 2008
vor 6 Jahren

Arbeitest Du wirklich noch mit VS 2010, wie es Deinem Profil hinterlegt ist? 🤔

656 Beiträge seit 2008
vor 6 Jahren

Ohne weiteres Infos ist es hier recht schwierig, dir genauere Hinweise zu geben. Pauschal hätte ich mal gesagt, dass in der Basisklasse irgendwo im Konstruktor oder in überschriebenen Events (zb OnPaint) die NullRef triggert, weil im Designer nicht notwendigerweise alles initialisiert ist.

Aber du könntest mal versuchen, ein zweites Visual Studio zu starten und dich ans erste dran zu hängen. Wenns in deinem eigenen Code kracht, solltest du das damit auch rausbekommen. Eventuell vorher unter Tools > Options, Debugging den Haken bei "Enable Just my Code" weg.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Arbeitest Du wirklich noch mit VS 2010, wie es Deinem Profil hinterlegt ist? 👶

ja ...

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Aber du könntest mal versuchen, ein zweites Visual Studio zu starten und dich ans erste dran zu hängen. Wenns in deinem eigenen Code kracht, solltest du das damit auch rausbekommen. Eventuell vorher unter Tools > Options, Debugging den Haken bei "Enable Just my Code" weg.

Kannst Du mir das bitte mal genauer erklären ?

MfG Christian

656 Beiträge seit 2008
vor 6 Jahren

Kannst Du mir das bitte mal genauer erklären ?

Im zweiten Visual Studio auf Debug > Attach to Process und dort das erste Visual Studio auswählen; dann im ersten Visual Studio dein Copy&Paste durchführen.
Ab hier ist's dann dasselbe als ob du dein eigenes Programm debuggst.

Einziger Unterschied: liegt der Fehler nicht in deinem eigenen Code, kann es sein dass der Debugger nicht stehen bleibt - daher ggf. "Enable Just My Code" deaktivieren damit du auch Exceptions ohne Source bekommst.
Und für die Nummer Sicher noch aktivieren, dass der Debugger auch bei handled Exceptions stehen bleibt.

1
124 Beiträge seit 2012
vor 6 Jahren

Wenn ich das richtig verstehe, dann kopiert er im Desinger von VS 2010 die Steuerelemente hin und her. Dies sollte eigentlich auch mit mehreren Steuerelementen wunderbar funktionieren.

Die Frage ist wie genau du das machst. Hast du 2 Instanzen von dem VS offen?
Wenn ja dann versuche mal die Form, aus der du die Elemente kopieren möchtest bei deinem Zielprojekt in die Projektmappe zu importieren um sie dann zu kopieren und danach dann wieder die Form aus der Projektmappe zu löschen.

Ich weiß ist ein bisschen umständlich, aber was besseres fällt mir gerade nicht ein.

MFG
Thomas

5.657 Beiträge seit 2006
vor 6 Jahren

Hi ChrisProg,

kopiere doch einfach den vom Designer kopierten Code, anstatt die Elemente im Designer. Dann siehst du auch gleich, ob es ein Problem mit dem Code gibt.

Weeks of programming can save you hours of planning

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

@BhaaL:
Leider keine Änderung ...

@123thomas:
Auch das hat leider nichts gebracht ...

@MrSparkle:
Wenn Du damit meinst, ich solle den »Form«.Designer öffnen u. mir daraus den Code kopieren - das ist ja noch umständlicher, zumal die entsprechenden Codeteile ja auch noch an diversen Stellen stehen ...

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Hast du die Option, auf eine neue Visual Studio-Version zu gehen?
Erfahrungsgemäß ist der Designer in den neuen Versionen stabiler geworden.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

leider nein ...

dann muß ich halt so weitermachen ...

Das betrifft auch komischerweise "nur" Objekte, die ich aus einer "normalen" Form auf eine Form mit einer vererbten Basisklasse kopiere; wenn ich aus einer anderen Form (oder auch der selben) mit Basisklasse kopiere, funktioniert es ... 🤔

MfG Christian

H
523 Beiträge seit 2008
vor 6 Jahren

Wenn der Windows-Forms-Designer spinnt hilft bei mir oft folgende Vorgehensweise:

  • Alle offenen Dokumente schließen
  • Projektmappe bereinigen
  • Kompilieren
D
985 Beiträge seit 2014
vor 6 Jahren

Nur mal so ganz doof gefragt:

Sprechen wir hier über WinForms oder WPF?

Ist mir nicht ganz klar ...

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

@Sir Rufo:
Hierbei über WinForms 😉

Das andere (WPF) ist nur für meine Weiterbildung 😁

MfG Christian

4.221 Beiträge seit 2005
vor 6 Jahren

Du könntest das Zielform im Code so ändern dass es von Form erbt... dann scheint das kopieren ja zu funktionieren.

Nach dem kopieren änderst Du die Form wieder so ab, dass die wieder von Deiner Baseclass erbt.

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

1.040 Beiträge seit 2007
vor 6 Jahren

Kannst du dein Projekt mal in abgespeckter Version zur Verfügung stellen?

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Du könntest das Zielform im Code so ändern dass es von Form erbt... dann scheint das kopieren ja zu funktionieren.

Nach dem kopieren änderst Du die Form wieder so ab, dass die wieder von Deiner Baseclass erbt.

Geht leider nicht, da ich aus der Basisklasse ein TabControl vererbe; und in dieses werden die Objekte kopiert ...

MfG Christian

4.221 Beiträge seit 2005
vor 6 Jahren

Mach den Designer mal im Debugger auf.. damit Du eine Ahnung hast wieso es knallt...

Hier hatte ich das mal beschrieben: UserControl kann im Designer nicht hinzugefügt werden

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

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Mach den Designer mal im Debugger auf.. damit Du eine Ahnung hast wieso es knallt...

Hier hatte ich das mal beschrieben:
>

Hat leider auch nicht geklappt; könnte aber auch daran liegen, das ich ja mein "anderes" Projekt gar nicht am "laufen" habe (wie Du in dem anderen Thread schreibst) ...

Ich bereite mal ´ne abgespeckte Version vor ...

MfG Christian

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

So, hier ist die abgespeckte Version:

Sie ist nicht lauffähig (zu weit abgespeckt, um die 256k zu erfüllen), aber das braucht sie auch nicht...

Es wird (hoffentlich) direkt beim öffnen die Maske "Mandantenstamm" (Formular) angezeigt.

Kopiert man nun aus einer anderen Instanz heraus mehrere unterschiedliche Felder, so erhält man die besagte Fehlermeldung ...

MfG Christian

1.040 Beiträge seit 2007
vor 6 Jahren

Habe sowohl im Visual Studio 2017 als auch im Visual Studio 2015 keinerlei Probleme.

Kannst du testweise dem Mandantenstamm mal einen parameterlosen Konstruktor verpassen?

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

Du meinst einfach so

public Mandantenstamm()

hat auch nichts gebracht...

Mich beschleicht der Verdacht, das es was mit meinem Rechner zu tun haben könnte; werde das mal am WE zu Hause probieren ...

MfG Christian

F
10.010 Beiträge seit 2004
vor 6 Jahren

Komplett falsche herangehensweise, aber in so ziemlich allem in dem Projekt.

Du versuchst zwar irgendwie die UI zu separieren, aber genau falsch.
Und SelectStatements haben nichts, aber auch überhaupt nichts in UI Code zu suchen.

  1. Erstelle dir UserControls die in deine TabPages kommen.
  2. Erstelle einen vernünftigen BusinessLayer
  3. [Artikel] C#: Richtlinien für die Namensvergabe
  4. Dein global ist nicht wirklich ernst gemeint, oder?
  5. Du bist sicher das du verstanden hast was das Schlüsselwort ref bedeutet?

Schau dir dringends mal [Artikel] Drei-Schichten-Architektur an

if ((Tabelle_BindingSource(x_haupttabelle, ref SQL_bindings).Find(x_hauptfeld, this.feld_mandant.Text.ToString().Trim()) != Tabelle_BindingSource(x_haupttabelle, ref SQL_bindings).Position) && (global.Tabelle_BindingSource(x_haupttabelle, ref SQL_bindings).Find(x_hauptfeld, this.feld_mandant.Text.ToString().Trim()) != -1))

Wie willst du so etwas debuggen, ganz abgesehen davon das das hier so nichts zu suchen hat in der UI.

H
523 Beiträge seit 2008
vor 6 Jahren

Habe sowohl im Visual Studio 2017 als auch im Visual Studio 2015 keinerlei Probleme.

Bei mir (VS 2015) geht es auch ohne Probleme.

ChrisProg Themenstarter:in
174 Beiträge seit 2009
vor 6 Jahren

@FZelle:
Vorab: ich bin Autodidakt und kein Studierter (und komme noch aus der VB u. FoxPro-Ära wo ich nahezu 18 Jahre erfolgreich programmiert habe) ...
Nun bin ich seit 2 Jahren dabei, mich schrittweise in C# einzuarbeiten - obwohl ich VFP immer noch für das bessere DB-Programm halte (aber es wird nicht mehr weiterentwickelt und ist auch mit 64-Bit nicht kompatibel)

Warum soll ich nicht alles das, was ich immer wieder in allen Stammmasken brauche, in eine BasisForm packen ? Wenn ich die TabControls in ein UI-Control packe, habe ich ja nur die Hälfte in einer Klasse.

Ähnlich, wie "ErfinderDesRades" tue ich mich auch schwer darin, das Drei-Schichten-Modell als Allheilmittel anzusehen - ok, der Code ist zwar durch die optische Aufteilung schneller zu finden, aber ob das nun einfacher ist ...

Das mit "global" ist im Moment mein Ernst, bis ich was besseres gefunden habe: es beinhaltet alles Methoden die ich immer wieder brauche, aber nicht in allen Form´s u. Prg´s reinschreiben will - wenn dann nämlich eine Änderung/Anpassung kommt muss man das ja wieder an allen möglichen Stellen machen ...

Das das der gekapselten Objektprogrammierung widerspricht, ist mir klar ...

Wenn Du dafür einen besseren Vorschlag hast, ich bin ganz Ohr ...

Ich denke, ich habe verstanden was das ref-Schlüsselwort bedeutet - an der von Dir gezeigten Stelle ist es natürlich nicht zweckführend (obwohl es funktioniert) - es sind dort noch viele Optimierungen zu machen, das ist mir klar (vieles davon ist noch kopierter, abgewandelter Code) ...

MfG Christian

4.931 Beiträge seit 2008
vor 6 Jahren

Hallo ChrisProg,

ich habe mir jetzt auch mal dein Test-Projekt angeschaut und ich stimme FZelle 100%ig zu.
Dein Code ist komplett unwartbar. Du hast viel zu viele No-Gos drin (gerade so als ob es absichtlich wäre).
Ein komplettes Refactoring des Codes würde auch die Zeilenanzahl drastisch reduzieren (obwohl es dann auf mehrere Klassen aufgeteilt wäre).

Gerade generische Programmierung würde deinen Code sinnvoll verbessern, anstatt z.B. so etwas


if ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "BUTTON" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "TEXTBOX" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "MASKEDTEXTBOX" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "NUMERICTEXTBOX" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "LINKTEXTBOX" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "CHECKBOX" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "RADIOBUTTON" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "COMBOBOX" |
   ((System.Windows.Forms.Control)controlHashtable[key.ToString()]).GetType().Name.ToUpper() == "MULTICOLUMNCOMBOBOX")

Edit: Mir scheint, du weißt anscheinend auch nicht, wie man eine vernünftige Projektstruktur aufbaut - du kannst dir mal das Beispielprojekt (Link ganz unten) von meinem Artikel Kommunikation von 2 Forms anschauen.

Du solltest max. 800-1000 Zeilen je Klasse als Obergrenze ansehen.

5.657 Beiträge seit 2006
vor 6 Jahren

Ähnlich, wie "ErfinderDesRades" tue ich mich auch schwer darin, das Drei-Schichten-Modell als Allheilmittel anzusehen - ok, der Code ist zwar durch die optische Aufteilung schneller zu finden, aber ob das nun einfacher ist ...

Es geht doch nicht um die Optik, das steht auch nicht so in dem verlinkten Artikel. Ein Haus bleibt doch auch nicht deswegen stehen, weil es gut aussieht, sondern weil es eine tragfähige Struktur hat.

Das mit "global" ist im Moment mein Ernst, bis ich was besseres gefunden habe: es beinhaltet alles Methoden die ich immer wieder brauche, aber nicht in allen Form´s u. Prg´s reinschreiben will - wenn dann nämlich eine Änderung/Anpassung kommt muss man das ja wieder an allen möglichen Stellen machen ...

Deiner Argumentation zufolge gibt es entweder nur eine globale Klasse mit allen Funktionalitäten oder aber redundanten Code. Das entspricht aber nicht der Realität. Hier wäre es sinnvoll, wenn du dich erstmal mit der objektorientierten Programmierung beschäftigst.

Der erste Schritt wäre zu verstehen, warum Code, wie der von FZelle und Th69 gepostete, unbedingt zu vermeiden ist.

Weeks of programming can save you hours of planning

F
10.010 Beiträge seit 2004
vor 6 Jahren

@ChrisProg:
Ich weis das erfinderdesrades einigen "neuen" Konzepten ( OOP gibt es seit ~1969 dem start von Smalltalk ) kritisch gegenübersteht, aber das bedeutet nicht das seine Ansicht hier gut ist.

Natürlich ist VFP einfacher als das was Du da mit der DB veranstaltest, wenn man es aber mal vernünftig macht ( OOP + ORM + Schichten) dann ist es bei weitem nicht mehr so unterschiedlich.

Hättest du lust mir das Projekt per PM zu schicken, dann schaue ich mal ob ich

  1. Es verstehe
  2. mal Grund rein bringe um es dir für die Zukunft zu erleichtern