Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Richtig in Ini Datei abspeichern (https://www.delphipraxis.net/184442-richtig-ini-datei-abspeichern.html)

Rippo 27. Mär 2015 08:56

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

bcvs 27. Mär 2015 09:23

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?

Rippo 27. Mär 2015 10:18

AW: Richtig in Ini Datei abspeichern
 
weis ich nicht

DeddyH 27. Mär 2015 10:27

AW: Richtig in Ini Datei abspeichern
 
So, damit es auch schön kompliziert aussieht:
Delphi-Quellcode:
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;
Und benutzt hab ich das dann so:
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;

p80286 27. Mär 2015 10:32

AW: Richtig in Ini Datei abspeichern
 
Zitat:

Zitat von bcvs (Beitrag 1295027)
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?

Zitat:

Zitat von Rippo (Beitrag 1295042)
weis ich nicht

:thumb:

DeddyH 27. Mär 2015 10:35

AW: Richtig in Ini Datei abspeichern
 
Lukas 23:34 :mrgreen:

Popov 27. Mär 2015 11:05

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);
...

SMO 28. Mär 2015 14:09

AW: Richtig in Ini Datei abspeichern
 
Äh, wieso umständlich Code für "DeleteAllSections" programmieren, wenn ein einfaches "DeleteFile" dasselbe tut?

DP-Maintenance 24. Apr 2015 06:23

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.

H.Bothur 24. Apr 2015 09:26

AW: Richtig in Ini Datei abspeichern
 
Zitat:

Zitat von DeddyH (Beitrag 1295048)
Lukas 23:34 :mrgreen:

Wieso "Dann warfen sie das Los und verteilten seine Kleider unter sich." Welche Kleider meinst Du ???

:twisted: :twisted:

Hans


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz