AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit 'implements'-Klausel

Ein Thema von barnti · begonnen am 2. Sep 2004 · letzter Beitrag vom 2. Sep 2004
Antwort Antwort
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#1

Probleme mit 'implements'-Klausel

  Alt 2. Sep 2004, 09:51
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?
Gruß,

Barnti
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Klassenmodell-Frage

  Alt 2. Sep 2004, 10:06
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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Klassenmodell-Frage

  Alt 2. Sep 2004, 10:24
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...?
Miniaturansicht angehängter Grafiken
new_class_diagram_991.jpg  
Gruß,

Barnti
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Klassenmodell-Frage

  Alt 2. Sep 2004, 11:33
Hallo,
habe kurz korrigiert: muss natürlich heißen:
Delphi-Quellcode:
...
implements IDatabase
...
Aber das Problem besteht weiterhin mit der untenstehenden Fehlermeldung...
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?
Gruß,

Barnti
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Probleme mit 'implements'-Klausel

  Alt 2. Sep 2004, 12:37
Ah, jetzt, beim 3 druchlesen 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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Probleme mit 'implements'-Klausel

  Alt 2. Sep 2004, 12:52
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?
Gruß,

Barnti
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Probleme mit 'implements'-Klausel

  Alt 2. Sep 2004, 12:56
Zitat von barnti:
Daher ist der Rückgabetyp 'TakQuery'.
Weitere Vorschläge?
Sorry, nein

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Probleme mit 'implements'-Klausel

  Alt 2. Sep 2004, 13:49
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?
Gruß,

Barnti
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz