![]() |
Probleme mit 'implements'-Klausel
Hallo,
wieder eine Frage zum Thema Klassenmodellierung. Diesmal folgendes.
Delphi-Quellcode:
Deklaration eines Interfaces, welches mir zwei Prozeduren zur Verfügung stellt.
unit IDatabase;
interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs; type IDatabase = interface (IInterface) procedure Load; stdcall; procedure Save; stdcall; end; ...
Delphi-Quellcode:
Die Klasse 'TakDatabase' ist eine Unterklasse der Komponente 'mysqlDatabase', welche die Implementation des Interface über die Property 'Query' an die Klasse TakQuery delegiert.
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; 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:
Wenn ich jetzt auf die Property 'Query' zugreife(in akDatabase), kann ich dann Query[index].Load ausführen?
unit akQuery;
interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs; type TakQuery = class (TmysqlQuery) public procedure Load; procedure Save; end; ... |
Re: Klassenmodell-Frage
Zitat:
...:cat:... |
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:
Wo liegt das Problem? Query ist indexierte Property mit einem Verweis, wo das Interface implementiert ist...?
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; |
Re: Klassenmodell-Frage
Hallo,
habe kurz korrigiert: muss natürlich heißen:
Delphi-Quellcode:
Aber das Problem besteht weiterhin mit der untenstehenden Fehlermeldung...:(
...
implements IDatabase ... Zitat:
|
Re: Probleme mit 'implements'-Klausel
Ah, jetzt, beim 3 druchlesen :zwinker: habe auch ich verstanden worum es geht.
Delphi-Quellcode:
Danke ich zumindest. Selbst habe ich noch nicht mit der implements-Anweisung experimentiert.
// aus
property Query[Index: Integer]: TakQuery read GetQuery implements IDatabase; // muss werden property Query[Index: Integer]: IDatabase read GetQuery implements IDatabase; ...:cat:... |
Re: Probleme mit 'implements'-Klausel
Hi,
das kann aber nicht funktionieren
Delphi-Quellcode:
Daher ist der Rückgabetyp 'TakQuery'.
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; Weitere Vorschläge? |
Re: Probleme mit 'implements'-Klausel
Zitat:
...:cat:... |
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:
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...
...
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; ... 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