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



  • 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



  • Du sollst es nicht weglassen, sonder in der OnCloseQuery schreiben CanClose = false. Dann schliesst sich deine Form nicht.
    Schau bitte mal in die Hilfe zu OnCloseQuery.


Anmelden zum Antworten