Login...mitnahme von Benutzername und Passwort!



  • du hast die DBEdits über DataSource mit Table3 verbunden?

    hast du schonmal versucht hier:

    Form3->Database1->Open();
    Form3->Table3->Open();
    Form3->Table3->SetKey();
    Form3->Table3->Fields->Fields[0]->AsString = Edit1->Text;
    
    //Testvariablen
    Form3->Table3->GotoKey();
    String Test1 = Form3->Table3->Fields->Fields[0]->AsString;
    String Test2 = Form3->Table3->Fields->Fields[1]->AsString;
    String Test3 = Form3->Table3->Fields->Fields[2]->AsString;
    String Test4 = Form3->Table3->Fields->Fields[3]->AsString;
    
    if (!Form3->Table3->GotoKey())
    {
    }
    else
    {
    }
    

    mit dem Debugger zu schaun, was er aus der Datenbank liest?
    bzw. ob er das SetKey ausführt?

    und zu dem was fragg sagte noch ne Anmerkung:

    wenn nacheinander User mit unterschiedlichen, speziell geringeren Rechten einloggen, haben sie bei dir wahrscheinlich noch die Rechte des vorhergehenden Nutzers, da du die Buttons nicht wieder auf false setzt

    und die Idee mit den Rechten in der Datenbank ist gut

    einfach im Feld Masterrechte statt der Zahlen 1-10 die Rechte in Form eines String eingeben (z.B. für Masterrecht 1 -> 10000010000)

    und dann mit String[Position] die einzelnen Stellen wieder auslesen

    damit sparst du dir die ganze große If-Abfrage



  • Hmm...das hört sich interessant an...aber wie gesagt hab damit noch nich gearbeitet!

    Kann mir auch noch nich vorstellen!

    Kannst mir mal ein Beispiel für 2-3 rechte geben?

    Wäre dir dankbar!

    Und zu den Button,die sind standardmäßig schon disabled beim Programmstart!


  • Mod

    Hallo

    du verwendest

    if (Form3->Query1->FieldByName("Masterrechte")->AsString == "1")
     {
     Form4->Button1->Enabled=true;
     Form4->Button7->Enabled=true;
     }
     if (Form3->Query1->FieldByName("Masterrechte")->AsString == "2")
     {
     Form4->Button1->Enabled=true;
     Form4->Button2->Enabled=true;
     Form4->Button7->Enabled=true;
     }
    

    einfacher waere doch

    if (Form3->Query1->FieldByName("Masterrechte")->AsString.SubString[1][1] == '1')
        Form4->Button1->Enabled=true;
    else
        Form4->Button1->Enabled=false;
    .
    ..
    ...
    

    MfG
    Klas



  • Leuchtet mir immernoch nicht ein...da ich ja 10 rechte habe!

    Wäre für ein beispiel für meine anwendung dankbar!



  • @Linnea: was sollen mir die string Test.... bringen?



  • if (Form3->Query1->FieldByName("Masterrechte")->AsString == "1")
     {
     Form4->Button1->Enabled=true;
     Form4->Button7->Enabled=true;
     }
     if (Form3->Query1->FieldByName("Masterrechte")->AsString == "2")
     {
     Form4->Button1->Enabled=true;
     Form4->Button2->Enabled=true;
     Form4->Button7->Enabled=true;
     }
     ...... ~snipped~ .......
    

    Warum soviele Zeilen???
    Geht doch einfacher.. Und das ist langsam.... Sehr lahm...

    -------------------------------------------------------

    switch(int(Form3->Query1->FieldByName("Masterrechte")->AsString)) {
      case 10:
        Form4->Button8->Enabled=true;
      case 9:
        Form4->Button12->Enabled=true;
      case 8:
        Form4->Button7->Enabled=true;
      case 7:
        Form4->Button6->Enabled=true;
      case 6:
        Form4->Button10->Enabled=true;
      case 5:
        Form4->Button5->Enabled=true;
      case 4:
        Form4->Button4->Enabled=true;
      case 3:
        Form4->Button3->Enabled=true;
      case 2:
        Form4->Button11->Enabled=true;
      case 1:
        Form4->Button1->Enabled=true;
        Form4->Button2->Enabled=true;
        break;
      default:
        break;
    }
    

    Mein Teil macht das selbe wie deine if klauseln. Nur if ist da halt langsam, grad deine. Weil er das 10 vergleiche.

    -------------------------------------------------------------

    Wenn "Form3->Query1->FieldByName("Masterrechte")->AsString" den Wert 5 hat.
    Würde er auch "Form3->Query1->FieldByName("Masterrechte")->AsString" mit 7 vergleichen etc. bei deiner variante

    ---------------------------------------------------------------

    Wenn dir mein Konstukt mit switch nicht passt (was eigentlich gut ist, find ich).
    Kannst du das so optimieren:

    if (Form3->Query1->FieldByName("Masterrechte")->AsString == "1")
     {
     Form4->Button1->Enabled=true;
     Form4->Button7->Enabled=true;
     }
     else if (Form3->Query1->FieldByName("Masterrechte")->AsString == "2")
     {
     Form4->Button1->Enabled=true;
     Form4->Button2->Enabled=true;
     Form4->Button7->Enabled=true;
     }
     else if (Form3->Query1->FieldByName("Masterrechte")->AsString == "3")
     {
     Form4->Button1->Enabled=true;
     Form4->Button2->Enabled=true;
     Form4->Button11->Enabled=true;
     Form4->Button7->Enabled=true;
     }
      ..... ~snipped~ .......
    

    Das wäre auch schneller als deine if-abfrage. weil wenn er einmal true hat, werden die anderen IF's ignoriert, was bei dir nicht der Fall ist.
    Aber meine Variante muß trotzdem noch schneller sein alls deine if-konstukte und mein if-konstrukt.

    Gruß
    DJ BlackEagle



  • Meine Frage ist hier nur:

    Werden auch die anderen Button freigeschaltet!

    Weil Masterrechte 7 hat selben Button wie 3, nur eben onoch Paar mehr!

    @ Black das sieht gut aus werd ich probieren

    @ Linnea dein Beispiel interessiert mich auch sehr, vielleicht kannst mir das mal bisschen erleutern!

    @All, bei dem Loginproblem bin ich noch nicht weiter...gibt es da noch eine andere Möglichkeit als SetKey??

    KAmille



  • Kamill schrieb:

    Hallo...ich hatte das schon in einem anderen Thread gepostet..und dachte Problem wäre gelöst...aber leider nicht!

    Ich habe ein Login...wo ich Benutzername und Passwort mit Datenbank abgleiche!

    Nun möchte ich...das wenn ich mich richtig anmelde...den Benutzername und das Passwort "mitnehmen" kann...weil ich im Programm das Passwort ändern möchte..und dazu DBEdit verwende!
    ....... snipped .....

    aber das funkt nich mehr richtig....weiß nich warum!

    Und mit dem Key hatte er dann den Name und Passwort sich gemerkt...und wenn ich die Passwortform mit den DBEdits aufrief standen in den Edits immer das richtige Passwort drin...nun steht, egal als wer ich mich anmelde...immer nur der erste Benutzer der Datenbank drin!

    Hat jemand vielleicht eine Idee??

    Nun zu deinem Problem.
    Warum noch das Password? MAch das nicht..
    Geh so vor:

    Erstelle eine Private Variable mit den Namen "strLoginName" vom Typ AnsiString.

    Mehr an Vars brauchst du nicht, da Loginnamen ja unique sind (auch sein sollten).

    Bei Konstrukter kannst du ja sowas machen:

    this->strLoginName = "";
    

    Aber nicht erforderlich.

    Wenn der Benutzer sich erfolgreich eingeloggt hast, weiß du ja den Loginnamen ja. (Edit1->Text).
    Und dann kannst du sowas machen:

    this->strLoginName = Edit1->Text;
    

    Nun ist der Loginname gespeichert in einer Var. und du kannst den rumtragen. 😉

    Wenn du nun ein Formular hast wo er sein PW ändern kann ist das auch easy...

    In den PW-Form kannst du ja im Edit-Feld "Loginname" diesen Namen eintragen (von strLoginName).

    Der Benutzer gibt sein altes PW ein und sein neues. Und wiederholt sein neues PW nochmal..

    Dann machst du ein vergleich mit dem alten eingegeben PAssword mit dem Password in der DB.
    ISt der gleich, kann er sein pw ändern. Aber dann solltest du noch das neue PW mit dem wiederholten eingabe des neuen PWs vergleichen.
    Ist der gleich, dann save das neue password in die datenbank..

    PS: Bitte speicher die Passwörter mindesten als md5-hash. Sonst kann jeder die PAsswörter auslesen, wenn die internen DB-Rechte des DB-SErvers nicht richtig gesetzt sind. Alternative kannst du ja das Pw ja mit Blowfish oder sonst was verschlüsseln... Aber md5 reicht eigentlich, da MySQL internen PW auch als md5-Hash speichert.

    Ich hoffe das ist verständlich was ich geschrieben habe...
    Wenn nicht sag bescheid und ich kann dir mal nen beispiel zeigen... 😉

    Gruß
    DJ BlackEagle



  • Kamill schrieb:

    @Linnea: was sollen mir die string Test.... bringen?

    die sind einfach nur zum schaun ob das SetKey zum richtigen Wert springt, sie zeigen also nur den Inhalt der Datenbank

    um diese Werte zu nutzen/kontrollieren brauchst du natürlich den Debugger und einen Breakpoint...

    zu dem anderen:

    Bsp:
    Rechte --- in Datenbank steht
    1 ________ 100000100000
    2 ________ 110000100000
    3 ________ 110000100010
    4 ________ 111000100010
    usw.
    Erklärung: die Zahl hat 12 Stellen, also für jeden deiner Button einen, und 1 oder 0 heißt nur ob an oder aus

    im Code kannst du das wie folgt nutzen

    String str = Form3->Query1->FieldByName("Masterrechte")->AsString;
    if (str[1] == "1") Form4->Button1->Enabled = true;
    else Form4->Button1->Enabled = false;
    if (str[2] == "1") Form4->Button2->Enabled = true;
    else Form4->Button2->Enabled = false;
    if (str[3] == "1") Form4->Button3->Enabled = true;
    else Form4->Button3->Enabled = false;
    if (str[4] == "1") Form4->Button4->Enabled = true;
    else Form4->Button4->Enabled = false;
    
    usw...
    

    eventuell kann man das sogar noch weiter verkürzen, aber das wird sonst zu schwer 😉



  • Kamill schrieb:

    Meine Frage ist hier nur:

    Werden auch die anderen Button freigeschaltet!

    Weil Masterrechte 7 hat selben Button wie 3, nur eben onoch Paar mehr!

    @ Black das sieht gut aus werd ich probieren

    Bei meinem Switch ja...

    Weil wie du hier siehst:

    switch(int(Form3->Query1->FieldByName("Masterrechte")->AsString)) {
      case 10:
        Form4->Button8->Enabled=true;
        // Break fehlt, also führt er auch case 9 aus.
      case 9:
        Form4->Button12->Enabled=true;
        // Break fehlt, also führt er auch case 8 aus.
      case 8:
        Form4->Button7->Enabled=true;
        // Break fehlt, also führt er auch case 7 aus.
      case 7:
        Form4->Button6->Enabled=true;
        // Break fehlt, also führt er auch case 6 aus.
      case 6:
        Form4->Button10->Enabled=true;
      case 5:
        Form4->Button5->Enabled=true;
      case 4:
        Form4->Button4->Enabled=true;
      case 3:
        Form4->Button3->Enabled=true;
      case 2:
        Form4->Button11->Enabled=true;
      case 1:
        Form4->Button1->Enabled=true;
        Form4->Button2->Enabled=true;
        break;
      default:
        break;
    }
    

    Auf deutsch, wenn Masterrechte den Wert 10 hat, durch läuft er alle Cases (von 10 bis 1 (ink. 1) runter), da der befehl break fehlt..
    Nur nach dem case 1 ist das break...
    Würde dann so ablaufen:

    Form4->Button8->Enabled=true;
    Form4->Button12->Enabled=true;
    Form4->Button7->Enabled=true;
    Form4->Button6->Enabled=true;
    Form4->Button10->Enabled=true;
    Form4->Button5->Enabled=true;
    Form4->Button4->Enabled=true;
    Form4->Button3->Enabled=true;
    Form4->Button11->Enabled=true;
    Form4->Button1->Enabled=true;
    Form4->Button2->Enabled=true;
    

    ------

    Wenn aber Masterrechte den Wert 5 hat. Dann springt das Programm in das Case 5 rein und läuft ebenfalls runter bis zu 1 (ink. 1).
    Dieses Switch Case, macht das was du dir wünscht mit deinen if-konstrukten.
    Würde dann so ablaufen:

    Form4->Button5->Enabled=true;
    Form4->Button4->Enabled=true;
    Form4->Button3->Enabled=true;
    Form4->Button11->Enabled=true;
    Form4->Button1->Enabled=true;
    Form4->Button2->Enabled=true;
    

    Denke mal das wäre klar mit dem switch...



  • Linnea schrieb:

    String str = Form3->Query1->FieldByName("Masterrechte")->AsString;
    if (str[1] == "1") Form4->Button1->Enabled = true;
    else Form4->Button1->Enabled = false;
    if (str[2] == "1") Form4->Button2->Enabled = true;
    else Form4->Button2->Enabled = false;
    if (str[3] == "1") Form4->Button3->Enabled = true;
    else Form4->Button3->Enabled = false;
    if (str[4] == "1") Form4->Button4->Enabled = true;
    else Form4->Button4->Enabled = false;
    
    usw...
    

    eventuell kann man das sogar noch weiter verkürzen, aber das wird sonst zu schwer 😉

    Ja kann man.

    So:

    String str = Form3->Query1->FieldByName("Masterrechte")->AsString;
    Form4->Button1->Enabled = (str[0] == "1") ? true : false;
    Form4->Button2->Enabled = (str[1] == "1") ? true : false;
    Form4->Button3->Enabled = (str[2] == "1") ? true : false;
    Form4->Button4->Enabled = (str[3] == "1") ? true : false;
    
    usw...
    

    Aber mein SWitch case ist auch optional.. 😉

    Obwohl ja if langsamer ist als switch... 😉 😉

    PS: li... ein Array fängt immer mit 0 an, nicht mit 1.



  • Also @ Black: dein erstes Beispiel hab ich verstanden, hab nur übersehen das da kein break war ...

    Und nun hätt ich gern ein paar erklärungen:

    Zu:

    DJ BlackEagle schrieb:

    Linnea schrieb:

    String str = Form3->Query1->FieldByName("Masterrechte")->AsString;
    if (str[1] == "1") Form4->Button1->Enabled = true;
    else Form4->Button1->Enabled = false;
    if (str[2] == "1") Form4->Button2->Enabled = true;
    else Form4->Button2->Enabled = false;
    if (str[3] == "1") Form4->Button3->Enabled = true;
    else Form4->Button3->Enabled = false;
    if (str[4] == "1") Form4->Button4->Enabled = true;
    else Form4->Button4->Enabled = false;
    
    usw...
    

    eventuell kann man das sogar noch weiter verkürzen, aber das wird sonst zu schwer 😉

    Ja kann man.

    So:

    String str = Form3->Query1->FieldByName("Masterrechte")->AsString;
    Form4->Button1->Enabled = (str[0] == "1") ? true : false;
    Form4->Button2->Enabled = (str[1] == "1") ? true : false;
    Form4->Button3->Enabled = (str[2] == "1") ? true : false;
    Form4->Button4->Enabled = (str[3] == "1") ? true : false;
    
    usw...
    

    Aber mein SWitch case ist auch optional.. 😉

    Obwohl ja if langsamer ist als switch... 😉 😉

    PS: li... ein Array fängt immer mit 0 an, nicht mit 1.

    für was steht bei (str[0] == "1" die "1"?, was hat das ? true : false zu bedeuten?

    @Linnea: also mit dem Debugger hab ich grad noch garnich gearbeitet...wirklich nich!

    Kannst mir das bei meinem Problem etwas erklären?

    Willst vielleicht meine EMail Adresse?

    @All; eure Beispiele für die rechte probier ich morgen ,weil ich jetzt gleich los mache!

    Sorry für die Umstände...bin noch relativer N00b!!! 😞



  • Form4->Button1->Enabled = (str[0] == "1") ? true : false;
    

    Das sind die gewissen if-short-conditional.

    Das was da steht würde ausgeschrieben so aussehen:

    if(str[0] == "1") {
     Form4->Button1->Enabled = true;
    }
    else {
    Form4->Button1->Enabled = false;
    }
    

    Ist halt nur kürzer. 😉

    Warum "1"?

    Linnea schrieb:

    Bsp:
    Rechte --- in Datenbank steht
    1 ________ 100000100000
    2 ________ 110000100000
    3 ________ 110000100010
    4 ________ 111000100010

    Die 1 steht für Aktiv..

    Wenn die Variable str[0] den Inhalt 1 hat, soll er den Button aktivieren. wenn 0 ist, dann button deaktivieren.

    100000100000 das würde dann in der DB drin stehen..
    Da wäre hier Button 1 Aktiv. und noch ein Button...

    Aber wie du das machst, würde ich dir eher empfehlen, weil du ja nen totaler Anfänger bist (sagst du ja selbst). 😉 Aber jeder fängt klein an.



  • DJ BlackEagle schrieb:

    PS: li... ein Array fängt immer mit 0 an, nicht mit 1.

    Strings sind 1 basiert ...

    @Kamill
    zur Nutzung des Debuggers gibst einen FAQ-Beitrag, ohne Debugger kann man eigentlich nicht programmieren, da man nie weiss wo genau der Fehler ist



  • naja,nach der beschreibun hab ich schon verstanden...also so der anfänger bin ich nich...und eure beispiele leuchten mir auch ein!

    Nur die sache mit dem debugger!...Kann mir wer ein link zum tut geben?



  • Sorry, bin erst jetzt zurück.
    Eine Möglichkeit:

    if(str[0] == "1") {
     Form4->Button1->Enabled = true;
    }
    else {
    Form4->Button1->Enabled = false;
    }
    

    Dachte aber eher an sowas:

    //Deine Zugriffsrechte aus Datenbank
    //Alternativ ein Integer und dann nach Bin (IntToBin())
    String ur="101010";
    // und dann anstatt von unendlich vielen if oder case Monstern sowas
    for(int i=0;i<Form1->ComponentCount;i++)
    {
       if (Form1->Components[i]->ClassNameIs("TButton"))
       {
          dynamic_cast<TButton*>(Form1->Components[i])->Enabled = StrToBool(ur.SubString(i+1,1));
       }
    }
    


  • Oder aber besser so:

    //Deine Zugriffsrechte aus Datenbank
    //Alternativ ein Integer und dann nach Bin (IntToBin())
    String ur="101010";
    // und dann anstatt von unendlich vielen if oder case Monstern sowas
    int co=0;
    for(int i=0;i<Form1->ComponentCount;i++)
    {
       if (Form1->Components[i]->ClassNameIs("TButton"))
       {
          dynamic_cast<TButton*>(Form1->Components[i])->Enabled = ur[++co]-48;
       }
    }
    }
    


  • Registrieren ist glaube ich manchmal doch besser: 😃 🙄

    String ur="0101010";
    int co=0;
    for(int i=0;i<Form1->ComponentCount&&co<ur.Length();i++)
    {
       if (Form1->Components[i]->ClassNameIs("TButton"))
       {
          dynamic_cast<TButton*>(Form1->Components[i])->Enabled = ur[++co]-48;
       }
    }
    


  • @fragg: hallo erstmal 🕶

    So nun fang ich mal an:

    Kamill schrieb:

    naja,nach der beschreibun hab ich schon verstanden...also so der anfänger bin ich nich...und eure beispiele leuchten mir auch ein!

    Nur die sache mit dem debugger!...Kann mir wer ein link zum tut geben?

    Ich hab geschrieben das ich nich so der anfänger bin...aber dein 2tes beispiel fragg hab ich wirklich nich verstanden...kannst mir das etwas genauer erklären?

    Mir geht daraus nich hervor wie ich da meine 12 oder mehr Buttons einzel freischalten kann!
    Was in DB stehen muss (wohl auch ein String ähnlich diesem: 100010001011?)!

    Würd mich freuen das etwas erläutert zu bekommen! 🙄



  • 100010001011
    =>
    
       1          0          0             0  1  0  0  0  1  0  1  1
    b1 aktiv  b2 inaktiv    b3 inaktiv......
    

    Die Zahlenfolge ergibt deine Buttons...
    erst zahl => Button 1
    2. Zahl => Button 2

    Der Wert 1 bedeutet er hat das Recht (true).
    Der Wert 0 bedeutet er hat nicht das Recht (false).
    Umd das zu erleutern...
    Falls du das nicht verstanden hast.


Anmelden zum Antworten