Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
NullObject - Referenzen die noch nicht existieren
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

NullObject - Referenzen die noch nicht existieren

beantworten | zitieren | melden

hi,

wenn ich zB eine List<> fülle und ein object hinzufügen möchte,
dass noch nicht existiert, dann erhalte ich ja den error, dass auf ein
nicht existierendes objekt verwiesen wurde.

kann ich das irgendwie umgehen?

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1.439
Herkunft: Linz, Austria

beantworten | zitieren | melden

Ja das Object zuvor erzeugen ;-)

was genau willst du denn machen?
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

hi,

hehe.. naja, das geht eben nicht immer.
also es geht mir darum vordefinierte abläufe zu erfassen.

ich stell mir eine art queue in der form eines array oder einer list vor.

das problem ist das ich noch nicht existente objekte
,listbox einträge,htmlElemente etc noch nicht referenzieren kann.

in meinem verständniss sehe ich 2 möglichkeiten:

1)
das nicht-existente objekt mit einem dummy zu referenzieren.
und dann wenns existiert neu zu instanziieren.

2)
das nicht existente objekt als STRING in meine queue hinzufügen und
dann wenns gebraucht wird, das objekt mit hilfe des strings
neu zu instanziieren oder zu konvertieren (reflection/casting)

ich habe soo viel probiert und habe bereits in einigen threads nach lösungen
gesucht, bin aber noch nicht fündig geworden.

wäre echt geil, wenn mir jemand helfen könnte.

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von Nullpunkt
das problem ist das ich noch nicht existente objekte
,listbox einträge,htmlElemente etc noch nicht referenzieren kann.

Warum willst du das tun?
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

hi,

weil ich die queue bzw. die list danach abarbeiten will.
so kann ich zB diverse abläufe in einem file oder so speichern.

wenn ich die app dann starte, dann lade ich ein "arbeits-schritt"-file
und arbeite schritt für schritt ab.

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi!

Für diese Aufgabe eignet sich eine Hashtable statt einer gewöhnlichen Liste ganz gut. Verwende dafür das Dictionary<T,T>, die Schlüssel/Wert-Datentypen kannst du dabei selbst festlegen und über die Collection der Schlüssel könntest du iterieren.

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Nullpunkt,

du brauchst so oder so ein Objekt. Wenn du das eigentliche Objekt noch nicht hast, musst du einen Stellvertreter erzeugen und verwenden.

herbivore
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi!

In einer Hashtable wären Platzhalter nicht notwendig

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo der Marcel,

hm, ich denke, dass man mit einer Hashtable (Dictionary) auch nicht um den Kern meiner Aussage herumkommt. Nur dass der Stellvertreter dann eben der Key ist. Außerdem schrieb ja Nullpunkt was von Queue, dass spricht dafür, dass eine Reihenfolge eingehalten werden muss, die bei eine Hashtable erstmal nicht gegeben ist.

herbivore
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

hi zusammen,
vielen dank für eure hilfe!!

habe grade noch deinen thread (herbivore) über "grundlegendes zu hashtables"
gelesen. aber ja, ich muss die reihenfolge zwingend einhalten.

fällt die hashtable also nun weg?
und wie würde ich ein stellvertretet objekt erstellen?

gehen wir dabon aus, dass ich das objekt
web1.Document.All["meinUmsatz"].innerText verwenden möchte, dass noch nicht existiert..

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi!

Wenn du die Reihenfolge vorher schon genau weißt, würde ich die Hashtable weiter vorne sehen

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

@der Marcel,

ok, ich steh leider voll aufm schlauch mit diesen datentypen.
über das thema hashtables/dictionary erhalte ich in msdn deutsch
eine leere seite und in us-en begreif ichs auch nicht 100%

der Marcel,
muss ich das so notieren:


Dictionary<HtmlElement,string> hans = new Dictionary<HtmlElement,string>();
hans.Add(inet.Document.Links[7],"test");

oder doch so?


Dictionary<string,string> hans = new Dictionary<string,string>();
hans.Add("HtmlElement","inet.Document.Links[2]");


ich kriege bei der ersten lösung den selben error wie vorher (objekt ist null).

ich sehe echt den wald nicht mehr, wäre lieb wenn du mir vielleicht
ein kurzes beispiel zeigen/machen könntest?

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi Nullpunkt!

Da die Reihenfolge bei dir anscheinend von vornerhein feststeht (Soll heißen, dass du schon beim ersten weißt, dass es meinetwegen an die 100. Stelle kommt) würde ich auch ein Dictionary verwenden.

