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;
// 1)   Image1.Picture.Bitmap.SaveToStream(mystream);

// 2)  desk.SaveToStream(mystream);


     {  ServerSocket1.Socket.SendStream(myStream); }
  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

user profile iconAlpha_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 := nil; // Unnötig.
  myStream := TMemoryStream.Create; // Oder TFileStream, TSocketStream etc.
  try
//    myStream := TStream.Create; // <-- 1. Fehler: Nie Instanzen von TStream erzeugen
//  2.Fehler: Create im Try..Finally
  finally
//   if assigned(myStream) then FreeAndNil(myStream); // myStream.Free macht GENAU das
    myStream.Free; // ist völlig ausreichend, weil Free prüft, ob myStream<>Nil ist...
  end;
end;


Also, nochmal:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  myStream: TStream;
begin
  myStream := TMemoryStream.Create;
  try
// Tu was mit myStream
  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;
    // Hier schreibst du alles rein was du mit lMyStream tun willst   
  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