AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Richtig in Ini Datei abspeichern

Ein Thema von Rippo · begonnen am 27. Mär 2015 · letzter Beitrag vom 24. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2   
Rippo

Registriert seit: 10. Feb 2015
75 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 09:56
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
Miniaturansicht angehängter Grafiken
verwaltung.png  
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
610 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 10:23
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?
  Mit Zitat antworten Zitat
Rippo

Registriert seit: 10. Feb 2015
75 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 11:18
weis ich nicht
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.455 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 11:27
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;
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 11:32
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?
weis ich nicht
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.455 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 11:35
Lukas 23:34
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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Richtig in Ini Datei abspeichern

  Alt 27. Mär 2015, 12:05
@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);
...
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#8

AW: Richtig in Ini Datei abspeichern

  Alt 28. Mär 2015, 15:09
Äh, wieso umständlich Code für "DeleteAllSections" programmieren, wenn ein einfaches "DeleteFile" dasselbe tut?
  Mit Zitat antworten Zitat
24. Apr 2015, 07: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

Registriert seit: 25. Jun 2012
167 Beiträge
 
#10

AW: Richtig in Ini Datei abspeichern

  Alt 24. Apr 2015, 10:26
Wieso "Dann warfen sie das Los und verteilten seine Kleider unter sich." Welche Kleider meinst Du ???



Hans
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf