Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Combobox aus *.ini laden

  Alt 4. Mär 2013, 20:10
Weil ich es gerade hier so fertig herumliegen habe:

Eine Unit mit der man alle published Properties (rw) einer beliebigen Instanz, eine TCollection und TStrings in eine ini-Datei schreiben und wieder auslesen kann.

Die Handhabung ist recht einfach:
Delphi-Quellcode:
var
  MyObj : TMyObject;
  MyIni : TIniFile;
begin
  ...

  // Instanzen von MyIni und MyObj müssen natürlich vorhanden sein
  
  // schreiben
  StoreObj( MyObj, MyIni, 'MyObject' );

  // lesen
  LoadObj( MyObj, MyIni, 'MyObject' );

end;
Eine TStringList würde dann wie folgt gespeichert werden
Code:
[MyObject\Strings]
0=Zeile1
1=Zeile2
2=Zeile3
BTW: Man könnte damit auch die komplette ComboBox abspeichern ... aber dann kommt halt alles andere auch mit

Delphi-Quellcode:
unit IniObjStore;

interface

uses
  Classes, IniFiles;

procedure StoreObj( const Instance : TObject; const Ini : TCustomIniFile; const Section : string );
procedure LoadObj( const Instance : TObject; const Ini : TCustomIniFile; const Section : string );

implementation

uses
  SysUtils,
  TypInfo;

const
  C_Sec_Delim = '\';

procedure StoreObj( const Instance : TObject; const Ini : TCustomIniFile; const Section : string );
  procedure EraseSection;
  var
    LSubSections : TStrings;
    LIdx : Integer;
  begin
    LSubSections := TStringList.Create;
    try
      Ini.ReadSubSections( Section, LSubSections, True );
      for LIdx := 0 to Pred( LSubSections.Count ) do
        Ini.EraseSection( Section + C_Sec_Delim + LSubSections[LIdx] );
    finally
      LSubSections.Free;
    end;
    Ini.EraseSection( Section );
  end;

var
  LPropName, LPropValue : string;
  LPropInfo : PPropInfo;
  LPropCount : Integer;
  LPropList : PPropList;
  LPropType : PPTypeInfo;
  LIdx : Integer;
  LObj : TObject;
  LItem : TCollectionItem;
begin
  EraseSection;

  if not Assigned( Instance )
  then
    Exit;

  // TCollection-Handling
  if Instance is TCollection
  then
    for LItem in ( Instance as TCollection ) do
      // recursive call
      StoreObj( LItem, Ini, Section + C_Sec_Delim + IntToStr( LItem.Index ) );

  if Instance is TStrings
  then
    with ( Instance as TStrings ) do
      for LIdx := 0 to Pred( Count ) do
        Ini.WriteString( Section + C_Sec_Delim + 'Strings', IntToStr( LIdx ), Strings[LIdx] );

  // examine all published properties
  LPropCount := GetPropList( PTypeInfo( Instance.ClassInfo ), LPropList );
  if LPropCount > 0
  then
    try

      for LIdx := 0 to Pred( LPropCount ) do
        begin
          LPropInfo := LPropList^[LIdx];
          LPropType := LPropInfo^.PropType;

          if LPropType^.Kind = tkMethod
          then
            Continue;

          // WriteOnly-Property
          if ( LPropInfo.GetProc = nil )
          then
            Continue;

          LPropName := string( LPropInfo.Name );

          case LPropType^.Kind of
            tkClass :
              begin

                LObj := GetObjectProp( Instance, LPropName );
                // recursive call
                StoreObj( LObj, Ini, Section + C_Sec_Delim + LPropName );

              end;
            tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkWChar, tkLString, tkWString, tkInt64, tkUString :
              begin

                // ReadOnly-Property
                if ( LPropInfo.SetProc = nil )
                then
                  Continue;

                LPropValue := GetPropValue( Instance, LPropName );
                Ini.WriteString( Section, LPropName, LPropValue );
              end;
          end;

        end;

    finally
      FreeMem( LPropList );
    end;

end;

procedure LoadObj( const Instance : TObject; const Ini : TCustomIniFile; const Section : string );
var
  LPropName, LPropValue : string;
  LPropInfo : PPropInfo;
  LPropCount : Integer;
  LPropList : PPropList;
  LPropType : PPTypeInfo;
  LIdx : Integer;
  LObj : TObject;
begin
  if not Assigned( Instance )
  then
    Exit;

  // TCollection-Handling
  if Instance is TCollection
  then
    with Instance as TCollection do
      begin
        Clear;
        LIdx := 0;
        while Ini.SectionExists( Section + C_Sec_Delim + IntToStr( LIdx ) ) do
          begin
            // recursive call
            LoadObj( Add, Ini, Section + C_Sec_Delim + IntToStr( LIdx ) );
            Inc( LIdx );
          end;
      end;

  if Instance is TStrings
  then
    with Instance as TStrings do
      begin
        BeginUpdate;
        try
          Clear;
          LIdx := 0;

          while Ini.ValueExists( Section + C_Sec_Delim + 'Strings', IntToStr( LIdx ) ) do
            begin
              Add( Ini.ReadString( Section + C_Sec_Delim + 'Strings', IntToStr( LIdx ) ) );
              Inc( LIdx );
            end;
        finally
          EndUpdate;
        end;
      end;

  // examine all published properties
  LPropCount := GetPropList( PTypeInfo( Instance.ClassInfo ), LPropList );
  if LPropCount > 0
  then
    try

      for LIdx := 0 to Pred( LPropCount ) do
        begin
          LPropInfo := LPropList^[LIdx];
          LPropType := LPropInfo^.PropType;

          if LPropType^.Kind = tkMethod
          then
            Continue;

          LPropName := string( LPropInfo.Name );

          case LPropType^.Kind of
            tkClass :
              begin

                LObj := GetObjectProp( Instance, LPropName );
                // recursive call
                LoadObj( LObj, Ini, Section + C_Sec_Delim + LPropName );

              end;
            tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkWChar, tkLString, tkWString, tkInt64, tkUString :
              begin

                // ReadOnly-Property
                if LPropInfo.SetProc = nil
                then
                  Continue;

                LPropValue := GetPropValue( Instance, LPropName );
                LPropValue := Ini.ReadString( Section, LPropName, LPropValue );
                SetPropValue( Instance, LPropName, LPropValue );
              end;
          end;

        end;

    finally
      FreeMem( LPropList );
    end;

end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 4. Mär 2013 um 20:44 Uhr)
  Mit Zitat antworten Zitat