Witam, przy zamykaniu programu pojawia mi sie taki błąd. I nie wiem jak sobie z nim poradzić. Muszę przez to zamykać program przez managera zadań
Znalazł się...
A tak może kod źródłowy ?
Średnio 6.5/10 przypadków, to idiota, który nie da kodu .
Za to dał olbrzymiego screena. Oprócz kodu napisz też czy błąd występuje zawsze przy zamknięciu czy tylko jak program wykona/jest w trakcie wykonywania jakaś czynność.
//EDIT
Błąd tkwi w tym:
hgg1.disconnect;
jak to usunałem to działa poprawnie
Jeszcze może ktoś wie dlaczego trzeba napisać kilka razy do bota, żeby dopiero załapał że ma odpowiadać... ?
\
jestem nowy na forum, tak więc przepraszam i daję kod.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, HGG,
StdCtrls, ExtCtrls, Grids, ValEdit, Mask;
type
TForm1 = class(TForm)
HGG1: THGG;
Button1: TButton;
PlStatus: TPanel;
Button2: TButton;
Memo1: TMemo;
TmpEdit: TEdit;
Label1: TLabel;
Command: TValueListEditor;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit3: TEdit;
Edit5: TEdit;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
MaskEdit1: TMaskEdit;
Label8: TLabel;
procedure HGG1Message(Sender: TObject; GGNumber: Integer;
MessageContent: String; MessageTime: TDateTime);
procedure Button1Click(Sender: TObject);
procedure HGG1Connected(Sender: TObject);
procedure HGG1Disconnected(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CommandKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
try
hgg1.Number := strtoint(Edit3.Text);
hgg1.Password := MaskEdit1.Text;
HGG1.Host := HGG1.GetServerAddress;
hgg1.Status:=usAvailable;
hgg1.connect;
except
ShowMessage('Wystąpił błąd');
hgg1.Disconnect;
end;
end;
procedure TForm1.HGG1Connected(Sender: TObject);
begin
Label3.Color := clLime;
Label3.Caption :='Polaczony';
hgg1.Description := Edit5.Text;
end;
procedure TForm1.HGG1Disconnected(Sender: TObject);
begin
Label3.Color := clRed;
Label3.Caption :='Niepolączony';
hgg1.Description := '';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
hgg1.disconnect;
end;
procedure TForm1.HGG1Message(Sender: TObject; GGNumber: Integer;
MessageContent: String; MessageTime: TDateTime);
var
Reply : string;
Row : integer;
begin
Memo1.Lines.Add('['+DateToStr(MessageTime)+']('+IntToStr(GGNumber)+') '+MessageContent);
TmpEdit.Text := MessageContent;
Command.FindRow(TmpEdit.Text, Row);
if Row = -1 then
Reply := 'Nie ma u nas takiej komendy' else
begin
Reply := Command.Values[Command.Keys[Row]];
end;
HGG1.SendMessage(GGNumber, Reply, []);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label3.Color := clRed;
Label3.Caption :='Niepolączony';
TmpEdit.Hide;
Memo1.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
RowNo : Integer;
begin
Command.FindRow(Edit1.Text, RowNo);
if RowNo = -1 then
Command.InsertRow(Edit1.Text, Edit2.Text, true)
else
ShowMessage('Jest już taka komenda w rzędzie '+IntToStr( RowNo))
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
hgg1.disconnect;
end;
procedure TForm1.CommandKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Integer(Key)=46 then
begin
if MessageBox(Handle,PChar('Czy napewno usunąć komendę '+Command.Strings[Command.Selection.Top -1]+' ?'),
'Usuwanie', MB_YESNO + MB_ICONQUESTION) = IdYes then
begin
Command.DeleteRow(Command.Selection.Top);
end;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
SaveDialog1.FileName := 'GGManiak';
if SaveDialog1.Execute then
begin
Command.Strings.SaveToFile(SaveDialog1.FileName + '.ggm');
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
OpenDialog1.Filter :='GaduGadu Bot (*.ggm)|*.ggm';
if OpenDialog1.Execute then begin
Command.Strings.LoadFromFile(OpenDialog1.FileName);
end;
end;
end.
Błąd występuje w trakcie zamykania programu.
Nie mam THGG i nie chce chce mi się tworzyć prowizorycznego projektu ale spróbuj wywalić Disconnect z FormClose a zrób go w zdarzeniu FormCloseQuery dodatkowo przechwytuj wyjątek (i na niego nie reaguj):
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
try
hgg1.disconnect;
except
//nic nie rób
end;
end;
Możesz też na potrzeby projektu (a konkretnie "walki" z tym błędem) napisać tak:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
try
hgg1.disconnect;
except
on E: Exception do
ShowMessage(E.Message);
end;
end;
Wtedy może będzie bardziej wiadomo co powoduje wyjątek.
</delphi>
a z tego co mi wiadomo to THGG nie obsługuje nowego protokołu gg. Tzn. Nie odbiera wiadomości bo jest inna struktura pakietu.
Zrobili już to?
Chyba nie, lepiej użyć TEasyGG, tylko jeżeli ktoś używa Delphi 7 Personal lub wersji
bez modułów obslugujących TXMLDocument to musi je sobie skombinowac albo - co
bardziej właściwe - zakupić takową wersję, która ma te moduły (choćby Enterprise).
Można też mozolnie edytować kod aby korzystał z jakiegoś datmowego Parsera XML.
Swego czasu sugerowałem autorom w nowej wersji użycie czegoś zewnętrznego, ale
do tej pory ostatnia wersja to 0.02 i nie wiadomo czy doczekamy się jakiejś nowszej.