IdHTTP Objekt erstellen aber wie??
-
Hi,
bin noch relatiev am Anfang der C++ Programmierung und wollte
mal die IdHTTP Komponente ausprobieren. Funktioniert auch alles super
wenn ich die auf meine Form ziehe und dann anspreche, aber wenn ich
die während der Laufzeit erstellen will dann bringt er nen Fehler.
Hier ist das was ich mache:TIdHTTP *IdHTTP1 = new TIdHTTP;
So und da sagt er beim Kompilieren:
Keine Übereinstimmung für 'TIdHTTP::TIdHTTP()'was mach ich denn falsch??
MFG
Maruu
-
Ich hab jetzt leider keine Indy-Kompos auf meinem Rechner installiert, aber ich denke mal du musst wohl noch einen Paramter übergeben.
-
Aha, wo finde ich denn Raus was da rein muss??
Hab jetzt mal folgendes eingegeben:TIdHTTP *IdHTTP1 = new TIdHTTP(
wenn man das macht also die Klammer am Schluss auf macht,
dann kommt ja immer so ein kleiner Hilfetext an der Stelle, da steht dann:TComponent * AOwner
const TIdHTTP &Vielleicht hilft das ja?
MFG
Maruu
-
Gewöhnt euch bloss ab (bzw. gar nicht erst an), bei der Instantiierung von VCL-Klassen aus Bequemlichkeit die "Konstruktor-Klammern" wegzulassen, nur weil einige Klassen mit parameterlosem Konstruktor das erlauben.
Bei TIdHTTP IdHTTP1 = new TIdHTTP()**;* setzt der Compiler bei obiger Fehlermeldung den Cursor nämlich genau zwischen die Klammern und teilt dir so explizit mit, wo der Hund begraben liegt. Dann einmal Shift+Strg+Space gedrückt und du siehst sofort, was da fehlt (bei aktiviertem CodeInsight).
-
Ok das hab ich jetzt gemacht mit den Klammern, nach Shift+strg+Space kommt wie oben beschrieben der folgende Dialog:
TComponent * AOwner
const TIdHTTP &Und wenn ich mit den Klammern aber ohne Inhalt kompilieren will (also so TIdHTTP *IdHTTP1 = new TIdHTTP(); )kommt folgendes:
[C++ Fehler] Source.cpp(24): E2285 Keine Übereinstimmung für 'TIdHTTP::TIdHTTP()' gefunden
[C++ Fehler] Source.cpp(26): E2316 'IdHTTP1' ist kein Element von 'TIdHTTP'Naja ich werd da auch nicht schlauer draus da ich noch ned lange C++ Programmiere. Wisst ihr mehr??
MFG
Maruu
-
Versuchs doch einfach mal mit this. Sonst halt in der Hilfe schauen.
Übrigens: da ist doch ein Unterschied zwischen NMHTTP und TIdHTTP?
-
Ahhh es werde Licht, jo jetzt hats funktioniert, ich hatte es schon mit TForm1 probiert da gings aber nicht komisch. Naja und NMHTTP und IdHTTP war nur ne Verwechslung, da ich mal mit beiden rumexperimentiert hatte.
MFG
Maruu
PS: this steht doch für die aktuelle Form wo der User gerade drauf ist oder wie
darf ich mir das vorstellen????
-
Zu this lies dir mal folgendes durch

-
Ahh danke, naja den sinn versteh ich dann noch ned ganz wieso ich dem dann sich selbst mit übergeb aber naja was solls.
Ich hätte noch ne Frage zu Exceptions, die IdHTTP Komponente löst manchmal welche aus die ich abfangen möchte, hab das jetzt so gemacht:try{
Memo1->Text=IdHTTP1->Get(Edit5->Text+"?SQLString="+Edit2->Text);
}
catch(...){
MessageBox ( NULL, "Dohh", "Error", MB_OK );
}So nun ist das Problem das das Programm trotzdem abschmiert obwohl ich das
Abfangen mit try und catch gemacht hab. Und das Programm schmiert genau in
der
Zeile mit dem Meomo1->... ab. Was mach ich falsch? Muss ich noch irgendwo was aktivieren??MFG
Maruu
-
Siehe den Beitrag zum Exception-Handling in der FAQ (unter "Drucker").
Und in Zukunft bitte die Faustregel beachten: ein Thema pro Thread, ein Thread pro Thema. Danke!
-
Ähm jetzt bin ich doch nochmal da zum thema TIdHTTP, also solange ich das
in der normalen Cpp Unit zu meinem Formular mache geht die Zeile:TIdHTTP *IdHTTP = new TIdHTTP(this);
mit "this" ohne probleme, so nun hab ich die Zeile aber in eine eigene Klasse von mir, die in einer Extra .cpp Datei mit Header datei is eingebunden und dann
zeigt this ja auf mein Objekt und genau an dieser Stelle meckert der Compiler oder Debugger was auch immer mit folgender Meldung:E2285 Keine Übereinstimmung für 'TIdHTTP::TIdHTTP(GetHtmlSource * const)' gefunden
meine Klasse heisst GetHtmlSource .
Naja ich peil jetzt leider nicht was ich der Klasse bzw. dem Objekt dann mit übergeben muss, gibts was damit es generell funktioniert???MFG
Maruu
-
Du musst ihr als Paramter deine Form übergeben. Darauf hättest du aber auch selber kommen können

In etwa so
TIdHTTP *IdHTTP = new TIdHTTP(Form1)
-
Wie du weiter oben selbst herausgefunden hast wird als Owner-Parameter TComponent oder TIdHTTP erwartet.
Bei Verwendung im Kontext einer Form bezieht sich this auf die Form, und die ist ja von TComponent abgeleitet. Bei Verwendung in einer eigenen Klasse bezieht sich this eben auf diese (bzw. eine Instanz davon), und deine Klasse ist offensichtlich weder von TComponent noch von TIdHTTP abgeleitet.
Üblicherweise übergibt man in solchen Fällen einfach NULL, ist damit aber definitiv selbst für das spätere Freigeben per delete verantwortlich. Das würde sonst nämlich notfalls der Owner bei seiner eigenen Zerstörung übernehmen.
-
Hi!
Hab jetzt erst mal die Lösung mit der Form Probiert udn es geht, so dann hab ich NULL übergeben und das geht auch. Mhhm werd wohl Null nehmen da das delete kein Problem darstellt da das Objekt nicht lange gültig ist und in der gleichen Methode wieder deletet wird. Danke für eure Hilfe.
MFG
Maruu