Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit 'implements'-Klausel (https://www.delphipraxis.net/28990-probleme-mit-implements-klausel.html)

barnti 2. Sep 2004 09:51


Probleme mit 'implements'-Klausel
 
Hallo,
wieder eine Frage zum Thema Klassenmodellierung. Diesmal folgendes.
Delphi-Quellcode:
unit IDatabase;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  IDatabase = interface (IInterface)
    procedure Load; stdcall;
    procedure Save; stdcall;
  end;
...
Deklaration eines Interfaces, welches mir zwei Prozeduren zur Verfügung stellt.

Delphi-Quellcode:
unit akDatabase;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TakDatabase = class (TmysqlDatabase, IDatabase)
  private
    FQuerys: TObjectList;
    function GetQuery(Index: Integer): TakQuery;
    procedure SetQuery(Index: Integer; Value: TakQuery);
  public
    property Query[Index: Integer]: TakQuery read GetQuery write SetQuery
            implements TakQuery;
  end;
Die Klasse 'TakDatabase' ist eine Unterklasse der Komponente 'mysqlDatabase', welche die Implementation des Interface über die Property 'Query' an die Klasse TakQuery delegiert.

Im Feld 'FQuerys' sollen für jede Tabelle der Datenbank eine Komponente des Typs 'TakQuery' gespeichert werden.
Der Vollständigkeit halber hier noch die Klasse TakQuery:
Delphi-Quellcode:
unit akQuery;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TakQuery = class (TmysqlQuery)
  public
    procedure Load;
    procedure Save;
  end;
...
Wenn ich jetzt auf die Property 'Query' zugreife(in akDatabase), kann ich dann Query[index].Load ausführen?

sakura 2. Sep 2004 10:06

Re: Klassenmodell-Frage
 
Zitat:

Zitat von barnti
Wenn ich jetzt auf die Property 'Query' zugreife(in akDatabase), kann ich dann Query[index].Load ausführen?

Wenn ich jetzt alles recht verstanden habe: Ja, wieso solltest Du es nicht können :gruebel:

...:cat:...

barnti 2. Sep 2004 10:24

Re: Klassenmodell-Frage
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich weiß nicht mit den Propertys umzugehen, wenn diese gleichzeitig indexiert sind und die implements klausel verwenden...
Jetzt habe ich das folgende Problem:
Delphi-Quellcode:
unit akDatabase;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, mysqldbTables, IntfDatabase,Contnrs,akQuery;

type
  TakDatabase = class (TmysqlDatabase,IDatabase)
  private
    FQuerys: TObjectList;
    function GetQuery(Index: Integer): TakQuery;
  public                        
                         // [Error] akDatabase.pas(16): Implements clause only allowed for
                         // properties of class or interface type
    property Query[Index: Integer]: TakQuery read GetQuery implements IDatabase;
  end;
Wo liegt das Problem? Query ist indexierte Property mit einem Verweis, wo das Interface implementiert ist...?

barnti 2. Sep 2004 11:33

Re: Klassenmodell-Frage
 
Hallo,
habe kurz korrigiert: muss natürlich heißen:
Delphi-Quellcode:
...
implements IDatabase
...
Aber das Problem besteht weiterhin mit der untenstehenden Fehlermeldung...:(
Zitat:

Zitat von barnti
Delphi-Quellcode:
unit akDatabase;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, mysqldbTables, IntfDatabase,Contnrs,akQuery;

type
  TakDatabase = class (TmysqlDatabase,IDatabase)
  private
    FQuerys: TObjectList;
    function GetQuery(Index: Integer): TakQuery;
  public                        
                         // [Error] akDatabase.pas(16): Implements clause only allowed for
                         // properties of class or interface type
    property Query[Index: Integer]: TakQuery read GetQuery implements IDatabase;
  end;
Wo liegt das Problem? Query ist indexierte Property mit einem Verweis, wo das Interface implementiert ist...?

Kann jemand helfen?

sakura 2. Sep 2004 12:37

Re: Probleme mit 'implements'-Klausel
 
Ah, jetzt, beim 3 druchlesen :zwinker: habe auch ich verstanden worum es geht.
Delphi-Quellcode:
// aus
property Query[Index: Integer]: TakQuery read GetQuery implements IDatabase;
// muss werden
property Query[Index: Integer]: IDatabase read GetQuery implements IDatabase;
Danke ich zumindest. Selbst habe ich noch nicht mit der implements-Anweisung experimentiert.

...:cat:...

barnti 2. Sep 2004 12:52

Re: Probleme mit 'implements'-Klausel
 
Hi,
das kann aber nicht funktionieren

Delphi-Quellcode:
unit akDatabase;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs,mysqldbTables,IntfDatabase,Contnrs,akQuery;

type
  TakDatabase = class (TmysqlDatabase, IDatabase)
  private
    FQuerys: TObjectList;
    function GetQuery(Index: Integer): TakQuery;
    procedure SetQuery(Index: Integer; Value: TakQuery);
  public
    // Wenn ich auf Query zugreife wird ja GetQuery ausgeführt
    // (siehe unten). Die zu implementierenden Methoden 'Load'
    // und 'Save' sollen aber in TakQuery implementiert werden                                  
    property Query[Index: Integer]: TakQuery read GetQuery write SetQuery
            implements IDatabase;
  end;
...[size=18][/size][size=24][/size]
{- TakDatabase.GetQuery }

function TakDatabase.GetQuery(Index: Integer): TakQuery;
begin
  if FQuerys[index]=nil then exit;
  Result:= TakQuery(FQuerys[index]);
end;
Daher ist der Rückgabetyp 'TakQuery'.
Weitere Vorschläge?

sakura 2. Sep 2004 12:56

Re: Probleme mit 'implements'-Klausel
 
Zitat:

Zitat von barnti
Daher ist der Rückgabetyp 'TakQuery'.
Weitere Vorschläge?

Sorry, nein :(

...:cat:...

barnti 2. Sep 2004 13:49

Re: Probleme mit 'implements'-Klausel
 
Ok,
danke dir trotzdem!

Ich habe herausgefunden, dass es bei einer Property mit 'implements'-Klausel nur funktioniert, wenn direkt auf das entsprechende Feld zugegriffen wird:
Delphi-Quellcode:
...
type
  TakDatabase = class (TmysqlDatabase, IDatabase)
  private
    FQuery: TakQuery;
    FQuerys: TObjectList;
    procedure CreateAccessComponents(aOwner: TComponent);
  public
    constructor Create(aOwner:TComponent; aHost, aDBName,aUser,aPass: String);
    property Query: TakQuery read FQuery implements IDatabase;
  end;
...
Allerdings weiß ich nicht, ob das so funktioniert. Ich möchte ja lediglich mit 'implements' hinweisen, dass die Implementation des Interfaces nach 'TakQuery' ausgelagert ist. Ich möchte aber gleichzeitig meine Querys in FQuerys verwalten...
Ob das so klappt?


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