Autor Beitrag
Jan11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 62



BeitragVerfasst: Mi 19.04.06 15:03 
hallo, ich kriege wenn ich das programm ausführe immer "abstract error" gesagt, jetzt wüsste ich gerne, woran es liegen könnte:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mi 19.04.06 15:08 
ausblenden 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*

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Jan11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 62



BeitragVerfasst: Mi 19.04.06 15:16 
was bedeutet das "mystream := nil" ?
es geht immer noch nich, mit beiden lösungen nich

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.


Zuletzt bearbeitet von Narses am Mi 19.04.06 15:28, insgesamt 2-mal bearbeitet
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mi 19.04.06 15:26 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 62



BeitragVerfasst: Mi 19.04.06 15:48 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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;

_________________
Na denn, dann. Bis dann, denn.
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: 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

ausblenden 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: www.delphi-forum.de/...highlight=freeandnil

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.


Zuletzt bearbeitet von Alpha_Wolf am Mi 19.04.06 16:06, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.