Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String in Variablen "umwandeln" (https://www.delphipraxis.net/148280-string-variablen-umwandeln.html)

Jackie1983 26. Feb 2010 15:38


String in Variablen "umwandeln"
 
Servus,

wuste jetzt nicht ganz wie ich das Thema nennen soll.
Habe eine Text- bzw. Inidatei mit folgendem Aufbau:
Zitat:

[option]
options_1=wert_1
options_2=wert_2
etc
Jetzt möchte ich gerne options_1 bis options_n auslesen und in einer Variable stecken.
Habe es zur Zeit so gelöst
Delphi-Quellcode:
const
  options : array[1..4] of String =
            (
             ('options_1'),
             ('options_2'),
             ...
            );
begin
  //...
      Text := LowerCase(ini.ReadString('option',options[i],''));
      if Text = 'options_1' then
        obj.options_1 := text;
      //...
Finde das aber recht unübersichtlich. Es gibt bestimmt was eleganteres wie oben, oder?
mfg

jfheins 26. Feb 2010 15:46

Re: String in Variablen "umwandeln"
 
Delphi-Referenz durchsuchenTIniFile

Jackie1983 26. Feb 2010 16:08

Re: String in Variablen "umwandeln"
 
TIniFile ist doch das gleiche wie TMemIniFile. Damit kann ich das auch nicht machen.

s.h.a.r.k 26. Feb 2010 16:44

Re: String in Variablen "umwandeln"
 
So einfach wie in PHP gehts leider nicht :mrgreen: dafür ist Delphi aber halt typsicher. Du könntest dir aber, wenn du D2010 im Einsatz hast, RTTI anschauen. Daniel hat da ein schönes Video dazu gepostet, das so ziemlich das abdeckt, was du haben willst.

p80286 26. Feb 2010 16:45

Re: String in Variablen "umwandeln"
 
Zitat:

Zitat von Jackie1983
Jetzt möchte ich gerne options_1 bis options_n auslesen und in einer Variable stecken.
Habe es zur Zeit so gelöst
Delphi-Quellcode:
const
  options : array[1..4] of String =
            (
             ('options_1'),
             ('options_2'),
             ...
            );
begin
  //...
      Text := LowerCase(ini.ReadString('option',options[i],''));
      if Text = 'options_1' then
        obj.options_1 := text;
      //...

Dir ist klar das in Text niemals options_1 auftauchen wird? Sondern nur wert_1, wert_2 usw.?

Was verstehst Du denn unter einer Variablen? Eine Variable pro "Option"?

Delphi-Quellcode:
var
  option_1 : string;
  option_2 : string;
 
  Text := LowerCase(ini.ReadString('option','option_1',''));
  if Text <>'' then option_1 := text;
  Text := LowerCase(ini.ReadString('option','option_2',''));
  if Text <>'' then option_2 := text;
Gruß
K-H

Jackie1983 26. Feb 2010 17:15

Re: String in Variablen "umwandeln"
 
Zitat:

Zitat von p80286
Dir ist klar das in Text niemals options_1 auftauchen wird? Sondern nur wert_1, wert_2 usw.?

Hatte mich vertan, so ist das richtig. Unten muss dann options[i] hin.
Delphi-Quellcode:
const
  options : array[1..4] of String =
            (
             ('options_1'),
             ('options_2'),
             ...
            );
begin
  //...
      Text := LowerCase(ini.ReadString('option',options[i],''));
      if options[i] = 'options_1' then //hier
        obj.options_1 := text;
      //...
Zitat:

Zitat von p80286
Was verstehst Du denn unter einer Variablen? Eine Variable pro "Option"?
Delphi-Quellcode:
var
  option_1 : string;
  option_2 : string;
 
  Text := LowerCase(ini.ReadString('option','option_1',''));
  if Text <>'' then option_1 := text;
  Text := LowerCase(ini.ReadString('option','option_2',''));
  if Text <>'' then option_2 := text;

Richtig. Aber da ich noch was mehr machen muss mit der Variable, möchte ich es gerne in einer Schleife abfragen
um sourcen zu sparen.

Zitat:

Zitat von s.h.a.r.k
So einfach wie in PHP gehts leider nicht :mrgreen: dafür ist Delphi aber halt typsicher. Du könntest dir aber, wenn du D2010 im Einsatz hast, RTTI anschauen. Daniel hat da ein schönes Video dazu gepostet, das so ziemlich das abdeckt, was du haben willst.

Nein habe ich leider nicht.

Matze 26. Feb 2010 17:18

Re: String in Variablen "umwandeln"
 
Vielleicht etwas umständlich, aber es geht. :stupid:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  MyIni: TIniFile;
  i: Integer;
  OptionNames: TStringList;
  OptionValues: array of string; // Enthält die Werte
begin
  // Ini lesen
  MyIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'options.ini');
  try
    OptionNames := TStringList.Create;
    try
      // alle Einträge (Namen) unter [option] einlesen und in StringList speichern
      MyIni.ReadSection('option', OptionNames);

      // Werte auslesen und dem Array hinzufügen
      SetLength(OptionValues, OptionNames.Count);
      for i := 0 to OptionNames.Count - 1 do
      begin
        OptionValues[i] := MyIni.ReadString('option', OptionNames[i], '');
      end;
    finally
      FreeAndNil(OptionNames);
    end;
  finally
    FreeAndNil(MyIni);
  end;

  // Sodele, hier sind nun alle Werte im Array

  // Testausgabe:
  for i := Low(OptionValues) to High(OptionValues) do
  begin
    ShowMessage(OptionValues[i]);
  end;
