AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TDataSet.Refresh erweitern

Ein Thema von ConnorMcLeod · begonnen am 12. Dez 2015 · letzter Beitrag vom 13. Dez 2015
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#1

TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 08:52
Hallo Kollegen,
es geht darum, die Refresh-Methode von TDataSet zu erweitern von:

Delphi-Quellcode:
procedure TDataSet.Refresh;
begin
  DoBeforeRefresh;
  CheckBrowseMode;
  UpdateCursorPos;
  try
    InternalRefresh;
  finally
    Resync([]);
    DoAfterRefresh;
  end;
end;
nach

Delphi-Quellcode:
procedure TDataSet.Refresh;
begin

  if <Bedingung> then exit;

  DoBeforeRefresh;
  CheckBrowseMode;
  UpdateCursorPos;
  try
    InternalRefresh;
  finally
    Resync([]);
    DoAfterRefresh;
  end;
end;
Delphi verweigert mir das overload in einer abgeleiteten Klasse, mit class helpers bekommt man eine Endlosschleife und den Methodenzeiger umbiegen mit TMethod.Code funkt auch nicht. Da meint Delphi, daß es eine umgültige Typumwandlung sei.

Jemand ne Idee, wie man das gebacken bekommt?
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 13:00
Bin mir nicht sicher, aber Du meinst doch sowas:
Delphi-Quellcode:
unit DataSetTest;

interface

uses
  SysUtils, Classes, DB;

type
  tDataSetTest = class(TDataSet)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    procedure Refresh;
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('WoAuchImmer', [tDataSetTest]);
end;

procedure tDataSetTest.Refresh;
begin
  if 1 = 2 then exit; // latürnich eine sinnvolle Bedingung ;-)
  inherited;
end;

end.
Delphi 7 kompiliert das und installiert die Komponente anstandslos.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.091 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 13:22
Ich habe keine Ahnung was du genau vorhast, aber vielleicht kannst du ja auch das BeforeRefresh -Event nutzen und dort einfach nur Abort() sagen

(Abort wird sogar als Beispiel für TDataSet.BeforePost angeführt)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 15:05
Ich habe keine Ahnung was du genau vorhast, aber vielleicht kannst du ja auch das BeforeRefresh -Event nutzen und dort einfach nur Abort() sagen

(Abort wird sogar als Beispiel für TDataSet.BeforePost angeführt)
Danke für die Idee!
AFAIK springt Abort zum nächsten finally und beendet dann das Programm.
Wenn ich das BeforeRefresh überschreibe, dann kommt Refresh trotzdem in jedem Fall dran. Innerhalb von Refresh wird BeforeRefresh ausgeführt ...
danke trotzdem!
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 15:12
Bin mir nicht sicher, aber Du meinst doch sowas:
Delphi-Quellcode:
  public
    { Public-Deklarationen }
    procedure Refresh;

implementation

procedure tDataSetTest.Refresh;
begin
  if 1 = 2 then exit; // latürnich eine sinnvolle Bedingung ;-)
  inherited;
end;
Im Prinzip ja. Aber ... ich bräuchte zusätzlich noch etwas wie ein reintroduce, weil die Objekte während des Programmablaufes auch mal als TDataSet verwendet werden und nicht immer nur als tDataSetTest. Aber reintroduce greift nicht, sondern es kommt immer das Refresh von TDataSet dran. Deswegen wollte ich den Code auswechseln.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 16:51
Zugegebenermaßen ist mir nicht klar, was Du möchtest.

Versuch einer Erklärung:

Du möchtest ein TDataSet verwenden und von dem die Methode Refresh in einer veränderten Form (bzw. nur unter bestimmten Bedingungen nutzen), ohne einen Nachkommen von TDataSet zu erstellen, der über eine veränderte Methode Refresh verfügt.

Zeig uns doch bitte mal die Routine aus Deinem Quelltext, an der Refresh aufgerufen werden soll. Eventuell fällt ja jemandem eine Möglichkeit ein, dort entsprechend Deinen Wünschen zu reagieren.

Oder hast Du keinen Einfluß auf den Aufruf von Refresh, möchtest aber trotzdem ein verändertes Verhalten erreichen?

Mir fällt jetzt eigentlich nur ein, wie oben bereits vorgeschlagen, onBeforeRefresh zu nutzen, dort die Bedingung zu prüfen und, falls diese nicht erfüllt ist, eine Exception zu werfen, damit TDataSet.Refresh nicht aufgerufen wird. Aber dann benötigst Du auch eine Fehlerbehandlungsroutine, die diesen Fehler ignoriert und den Programmablauf ungestört weiter machen lässt, sinnvoll meldet...

