Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Inifile Problem (https://www.delphipraxis.net/184172-inifile-problem.html)

Jumpy 5. Mär 2015 17:38

AW: Inifile Problem
 
Zitat:

Zitat von Maximum (Beitrag 1292511)
Ja ich bin mir zu 100% sicher, dass der Dateipfad richtig zusammengesetzt wird

Glaub ich dir jetzt mal, obwohl ich mich auch gewundert habe, dass das n 2x in den Pfad+dateinamen kommt.

Zum Problem, guck dir mal den Part an:

Delphi-Quellcode:
  ini.ReadSectionValues('BMI', sl);
  for l := 0 to sl.Count-1 do
    helpd[l] := StrToDate(sl.Names[l]);
  for l := 0 to sl.Count-1 do
    helpb[l] := Integer(sl.Objects[l]);
Du füllst in 2 Schleifen jeweils "helpd[l]:=". Damit überschreibst du beim 2x das, was du beim 1x reingeschrieben hast, ist das gewollt?

Davon ab scheint mir das "helpb[l] := Integer(sl.Objects[l]);" auch falsch, denn was soll in den Objekten drin sein, eigentlich doch nix, daher vllt. die 0 überall drin.

Du meintest wahrsch. sowas:
helpb[l] := Integer(sl.values[helpb[l]]);

BadenPower 5. Mär 2015 17:40

AW: Inifile Problem
 
Zitat:

Zitat von Maximum (Beitrag 1292511)
aktuelles Ergebnis sieht so aus, das er die Arrays mit Daten bestückt, die Länge ist nun wie erwünscht "365", jedoch sind alle Werte = 0 also default.

Wo werden denn die Arrays ausgelesen?

Zitat:

Zitat von Jumpy (Beitrag 1292515)
Du füllst in 2 Schleifen jeweils "helpd[l]:=". Damit überschreibst du beim 2x das, was du beim 1x reingeschrieben hast, ist das gewollt?

sind doch 2 verschiedene
"helpd[l]:="
"helpb[l]:="

Dalai 5. Mär 2015 17:40

AW: Inifile Problem
 
Ich kann mir kaum vorstellen, dass in
Delphi-Quellcode:
sl.Objects
irgendwas Sinnvolles drinsteht. Kann es sein, dass du
Delphi-Quellcode:
sl.Values
suchst?

Und noch eine Sache:
Delphi-Quellcode:
ExtractFilePath
liefert den Pfad inkl. abschließendem Pfadtrenner (bei Windows Backslash), d.h. du brauchst beim Zusammenbauen deines Dateinamens keinen Backslash einzufügen. Sinnvoller wäre die Verwendung der Funktion
Delphi-Quellcode:
IncludeTrailingPathDelimiter
(bzw. IncludeTrailingBackslash bei Delphi 5 und älter).

MfG Dalai

himitsu 5. Mär 2015 17:53

AW: Inifile Problem
 
Warum gibt GetApplicationDirectory den Path und nicht das Directory zurück?

Dir = ohne abschließendes \
Path = mit



Und für aktuellere Delphis: Delphi-Referenz durchsuchenTPath.Combine

Jumpy 6. Mär 2015 09:01

AW: Inifile Problem
 
Zitat:

Zitat von BadenPower (Beitrag 1292519)
Zitat:

Zitat von Jumpy (Beitrag 1292515)
Du füllst in 2 Schleifen jeweils "helpd[l]:=". Damit überschreibst du beim 2x das, was du beim 1x reingeschrieben hast, ist das gewollt?

sind doch 2 verschiedene
"helpd[l]:="
"helpb[l]:="

Das hab ich nicht gesehen, dass da einmal b und einmal p am Schluss steht. Ist dann aber in jedem Fall ein gutes Beispiel für eine schlechte "Benamsung".

Davon ab steht aber der Rest meines Posts noch, dass wahrscheinlich sl.Values statt sl.Objects verwendet werden sollte.

BadenPower 6. Mär 2015 09:14

AW: Inifile Problem
 
Zitat:

Zitat von Jumpy (Beitrag 1292569)
Das hab ich nicht gesehen, dass da einmal b und einmal p am Schluss steht.

:?::?::?:

Also ich sehe kein: p :-D:lol::spin2::coder2:

Jumpy 6. Mär 2015 11:35

AW: Inifile Problem
 
Zitat:

Zitat von BadenPower (Beitrag 1292572)
Zitat:

Zitat von Jumpy (Beitrag 1292569)
Das hab ich nicht gesehen, dass da einmal b und einmal p am Schluss steht.

:?::?::?:

Also ich sehe kein: p :-D:lol::spin2::coder2:

Das p steht vor dem b oder dem d, welches ich jetzt beim xten mal hingucken nun auch erkannt habe. Du kannst mir nicht zufällig ein Rezept für eine neue Brille aufschreiben :oops:

p80286 6. Mär 2015 11:37

AW: Inifile Problem
 
p b d
ist doch egal, Hauptsache lesbar!

Gruß
K-H

Maximum 6. Mär 2015 12:47

AW: Inifile Problem
 
Hallo Leute,
Erstmal ein großes Danke an alle die sich mit meinem Problem beschäftigen und versuchen mir zu helfen!
Ich hab mir eure Antworten angekuckt und Vorschläge ausprobiert(Backslash bleibt vorerst, da ich wie schon gesagt erstmal erreichen will, dass es funktioniert).
Folgendes kam dabei raus:
Delphi-Quellcode:
unit ULoad2;

interface

uses SysUtils,StdCtrls, ExtCtrls,FileCtrl, Classes, Graphics, Controls, Forms,IniFiles, Dialogs;
type tladenbmi= array[1..365] of String;
     tladendate= array[1..365] of TDate;
function GetApplicationDirectory: string;
procedure loadfileb(n:string);

var
helpbmi:tladenbmi;
helpdate:tladendate;
test: string;
implementation

function GetApplicationDirectory: string;
begin
  GetApplicationDirectory := ExtractFilePath(ParamStr(0));
end;

procedure loadfileb(n:string);
var Ini: TIniFile;
  dir:string;
  sl : TStringList;
  l:integer;
begin
  dir:=GetApplicationDirectory+n;
  sl:=TStringlist.Create;
  Ini:=TIniFile.Create(dir+'\'+n+'.ini'); //Datei in Stringliste laden
  try
    ini.ReadSectionValues('BMI', sl);
    for l := 0 to sl.Count-1 do
  begin
    helpdate[l]:=StrToDate(sl.Names[l]);
    helpbmi[l]:=sl.Values[DateToStr(helpdate[l])];
  end;
    test:= helpbmi[1];
  finally
   Ini.Free;
   sl.Free;
  end;
end;

end.
So nachdem ich nun test in einem Editfeld ausgebe bleibt dieses jedoch leer, verändert sich jedoch(Defaulttext:'Edit1'; nach Ausführung des Befehls:''; )
Ich weiß schonwieder echt nicht weiter. Ist mir echt peinlich, wie blöd ich mich anstell...

PS: Sorry das ich so unregelmäßig antworte, hab zur Zeit nicht viel Zeit.

Sir Rufo 6. Mär 2015 12:47

AW: Inifile Problem
 
Ich habe die Unit jetzt mal ein wenig umgeschrieben, auch wenn die Struktur der Daten immer noch nicht optimal ist ... aber das ist ja auch ein anderes Thema.
Delphi-Quellcode:
unit ULoad2;

interface

uses
  SysUtils,
  Classes,
  IniFiles;

type
  // ## INFO ##
  //
  // Zusammengehörende Informationen fassen wir auch zusammen

  // tladen = array [1 .. 365] of Integer;
  // tladend = array [1 .. 365] of TDate;

  TTagesWert = record
    Datum: TDate;
    Wert: Integer;
  end;

  TJahresWerte = array of TTagesWert;

  // ## INFO ##
  //
  // Statt irgendwelcher Magic Values, die überall im Code auftauchen
  // benutzen wir Konstanten

const
  PATH_SEPARATOR = '\';
  DATA_DIRECTORY_NAME = 'Data';
  BMIFILE_EXTENSION = '.ini';
  BMIFILE_BMI_SECTIONNAME = 'BMI';

function GetApplicationDirectory: string;

// ## INFO ##
//
// DRY - **D**on't **R**epeat **Y**ourself
//
// Niemals an irgendwelchen Stellen den gleichen Code mit der gleichen Bedeutung
// doppelt schreiben. Diese Teile werden ausgelagert und bekommen sprechende
// Namen.

function GetDataDirectory: string;
function GetDataFileName( const AName: string ): string;

// procedure loadfileb( n: string );
function LoadBmiFileData( const AName: string ): TJahresWerte;
procedure SaveBmiFileData( const AName: string; AData: TJahresWerte );

// ## INFO ##
//
// Globale Variablen müssen nicht sein und sind mehr BÖSE als nützlich

// var
// helpb: tladen;
// helpd: tladend;
// j: Integer;

implementation

function GetApplicationDirectory: string;
begin
  // ## INFO ##
  //
  // Wenn wir das Verzeichnis möchten, dann müssen wir uns auch das Verzeichnis
  // holen und nicht den Pfad

  // GetApplicationDirectory := ExtractFilePath( ParamStr( 0 ) );
  GetApplicationDirectory := ExtractFileDir( ParamStr( 0 ) );
end;

function GetDataDirectory: string;
begin
  GetDataDirectory := GetApplicationDirectory + PATH_SEPARATOR + DATA_DIRECTORY_NAME;
end;

function GetDataFileName( const AName: string ): string;
begin
  GetDataFileName := GetDataDirectory + PATH_SEPARATOR + AName + BMIFILE_EXTENSION;
end;

// procedure loadfileb( n: string );
// var
// Ini: TIniFile;
// dir: string;
// sl: TStringList;
// l: Integer;
// begin
// dir := GetApplicationDirectory + n;
// sl := TStringList.Create;
// Ini := TIniFile.Create( dir + '\' + n + '.ini' ); // Datei in Stringliste laden
// try
// Ini.ReadSectionValues( 'BMI', sl );
// for l := 0 to sl.Count - 1 do
// helpd[l] := StrToDate( sl.Names[l] );
// for l := 0 to sl.Count - 1 do
// helpb[l] := Integer( sl.Objects[l] );
// j := Length( helpb );
// finally
// Ini.Free;
// sl.Free;
// end;
// end;

function LoadBmiFileData( const AName: string ): TJahresWerte;
var
  LBmiFileName: string;
  LBmiFile: TIniFile;
  LSectionNames: TStringList;
  LIdx: Integer;
begin
  LSectionNames := nil;
  LBmiFile := nil;
  try

    LBmiFileName := GetDataFileName( AName );
    LBmiFile := TIniFile.Create( LBmiFileName );

    LBmiFile.ReadSection(
      {Section} BMIFILE_BMI_SECTIONNAME,
      {Strings} LSectionNames );

    SetLength( Result, LSectionNames.Count );

    for LIdx := 0 to LSectionNames.Count - 1 do
      begin
        Result[LIdx].Datum := StrToDate( LSectionNames[LIdx] );
        Result[LIdx].Wert := LBmiFile.ReadInteger(
          {Section} BMIFILE_BMI_SECTIONNAME,
          {Ident} LSectionNames[LIdx],
          {Default} 0 );
      end;

  finally
    LSectionNames.Free;
    LBmiFile.Free;
  end;
end;

procedure SaveBmiFileData( const AName: string; AData: TJahresWerte );
var
  LBmiFileName: string;
  LBmiFile: TIniFile;
  LIdx: Integer;
begin
  LBmiFile := nil;
  try

    LBmiFileName := GetDataFileName( AName );
    LBmiFile := TIniFile.Create( LBmiFileName );

    LBmiFile.EraseSection( BMIFILE_BMI_SECTIONNAME );

    for LIdx := Low( AData ) to High( AData ) do
      begin
        LBmiFile.WriteInteger(
          {Section} BMIFILE_BMI_SECTIONNAME,
          {Ident} DateToStr( AData[LIdx].Datum ),
          {Value} AData[LIdx].Wert );
      end;

  finally
    LBmiFile.Free;
  end;
end;

end.


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

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 by Thomas Breitkreuz