end;
Edit: Du kannst allerdings nicht mehr zuordnen, unter welchem Namen welcher Wert stand. OptionValues[0] enthält beispielsweise den ersten Wert in dem Abschnitt [option].

Jackie1983 26. Feb 2010 17:39

Re: String in Variablen "umwandeln"
 
Zitat:

Zitat von Matze
Edit: Du kannst allerdings nicht mehr zuordnen, unter welchem Namen welcher Wert stand. OptionValues[0] enthält beispielsweise den ersten Wert in dem Abschnitt [option].

Und genau das ist mein Problem. Ich brauche schon einen Namen, da ich nicht weis was bei 0,1,2 für Optionen stehen.
Wenn es so nicht geht muss ich das ganze anders lösen, habe schon einen Ansatz.....

Matze 26. Feb 2010 18:51

Re: String in Variablen "umwandeln"
 
Ich habe ganz schlampig was zusammen getippt. Es ist nicht sauber, aber vielleicht kannst du in der Richtung etwas machen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    type TOptData = record
      OptName: string;
      OptValue: string;
    end;
    type TOptDataArray = array of TOptData;

    function GetOptionsFromIni: TOptDataArray;
    function GetOptValue(OptData: TOptDataArray; OptName: string): string;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetOptionsFromIni: TOptDataArray;
var
  MyIni: TIniFile;
  i: Integer;
  OptionNames: TStringList;
  OptionValues: array of string;
  OptionData: TOptDataArray;
begin
  MyIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'options.ini');
  try
    OptionNames := TStringList.Create;
    try
      MyIni.ReadSection('option', OptionNames);

      SetLength(OptionData, OptionNames.Count);
      for i := 0 to OptionNames.Count - 1 do
      begin
        OptionData[i].OptName := OptionNames[i];
        OptionData[i].OptValue := MyIni.ReadString('option', OptionNames[i], '');
      end;
    finally
      FreeAndNil(OptionNames);
    end;
  finally
    FreeAndNil(MyIni);
  end;

  Result := OptionData;
end;

function TForm1.GetOptValue(OptData: TOptDataArray; OptName: string): string;
var
  i: Integer;
begin
  Result := '';

  for i := Low(OptData) to High(OptData) do
  begin
    if OptData[i].OptName = OptName then
    begin
      Result := OptData[i].OptValue;
      break;
    end;
  end;
end;

// Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
var
  OptionValues: TOptDataArray;
begin
  OptionValues := GetOptionsFromIni;

  ShowMessage(GetOptValue(OptionValues, 'options_1'));
  ShowMessage(GetOptValue(OptionValues, 'options_4'));
end;

end.

Hawkeye219 26. Feb 2010 19:33

Re: String in Variablen "umwandeln"
 
Hallo,

wenn man statt ReadSection die Methode ReadSectionValues verwendet, wird die Sache etwas einfacher:

Delphi-Quellcode:
var
  Options: TStrings;
  Ini: TMemIniFile;
  i: Integer;
  OptionName: string;
  OptionValue: string;
begin
  Options := TStringList.Create;
  try
    Ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Options.ini');
    try
      Ini.ReadSectionValues ('option', Options);
    finally
      Ini.Free;
    end;

    for i := 0 to Options.Count - 1 do
      begin
        OptionName := Options.Names[i];
        OptionValue := Options.Values[OptionName]; // oder Options.ValueFromIndex[i]

        ShowMessage (Format('Wert von %s: %s', [OptionName, OptionValue]));
      end;
  finally
    Options.Free;
  end;
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:34 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