Procedure TfrmBenutzerverwaltung.SaveToStringGrid(Name, Passwort, Kunde, Lieferant, Personal, Verwaltung : string); var ARow : Integer; Begin // Schutz ifName ='' then exit;
ARow := StringGridVerwaltung.Row; With StringGridVerwaltung do Begin
Cells[1,ARow] := Name;
Cells[2,ARow] := Passwort;
Cells[3,ARow] := Kunde;
Cells[4,ARow] := Lieferant;
Cells[5,ARow] := Personal;
Cells[6,ARow] := Verwaltung; End; End; //*****************************************************************************/
//Ini Datei wird gelöscht und wieder hergestellt Procedure DeleteAllSections(aIni :TIniFile); var AllSectionsList : TStringList;
i : Integer;
SectionName : string; Begin
AllSectionsList := TStringList.Create; Try
aIni.ReadSections(AllSectionsList);
for I := 0 to AllSectionsList.Count-1 do Begin
SectionName := AllSectionsList[I];
aIni.EraseSection(SectionName); End; Finally
AllSectionsList.Free; End; End; //*****************************************************************************/ //*****************************************************************************/
function ReadFromGrid(AZeile: Integer): TBenutzer; const
SpalteBenutzer = 1;
SpalteKennwort = 2;
SpalteRechteVon = 3;
SpalteRechteBis = 6; var
Spalte: Integer;
Recht: string;
BenutzerName : String; //StringGridVerwaltung : TStringGrid; begin
Result.BenutzerName := StringGridVerwaltung.Cells[SpalteBenutzer, AZeile];
Result.Kennwort := StringGridVerwaltung.Cells[SpalteKennwort, AZeile];
Result.Rechte := ''; for Spalte := SpalteRechteVon to SpalteRechteBis do begin
Recht := StringGridVerwaltung.Cells[Spalte, AZeile]; if Recht <> '' then begin if Result.Rechte <> '' then
Result.Rechte := Result.Rechte + ',';
Result.Rechte := Result.Rechte + Recht; end; end; end;
AIni.WriteString(SectionBenutzer, ABenutzer.BenutzerName, ABenutzer.Kennwort);
AIni.WriteString(SectionZugang, ABenutzer.BenutzerName, ABenutzer.Rechte); begin
AIni.Free; end; end;
//Hier werden die Sätze in die Ini Datei gespeichert procedure TfrmBenutzerverwaltung.btnSpeichernClick(Sender: TObject); var
Zeile, Spalte : integer;
Titel: string;
AIni: TIniFile;
Benutzer : TBenutzer;
Begin
SaveToStringGrid(edtName.Text,edtPasswort.Text,edtKunde.Text,edtLieferant.Text,edtPersonal.Text,edtVerwaltung.Text);
AIni := TIniFile.Create('C:\Users\Verwaltung.ini');
SaveToIni(AIni, Benutzer);
DeleteAllSections(Aini);
try begin {// Lösche Alle Sectionen aus der Ini Datei
// DeleteAllSections(Aini);
// Speicher alle Zeilen
for Zeile := 0 to StringGridVerwaltung.RowCount - 1 do
Begin
// je Kunde
for Spalte := StringGridVerwaltung.FixedCols to StringGridVerwaltung.ColCount - 1 do
begin
// Kundendetails
Titel := StringGridVerwaltung.Cells[Spalte, 0];
AIni.WriteString('BenutzerName' + IntToStr(Zeile), Titel, StringGridVerwaltung.Cells[Spalte, Zeile]);
end;
} End; finally
AIni.Free; end; end;
Ini datei sieht so aus
[Benutzer]
Hans=a
[Zugang]
Hans=1,2,3,4
Ich möchte auch das die Ini datei so bleibt
Die Einträge von Benutzername und passwort sollen in die section [Benutzer] so eingefügt werden BenutzerName = Passwort in die Section
und für [Zugang] soll BenutzerName = Kunde, Lieferant, Personal, Verwaltung
jedoch klappt dies nicht und es kommt eine fehlermeldung : fehlermeldung mit Zugrifsverletzung in modul kommt wenn ich auf den speicher button klicke
Wieso erzeugst du denn in SaveToIni das AIni neu und zerstörst es auch wieder?
Das wird doch als Parameter übergeben. Wahrscheinlich kommt deine Zugriffsverletzung danach in DeleteAllSectionsweil in SaveToIni das AIni.free drinsteht.
Hast du das mal mit dem Debugger geprüft, wo der Fehler genau auftritt?
function RightsToString(RightsList: TStrings;
Columns: arrayof integer): string; var
Rights: TStringlist;
i: integer; begin
Result := '';
Rights := TStringlist.Create; try for i := Low(Columns) to High(Columns) do if RightsList[Columns[i]] <> '' then
Rights.Add(RightsList[Columns[i]]);
Result := Rights.CommaText; finally
Rights.Free; end; end;
procedure TFormTest.ButtonSaveClick(Sender: TObject); const
NAMECOLUMN = 1;
PWCOLUMN = 2;
RIGHTSCOLUMNS: array [0 .. 3] of integer = (3, 4, 5, 6);
ININAME = 'C:\Temp\Test.ini'; //Ist ja nur zum Testen var
Ini: TIniFile;
Row: integer; begin
Ini := TIniFile.Create(ININAME); try for Row := Grid.FixedRows to Grid.RowCount - 1 do
SaveUserToIni(Ini, Grid.Rows[Row], NAMECOLUMN, PWCOLUMN, RIGHTSCOLUMNS); finally
Ini.Free; end; end;
Detlef "Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
Wieso erzeugst du denn in SaveToIni das AIni neu und zerstörst es auch wieder?
Das wird doch als Parameter übergeben. Wahrscheinlich kommt deine Zugriffsverletzung danach in DeleteAllSectionsweil in SaveToIni das AIni.free drinsteht.
Hast du das mal mit dem Debugger geprüft, wo der Fehler genau auftritt?
Detlef "Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
Du machst das etwas kompliziert mit der Ini. Du erzeugst die Ini in einer Prozedur und verschickst sie dann als Parameter an andere Prozeduren. Das ist an sich kein Fehler, man verliert aber schnell die Übersicht. Wie gesagt, man kann es so machen, aber einfacher ist es nur den Dateinamen zu verschicken und in jeder Prozedur die Ini neu öffnen. Kostet kein Geld. Die Ini wird in jeder Prozedur neu geöffnet und wieder geschlossen. Das ist etwas sauberer (finde ich).
Das habe ich aus dem Kopf gemacht, ist also nicht überprüft. Sollte aber funktionieren. Hier wird nicht die Ini als Parameter übergeben, sondern nur der Dateiname.
procedure DeleteAllSections(const IniFileName: String);
... begin
... for I := 0 to AllSectionsList.Count-1 do begin
SectionName := AllSectionsList[I];
IniEraseSection(IniFileName, SectionName); end;
... end;
Dieses Thema wurde am "24. Apr 2015, 07:23 Uhr" von "r_kerber" aus dem Forum "Neuen Beitrag zur Code-Library hinzufügen" in das Forum "Win32/Win64 API (native code)" verschoben.