Entwickler-Ecke
Internet / Netzwerk - problem bei image -> savetostream
Jan11 - Mi 19.04.06 15:03
Titel: problem bei image -> savetostream
hallo, ich kriege wenn ich das programm ausführe immer "abstract error" gesagt, jetzt wüsste ich gerne, woran es liegen könnte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button2Click(Sender: TObject); begin mystream:=TStream.Create; try Image1.Picture.Bitmap.SaveToStream(myStream); ServerSocket1.Socket.SendStream(myStream); finally myStream.Free; end; end; |
vielen dank, jan
Alpha_Wolf - Mi 19.04.06 15:08
Titel: Re: problem bei image -> savetostream
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.Button2Click(Sender: TObject); var myStream: TStream; begin myStream := nil; try myStream := TStream.Create; Image1.Picture.Bitmap.SaveToStream(myStream); ServerSocket1.Socket.SendStream(myStream); finally if assigned(myStream) then FreeAndNil(myStream); end; end; |
Wenn du Free im finally aufrufst muss der Stream auch im try sein..
Ps.: ungetestet ^^
Pps.: Habs noch ein wenig "schöner" gemacht *g*
Jan11 - Mi 19.04.06 15:16
was bedeutet das "mystream := nil" ?
es geht immer noch nich, mit beiden lösungen nich
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button2Click(Sender: TObject); begin mystream := nil; try mystream:=TStream.Create;
finally myStream.Free; end; end;
end. |
Narses - Mi 19.04.06 15:26
Moin!
Min. 2 Fehler:
1: Du kannst keine Instanzen von TStream anlegen, sollte schon ein TMemoryStream, TFileStream oder TStringStream sein. Schau mal zu den Klassen in die OH. ;)
2: Du kannst so nicht vom ServerSocket aus senden:
Delphi-Quelltext
1:
| ServerSocket1.Socket.SendStream(myStream); |
Du mußt schon auf das Connections-Array zugreifen und an eine bestimmte Verbindung senden. ;) Guckst du
hier [
http://www.delphi-library.de/topic_die+Clients+von+TServerSocket+auseinanderhalten_47183.html].
cu
Narses
Alpha_Wolf - Mi 19.04.06 15:26
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var myStream: TStream; begin myStream := nil; try myStream := TStream.Create; finally if assigned(myStream) then FreeAndNil(myStream); end; end; |
Getestet und gibt keinen Fehler.
1. Hast du die Unit Classes eingebunden?
2. Wo deklarierst du eigentlich myStream?
4. Ich setz die Variable am Anfang auf Nil = nix
5. Nimm niemals nur Free.. prüfe vorher ob der Stream überhaupt kreiert wurde und dann sag Free And Nil ist sicherer und effektiver.
6. Davon abgesehen meckert der Compiler das TStream nich grad das ist was du brauchst.. TMemoryStream gbit es zB
EDIT: Ok Punkt 6 wurde schon erläutert ^^
Jan11 - Mi 19.04.06 15:48
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button2Click(Sender: TObject); begin mystream:=TmemoryStream.Create; mystream:=nil; try Image1.Picture.Bitmap.SaveToStream(mystream); ServerSocket1.Socket.Connections[0].SendStream(mystream); finally myStream:=nil; end; end; |
na immerhin schonmal nen anderer error. ja, die units sind eingebunden (meine ich zumindest, bin noch nen anfänger, du meinst doch diese ganzen sachen da oben die da immer automatisch am anfang stehen?) Und deklariert wird es bei den allgemeinen Variablen, ist sone doofe angewohnheit aus der schule :)
alzaimar - Mi 19.04.06 15:50
Alpha_Wolf hat folgendes geschrieben: |
Wenn du Free im finally aufrufst muss der Stream auch im try sein..
|
Nein. Die Instantiierung ('Create') muss/kann vor das Try. Wäre es IM 'Try..Finally', würde das Free auch aufgerufen, wenn das 'Create' fehlschlägt. Dann ist aber per definitionem kein Speicher alloziiert, also ist das Free überflüssig. Ob es wirklich *falsch* ist, ist Geschmackssache. Es ist nun mal aber so, das der Konstruktor selbst aufräumt, wenn er fehlschlägt.
Aber der Mini-Code ist auch nicht ganz richtig.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var myStream: TStream; begin myStream := TMemoryStream.Create; try finally myStream.Free; end; end; |
Also, nochmal:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var myStream: TStream; begin myStream := TMemoryStream.Create; try finally myStream.Free; end; end; |
Alpha_Wolf - Mi 19.04.06 15:58
Immer schön langsam abschreiben...:
Wenn du etwas lokal erzeugst, lokal verwendest und lokal wieder freigbist dann deklarier es auch lokal. Sonst geht dir später der Überblick verloren.
Mit Nil gibst du nix frei!! Wenn du etwas manuell erzeugst (mit Create) dann musst du es auch manuell wieder freigeben und das am besten mit FreeAndNil(DeinStream).
Assigned(DeinStream) überprüft nur ob das Objekt überhaupt kreiert wurde..
Assigned gibt wenn es das Objekt gibt true zurück deswegen steht das in ne if Anweisung.
Wenn das Objekt nicht erstellt wurde wird es auch nicht freigeben.
Benenne Lokale Variablen am besten mit einem l davor für lokal. Nur so als Tipp
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var lMyStream: TMemoryStream; begin try lMyStream := TMemoryStream.Create; finally if assigned(lMyStream) then FreeAndNil(lMyStream); end; end; |
@alzaimar
Ok du hast recht man kann es auch vorher schreiben... Deswegen auch die Überprüfung mit assigned. Somit ist das wieder ok.
EDIT: Soviel zum Thema FreeAndNil:
http://www.delphi-forum.de/viewtopic.php?t=55949&highlight=freeandnil
Narses - Mi 19.04.06 16:02
Moin!
Nochwas... ;) .SendStream überträgt das Eigentumsrecht auf den Socket. :mahn: Also muss nur im Fehlerfall der Stream wieder freigegeben werden :arrow: try-except, sonst wird der Stream freigegeben, während er gesendet wird! :shock:
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!