Indy-Komponente bei DosFenster



  • Hi ich habe bisher die Komponente IdHttp des Indy-Packages verwendet... jetzt will ich mein Programm erstmal als "konsolen-experte",sprich DosFenster-Anwendung schreiben. Bei der Form konnte ich ja die Komponente einfach auf die Form ziehen und sogleich verwenden...
    Doch wie muss ich das jetzt machen?? Hab ja keine Form mehr...
    Hab versucht eine *.h Datei zu schreiben und dann einzubinden hat aber leider nicht so gut funktionniert, hiermal mein Quellcode:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <File1.h>    <------ selber entworfen
    #pragma hdrstop
    #include <iostream.h>
    #include <fstream>
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    using namespace std;
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
          IdHTTP1->HandleRedirects=true;
            String Quelltext = IdHTTP1->Get("http://www.google.de");
           system("PAUSE");
            return 0;
    }
    //---------------------------------------------------------------------------
    

    hier mal die Datei File1.h:

    #ifndef File1H
    #define File1H
    
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <IdBaseComponent.hpp>
    #include <IdComponent.hpp>
    #include <IdHTTP.hpp>
    #include <IdTCPClient.hpp>
    #include <IdTCPConnection.hpp>
    #include <Grids.hpp>
    TIdHTTP *IdHTTP1;
    
    #endif
    

    Leider bekomme ich keine konkrete Fehlermeldung sondern eine "Benachrichtigung über Debugger-Exception"...

    Wie kann ich die TIdHttp-Komponente bei dem Dos-Fenster verwenden bzw wie könnte ich den Timer verwenden(falls ihr das Indy-Package nicht installiert habt)

    MfG Straightflush



  • Hallo

    die Exception kommt, weil du für die Indy-Kompo keine gültige Instanz erstellt hast.
    int main(int argc, char* argv[])
    {
    IdHTTP1 = new TIdHTTP(NULL); // Instanz erstellen
    IdHTTP1->HandleRedirects=true;
    String Quelltext = IdHTTP1->Get("http://www.google.de");
    system("PAUSE");
    delete IdHTTP1; // nach gebrauch löschen
    return 0;
    }

    Noch Anmerkungen :
    - globale Variablen sind schlecht. Verwende lokale Variablen
    - system ist schlecht. Schau in die Konsolen-FAQ, den Thread Automatisches Schließen verhindern
    - Verwende sinnvollere Variablennamen als IdHTTP1

    bis bald
    akari



  • IdHTTP1 wurde halt automatisch von Borland erstellt...
    und system war halt die einzige Lösung die mir so auf die schnelle eingefallen is



  • und wie füg ich die komponente jetzt ein???

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <fstream>
    #include <iostream>
    #pragma hdrstop
    TIdHTTP *IdHTTP1;
    //---------------------------------------------------------------------------
    using namespace std;
    #pragma argsused
    int main(int argc, char* argv[])
    {
    
            return 0;
    }
    //---------------------------------------------------------------------------
    

    so gehts net 😞

    muss ich des über Komponente->Neue Komponente machen???
    da wird aber eine komplette *.cpp erzeugt??

    Gibts da irgendwo ne Anleitung wie man Komponenten einfügt? Hab leider garkeine Erfahrung damit...

    MfG Straightflush



  • Hallo

    nein, dafür gibt es weder ein Tutorial noch eine Menüoption.
    Diese Komponentenerzeugen geht nur in VCL-Anwendungen mit dem Objektinspektor.
    Wenn du ein Konsolenprogramm schreibst, must du alles manuell schreiben. Und zwar nach dem Prinzip das ich dir schon gezeigt habe.

    bis bald
    akari



  • was meinst du mit "gezeigt"??

    int main(int argc, char* argv[])
    {
    IdHTTP1 = new TIdHTTP(NULL); // Instanz erstellen
    IdHTTP1->HandleRedirects=true;
    String Quelltext = IdHTTP1->Get("http://www.google.de");
    system("PAUSE");
    delete IdHTTP1; // nach gebrauch löschen
    return 0;
    }
    

    das hier??

    MfG Straightflush



  • Hallo

    genau. Sowird nach dem C++ Standard eine dynamische Instanz einer Klasse erstellt und gelöscht.

    bis bald
    akari



  • da bekomme ich aber die Meldung "undefiniertes Symbol 'IdHTTP1'"



  • Hallo

    du must natürlich noch den Pointer deklarieren.
    Ich hatte es nicht in meinen Code augenommen, weil dazu eh dein Block mit den Inkludes und eben der Deklaration dazugehört. Also jetzt noch mal zusammen

    #include <vcl.h>
    #include <fstream>
    #include <iostream>
    #pragma hdrstop
    
    int main(int argc, char* argv[])
    {
      TIdHTTP *IdHTTP1 = new TIdHTTP(NULL); // Pointer deklarieren und Instanz erstellen
      IdHTTP1->HandleRedirects=true;
      String Quelltext = IdHTTP1->Get("http://www.google.de");
      system("PAUSE");
      delete IdHTTP1; // nach gebrauch löschen
      return 0;
    }
    

    bis bald
    akari



  • ne sry so klappts auch net... bekomme die meldung immernoch



  • Hallo

    es fehlen noch diese Includes

    #include "IdBaseComponent.hpp"
    #include "IdComponent.hpp"
    #include "IdHTTP.hpp"
    #include "IdTCPClient.hpp"
    #include "IdTCPConnection.hpp"
    

    Desweiteren must du noch schauen, das in den Projektoptionen/Verzeichnisse und Bedingungen sowohl bei den Include- als auch Library-Paths dein Indy-Verzeichnis dabei ist. (und wenn nicht, nachtragen)

    bis bald
    akari


Anmelden zum Antworten