Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm stürtzt ab... (https://www.delphipraxis.net/139325-programm-stuertzt-ab.html)

wayne312 26. Aug 2009 18:14


Programm stürtzt ab...
 
Hi leute,

ersma sorry falls ich im falschen bereich gepostet habe...
Also mein problem ist, dass mein programm immer abstürtzt sobald ich eine bestimmte procedure ausführe :

Delphi-Quellcode:
procedure GetServerMap;
var
buffer       : byte;
Stream1       : TMemoryStream;
bsize        : integer;
begin
Stream1 := TMemoryStream.Create;
Form1.IdUDPClient1.Send('ÿÿÿÿTSource Engine Query');
bsize := Form1.IdUDPClient1.ReceiveBuffer(buffer,sizeof(buffer));
Stream1.WriteBuffer(buffer,bsize);
Stream1.Position:=Length(Form1.sLabel5.Caption)+7;
Form1.sLabel6.Caption:=ReadString(Stream1);
Form1.sLabel6.Visible:=True;
Form1.IdUDPClient1.Free;
Stream1.Free;
end;
Sobald ich GetServerMap aufrufe geht das programm mit dieser nachricht aus : "Access violation at address 00465808 in module 'Project1.exe'. Read of address 00000078'."

Und ich werde auf folgende zeile hingewiesen :
Delphi-Quellcode:
bsize := Form1.IdUDPClient1.ReceiveBuffer(buffer,sizeof(buffer));
Wo ist der fehler?

mfg

mirage228 26. Aug 2009 18:19

Re: Programm stürtzt ab...
 
Wo rufst Du die Methode auf? Form1 könnte ggf. = nil sein ...

Edit: Spätestens beim 2. Aufruf der Methode muss es krachen, denn du machst
Delphi-Quellcode:
Form1.IdUDPClient1.Free;
und erstellst das Objekt nicht neu.

wayne312 26. Aug 2009 18:25

Re: Programm stürtzt ab...
 
Ersma danke für die antwort
also ich wollte die procedure nur einmal direkt am start aufrufen (bis jetzt)...

Jetzt hab ichs einfach mal so geschrieben :
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
buffer       : byte;
Stream1       : TMemoryStream;
bsize        : integer;
begin

Stream1 := TMemoryStream.Create;
IdUDPClient1.Send('ÿÿÿÿTSource Engine Query');
bsize := IdUDPClient1.ReceiveBuffer(buffer,8192);
Stream1.WriteBuffer(buffer,bsize);
Stream1.Position:=Length(sLabel5.Caption)+7;
sLabel6.Caption:=ReadString(Stream1);
sLabel6.Visible:=True;
Stream1.Free;
end;
Nur es geht leider immernoch nicht...

mirage228 26. Aug 2009 18:31

Re: Programm stürtzt ab...
 
Setz mal einen Haltepunkt an die erste Zeile. Wenn Du in der Fehlerzeile bist, könntest Du prüfen (einfach Mauszeiger drüber bewegen), ob die Variable = nil ist... sonst poste mal die Fehlerzeile -- Hast Du die Indy-Komponente einfach aufs Form gepappt oder erstellt Du die selbst? Wie rufst Du das Form auf - oder wird es automatisch aufgerufen?

Viele Grüße,

David

Klaus01 26. Aug 2009 18:37

Re: Programm stürtzt ab...
 
.. kann es vielleicht daran liegen, dass dein Buffer nur ein (1) Byte groß ist
und Du da 8Kbit hineinschreiben willst.
ReceiveBuffer erwartet in der Regel TidBytes was einem Array of Bytes entspricht.

Grüße
Klaus

wayne312 26. Aug 2009 18:42

Re: Programm stürtzt ab...
 
Also ich habe den idUDPClient einfach auf die Form1 gesetzt, die sowieso erstellt wird.
Die "bruchstelle" ist :
Delphi-Quellcode:
bsize:=Form1.IdUDPClient1.ReceiveBuffer(buffer,8192);
und wenn ich den Mauszeiger über "buffer" halte erscheint keine meldung, aber über idUDPCLient1 wird gesagt das es nil ist.

PS: ich habe schon folgende procedure :

Delphi-Quellcode:
procedure GetServerName;
begin
Form1.idUDPClient1.Send('ÿÿÿÿTSource Engine Query');
Form1.sLabel5.Caption:=(Form1.idUDPClient1.ReceiveString(-1));
Form1.sLabel5.Caption:=StringReplace(Form1.sLabel5.Caption,'ÿÿÿÿI','',[rfReplaceAll]);
Form1.sLabel5.Visible:=True;
Form1.idUDPClient1.Send('ÿÿÿÿi');
Form1.sLabel3.Caption:=(Form1.idUDPClient1.ReceiveString(-1));
if Form1.sLabel3.Caption=('ÿÿÿÿj00000000000000') then begin
Form1.sLabel3.Caption:=('ON');
Form1.sLabel3.Font.Color:=(clGreen);
end
else
Form1.sLabel3.Caption:=('OFF');
end;
Aber bei der gibt es keine schwierigkeiten...

Edit1 // wenn ich idGobal bei uses hinschreibe und dann TidBytes verwende kommt nur : Undeclared identifier: 'TidBytes'...

mfg

wayne312 27. Aug 2009 15:44

Re: Programm stürtzt ab...
 
So hab das ganze jetzt mal ein wenig umgeschrieben :

Delphi-Quellcode:
procedure GetServerMap;
var
s,bsize      : integer;
a            : TBytes;
Stream1       : TMemoryStream;
map          : string;
begin
Stream1 := TMemoryStream.Create;
s:=16384;
SetLength(a,s);
if Form1.sLabel3.Caption=('ON') then begin
Form1.IdUDPClient1.Send('ÿÿÿÿTSource Engine Query');
bsize := Form1.IdUDPClient1.ReceiveBuffer(a,s);
Stream1.WriteBuffer(a,bsize);
Stream1.Position:=Length(Form1.sLabel5.Caption)+7;
ShowMessage(ReadString(Stream1));
Stream1.Free;
end
else
ShowMessage('Der Server ist momentan Offline');
Stream1.Free;
end;
So und ich bin durchgegangen : Die ganze Procedure läuft durch und die Nachricht mit "map" wird auch angezeigt, nur bei der zeile "end;" bekomm ich die
Fehlermeldung : "Access violation at address 00405AE4 in module 'Project1.exe'.Write of address FFFFFFF7."

Aber wieso?

DeddyH 27. Aug 2009 15:51

Re: Programm stürtzt ab...
 
Du gibst den Stream ggf. 2 mal frei. Versuch es mal so:
Delphi-Quellcode:
procedure GetServerMap;
var
  s,bsize      : integer;
  a            : TBytes;
  Stream1       : TMemoryStream;
  map          : string;
begin
  Stream1 := TMemoryStream.Create;
  try
    s:=16384;
    SetLength(a,s);
    if Form1.sLabel3.Caption=('ON') then begin
      Form1.IdUDPClient1.Send('ÿÿÿÿTSource Engine Query');
      bsize := Form1.IdUDPClient1.ReceiveBuffer(a,s);
      Stream1.WriteBuffer(a,bsize);
      Stream1.Position:=Length(Form1.sLabel5.Caption)+7;
      ShowMessage(ReadString(Stream1));
    end
    else
      ShowMessage('Der Server ist momentan Offline');
  finally
    Stream1.Free;
  end;
end;

wayne312 27. Aug 2009 16:32

Re: Programm stürtzt ab...
 
ersma danke für die antwort.. nur leider gehts immernochnicht auch wenn ich 2. Stream1.Free; mache ... er führt alles aus aber wenn die prozedur zu ende ist kommt die meldung

himitsu 27. Aug 2009 16:40

Re: Programm stürtzt ab...
 
Zitat:

Delphi-Quellcode:
Stream1.WriteBuffer(a,bsize);

vermutlich, weil du dir mit solchen Dingen den Stack oder sonstwas zerschießt?

Code:
// zeigt auf den internen Zeiger bzw auf die Variable
[color=silver]var[/color] a
@a

// zeigt auf die Daten des Arrays
[color=silver]var[/color] a[0]
@a[0]
PS: das mit dem a[0] ist nur ein Beispiel, denn ich hab jetzt nicht nachgesehn, ob du sowas auch noch an anderer Stelle machst
(z.B. mit anderen Strings und dynamischen Arrays)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf