Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TuniConnection (https://www.delphipraxis.net/180785-tuniconnection.html)

youuu 17. Jun 2014 18:57

TuniConnection
 
Guten Abend,

ich erstelle per runtime die Komponente TUniConnection

Delphi-Quellcode:
Connect := TUniConnection.Create(nil);
    Connect.Port := MYSQL_PORT;
    Connect.ProviderName := MYSQL_PROVIDER;
    Connect.Server := MYSQL_SERVER;
    Connect.Username := MYSQL_USERNAME;
    Connect.Database := MYSQL_DATABASE;
    Connect.Password := MYSQL_PASSWORD;
    Connect.Options.DisconnectedMode := True;
    Connect.Options.LocalFailover := True;
    Connect.OnConnectionLost := ConnectionConnectionLost;  // <-----
    Connect.Connect;
Delphi-Quellcode:
procedure ConnectionConnectionLost(Sender: TObject;
  Component: TComponent; ConnLostCause: TConnLostCause;
  var RetryMode: TRetryMode);
begin
  RetryMode := rmReconnectExecute;
end;
Leider funktioniert die Zuweisung so nicht.
(E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur')



Wenn ich das über eine Klasse regel

Zitat:

type
TUni_connection = class
private
public
procedure ConnectionConnectionLost(Sender: TObject;
Component: TComponent; ConnLostCause: TConnLostCause;
var RetryMode: TRetryMode);
end;
erhalte ich den Fehler (wärend der Laufzeit), EReadError "Ungültiger Eigenschaftswert"

Wie löse ich das am besten?

himitsu 17. Jun 2014 19:18

AW: TuniConnection
 
Indem du das machst, was da steht?

Das darft halt keine Prozedur, sondern muß eine Methode sein. :roll:

youuu 17. Jun 2014 19:34

AW: TuniConnection
 
Hm, hast noch meinen 2. Versuch gesehen über eine Klasse? Damit startet das Programm, allerdings meckert es dann, siehe 1. Post.

himitsu 17. Jun 2014 19:44

AW: TuniConnection
 
TUni_connection ist auch instanziiert?

Und wo tritt denn diese Exception auf?

youuu 17. Jun 2014 19:48

AW: TuniConnection
 
Ja ist initialisiert.

Fehler beim Lesen von Connection.OnConnetionLost: Ungültiger Eigentschaftswert


Edit: Ok Fehler liegt woanderst.

himitsu 17. Jun 2014 19:54

AW: TuniConnection
 
Du lässt jetzt das Event über den FormDesigner/Objektinspektor zuweisen?

Wenn ja, dann muß diese Event published sein.

mkinzler 17. Jun 2014 20:35

AW: TuniConnection
 
Oder man verwendet eine anonyme Methode:

Delphi-Quellcode:
connect.OnConnectionLost := procedure (Sender: TObject;
  Component: TComponent; ConnLostCause: TConnLostCause;
  var RetryMode: TRetryMode);
begin
  RetryMode := rmReconnectExecute;
end;

himitsu 17. Jun 2014 21:22

AW: TuniConnection
 
Aber nicht laut der Deklaration.
http://www.devart.com/unidac/docs/in...ficoptions.htm

Für mich sieht das nur nach einer Methode aus.
Und wenn anonyme Methoden gehen würden, dann hätte man auch die Prozedur zuweisen können, da derartige Referenzen/Zeiger alle 3 Varianten enthalten können. :zwinker:

mkinzler 17. Jun 2014 21:46

AW: TuniConnection
 
Lut Delphihilfe sollte es funktionieren:

http://docwiki.embarcadero.com/RADSt...onyme_Methoden

Sir Rufo 17. Jun 2014 22:54

AW: TuniConnection
 
Zitat:

Zitat von mkinzler (Beitrag 1262649)
Lut Delphihilfe sollte es funktionieren:

http://docwiki.embarcadero.com/RADSt...onyme_Methoden

Wo steht das da?

Dort wird nur der umgekehrte Fall beschrieben
Delphi-Quellcode:
type
  TFoo = class
    procedure Bar( Sender : TObject );
  end;

procedure Bar( Sender : TObject );
begin
end;

procedure test;
var
  LEvent : TNotifyEvent;
  LProc : TProc<TObject>;
  LFoo : TFoo;
begin
  LProc := LFoo.Bar;
  LProc := Bar;
  LProc := procedure ( Sender : TObject )
  begin
  end;

  LEvent := LFoo.Bar;
  // der Rest geht nicht
  LEvent := Bar;
  LEvent := procedure ( Sender : TObject )
  begin
  end;
end;

himitsu 18. Jun 2014 00:11

AW: TuniConnection
 
Technisch wäre es möglich, wenn für die anonyme Methode (welche intern ein Interface ist) je ein virtueller Prozedurzeiger erzeugt würde, für Prozeduren und eventuell auch für Methoden,
aber mir ist noch nicht bekannt, daß Emba bereits auf diese Idee gekommen ist. (TMethodImplementation) :stupid:
Beim virtuellen Methodenzeiger könnte man das Interface im Data-Teil des Zeigers verstecken, also da wo bei Methoden die Objektinstanz und bei Klassenmethoden der Klassentyp steckt.

Wobei die eigentlich absichtlich nicht darauf gekommen sind, denn für das Interface gibt es in den Methoden und Prozedurzeigern ein klitzekleines Problem, mit der fehlenden Referenzzählung in diesen Zeigern.
Via ARC könnte man das maximal bei Methodenzeigern implementieren, fals Emba dort die Referenz ordentlich zählt.
Aber zumindestens vom RTL-Quellcode sieht es grade danach aus, als wenn Emba im ARC einen Bug hat, da es nicht so aussieht, als wenn Methodenzeiger (genauer TMethod.Data) keine Referenzzählung besitzen, obwohl sie zu über 90% eine Objektreferenz enthalten. :shock:

Also aktuell geht es IMHO nur so:
reference to procedure <= anonyme Methode, Methode, Klassenmethode, statische Klassenmethode oder Prozedur
procedure of object <= Methode oder Klassenmethode
procedure <= Prozedur oder statische Klassenmethode

Mschmidt 19. Jun 2014 13:02

AW: TuniConnection
 
Das Problem liegt daran, dass die zuweisende Methode KEINE Klassenmethode ist.

also statt
Delphi-Quellcode:
(T)Uniconnection.<Event>:= EventMethode
musse

Delphi-Quellcode:
(T)UniConnection.<Event>:= <Class>.EventMethode
stehen,

Grüsse
Mschmidt


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 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