Gibt es im BCB etwas wie Cookie oder einer Session-Variable?



  • Hallo Zusammen,
    danke für eure Hinweise.

    @Dingo,
    die Session-Variable sollte ein Beispiel sein um mein Problem ziemlich leicht jemand anderem verständlich zu machen.

    Jetzt habe ich noch eine Frage:
    Ich habe jetzt als Hauptfenster das Login-Formular. Wenn sich der User jetzt einloggt möchte ich, dass sich das Login Fenster schließt und ein neues Formular aufgeht.
    Das habe ich so weit auch hin bekommen. Jetzt meine Frage:
    Kann ich während eines erfolgreichen Login-Versuchs dem neuen, zweiten Formular mitteilen, dass es jetzt das Hauptformular ist und das Login-Formular komplett schließen??

    Danke im voraus
    Gruß
    EPMS



  • Sicher.

    Praktischer wäre es aber wohl, das Hauptformular Hauptformular sein zu lassen und ein extra Login-Formular zu machen, was man anzeigt und versteckt nach belieben.

    Das leichte Verständlich machen deines Problems ist dir gründlich Missglückt.



  • @Dingo,
    und wie sage ich dem Hauptformular beim Programm-Start das es nicht sichtbar sein soll??

    Und so schlecht scheint mein Versuch mit dem "Verständlich" machen nicht gewesen zu sein. Es hat anscheind jeder gleich verstanden was mein Problem war.

    Gruß
    EPMS



  • z.B. indem Du das Login-Fenster nicht automatisch erzeugen läßt, sondern von Hand im Konstruktor des Hauptformulars erzeugst und Modal anzeigst. Hauptformular ist zu dem Zeitpunkt noch nicht sichtbar und durch den modalen Aufruf wird es auch nicht weiter abgearbeitet.



  • Hallo Joe_M.,

    wie rufe ich denn das Login-Fenster Modal auf??



  • Hallo

    LoginForm->ShowModal();
    

    bis bald
    akari



  • Hallo akari,

    wo genau muß ich das LoginForm dann starten??
    Und was muß ich machen damit das HauptForm nach dem Schließen des LoginForm richtig angezeigt wird??

    Gruß
    EPMS



  • Hallo

    ich mach sowas immer aus der Hauptprojektdatei aus, die ja immer <Projetktname>.cpp heißt.
    Das LoginForm bekommt eine neue Methode namens Execute(), die das Fenster mit ShowModal() aufruft und die Eingabe überpüft. Ist die Eingabe positiv, gibt Execute() true zurück, ansonsten false.
    In der Haupt-Projektdatei wird das ganze dann ausgeführt

    #include "LoginForm.h" // Include hinzufügen, wenn noch nicht da
    ...
    
      Application->Initialize();
    
      Application->CreateForm(__classid(TMainForm), &MainForm);
      Application->CreateForm(__classid(TLoginForm1), &LoginForm);
      if (LoginForm->Execute()) // Hier wird der Login durchgeführt und ausgewertet
        Application->Run();
    

    bis bald
    akari



  • @akari,
    jui jetzt wirds schwierig. Wie füge ich denn dem LoginForm eine neue Methode hinzu??



  • Hallo

    per Hand einfach in die Headerdatei LoginForm.h

    public:
     ...
     bool Execute(); // Deklaration der Methode hinzufügen
     ...
     };
    

    und in die Implementationsdatei LoginForm.cpp

    ...
    bool TLoginForm::Execute()
    {
      ... // Form vorbereiten
      ShowModal(); // Form modal anzeigen
      ... // Eingabe auswerten
      }
    

    Dies sind grundlegende Dinge der OOP, die solltest du dir unbedingt aneignen, wenn du tiefer in den BCB und die VCL einsteigen willst.

    bis bald
    akari



  • Hallo akari,
    kennst du im Internet Seiten wo ich mich darüber schlau machen kann??

    Also habe das jetzt mal so gemacht. Funktioniert leider nicht:
    login.h

    #ifndef login_cppH
    #define login_cppH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class Tlogin : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TLabel *Label1;
            TLabel *Label2;
            TEdit *e_username;
            TEdit *e_passwort;
            TLabel *Label3;
            TCheckBox *c_login_speichern;
            TButton *Button1;
            TLabel *Label4;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall Tlogin(TComponent* Owner);
    	bool Execute(); // Deklaration der Methode hinzufügen 
    };
    //---------------------------------------------------------------------------
    extern PACKAGE Tlogin *login;
    //---------------------------------------------------------------------------
    #endif
    

    Die Login.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "login_cpp.h"
    #include "hauptmenu_cpp.h"
    #include "DataModul.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    AnsiString login_username;
    
    Tlogin *login;
    //---------------------------------------------------------------------------
    __fastcall Tlogin::Tlogin(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    bool Tlogin::Execute()
    {
      ShowModal(); // Form modal anzeigen
      }
    //---------------------------------------------------------------------------
    void __fastcall Tlogin::Button1Click(TObject *Sender)
    {
    AnsiString sql_insert;
    
    ShowMessage(e_username->Text + " " + e_passwort->Text);
    sql_insert = "select * from user where username = '"+e_username->Text+"' AND passwort = '"+e_passwort->Text+"'";
    DataModule1->sql_user->SQL->Clear();
    DataModule1->sql_user->SQL->Add(sql_insert);
    DataModule1->sql_user->Open();
    DataModule1->sql_user->First();
    
    if(DataModule1->sql_user->RecordCount != '1')
    {
            hauptmenu->Show();
            login->Close();
            login_username = DataModule1->sql_user->FieldByName("username")->AsString;
    }
    }
    //---------------------------------------------------------------------------
    

    und die projekt.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <login_cpp.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    USEFORM("hauptmenu_cpp.cpp", hauptmenu);
    USEFORM("DataModul.cpp", DataModule1); /* TDataModule: File Type */
    USEFORM("login_cpp.cpp", login);
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     Application->CreateForm(__classid(Thauptmenu), &hauptmenu);
                     Application->CreateForm(__classid(TDataModule1), &DataModule1);
                     if (login->Execute()) // Hier wird der Login durchgeführt und ausgewertet 
                     Application->Run();
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            catch (...)
            {
                     try
                     {
                             throw Exception("");
                     }
                     catch (Exception &exception)
                     {
                             Application->ShowException(&exception);
                     }
            }
            return 0;
    }
    //---------------------------------------------------------------------------
    

    Leider klappt das noch nicht. Es kommt eine Exception Fehler Meldung.

    Kannst mir da noch weiter helfen??

    Gruß
    EPMS



  • Hallo

    Leider klappt das noch nicht. Es kommt eine Exception Fehler Meldung.
    

    was ja daran liegt, das login zu dem Zeitpunkt nach gar nicht erschaffen ist.
    Geh mal über Menü Projekt/Optionen in den Tab Formulare und setzt login in die Liste der automatisch zu erzeugenen Formulare (also nach links)

    Das muß dann so aussehen :

    ...
      Application->CreateForm(__classid(Tlogin), &login);  // Formular wird erschaffen
      ...
      if (login->Execute()) // Formular wird verwendet
      ...
    

    Desweiteren must du aus Execute() noch einen passenden Bool-Wert zurückgeben, je nachdem ob die Anmeldung erlaubt ist oder nicht.

    bis bald
    akari



  • Hallo akari,

    wann wird das Execute() denn ausgeführt?? Gleich am Anfang, wenn das Formular ausgestellt wird??

    Momentan muß der User bei mir seinen Benutzernamen und Passwort eingeben und dann einen Button betätigen. Dann wird geschaut ob die Eingaben richtig waren.

    Aber wie realisiere ich das im Execute()?? Kann ich das Execute() im Button1Click ausführen??

    Gruß
    EPMS



  • Hallo,

    Du fürst das Execute doch selbst aus (siehe dein eigener Quelltext).
    Tlogin::Execute() ruft ShowModal() auf, d.h. deine Dialog wird angezeigt bis du ihn schliesst. ShowModal hat auch einen Rückgabewert. Den könntest du auswerten. Desweiteren kannst du ja im OnClose (oder besser in OnCloseQuery) von Tlogin testen ob das Passwort stimmt und dann die Variable ModalResult entsprechend setzen. Also entweder auf mrOk oder mrCancel oder mrNo ...

    Ciao



  • Hallo Braunstein,
    danke für deine Tipps. Leider bin ich zu blöd dafür. Habe es jetzt ein bischen umgebaut.

    Also die Exception kommt nicht mehr. Hier mal meine geänderte Datei

    login.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "login_cpp.h"
    #include "hauptmenu_cpp.h"
    #include "DataModul.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    AnsiString login_username;
    
    Tlogin *login;
    //---------------------------------------------------------------------------
    __fastcall Tlogin::Tlogin(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    bool Tlogin::Execute()
    {
      return ShowModal(); // Form modal anzeigen
      }
    //---------------------------------------------------------------------------
    void __fastcall Tlogin::FormCloseQuery(TObject *Sender, bool &CanClose)
    {
    AnsiString sql_insert;
    
    sql_insert = "select * from user where username = '"+e_username->Text+"' AND passwort = '"+e_passwort->Text+"'";
    DataModule1->sql_user->SQL->Clear();
    DataModule1->sql_user->SQL->Add(sql_insert);
    DataModule1->sql_user->Open();
    DataModule1->sql_user->First();
    
    if(DataModule1->sql_user->RecordCount != '1')
    {
            login_username = DataModule1->sql_user->FieldByName("username")->AsString;
            ModalResult = mrOk;
    } else
    {
            ModalResult = mrCancel;
    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall Tlogin::Button1Click(TObject *Sender)
    {
    Close();        
    }
    //---------------------------------------------------------------------------
    

    Wenn ich das jetzt den Button betätige kommt ich jedesmal ins Hauptmenü. Das will ich ja nicht. Wenn der Username und das Passwort falsch sind möchte ich wieder das Login-Fenster haben und das Hauptmenü soll noch nicht zu sehen sein.

    Gruß
    EPMS


  • Mod

    Hallo

    hast du dir das mal angeschaut

    bool &CanClose
    

    MfG
    Klaus



  • Setze doch CanClose auf false. Dann schliesst sich dein Login-Dialog nicht. Du mußt deinen Nutzer natürlich auch die Chance geben den Dialog abzubrechen und das Programm zu beenden.



  • Ui, ist das kompliziert. Wo finde ich oder benutze ich denn CanClose???
    In der Hilfe steht nichts darüber.

    Bin glaube ich echt zu blöd dafür.

    Gruß
    EPMS



  • Schau doch mal in deinen eigenen Quelltext. Da findest du das hier:
    [cpp]void __fastcall Tlogin::FormCloseQuery(TObject *Sender, bool &CanClose)[/cpp]



  • Wenn ich das jetzt so versuche:

    void __fastcall Tlogin::FormCloseQuery(TObject *Sender)
    

    kommt: [C++ Fehler] login_cpp.cpp(27): E2316 'Tlogin::FormCloseQuery()' ist kein Element von 'Tlogin'

    Also einfach weg lassen kann ich es anscheind auch nicht.

    Hast du sowas wie icq oder so?? Dann schreibt man hier das Board nicht so voll...

    EPMS


Anmelden zum Antworten