Grundlagen IntraWeb
-
Hallo,
ich versuche gerade mich in IntraWeb einzuarbeiten. Ich habe schon so einige Tuto's zu diesem Thema gelesen und auch das 'IntraWeb Manual' von Atozed Software zur Hand. Doch leider beziehen sich hier alle Angaben auf Delphi.
Und da liegt leider das Problem.
Ich versuche jetzt schon einige Zeit mir in meinem Projekt eine zweite Seite anzeigen zu lassen. Im Manual ist das Einbinden einer zweiten Seite ja schön beschrieben. Doch hakt es hier schon an der Einbindung der zweiten Seite. Normaler Weise geschieht das in C++ ja mit einem '#include xyz'. Doch hier geht es leider nicht! Was muss ich machen, um eine zweite, dritte, vierte,... Seite einzubinden??????SG
Torsten
-
...ist denn niemand da, der schon mal etwas mit IntraWeb gemacht hat?????
Gruß Torsten
-
torsten_156 schrieb:
Im Manual ist das Einbinden einer zweiten Seite ja schön beschrieben.
Hast du gerade mal einen Link?
-
Hi audacia,
hier mal ein kleines manual: http://www.delphi-treff.de/tutorials/netzwerk-und-internet/einfuehrung-in-intraweb/
Auf der Seite "Eine zweite Seite" ist geschrieben, dass man die Unit2 einbinden muss. Klar, habe ich versucht mit
#include "Unit2.h"
Doch leider kann ich immer noch nicht diese Seite ansprechen??? Geht dann natürlich weiter mit
TIWForm2.Create(WebApplication).Show;
Da ich leider Unit2 nicht eingebunden kriege, geht auch das nicht...
Gruß Torsten
-
Sollte vermutlich so funktionieren. Bitte Fehlermeldungen posten.
-
Hi,
nachdem ich nun mit#include "Unit2.h";
die zweite Seite eingebunden habe, sollte diese doch mit
IWForm2->...
anzusprechen sein. Doch leider kommt nach dem -> kein Vorschlag (...was man alles so eingeben kann)?
Also weis Seite1 nicht, dass es eine Seite2 gibt...?
Gruß Torsten
-
Hallo
und in der Unit2 steht
class IWForm2 : TForm
Mfg
Klaus
-
Hallo Klaus,
ja, das steht (fast) da. Hier mal der Code aus den einzelnen Units:
Unit1.cpp
#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "IWBaseControl" #pragma link "IWBaseHTMLControl" #pragma link "IWCompButton" #pragma link "IWCompEdit" #pragma link "IWCompLabel" #pragma link "IWControl" #pragma link "IWVCLBaseControl" #pragma resource "*.dfm" //--------------------------------------------------------------------------- __fastcall TIWForm1::TIWForm1(TComponent* Owner) : TIWAppForm(Owner) { } //--------------------------------------------------------------------------- void setAsMainForm() { TIWForm1::SetAsMainForm(); } #pragma startup setAsMainForm void __fastcall TIWForm1::IWButton1Click(TObject *Sender) { //WebApplication->ShowMessage("Hallo " + IWEdit1->Text); TIWForm2-> } //---------------------------
Hier die Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <IWAppForm.hpp> #include "IWBaseControl.hpp" #include "IWBaseHTMLControl.hpp" #include "IWCompButton.hpp" #include "IWCompEdit.hpp" #include "IWCompLabel.hpp" #include "IWControl.hpp" #include "IWVCLBaseControl.hpp" //--------------------------------------------------------------------------- class TIWForm1: public TIWAppForm { __published: // IDE-managed Components TIWEdit *IWEdit1; TIWButton *IWButton1; TIWLabel *IWLabel1; void __fastcall IWButton1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TIWForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- #endif
Die Unit2.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "IWBaseControl" #pragma link "IWBaseHTMLControl" #pragma link "IWCompLabel" #pragma link "IWControl" #pragma link "IWVCLBaseControl" #pragma resource "*.dfm" //--------------------------------------------------------------------------- __fastcall TIWForm2::TIWForm2(TComponent* Owner) : TIWAppForm(Owner) { } //---------------------------------------------------------------------------
und die Unit2.h
//--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <IWAppForm.hpp> #include "IWBaseControl.hpp" #include "IWBaseHTMLControl.hpp" #include "IWCompLabel.hpp" #include "IWControl.hpp" #include "IWVCLBaseControl.hpp" //--------------------------------------------------------------------------- class TIWForm2: public TIWAppForm { __published: // IDE-managed Components TIWLabel *IWLabel1; private: // User declarations public: // User declarations __fastcall TIWForm2(TComponent* Owner); }; //--------------------------------------------------------------------------- #endif
Wie man sehen kann, steht da noch nicht viel. Ich hoffe du kannst mir einen Tip geben, was ich ändern/zufügen muss.
Vielen Dank und Gruß
Torsten
-
...ich komme einfach nicht weiter
Wie bekomme ich die zweite Form angesprochen???SG
Torsten
-
Hallo
Zunächstmal : TIWForm2-> wird dir auf keinen Fall helfen. Das ist nur die Klasse, du brauchst aber eine Instanz der Klasse. Normalerweise erzeugt der Builder bei Forms immer automatisch eine passende Instanz, die über einen festen globalen Zeiger angesprochen werden kann. In deinem Fall wäre das IWForm2-> . Allerdings ist in deinem Auszug aus Unit2.h dieser Zeiger nicht deklariert, was auch bedeutet das keine Instanz erzeugt wird. Dieses Verhalten ist normalerweise in den Projektoptionen unter Forumulare/Automatisch erzeugen regulierbar. Schau also ob du das für deine Forms wieder anschalten kannst.
Sollte das nicht gehen, kannst du natürlich immer noch im Quellcode von TIWForm1 dynamisch eine Instanz von TIWForm2 erstellen und benutzen. Siehe new und delete.
bis bald
akari
-
Hallo akari,
ich stehe irgendwie auf'm Schlauch
Im Handbuch habe ich jetzt folgenden Hinweis gelesen:
8.12 Note for C++ Builder users
Due to the way forms work in C++ Builder, the best place to initialize all automatic class instances is
inside the form constructor rather than within the OnCreate event handler.
This will avoid the problem of instances being created twice, problem that arises because of the
creation order of the form elements in C++ Builder. In C++ Builder the OnCreate event handler is
called before the form constructor, and the OnDestroy event handler is called after the form
destructor.
To avoid such problems, please move all the automatic class instances initialization in the form
constructor, and keep in the OnCreate event handler only the dynamically allocated instances.Da steht ja genau das, was Du mir ja geschrieben hast, oder? Nur ich habe keine Ahnung, was ich wie wo eintragen muss
Folgendes habe ich ohne Erfolg schon probiert:
__fastcall TIWForm1::TIWForm1(TComponent* Owner) : TIWAppForm(Owner) { TIWForm2 *IWForm2 = new TIWForm2; }
...und folgenden Fehler bekommen:
[BCC32 Fehler] Unit1.cpp(29): E2285 Keine Übereinstimmung für 'TIWForm2::TIWForm2()' gefunden
Vollständiger Parser-Kontext
Unit1.cpp(27): Analyse: _fastcall TIWForm1::TIWForm1(TComponent??????????
SG
Torsten
-
Hallo
1. Das new muß dorthin wo du es brauchst. Der Auszug aus der Doku besagt nur, das du statt dem OnCreate-Event immer den Konstruktor nehmen sollt, aber nicht das du immer den Konstruktor nehmen must. Du kannst also den new- Aufruf auch z.B. in einen Button-Event verlegen, wenn das besser in dein Konzept passt.
2. Die Fehlermeldung ist doch eindeutig : Es gibt keinen parameterlosen Konstruktor von TIWForm2. Sondern alle VCL-Komponenten erwarten im Konstruktor noch den Owner als Parameter. Der Owner ist für das löschen der neuen Komponente zuständig. Die Komponente lebt also nicht länger als der Owner selbst.
Du kannst auch einfach NULL als Owner übergeben (bist dann aber selbst für das löschen zuständig), wenn das besser in dein Konzept passt.Ich empfehle dir, dich in die Grundlagen von Lebenszeit, Sichtbarkeit und Speicherverwaltung von C++ einzuarbeiten. Denn das ist nicht VCL- oder IntraWeb-spezifisch, sondern sollte eigentlich beherscht werden bevor man sich an so was wagt.
bis bald
akari
-
so, jetzt hab ich's. Vielen Dank. Das mit den "...Grundlagen von Lebenszeit, Sichtbarkeit und Speicherverwaltung von C++ " sollte ich mir wirklich nochmals zu Gemüte führen...
Danke und SG
Torsten