Also eventuell sowas:
Delphi-Quellcode:
type
  ERefreshError = Class(Exception);

...

procedure TfmTextverwaltung.myDataSetBeforeRefresh(DataSet: TDataSet);
begin
  try
    if meineAbbruchBedingung then begin
      raise ERefreshError.Create('Refresh nicht zulässig.');
    end;
  except
    on e: ERefreshError do begin
      // Das "Fressen" der Exception an dieser Stelle wirkt wie das Exit.
      // TDataSet.Refresh wird nicht ausgerufen.
      // ShowMessage(e.message);
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 17:36
Ich habe keine Ahnung was du genau vorhast, aber vielleicht kannst du ja auch das BeforeRefresh -Event nutzen und dort einfach nur Abort() sagen

(Abort wird sogar als Beispiel für TDataSet.BeforePost angeführt)
Danke für die Idee!
AFAIK springt Abort zum nächsten finally und beendet dann das Programm.
Wenn ich das BeforeRefresh überschreibe, dann kommt Refresh trotzdem in jedem Fall dran. Innerhalb von Refresh wird BeforeRefresh ausgeführt ...
danke trotzdem!
In der Doku kamm man nachlesen was Delphi-Referenz durchsuchenAbort denn so macht.

Ein genereller Programmabbruch erfolgt nicht.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 17:45
Leider kann/darf ich keinen Quellcode zeigen, das wäre auch etwas umständlich, aber das Prinzip geht so:

Delphi-Quellcode:
type
  // diese Klasse kann ich nicht verändern:
  TDataSetMitExtraFunktionalitaet = class(TDataSet)
  public
    procedure NichtAenderbar;
  end;

implementation

procedure TDataSetMitExtraFunktionalitaet.NichtAenderbar
begin
  // in dieser Prozedur kann ich nichts ändern
  [...]
  Refresh;
end;

procedure Demo;
var
  ds1: TDataSetMitExtraFunktionalitaet;
begin
  [...]
  // hier passiert ein implizierter Refresh, der unterdrückt werden soll:
  ds1.NichtAenderbar;
end;
Hoffe, das ist halbwegs verständlich
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 18:26
Prinzip ist verständlich, damit reicht der Quelltext (erstmal) aus:
Delphi-Quellcode:
type
  ERefreshError = Class(Exception);

type
  // diese Klasse kann ich nicht verändern:
  TDataSetMitExtraFunktionalitaet = class(TDataSet)
  public
    procedure NichtAenderbar;
  end;

implementation

procedure TDataSetMitExtraFunktionalitaet.NichtAenderbar
begin
  // in dieser Prozedur kann ich nichts ändern
  [...]
  Refresh;
end;

procedure EignesBeforeRefresh(DataSet: TDataSet);
begin
  if meineAbbruchBedingung then begin
    raise ERefreshError.Create('Refresh nicht zulässig.');
  end;
end;

// aber dashier ist änderbar?
procedure Demo;
var
  ds1: TDataSetMitExtraFunktionalitaet;
begin
  [...]
  // hier passiert ein implizierter Refresh, der unterdrückt werden soll:
  ds1.OnBeforeRefresh := EignesBeforeRefresh;
  Try
    ds1.NichtAenderbar;
  except
      // Das "Fressen" der Exception an dieser Stelle wirkt wie ein Exit in der RefreshMethode.
      // TDataSetMitExtraFunktionalitaet.Refresh wird nicht ausgerufen.
    on e: ERefreshError do;
  end;
  ds1.OnBeforeRefresh := Nil;
end;
Würde sowas helfen?

Natürlich scheitert das, wenn in der nichtänderbaren Routine sowas enthalten ist:
Delphi-Quellcode:
procedure TDataSetMitExtraFunktionalitaet.NichtAenderbar(DataSet: TDataSet);
begin
  [...]

  Refresh;

  [...] // Dashier würde dann nichtmehr ausgeführt.
         // Wenn das aber ausgeführt werden muss, dann kann man den Vorschlag vergessen.
end;
Ist denn der Quelltext von "NichtAenderbar" so, dass man eventuell auftretende Probleme erkennen kann und nach einer gezielten Lösung suchen kann?

Geändert von nahpets (12. Dez 2015 um 18:56 Uhr) Grund: Text ergänzt...
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: TDataSet.Refresh erweitern

  Alt 12. Dez 2015, 18:43
Yo, sehr nette Idee! Ich werde noch sicherheitshalber ein mglw bereits zugewiesenes OnBeforeRefresh Event in eine Variable retten und danach wieder auswechseln. Das wär's dann.
Vielen Dank!
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:48 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