Grundlagen IntraWeb



  • 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


  • Mod

    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


Anmelden zum Antworten