Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 07:31

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 10:23 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

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:
  1.  
  2.   rights int(11) NOT NULL default '0',
  3.  


Die Struktur in Delphi so:

Code:
  1.  
  2.   TDRights = set of (drMenu, drUser, drConsultProfile);
  3.  
  4. const
  5.   // Rechte
  6.   cNoRights = 0;
  7.   cRightMenu = 1;
  8.   cRightUser = 2;
  9.   cRightConsultProfile = 3;
  10.  
  11.   // Alle Rechte
  12.   cFullRights = 6;
  13.  


nehmen wir jetzt man an ich will die rechte so haben:

Code:
  1.  
  2.  
  3. ************************************
  4.  
  5. benutzer "Chef" hat folgende rechte:
  6. - Menu (cRightMenu)
  7. - User (cRightUser)
  8.  
  9. in dem Tabellen Eintrag steht im Feld Rights "3".
  10. Rechte = cRightMenu + cRightUser
  11.  
  12. ************************************
  13.  
  14. benutzer "Admin" hat folgende rechte:
  15. - Menu (cRightMenu)
  16. - User (cRightUser)
  17. - Profile (cRightConsultProfile)
  18.  
  19. in dem Tabellen Eintrag steht im Feld Rights "6".
  20. Rechte = cRightMenu + cRightUser + cRightConsultProfile
  21.  
  22. ************************************
  23.  
  24. benutzer "Sekretärin" hat folgende rechte:
  25. - Menu (cRightMenu)
  26. - Profile (cRightConsultProfile)
  27.  
  28. in dem Tabellen Eintrag steht im Feld Rights "4".
  29. Rechte = cRightMenu + cRightConsultProfile
  30.  
  31. ************************************
  32.  
  33.  


Jetzt will ich die rechte so auslesen:

Code:
  1.  
  2.  
  3. var
  4.   Rights : array [0..2] of TDRights;
  5.  
  6. function GetRightsFromNumber(const Num : Integer) : TDRights;
  7. begin
  8.   Result := [];
  9.   if cRightMenu in Num then Result :=  Result  + [drMenu];
  10.   if cRightUser in Num then Result :=  Result  + [drUser];
  11.   if cRightConsultProfile in Num then Result :=  Result  + [drConsultProfile];
  12.   // Das Funktioniert natürlich so nicht :( Mein Delphi 5 meckert bei dem Code :(
  13. end;
  14.  
  15. procedure ReadRights;
  16. var
  17.   RightsNumber : Integer;
  18. begin
  19.   // Rechte für Chef
  20.   RightsNumber := 3;
  21.   Rights[0] = GetRightsFromNumber(RightsNumber);
  22.  
  23.   // Rechte für Admin
  24.   RightsNumber := 6;
  25.   Rights[1] = GetRightsFromNumber(RightsNumber);
  26.  
  27.   // Rechte für Sekretärin
  28.   RightsNumber := 4;
  29.   Rights[2] = GetRightsFromNumber(RightsNumber);
  30. end;
  31.  
  32. procedure CheckRights;
  33. begin
  34.   if drMenu in Rights[0] then ShowMessage('´Chef´hat ´Menu´ rechte');
  35.   if drUser in Rights[0] then ShowMessage('´Chef´hat ´User´ rechte');
  36.   if drConsultProfile in Rights[0] then ShowMessage('´Chef´hat ´Profil´ rechte');
  37. end;
  38.  
  39.  


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.

Danke schonmal fürs lesen ;)

matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 10:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Code:
  1.  TDRights = set of (drMenu, drUser, drConsultProfile);
  2.  
  3. const
  4.  // Rechte
  5.  cNoRights = 0;
  6.  cRightMenu = 1;
  7.  cRightUser = 2;
  8.  cRightConsultProfile = 3;
  9.  
  10.  // Alle Rechte
  11.  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:
  1. var
  2.   Rights: Word; // oder Integer
  3. begin
  4.   // Rechte (Bits) setzen
  5.   Rights := Rights or $01;
  6.   Rights := Rights or $04;
  7.  
  8.   // Rechte (Bits) abfragen
  9.   if (Rights and $02 > 0)
  10.     then Caption := 'Yes'
  11.     else Caption := 'No';
  12. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 11:14 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hmm... irgendwie wenn ich diesen Code benutze

Code:
  1.  
  2.  
  3. const
  4.   // Rechte
  5.   cRightMenu = $01;
  6.   cRightUser = $02;
  7.   cRightConsultProfile = $03;
  8.  
  9.   // Alle Rechte
  10.   cFullRights = cRightMenu or
  11.                 cRightUser or
  12.                 cRightConsultProfile;
  13.  
  14. var
  15.   Rights : Word;
  16. begin
  17.   // Menu Rechte
  18.   Rights := 0;
  19.   Rights := Rights or cRightMenu;
  20.   Rights := Rights or cRightUser;
  21.   Rights := Rights or cRightConsultProfile;
  22.  
  23.   Showmessage(inttostr(Rights));
  24.  



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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Finalspace hat geschrieben:
 // Rechte
 cRightMenu = $01;
 cRightUser = $02;
 cRightConsultProfile = $03;

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:
  1. cRightConsultProfile = &#036;03;

mal die folgende.
Code:
  1. cRightConsultProfile = &#036;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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 13:20 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Alles klar funzt wunderbar ;)
Mensch ich kenn das eigentlich mit den Bits.
Schule is doch nich so unnötig...

OR Oder

AND Und

XOR Exklusiv oder

NOR Nicht oder

NAND Nicht und

und den ganzen rotz...

ich lern ja den scheiss... wusste aba bis heute nich... was man damit alles anfangen kann ;)
Jetzt weiss ichs...

"ARIGATOU GOIZEMASU" *verbeugend danke sag*.


matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 16:41 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ich würde gern Morgen mal das Prog Online gern testen.
Wer hätte den lust mal so art alpha test zu machen ??

Ist nich viel, nur zur Datenbank Connecten... einloggen... Protocol anschauen... und dann passt dat.
Lokal gehts bis jetzt ganz gut ;)

Ich kanns leider nich alleine testen, da ich hier DSL mit Router habe... und zuhause kein Internet :(

matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 16, 2003 18:29 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Schicks rüber. Bin morgen an einer 2Mbit Standleitung, kann also gut testen.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 17 Queries | GZIP : On ]