Avatar billede morten_s Nybegynder
01. februar 2002 - 11:20 Der er 1 løsning

Synchronize af streng


Jeg har en streng, se neden under med tilhørende hovedprogram.

Mit problem er når jeg har en fejl i tråden og ønsker at sende den til hovedprogrammet i denne kode:

inherited;
  try
    ClientSocket.Connect;
  except
    FOnErrorEvent('Could not connect to IP: '+IPNo+':'+IntToStr(Port));
    Exit;
  end;
  if ClientSocket.Connected then
    FOnStatusEvent('Connected');

Når jeg efterfølgende lukker programmet så får jegn EOS Error Code 1400 når jeg lukker mit program, jeg går ud fra at det er fordi at jeg mangler en synchronize. Hvordan gøres dette ???

Tråden ser således ud:

unit tLogOn;

interface

uses
  Classes, Dialogs, Controls, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
  TStatusEvent  = procedure(Status : String) of object;
  TErrorEvent  = procedure(Error : String) of object;
  TLogOnController = class (TThread)
  private
    FOnStatusEvent : TStatusEvent;
    FOnErrorEvent : TErrorEvent;
    procedure SetOnStatusEvent(const Value: TStatusEvent);
    procedure SetOnErrorEvent(const Value: TErrorEvent);
  protected
    procedure Execute; override;
  public
    ClientSocket : TIdTCPClient;
    IPNo : String;
    Port : Integer;
    Constructor Create;
    Destructor Destroy; override;
    property OnStatusEvent : TStatusEvent read FOnStatusEvent write SetOnStatusEvent;
    property OnErrorEvent : TErrorEvent read FOnErrorEvent write SetOnErrorEvent;
  end;

implementation

constructor TLogOnController.Create;
begin
  inherited Create(true);
  FreeOnTerminate := True;
end;


destructor TLogOnController.Destroy;
begin
  inherited;
end;

procedure TLogOnController.execute;
begin
  inherited;
  try
    ClientSocket.Connect;
  except
    FOnErrorEvent('Could not connect to IP: '+IPNo+':'+IntToStr(Port));
    Exit;
  end;
  if ClientSocket.Connected then
    FOnStatusEvent('Connected');
end;

procedure TLogOnController.SetOnStatusEvent(const Value: TStatusEvent);
begin
  FOnStatusEvent := Value;
end;

procedure TLogOnController.SetOnErrorEvent(const Value: TErrorEvent);
begin
  FOnErrorEvent := Value;
end;

end.


Og Hovedprogrammet:

unit uSyncronize;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    StatusBar1: TStatusBar;
    IdTCPClient1: TIdTCPClient;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WriteStatus(Status : String);
    procedure WriteError(Error : String);
  end;

var
  Form1: TForm1;

implementation

uses tLogOn;

{$R *.dfm}

var
  LogOnTread : TLogOnController;

procedure TForm1.Button1Click(Sender: TObject);
begin
  With LogOnTread do
  begin
    LogOnTread := TLogOnController.Create;
    OnStatusEvent := WriteStatus;
    OnErrorEvent := WriteError;
    IPNo := '192.168.1.3';
    Port := 800;
    Resume;
  end;
end;

procedure TForm1.WriteError(Error: String);
begin
  ShowMessage(Error);
end;

procedure TForm1.WriteStatus(Status: String);
begin
  StatusBar1.Panels[0].Text := Status;
end;

end.
Avatar billede morten_s Nybegynder
01. februar 2002 - 11:44 #1
Fandt selv ud af det :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester