![]() |
Richtig in Ini Datei abspeichern
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Procedure TfrmBenutzerverwaltung.SaveToStringGrid(Name, Passwort, Kunde, Lieferant, Personal, Verwaltung : string);
var ARow : Integer; Begin // Schutz if Name ='' 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; procedure SaveToIni(AIni: TIniFile; const ABenutzer: TBenutzer); const SectionBenutzer = 'Benutzer'; SectionZugang = 'Zugang'; begin AIni := TIniFile.Create('C:\Users\Verwaltung.ini'); 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 |
AW: Richtig in Ini Datei abspeichern
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? |
AW: Richtig in Ini Datei abspeichern
weis ich nicht
|
AW: Richtig in Ini Datei abspeichern
So, damit es auch schön kompliziert aussieht:
Delphi-Quellcode:
Und benutzt hab ich das dann so:
uses IniFiles, math;
function RightsToString(RightsList: TStrings; Columns: array of 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 SaveUserToIni(AIni: TIniFile; DataList: TStrings; NameIndex, PWIndex: integer; RightsList: array of integer); const USERSECTION = 'Benutzer'; ACCESSSECTION = 'Zugang'; begin Assert(Assigned(AIni), 'Keine IniFile-Instanz übergeben'); Assert(Assigned(DataList), 'Keine Liste übergeben'); if DataList.Count - 1 < MaxIntValue([NameIndex, PWIndex, MaxIntValue(RightsList)]) then raise Exception.Create('Liste enthält zuwenig Elemente'); AIni.WriteString(USERSECTION, DataList[NameIndex], DataList[PWIndex]); AIni.WriteString(ACCESSSECTION, DataList[NameIndex], RightsToString(DataList, RightsList)); end;
Delphi-Quellcode:
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; |
AW: Richtig in Ini Datei abspeichern
Zitat:
Zitat:
|
AW: Richtig in Ini Datei abspeichern
Lukas 23:34 :mrgreen:
|
AW: Richtig in Ini Datei abspeichern
@Rippo
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.
Delphi-Quellcode:
procedure IniEraseSection(const IniFileName, SectionName: String);
var AIni: TIniFile; begin AIni := TIniFile.Create(IniFileName); try AIni.EraseSection(SectionName); finally AIni.Free; end; end; procedure SaveToIni(const IniFileName: String; const ABenutzer: TBenutzer); const SectionBenutzer = 'Benutzer'; SectionZugang = 'Zugang'; var AIni: TIniFile; begin AIni := TIniFile.Create(IniFileName); try AIni.WriteString(SectionBenutzer, ABenutzer.BenutzerName, ABenutzer.Kennwort); AIni.WriteString(SectionZugang, ABenutzer.BenutzerName, ABenutzer.Rechte); finally AIni.Free; end; end; procedure DeleteAllSections(const IniFileName: String); ... begin ... for I := 0 to AllSectionsList.Count-1 do begin SectionName := AllSectionsList[I]; IniEraseSection(IniFileName, SectionName); end; ... end; procedure TfrmBenutzerverwaltung.btnSpeichernClick(Sender: TObject); const IniFileName = 'C:\Users\Verwaltung.ini'; var Zeile, Spalte : integer; Titel: string; AIni: TIniFile; Benutzer : TBenutzer; begin SaveToStringGrid(edtName.Text,edtPasswort.Text,edtKunde.Text,edtLieferant.Text,edtPersonal.Text,edtVerwaltung.Text); SaveToIni(IniFileName, Benutzer); DeleteAllSections(IniFileName); ... |
AW: Richtig in Ini Datei abspeichern
Äh, wieso umständlich Code für "DeleteAllSections" programmieren, wenn ein einfaches "DeleteFile" dasselbe tut?
|
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.
|
AW: Richtig in Ini Datei abspeichern
Zitat:
:twisted: :twisted: Hans |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz