Laden...

NullObject - Referenzen die noch nicht existieren

Erstellt von Nullpunkt vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.792 Views
N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren
NullObject - Referenzen die noch nicht existieren

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

M
1.439 Beiträge seit 2005
vor 17 Jahren

Ja das Object zuvor erzeugen 😉

was genau willst du denn machen?

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

S
8.746 Beiträge seit 2005
vor 17 Jahren

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?

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

49.485 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

Hi!

In einer Hashtable wären Platzhalter nicht notwendig 🙂

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

49.485 Beiträge seit 2005
vor 17 Jahren

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

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

Hi!

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

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

@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

564 Beiträge seit 2006
vor 17 Jahren

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.

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

564 Beiträge seit 2006
vor 17 Jahren

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 🙂

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

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:

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

Du hattest ja auch schon sowas im Sinn.

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

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

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

N
Nullpunkt Themenstarter:in
277 Beiträge seit 2005
vor 17 Jahren

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

S
8.746 Beiträge seit 2005
vor 17 Jahren

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.