ich steht vor nem kleinem prob. Ich schreib für meine Firma eine Mitarbeiter Profil datenbank, wo später auch Online gehen soll. Kein problem, ich hab mir ne TMySQL Kompo besorgt, mir nen paar funktionen geschrieben um einträge aus ner Tabelle Lesen, Schreiben, Ändern und Löschen kann.
So alles recht und gut... jetzt muss ich wohl oder übel. Benutzer Rechte für jeden Einzelnen Benutzer festlegen.
Jetzt kommt das problem... ICH kann keine BLOB´s (Arrays) aus der MySQL Datenbank auslesen. Wenn dann nur als PChar... und nen mysql array zu entschlüsseln wäre nen bissel kompli, deswegen dachte ich mir ich mach das auf ne ganz primitivere art.
Tja, denkste von wegen primitiv... ich bekomm ja nichmal sowas einfaches auf die reihe.
Mein Feld in der MySQL Datenbank sieht so aus:
Code:
rights int(11) NOT NULL default '0',
Die Struktur in Delphi so:
Code:
TDRights = set of (drMenu, drUser, drConsultProfile);
const
// Rechte
cNoRights = 0;
cRightMenu = 1;
cRightUser = 2;
cRightConsultProfile = 3;
// Alle Rechte
cFullRights = 6;
nehmen wir jetzt man an ich will die rechte so haben:
function GetRightsFromNumber(const Num : Integer) : TDRights;
begin
Result := [];
if cRightMenu in Num then Result := Result + [drMenu];
if cRightUser in Num then Result := Result + [drUser];
if cRightConsultProfile in Num then Result := Result + [drConsultProfile];
// Das Funktioniert natürlich so nicht :( Mein Delphi 5 meckert bei dem Code :(
end;
procedure ReadRights;
var
RightsNumber : Integer;
begin
// Rechte für Chef
RightsNumber := 3;
Rights[0] = GetRightsFromNumber(RightsNumber);
// Rechte für Admin
RightsNumber := 6;
Rights[1] = GetRightsFromNumber(RightsNumber);
// Rechte für Sekretärin
RightsNumber := 4;
Rights[2] = GetRightsFromNumber(RightsNumber);
end;
procedure CheckRights;
begin
if drMenu in Rights[0] then ShowMessage('´Chef´hat ´Menu´ rechte');
if drUser in Rights[0] then ShowMessage('´Chef´hat ´User´ rechte');
if drConsultProfile in Rights[0] then ShowMessage('´Chef´hat ´Profil´ rechte');
end;
So ich hoffe mal ihr erkennt was mein problem ist und was ich haben will. Bitte sagt jetzt niemand,... "Ha, Code works on Delphi 6, 7"... sonst heul ich. Ich hab Delphi 5 Standard ohne BDE, deswegen muss ich ja mySQL und so alles manuel ansteuern, funzt ja eigentlich auch ganz gut.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Code:
TDRights = set of (drMenu, drUser, drConsultProfile);
const
// Rechte
cNoRights = 0;
cRightMenu = 1;
cRightUser = 2;
cRightConsultProfile = 3;
// Alle Rechte
cFullRights = 6;
Also ich weiß nicht genau was die Zahlen da bedeuten sollen. Aber warum verwendes du nicht für jedes Recht ein Bit? So kannst du die Rechte frei kombinieren.
Code:
var
Rights: Word; // oder Integer
begin
// Rechte (Bits) setzen
Rights := Rights or $01;
Rights := Rights or $04;
// Rechte (Bits) abfragen
if (Rights and $02 > 0)
then Caption := 'Yes'
else Caption := 'No';
end;
$01 // Bit 1 $02 // Bit 2 $04 // Bit 3 $08 // Bit 4 $10 // Bit 5 $20 // Bit 6 $40 // Bit 7 $80 // Bit 8 usw.
bekomm ich immer als ergebnis 3 raus, das kann ja nicht stimmen. es sollte ja 6 rauskommen, $01+$02+$03 = $06 oder ?? Erklär mir mal was genau diese zeile macht:
[code] Rights := Rights or cRightMenu; [code]
or ist doch einfach ODER... ich weiss ein kleines bischen über bits... und so... das thema nehmen wir in der berufsschule durch aber warum OR ?
Was muss dann in der Datenbank stehen, wenn ich alle 3 Rechte haben will. $01 or $02 or $03 peilt mysql nicht.
Das ist nicht ganz richtig. Du hast einen klassischen Denkfehler drinne. $ ist der Operator für Hex. Und an dieser Stelle hast du die Zahlen 1, 2, und 3. In wirklichkeit musst du aber die zahlen 1, 2 und 4 verwenden. Da 4 wieder ein extra Bit besitzt! $03 (oder dezimal 3) besitzt bit 1 und 2.
Finalspace hat geschrieben:
es sollte ja 6 rauskommen, $01+$02+$03 = $06 oder ??
Also das ist ja richtig. Du addierst 1, 2 und 3. Raus kommt 6. Allerdings als Bitmaske gesehen. Belegt 6 die Bits 2 und 3. Wenn du die Bits 1, 2 und 3 addieren willst kommt 7 raus, da 1 + 2 + 4 = 7 sind.
Funktionsweise or (Bitweises Oder) Am besten mache ich dir mal kurz eine Tabelle <span style='font-family:Courier'> Var 1|Var 2 |Result 0 |0 |0 1 |0 |1 0 |1 |1 1 |1 |1 </span> Also wenn in einer der Beiden Variablen ein Bit gesetzt, dann wird im Ergebniss dieses Bit gesetzt. Bei and muss in Variable 1 und Variable 2 das bit gesetzt sein, damit im ergebniss dieses Bit auch gesetzt ist.
Um dein Problem zu lösen verwende anstelle der Zeile
Code:
cRightConsultProfile = $03;
mal die folgende.
Code:
cRightConsultProfile = $04;
für das nächste Recht benötigst du $08 (da dieser Wert erst das nächste Bit wieder spiegelt)
Hier noch mal die Bitmasken für die ersten 8 Bits. $01 // Bit 1 (dezimal 1) $02 // Bit 2 (dezimal 2) $04 // Bit 3 (dezimal 4) $08 // Bit 4 (dezimal 8) $10 // Bit 5 (dezimal 16) $20 // Bit 6 (dezimal 32) $40 // Bit 7 (dezimal 64) $80 // Bit 8 (dezimal 128)
Anstelle der Hexwerte könntest du auch den Dezimalwert nehmen. Allerdings ist Hex an dieser Stelle wesentlich gebräuchlicher.
Mitglieder in diesem Forum: Google [Bot] und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.