Guten Morgen,
wie kann in einer anderen Methode auf das Objekt imageStream zugeriffen
werden? Nach Ausführung der Buttonmethode btn_Load_Click soll der Button
btn_SendImage_Click ausgeführt werden. Bei der folgenden Zeile,
zeigt Visual Studio einen Fehler an. Es handelt sich hierbei um einen
NullReferenceException Fehler. Was könnte ich tun, damit ich auch in der
Methode btn_SendImage_Click auf das Objekt imageStream zugreifen kann?
Der Zugriff auf imageStream ist in der Funktion möglich.
Alles korrekt.
Das Objekt imageStream ist noch null (NullReferenceException).
Es muss irgendwo vor dem ersten Zugriff ein Objekt erzeugt werden.
z.B.
imageStream = new FileStream();
Gruß JensM
Dir ist schon klar, dass du zwei imageStreams hast?
Und nur einer davon wird initialisiert (aber auch gleich darauf wieder
abgeräumt).
csharp_user schrieb:> FileStream imageStream;csharp_user schrieb:> using (FileStream imageStream = new FileStream...
Ich möchte zuerst das Bild in ein FileStream laden. Im Anschluss möchte
ich mit der anderen Funktion btn_SendImage_Click auf den gleichen
FileStream zugreifen können, ohne das die Fehlermeldung erscheint.
>Dir ist schon klar, dass du zwei imageStreams hast?>Und nur einer davon wird initialisiert (aber auch gleich darauf wieder>abgeräumt).
Habe ich bereits berichtigt.
Trotzdem erscheint nun eine andere Fehlermeldung: sieh Anhang
Wie sieht dein Code denn jetzt aus? Verwendest du immernoch das using?
Das macht deinen Stream natürlich dicht. Wenn du den also weiter
verwenden willst, solltest du das using entfernen.
Hm Boris hat Recht, du hast 2 mal die Deklaration "FileStream
imageStream" mit gleichem Namen, komisch dass das überhaupt kompiliert.
Eine using-Direktive begrenzt den Scope einer Variablen, d.h. am Ende
des using Blocks wird der Stream wieder deinitialisiert (weil du ihm ja
sagst ich brauche ihn nur innerhalb des Bereichs).
Wenn das using keinen guten Grund hat machs wieder weg (dann musst du
aber selbst später den Stream wieder schließen, ich denke mit .Close()
oder .Dispose() oder so, schau mal im Internet), außerdem reicht da dann
imageStream ohne "FileStream" davor, das steht ja schon global einmal.
Dann müsstest du nach dem Laden von überall Zugriff auf ImageStream
haben.
Allerdings sollte in dem Send Button trotzdem nochmal auf !=null
checken, da er unter Umständen ja vor dem Laden gedrükt wird (selbst
wenn du ihn vorher ausgraust oder so ist es kein guter Stil so einen
Fallstrick offen zu lassen). Hier also eine kleine Verbesserung:
using habe ich nun entfernt:
[/c]
if (ImageOpenFileDialog.ShowDialog() == DialogResult.OK)
{
imageStream = new
FileStream(ImageOpenFileDialog.FileName, FileMode.Open,
FileAccess.Read);
}
[/c]
Allerdings ist byteSize in der while Schleife immer null:
csharp_user schrieb:> Wenn ich das Bild in der Methode btn_SendImage öffne, dann wird die> while Schleife korrekt ausgeführt.
Das sollte keinen Unterschied machen.
Frage: machst du vorher schon etwas mit dem Stream? Also NACHDEM du ihn
geöffnet hast und BEVOR du btn_SendImage_Click aufrufst?
Falls du z.B. schon daraus gelesen hast, kannst du das nicht ohne
Weiteres noch ein zweites mal tun.
Ja. Auf der Oberfläche wird die Byte Größe des Bildes und das Bild
ausgegeben. Was kann ich da tun, damit ich trotzdem in der Methode
btn_Load_Click die Bytegröße sowie das Bild ausgeben kann?
csharp_user schrieb:> Ja. Auf der Oberfläche wird die Byte Größe des Bildes und das Bild> ausgegeben. Was kann ich da tun, damit ich trotzdem in der Methode> btn_Load_Click die Bytegröße sowie das Bild ausgeben kann?
Warum willst du denn den FileStream wiederverwenden? Ich glaube das ist
nicht sinnvoll...
Öffne doch einfach immer einen neuen Filestream an den Stellen, wo du
ihn benötigst. Dann kannst du dort auch immer das using verwenden, was
dir ein sauberes Aufräumen garantiert.
Ein Stream geht Zeichen für Zeichen durch die Quelle und schreibt diese
in seinen (größenbegrenzten) Buffer den du dann stückweise oder komplett
liest. Bei jedem gelesenen Zeichen geht er daher natürlich eins weiter.
Wenn du das Bild einmal ausliest bist du am Ende des Streams angekommen,
da folgen keine weiteren Daten.
Mit Stream.Seek kannst du an den Anfang (oder andere Positionen) des
Streams zurückspringen.
http://msdn.microsoft.com/de-de/library/system.io.filestream.seek%28v=vs.110%29.aspx
Ansonsten sind Boris' Alternativen auch gut.