Thema: Delphi Dienste abfragen!

Einzelnen Beitrag anzeigen

flossinger

Registriert seit: 22. Aug 2005
Ort: südlich der Alpen
109 Beiträge
 
Delphi 5 Standard
 
#3

Re: Dienste abfragen!

  Alt 13. Okt 2006, 13:24
Hallo Doktor,

hast du den code, den du postest wirklich getestet?

  socket.Create; da meckert doch der Compiler?

Deine Funktion wird im Allgemeinen immer false zurückgeben, da bei Beendigung der .open Methode die Eigenschaft .active noch false ist.

Da musst du abwarten ob onconnect oder onerror eintritt. Erst dann hast du Information, die du brauchst.

Aus dem selben Grund gibt die vorgeschlagene Variante mit try except immt true zurück, da bei Beendigung der .open Methode noch keine Exception aufgetreten ist, auch wenn sich später herausstellen sollte, dass die Vebindung nicht zustande kommt. Da wurde etwas vorgeschlagen dass nicht getestet wurde. Beim Testen hätte sich herausgestellt, dass es so nicht funktioniert.

Delphi-Quellcode:
procedure tform1.connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  (sender as tclientsocket).tag:=0;
  end;

procedure tform1.sockerr(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
begin
  form1.memo1.lines.add(inttostr(errorcode));
  (sender as tclientsocket).tag:=errorcode;
  errorcode:=0;
  end;

function test():boolean;
var
  socket: TClientSocket;
begin
  // socket.Create; // Compilerfehler <--<<<
  // socket.create(form1); // EAccessViolation <--<<<
  socket:=tclientsocket.Create(form1); // works <--<<<
  socket.OnError:=form1.sockerr;
  socket.OnConnect:=form1.connect;
  socket.Host := '127.0.0.1';
  socket.Port := 4051;
  socket.Tag := -1;
  socket.Open;
  while (socket.tag = -1) do
    begin
    form1.memo1.lines.add('looping');
    application.ProcessMessages;
    sleep(100);
    end;
  if socket.tag=0 then result:=true
     else result:= false;
  socket.Free;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if test() then memo1.lines.add('* active *')
    else memo1.Lines.add('* not active *');
  end;
Etwas eleganter wäre natürlich eine Variante ohne Warteschleife. Sie ist auch nicht nötig.

Um ohne Warteschleife aus zu kommen, verlegt man die Reaktionen auf das Zustandekommen der Verbindung in die onconnect Prozedur und die Reaktionen auf das Fehlschlagen in die onerror Prozedur.

grüsse,
der flossinger
  Mit Zitat antworten Zitat