![]() |
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:
Sobald ich GetServerMap aufrufe geht das programm mit dieser nachricht aus : "Access violation at address 00465808 in module 'Project1.exe'. Read of address 00000078'."
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; Und ich werde auf folgende zeile hingewiesen :
Delphi-Quellcode:
Wo ist der fehler?
bsize := Form1.IdUDPClient1.ReceiveBuffer(buffer,sizeof(buffer));
mfg |
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:
und erstellst das Objekt nicht neu.
Form1.IdUDPClient1.Free;
|
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:
Nur es geht leider immernoch nicht...
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; |
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 |
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 |
Re: Programm stürtzt ab...
Also ich habe den idUDPClient einfach auf die Form1 gesetzt, die sowieso erstellt wird.
Die "bruchstelle" ist :
Delphi-Quellcode:
und wenn ich den Mauszeiger über "buffer" halte erscheint keine meldung, aber über idUDPCLient1 wird gesagt das es nil ist.
bsize:=Form1.IdUDPClient1.ReceiveBuffer(buffer,8192);
PS: ich habe schon folgende procedure :
Delphi-Quellcode:
Aber bei der gibt es keine schwierigkeiten...
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; Edit1 // wenn ich idGobal bei uses hinschreibe und dann TidBytes verwende kommt nur : Undeclared identifier: 'TidBytes'... mfg |
Re: Programm stürtzt ab...
So hab das ganze jetzt mal ein wenig umgeschrieben :
Delphi-Quellcode:
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
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; Fehlermeldung : "Access violation at address 00405AE4 in module 'Project1.exe'.Write of address FFFFFFF7." Aber wieso? |
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; |
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
|
Re: Programm stürtzt ab...
Zitat:
Code:
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
// 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] (z.B. mit anderen Strings und dynamischen Arrays) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz