Code zum Pingen in eigene Datei exportieren: wie?



  • hi
    ich hab da ein problem!
    in den vorlagen, die beim bcb6 dabei hat, hat es ein beispiel für die Pingkomponente von Indy! Ich möcht nun aber den folgenden Code in eine eigene Datei kopieren, damit ich in anderen Programmen auch Pingen kann, und trotzdem die main.cpp nicht zu gross/unübersichtlich wird!

    void __fastcall TTfrmPing::btnPingClick(TObject *Sender)
    {
         int i;
    
         ICMP->OnReply = ICMPReply;
         ICMP->ReceiveTimeout = 1000;
         btnPing->Enabled = False;
    
         try
         {
              ICMP->Host = edtHost->Text;
    
              for(i = 0; i < 3; i++)
              {
                   ICMP->Ping();
                   Application->ProcessMessages();
                   // Sleep(1000);
              }
         }
         __finally
         {
              btnPing->Enabled = True;
         }
    }
    //---------------------------------------------------------------------------
    void __fastcall TTfrmPing::ICMPReply(TComponent *ASender,
          const TReplyStatus &AReplyStatus)
    {
         AnsiString sTime, result[5];
    
         // TODO: Check for error on ping reply (ReplyStatus->MsgType?)
         if(AReplyStatus.MsRoundTripTime == 0)
         {
              sTime = "<1";
         }
         else
         {
              sTime = "=";
         }
    
         result[0] = IntToStr(AReplyStatus.BytesReceived);
         result[1] = AReplyStatus.FromIpAddress;
         result[2] = IntToStr((int)AReplyStatus.SequenceId);
         result[3] = IntToStr((int)AReplyStatus.TimeToLive);
         result[4] = sTime;
         result[5] = IntToStr(AReplyStatus.MsRoundTripTime);
    
         lstReplies->Items->Add(result[0] + " bytes from " + result[1] +
                                ": icmp_seq=" + result[2] + " ttl=" + result[3] +
                                " time" + result[4] + result[5] + " ms");
    }
    

    das exportieren der befehle in btnPingClick() war nicht so schwer! nur gibt der compiler jetzt an die Funktion ICMPReply nicht zu kennen!

    Weiss mir einer ne schöne Methode, wie ich das ganze Element des Pingens in eine eigene datei (zb ping.cpp) verlegen kann?

    vielen dank schon zum voraus!



  • Schreib in deiner neuen Datei eine Funktion, die als Parameter eine Referenz auf ein TReplyStatus-Objekt erwartet, ala String ParseReply(TReplyStatus &rstat). Dafür muss deine Datei natürlich die entsprechenden Indy-Header inkludieren. In der Funktion wertest du den ReplyStatus rstat aus, bastelst den Ergebnis-String zusammen und gibst diesen mittels return zurück.

    In zukünftigen Programmen kannst du diese Funktion dann im IdIcmpClientReply-Event aufrufen lassen, dabei den AReplyStatus übergeben und das von der Funktion zurückgegebene Ergebnis zB. jeweils zu einer StringList hinzufügen.



  • auf was setz ich dann ICMP->OnReply? und wo?



  • Gar nicht, brauchst du nicht.

    Davon abgesehen macht es auch nicht wirklich Sinn, diese "Einstellungen" der Komponente in eine externe Funktion auszulagern. Die sind üblicherweise so anwendungsspezifisch, dass sie sowieso in jedem Programm anders gesetzt werden.


Anmelden zum Antworten