Mein Vorstellung, welche ich beim Antworten hatte, war das Codebeispiel von herbivore in Grundlegendes zu Hashtables, welches ich hier nochmal herausgreife:

a [5] = 97;
a [8798] = 97;
a [9979679] = 97;

Das würde an dieser Stelle bedeuten, dass der Schlüsseldatentyp ein int ist.
Bei

Dictionary<HtmlElement,string> hans = new Dictionary<HtmlElement,string>();
hans.Add(inet.Document.Links[7],"test");

geht wahrscheinlich schief, dass inet.Document.Links[7] = null ist und damit kein Objekt dahinter steht. Stattdessen würde ich eben schreiben

Dictionary<int, string> hans = new Dictionary<int, string>();
hans.Add(7,"test");



der Marcel

EDIT1+2: Berichtigungen

EDIT3: Seltsamerweise bekomme ich auch leere Seite bei der deutschen Dictionary-Hilfe in der MSDN, würde meinen, ich war da schonmal.
Alternativ steht sie aber in der Offline-Version der MSDN auf Deutsch bereit.
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

vielen dank für deinen ausführlichen beitrag.
das problem ist aber, dass die struktur der verschiedenen
nicht-existenten objekten nicht immer gleich ist.

zB:

1)
inet.Document.Links[0]

2)
inet.Document.Links["test"]

3)
inet.Document.All["sonstwas"]

4)
inet.Document.Forms[0]....


