Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anfängerfragen zu Generics (https://www.delphipraxis.net/217010-anfaengerfragen-zu-generics.html)

ringli 6. Apr 2025 11:14

Anfängerfragen zu Generics
 
Ich habe mit der XML-Datenanbindung eine Klasse zur Verwaltung von Programmeinstellungen erstellt.

In der eigentlichen Anwendung habe ich nun 3 ExecApps-Funktionen, die bis auf den Funktionskopf identisch sind.

Delphi-Quellcode:
interface

...

type
  TfrmMain = class(TForm)
    procedure btnPreBackupClick(Sender: TObject);
    procedure btnBackupClick(Sender: TObject);
    procedure btnPostBackupClick(Sender: TObject);
    private
      function ExecApps(AppType : IXMLPreBackupType;
                         SelectedOption : TExitMode) : Integer; overload;
      function ExecApps(AppType : IXMLBackupType;
                         SelectedOption : TExitMode) : Integer; overload;
      function ExecApps(AppType : IXMLPostBackupType;
                         SelectedOption : TExitMode) : Integer; overload;
    public
      ...
    end;
   
implementation

function TfrmMain.ExecApps(AppType : IXMLBackupType;
                           SelectedOption : TExitMode) : Integer;
begin
  if (AppType.Count = 0) then
    begin
      Exit;
    end;
   
  ...
end;

function TfrmMain.ExecApps(AppType : IXMLPreBackupType;
                           SelectedOption : TExitMode) : Integer;
begin
  if (AppType.Count = 0) then
    begin
      Exit;
    end;
   
  ...
end;

function TfrmMain.ExecApps(AppType : IXMLPostBackupType;
                           SelectedOption : TExitMode) : Integer;
begin
  if (AppType.Count = 0) then
    begin
      Exit;
    end;
   
  ...
end;

...

procedure TfrmMain.btnPreBackupClick(Sender: TObject);
begin
  if ExecApps(FXMLConfig.Types.Prebackup, SelectedOption) then
    begin
      ...
    end;
end;

procedure TfrmMain.btnBackupClick(Sender: TObject);
begin
  if ExecApps(FXMLConfig.Types.Backup, SelectedOption) then
    begin
      ...
    end;
end;

procedure TfrmMain.btnPostBackupClick(Sender: TObject);
begin
  if ExecApps(FXMLConfig.Types.Postbackup, SelectedOption) then
    begin
      ...
    end;
end;
IXMLBackupType, IXMLPreBackupType, IXMLPostBackupType sind von IXMLNodeCollection abgeleitet.

Der obige Code funktioniert soweit, ist aber natürlich 3-fach vorhanden und muss entsprechend gepflegt werden.

Jetzt dachte ich, ich könnte die 3 ExecApps-Funktionen zusammenfassen um die Pflege zu vereinfachen:
Delphi-Quellcode:
interface

...

type
  TfrmMain = class(TForm)
    procedure btnPreBackupClick(Sender: TObject);
    procedure btnBackupClick(Sender: TObject);
    procedure btnPostBackupClick(Sender: TObject);
    private
      function ExecApps<T>(AppType : T;
                            SelectedOption : TExitMode) : Integer;
    public
      ...
    end;
   
implementation

function TfrmMain.ExecApps<T>(AppType : T;
                              SelectedOption : TExitMode) : Integer;
begin
  if (AppType.Count = 0) then // E2003 Undeklarierter Bezeichner: 'Count'
    begin
      Exit;
    end;
end;

...

procedure TfrmMain.btnPreBackupClick(Sender: TObject);
begin
  if ExecApps<IXMLPreBackupType>(FXMLConfig.Types.Prebackup, SelectedOption) then
    begin
      ...
    end;
end;

procedure TfrmMain.btnBackupClick(Sender: TObject);
begin
  if ExecApps<IXMLBackupType>(FXMLConfig.Types.Backup, SelectedOption) then
    begin
      ...
    end;
end;

procedure TfrmMain.btnPostBackupClick(Sender: TObject);
begin
  if ExecApps<IXMLPostbackupType>(FXMLConfig.Types.Postbackup, SelectedOption) then
    begin
      ...
    end;
end;
Leider erhalte ich beim Zugriff auf AppType.Count in TfrmMain.ExecApps<T> den Fehler E2003 Undeklarierter Bezeichner: 'Count'.

Weiß jemand was ich falsch mache?

Olli73 6. Apr 2025 12:27

AW: Anfängerfragen zu Generics
 
Probiere Mal in der Deklaration:

Delphi-Quellcode:
    private
      function ExecApps<T: IXMLNodeCollection>(AppType : T; SelectedOption : TExitMode) : Integer;
sonst könnte "T" ja auch ein Integer oder sonstwas sein, das keine Eigenschaft "Count" hat.

himitsu 6. Apr 2025 13:03

AW: Anfängerfragen zu Generics
 
Wozu hierfür überhaupt Generics?

Diese 3 Interfaces scheinen doch, für dieses ExecApps, eine gemeinsame Funktion zu besitzen?

Warum haben sie dann nicht alle einen gemeinsamen Vorfahren, oder daneben einen gemeinsamen Typen, welcher hier als Parameter genutzt wird?

ringli 6. Apr 2025 13:10

AW: Anfängerfragen zu Generics
 
Zitat:

Zitat von Olli73 (Beitrag 1547843)
Probiere Mal in der Deklaration:

Danke, das funktioniert.

Jetzt habe ich noch an anderen Stellen den gleichen Fehler, der die gleiche Ursache hat.

Aber ich glaube ich muss die Struktur meiner XML-Datei noch mal überdenken damit das überhaupt mit Generics funktionieren kann. :(

ringli 6. Apr 2025 13:13

AW: Anfängerfragen zu Generics
 
Zitat:

Zitat von himitsu (Beitrag 1547844)
Diese 3 Interfaces scheinen doch, für dieses ExecApps, eine gemeinsame Funktion zu besitzen?

Warum haben sie dann nicht alle einen gemeinsamen Vorfahren, oder daneben einen gemeinsamen Typen, welcher hier als Parameter genutzt wird?

Diese Interfaces wurden vom XML-Datenanbindungs-Wizard generiert. Wie einen Beitrag vorher beschrieben muss ich wohl die XML-Struktur nochmal ändern. Irgendwas ist hier faul.

ringli 6. Apr 2025 15:39

AW: Anfängerfragen zu Generics
 
Zitat:

Zitat von himitsu (Beitrag 1547844)
Diese 3 Interfaces scheinen doch, für dieses ExecApps, eine gemeinsame Funktion zu besitzen?

XML-Struktur etwas geändert und im XML-Datenanbindungs-Wizard vor dem Generieren die Werte für IXMLBackupType, IXMLPreBackupType, IXMLPostBackupType auf IXMLBackupType geändert und jetzt brauche ich nur noch eine Funktion.

@Olli73 und @himitsu
Danke für eure Hilfe und Denkanstösse. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr.

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