RuntimeError 211 Call to abstract method

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
gromit72
Beiträge: 2
Registriert: So 28. Apr 2019, 09:28

RuntimeError 211 Call to abstract method

Beitrag von gromit72 »

Hallo zusammen,

ich habe versucht - und es eigentlich auch geschafft ;-) - die Klasse TINIFile aus der Unit INIFiles zu erweitern.
Ich brauche so eine Art "kaskadierende" .INI-Datei.

"Gestern hat es noch alles funktioniert." :roll: Heute am Projekt weiter gearbeitet und auf einmal kommt beim Ausführen die Fehlermeldung "Call to abstract method", beim Aufruf der Prozedur Readsections - in TCustomINIFile abstract, in TINIFile überschrieben. Meine Klasse leitet sich von TINIFile ab und nicht von TCustomINIFile.

Kann mir bitte jemand einen Tipp geben, warum das nicht funktioniert? Ich seh' den Wald anscheinend vor lauter Bäumen nicht, obwohl der Wald hier extrem übersichtlich ist.

System: Win 10 22H2
Lazarus V 2.2.6, FPC 3.2.2 X86_64-win64-win32/win64

Code: Alles auswählen

unit MergedINIFiles;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, INIFiles;

type

  { TMergedINIFile }

  TMergedINIFile = Class (TINIFile)
  private
     FFiles : TStringArray;
     FOverwrite : Boolean;
  public
     constructor Create(FilesToMerge : TStringArray; DoOverwrite : Boolean = false; AOptions : TIniFileOptions = []); overload;
     constructor Create(FilesToMerge : TStrings; DoOverwrite : Boolean = false; AOptions : TIniFileOptions = []); overload;
     procedure Reload;
     property Files : TStringArray read FFiles write FFiles;
     property Overwrite : Boolean read FOverwrite write FOverwrite;
  end;

implementation

{ TMergedINIFile }

constructor TMergedINIFile.Create(FilesToMerge: TStringArray; DoOverwrite: Boolean; AOptions: TIniFileOptions);
begin
  inherited Create ('', AOptions);
  FOverwrite := DoOverwrite;
  FFiles := Copy (FilesToMerge, 1);
  Reload;
end;

constructor TMergedINIFile.Create(FilesToMerge: TStrings;  DoOverwrite: Boolean; AOptions: TIniFileOptions);
begin
  Create (FilesToMerge.ToStringArray, DoOverwrite, AOptions);
end;

procedure TMergedINIFile.Reload;
var
  ti : TINIFile;
  sl : TStrings;
  vl : TStrings;
  f : Integer;
  s : Integer;
  v : Integer;
begin
  // if the files array is empty leave
  if Length(FFiles) = 0 then Exit;

  try
    // sectionlist
    sl := TStrings.Create;
    // valuelist
    vl := TStrings.Create;

    // remove old sections on reload
    ReadSections(sl);
    For s := 0 to sl.Count -1 do
      EraseSection(sl[s]);

    // cycle through the files
    for f := Low(FFiles) to High(FFiles) do
    begin
      if FileExists(FFiles[f]) then
        try
          // open file
          ti := TINIFile.Create (FFiles[f], Self.Options);
          // get the sections
          ti.ReadSections(sl);
          For s := 0 to sl.Count -1 do
          begin
            // for each section get the values
            ti.ReadSection(sl[s], vl);
            For v := 0 to vl.Count -1 do
              // if overwrite is true or value does not exist write the value to the merged ini
              if FOverwrite or ((not FOverwrite) and (not ValueExists(sl[s], vl[v]))) then
                WriteString(sl[s], vl[v], ti.ReadString(sl[s], vl[v], ''));
          end;
        finally
          // remove the current file from memory
          ti.Free;
        end;
    end;

  finally
    // remove the section and value lists
    sl.Free;
    vl.Free;
  end;

end;


end.

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, MergedINIFiles;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  i : TMergedINIFile;
begin
  i := TMergedINIFile.Create(['a.ini','b.ini','c.ini']);
end;

end. 

gromit72
Beiträge: 2
Registriert: So 28. Apr 2019, 09:28

Re: RuntimeError 211 Call to abstract method

Beitrag von gromit72 »

Fehler gefunden - statt TStrings einfach TStringlist verwenden - schon geht's.

Antworten