AGB  ·  Datenschutz  ·  Impressum  







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

Anonymous Methods für Sanduhr als Design Pattern

Ein Thema von bernhard_LA · begonnen am 8. Dez 2015 · letzter Beitrag vom 10. Dez 2015
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#1

Anonymous Methods für Sanduhr als Design Pattern

  Alt 8. Dez 2015, 15:18
ich würde gerne alle SQL Operationen in meinem Programm via Anonymous Methods als Design Pattern mit einem Mauszeiger ausstatten.
Ich habe folgenden Code hierzu :


Delphi-Quellcode:
type
 TQueryProc = reference to procedure (aQuery: TADOQuery);


procedure ShowHourGlassDuringSQL(Proc: TQueryProc);
 var
 OldCursor: TCursor;
 begin
 OldCursor := Screen.Cursor;
 Screen.Cursor := crHourGlass;
 try
 Proc;
 finally
 Screen.Cursor := OldCursor
 end;
 end;


TMainform.ExecuteSQL1(aQuery : TADOQUERY);
begin
   ....
end;

TMainform.ExecuteSQL2(aQuery : TADOQUERY);
begin
   ....
end;

TMainform.ExecuteSQL3(aQuery : TADOQUERY);
begin
   .....
end;


der eigenliche Code wäre dann :

Delphi-Quellcode:
    ShowHourGlassDuringSQL(MyMainForm.ExecuteSQL3(meineQueryA));

    ShowHourGlassDuringSQL(MyMainForm.ExecuteSQL3(meineQueryB));
Ich bekomme noch nicht mal die korrekte Syntax hin, was mache ich falsch?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Anonymous Methods für Sanduhr als Design Pattern

  Alt 8. Dez 2015, 15:39
Delphi-Quellcode:
unit Unit1;

interface

uses
  System.Classes,
  Vcl.Controls,
  Vcl.Forms;

type
  TADOQuery = class

  end;

  TQueryProc = reference to procedure(aQuery: TADOQuery);

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    procedure ExecuteSQL1(aQuery: TADOQuery);
    procedure ExecuteSQL2(aQuery: TADOQuery);
    procedure ExecuteSQL3(aQuery: TADOQuery);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure ShowHourGlassDuringSQL(const Proc: TQueryProc; const Query : TADOQuery);
var
  OldCursor: TCursor;
begin
  OldCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  try
    Proc(Query);
  finally
    Screen.Cursor := OldCursor
  end;
end;

procedure TForm1.ExecuteSQL1(aQuery: TADOQuery);
begin

end;

procedure TForm1.ExecuteSQL2(aQuery: TADOQuery);
begin

end;

procedure TForm1.ExecuteSQL3(aQuery: TADOQuery);
begin

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  LQuery: TADOQuery;
begin
  LQuery:= TADOQuery.Create;
  ShowHourGlassDuringSQL(ExecuteSQL1, LQuery);
  ShowHourGlassDuringSQL(ExecuteSQL2, LQuery);
  ShowHourGlassDuringSQL(ExecuteSQL3, LQuery);
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.012 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#3

AW: Anonymous Methods für Sanduhr als Design Pattern

  Alt 8. Dez 2015, 18:02
Dafür benötigt man keine anonymen Methoden - der Schlüssel ist ein Interface.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Anonymous Methods für Sanduhr als Design Pattern

  Alt 8. Dez 2015, 18:44
Bei der Gelegenheit:

http://www.delphipraxis.net/180596-h...ml#post1260998 (nicht vom Titel-Thema verwirren lassen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.183 Beiträge
 
Delphi 12 Athens
 
#5

AW: Anonymous Methods für Sanduhr als Design Pattern

  Alt 9. Dez 2015, 09:00
Oder andersrum, also in etwa so?
Delphi-Quellcode:
procedure Test1;
begin
  THourGlass.Create;
  // mach was
end; // THourGlass setzt sich am Funktions-Ende selber zurück

procedure Test2;
var
  HourClass: IHourClass;
begin
  HourClass := THourGlass.Create;
  // mach was
  HourClass := nil; // THourGlass manuell zurücksetzen
  // mach nochwas
end;
Delphi-Quellcode:
type
  IHourClass = IInterface;
  THourGlass = class(TInterfacedObject {, IHourClass})
  private class var
    FInstances: Integer;
    FOldCursor: TCursor;
  public
    class function Create: IHourClass; reintroduce; static;
    destructor Destroy; override;
  end;

class function THourGlass.Create: IHourClass;
begin
  Result := inherited THourGlass.Create; //Result := THourGlass(NewInstance);
  if InterlockedIncrement(FInstances) = 1 then
    Result.FOldCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
end;

destructor THourGlass.Destroy;
begin
  if InterlockedDecrement(FInstances) = 0 then
    Screen.Cursor := FOldCursor;
  inherited;
end;
Oder als externe function SetHourGlass: IHourGlass; und die Klasse in Implementation verschieben/verstecken.
Bei der Funktion kann man das auch leichter als Singleton implementieren. (darf da nur nicht die globale Singleton-Instanz vergessen mitzuzählen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Dez 2015 um 09:05 Uhr)
  Mit Zitat antworten Zitat
Bentissimo

Registriert seit: 25. Apr 2006
Ort: Friedenfels
82 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Anonymous Methods für Sanduhr als Design Pattern

  Alt 9. Dez 2015, 12:18
@Stevie:

Ich hab mir mal den Fun Code geholt und in mein Programm eingebaut. Ich muss vorweg schicken, dass ich "Old-School" bin und deshalb leider noch rein gar nichts mit Interfaces zu tun gehabt habe.

Wenn ich es richtig verstehe, kann ich die Funktion AutoCursor innerhalb einer Methode XY aufrufen und innerhalb der selben Methode anschliessend z.B. eine Tabelle laden. Sobald XY beendet ist, also das AutoCursor-Interface innerhalb des Scope von XY nicht mehr referenziert wird, wird der Cursor restauriert und das Interface frei gegeben. Ist das korrekt?

Wenn ja, dann müsste es analog funktionieren wie den Cursor zu setzen und anschliessend innerhalb eines try...finally Blocks die Tabelle zu laden und den Cursor wieder zurück zu setzen. Leider ist aber mit AutoCursor nichts zu sehen vom geänderten Cursor. Wenn ich einen Haltepunkt setze, scheint das Programm so zu laufen wie im vorhergehenden Absatz beschrieben. Das wird auch bestätigt, wenn ich zu Testzwecken am Ende von XY noch ein kleines Sleep einbaue. Dann kann ich, wie beim try...finally Block das Setzen und Rücksetzen des Cursors verfolgen.

Mache ich einen Denkfehler oder habe irgendetwas übersehen? Hättest Du vielleicht ein kleines Codebeispiel, in dem der gewünschte Effekt nachvollziehbar ist?

Vielen Dank!
Stephan Schmahl
  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 20:30 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