verstehts du?
ich sollte also schon die ganze referenz erfassen können : (

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi!

Nun habe ich 2 Fragen:
Weißt du bei jedem Element die exakte Position in der Liste? (also zB Index 100)
Oder fügst du zwischen 2 vorhandenen Objekten eins ein und die genaue Indexierung ist variabel?
Wenn die Indexierung variabel ist (was ich bisher nicht angenommen hatte), dann wäre vielleicht eine List<> doch das richtige, diese hat eine Methode Insert

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

hi der Marcel,

nein, ich weiss zu beginn an jede position in der queue..
das problem bei der list ist doch genau dasselbe:

wenn ich dort einträge adden will, dann gibts n error, weil
das objekt noch nicht existiert.
und wenn ichs als string adde zB "iner.Document...."

dann klappts zwar, weils n string ist, ich kanns aber nacher nicht mehr verarbeiten.

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi Nullpunkt!

Dann doch ein Dictionary!

Welche Objekte möchtest du denn Adden?
ich dachte vorhin inet.Document.Links[7] ist nicht das Element, welches du Adden möchtest. Scheint es aber zu sein, oder?
Mit dem Dictionary müsste der Fall doch dann klar sein. Wenn die Elementposition vorher fest steht, dann erstellst du ein Dictionary<int, Link>. das int steht als Schlüssel für die Position in der Reihenfolge und der Wert ist dann das zugehörige Objekt (in meinem Beispiel Link) an dieser Stelle. Ich denke, du hast bisher vielleicht den Sinn von Schlüssel und Wert verwechselt.

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

hi der Marcel,

also wenn ich dich richtig verstanden habe,
dann denkst du an sowas:


Dictionary<int, HtmlElement> queue = new Dictionary<int, HtmlElement>();
queue.Add(0,inet.Document.Links["test"]);


das angegebene element existiert noch nicht.
aber ich weiss dass es zu einem späteren zeitpunkt mit
inet.Document.Links["test"] erreichbar sein wird.

und genau jetzt kommt das problem.
ich erhalte beim queue.Add eine fehler.
das objekt existiert noch nicht.

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi Nullpunkt!

Richtig!

Dann Adde es doch erst dann, wenn es da ist! Das heißt auf null prüfen und wenn dem so ist, nicht adden und weiter. Wenn dies nicht geht, dann musst du die schon erwähnten Platzhalter einfügen.
Der Vorteil den ich beim Dictionary sehe, ist, dass es 2 Elemente haben kann, welche sich zB jedoch schon als queue[0] und queue[89] ansprechen lassen. Über die Schlüssel kann man ja auch einfach iterieren und so jedes vorhandene Element ansprechen.

der Marcel

EDIT: Wenn es nicht geht, bützen dir auch die Platzhalter nichts, denn auch die musst du ersetzen, wenn die eigentliche Referenz dann mal auf ein Objekt zeigt
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

vielleicht muss ich ja auch eine wenig weiter ausholen.

IDEE
Ich möchte zuerst einen von mir durchgeführten webseitenbesuch
mit einigen klicks und texteingaben etc recorden.

diesen record kann ich dann zB jeden tag um 15.00 wieder ablaufen lassen.
das ziel soll dann sein, bei diesem virtuellen besuch gewisse daten wie
cookies, ladedauer etc abzuspeichern.


MOMENTANES PROBLEM
das in diesem angesprochene problem ist eben genau, dieser record bzw. diese
step-by-step liste abzuarbeiten, da noch nicht (und auch zu keiner zeit) ALLE diese
elemente und steps existieren.

das ziel soll ja sein, nach dem documentCompleted-event den nächsten
arbeitsschritt einzuleiten.

wenn ich jetzt also zB folgende 2 steps habe:


inet.Document.Links[0]    // soll geklickt werden
inet.Document.All[5]  // soll geklickt werden

dann müsste ich sowas machen:


while (inet.Document.Links[0]==Null) {
  application.DoEvents();
}
inet.Document.Links[0].InvokeMember("Click");

while (inet.Document.All[5]==Null) {
  application.DoEvents();
}
inet.Document.All[5].InvokeMember("Click");

oder so ähnlich.

genauso müssten ja dann meine arbeitsschritte aussehen.
das kann man doch sicher anders lösen.

vielleicht hast du jetzt nachdem du weisst was ich eigentlich erreichen will,
ja eine andere idee um das einigermassen gescheit zu bauen...

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo der Marcel,

ich habe jetzt nicht alles ganz genau gelesen, aber ich verstehe überhaupt nicht, warum du hier für eine Hashtable (Dictionary) plädierst. Das ist doch ein klarer Fall für eine Queue, selbst wenn man den genauen Index kennt.

Hallo Nullpunkt,

ich komme auf meinen Vorschlag von oben zurück:
Zitat
Wenn du das eigentliche Objekt noch nicht hast, musst du einen Stellvertreter erzeugen und verwenden.
Du hattest ja auch schon sowas im Sinn.
Zitat
das nicht-existente objekt mit einem dummy zu referenzieren. und dann wenns existiert neu zu instanziieren.
Mach es einfach so. Das ist gut. Wobei ich es eben nicht Dummy nennen würde, sondern Stellvertreter. Das öffnet die Option, dass man auch für die Objekte, die man sofort erzeugen kann, Stellvertreter verwendet. Diese Stellvertreter können und sollten einen sinnvollen Namen bekommen, vielleicht sowas wie Arbeitsschritt.

herbivore
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

hi herbivore,

okay, nur weiss ich nicht genau wie ich das mit den "stellvertreter" anstellen soll.
ich denke im kopf hab ichs schon zusammen, aber ich brings ned ins script.

wie würdest du das anstellen?

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Nullpunkt,

die konkrete Lösung, also das "ins Script bringen" oder auch das ausprogrammieren, bleibt eine Aufgabe, die ich dir nicht abnehmen kann. Aber konkrete Fragen - und je konkreter desto besser - kann ich gerne beantworten.

Vielleicht kommen wir sogar ganz weg vom Stellvertreter hin zu einer (neuen) Klasse Arbeitsschritt, deren Objekte immer sofort erzeugt werden können, die aber ggf. erst später mit den für den jeweiligen Arbeitsschitt nötigen Informationen gefüllt werden.

herbivore
private Nachricht | Beiträge des Benutzers
Nullpunkt
myCSharp.de - Member



Dabei seit:
Beiträge: 277
Herkunft: CH -> ZH

Themenstarter:

beantworten | zitieren | melden

alles klar..
ich wills ja grundsätzlich schon selber machen, und möchte
auch nicht das mir jemand etwas abnimmt.. aber ich habe schon soo viele
möglichkeiten probiert und sehe den wald nicht mehr vor lauter bäumen..

verstehst du? ich habe ehrlich gesagt keine ahnung in welche richtung ich gehen soll..

mfg nullpunkt
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von herbivore
Vielleicht kommen wir sogar ganz weg vom Stellvertreter hin zu einer (neuen) Klasse Arbeitsschritt, deren Objekte immer sofort erzeugt werden können, die aber ggf. erst später mit den für den jeweiligen Arbeitsschitt nötigen Informationen gefüllt werden.

Das will ich meinen. Die ursprüngliche Frage an sich zeigt, dass das Modell dahinter schräg ist.
private Nachricht | Beiträge des Benutzers