Wenn ich das richtig erkenne, brauchst du, wie ich oben schon vermutet hatte, die Methoden Open und Close sowie die Eigenschaft SQL. TZQuery und TReadOnlyQuery haben einen gemeinsamen Vorfahren TZAbstractRODataset. Dieser erbt von TDataset die öffentlichen Methoden Open und Close; außerdem wird die Eigenschaft SQL eingeführt. Daher kannst du die Funktion mit TZAbstractRODataset deklarieren:
Code: Alles auswählen
function OpenSQLSet(SQLSet: TZAbstractRODataset; SQLText:String): Boolean;
Da TZAbstractRODataset die Eigenschaft SQL nur als protected eingeführt hat, kannst du sie von dem so deklarierten SQLSet aus nicht aufrufen. Der übliche Trick ist, eine Hilfsklasse, etwa TZAbstractRODatasetMitSQL, einzuführen, die ebenfalls von TZAbstractRODataset abgeleitet ist und SQL als public umdeklariert. Durch eine Typumwandlung nach TZAbstractRODatasetMitSQL kannst du die Eigenschaft sichtbar machen. Das funktioniert, weil sich sich TZQuery und TZReadOnlyQuery hinsichtlich der Eigenschaft SQL nicht unterscheiden und du nichts anderes von dem gemeinsamen Vorfahren verwendest (wiegesagt, Open und Close sind schon öffentlich). Eine saublere Implementierung muss allerdings noch vorsehen, dass nur TZQuery oder TZReadOnlyQuery verwendet werden.
Code: Alles auswählen
implemenation
...
type
TZAbstracRODatasetMitSQL = class(TZAbstractRODataset)
public
property SQL;
end;
function OpenSQLSet(SQLSet: TZAbstracctRODataset; SQLText:String): Boolean;
begin
if not ((SQLSet is TZQuery) or (SQLSet is TZReadOnlyQuery)) then
raise Exception.Create('OpenSQLSet kann nur mit TZQuery oder TZReadOnlyQuery aufgerufen werden.');
with TZAbstractRODatasetMitSQL(SQLSet) do
begin
writeln;
writeln('OpenSQLSet: ' + SQLText);
try
Close
except
end;
try
SQL.Clear;
SQL.Text := SQLText;
Open;
Result := True;
Except
On E :Exception do
begin
writeln;
writeln('ERROR in OpenSQLSet: ' + SQLText);
Result:=false;
end;
end;
end;
end;
[EDIT]
Ja, ok, MmVisual's direkter Cast zu TZQuery geht auch, weil sich TZQuery und TZReadOnlyQuery hinsichtlich der Eigenschaft SQL nicht unterscheiden. Meine Schreibweise erscheint mir allerdings etwas sicherer, weil man im Unterschied zu dem TZQuery-Cast in dem with-Teil nicht mehr irrtümlicherweise eine Nur-TZQuery-Methode aufrufen kann, obwohl ein TZReadOnlyQuery als Parameter übergeben ist.