Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Non-Visual-Komponente > Ereignisse im OI verknüpfen (https://www.delphipraxis.net/155847-non-visual-komponente-ereignisse-im-oi-verknuepfen.html)

himitsu 10. Nov 2010 10:48

Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Moin,

irgendwie hab ich grade ein kleines Problemchen mit meiner kleinen nichtvisuellen Komponente.

Und zwar aktuell speziell mit den Ereignis-Property.

Der relevante Teil sieht so aus:
Delphi-Quellcode:
THIDDeviceEx = Class(TComponent)
Published
  Property OnRecive: THIDEOnRecive Read FOnRecive Write FOnRecive;
End;
Als Callback wurde es so deklariert:
Delphi-Quellcode:
THIDEOnRecive = Reference to Procedure(Sender: THIDDeviceEx; Const Data; Len: Integer);
.
Leider kann man so im OI keine Methode zuordnen.
Weder eine Existierende auswählen, noch wird per Doppelklick eine erstellt.

OK, da es auch schon andere Problemchen mit dem "reference to" habe, wollte ich es mal "normal" gestalten und hab es so versucht.
Delphi-Quellcode:
THIDEOnRecive = Procedure(Sender: THIDDeviceEx; Const Data; Len: Integer) of Object;
.
Problem hierbei ist, daß dieses Property so überhaupt nicht im OI angezeigt wird. :shock:



Also, wie macht man es nun richtig?

Oder hat jemand eine Lösung, wie man das mit "reference to" zum Laufen bekommen könnte?
Eigentlich wäre es ja schön, wenn man so eine recht offene Schnittstelle bieten könnte.

Bummi 10. Nov 2010 10:55

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
was sollte Dir denn der OI zur Auswahl anbieten?
Ich bezweifle dass sowas machbar ist.

mleyen 10. Nov 2010 10:58

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Zitat:

Zitat von himitsu (Beitrag 1060723)
Delphi-Quellcode:
THIDEOnRecive = Procedure(Sender: THIDDeviceEx; Const Data; Len: Integer) of Object;
.
Problem hierbei ist, daß dieses Property so überhaupt nicht im OI angezeigt wird. :shock:

Altes Package deinstallieren. Relevante DCUs löschen. Pakage neu erzeugen + installieren. Evtl noch IDE neu starten.
Spätestens so hat es bei mir immer funktioniert.

himitsu 10. Nov 2010 11:19

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
@mleyen: Sowas hab ich schon versucht, aber ich versuch es noch weiter.

@Bummi: Also, da "reference to" alles aufnehmen kann, und "procedure of object" somit enthalten ist, sollten mindestens die Methoden der Form auswählbar sein.

Bummi 10. Nov 2010 11:34

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
meine Zweifel bezogen sich nicht auf:
Delphi-Quellcode:
THIDEOnRecive = Procedure(Sender: THIDDeviceEx; Const Data; Len: Integer) of Object;

himitsu 10. Nov 2010 11:47

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Zitat:

Zitat von Bummi (Beitrag 1060735)
meine Zweifel bezogen sich nicht auf

Ich weiß.
"reference to" kann aber auch Objekt-Methoden aufnehmen,
sowie einfache Prozeduren, Klassen-Methoden, anonyme Methoden usw.

himitsu 10. Nov 2010 18:01

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hab hier mal beide Varianten zusammengestellt.

Wie gesagt, bei "procedure of object" zeigt der OI die Property nicht an
und bei "reference to procedure" kann man via OI nichts zuweisen.

Die Komponente selber hat keine Funktion.
(Wurde wegen eines Fehlers im HIDControler deaktivert, nicht daß die IDE nochmal verreckt)

Aktuell wäre der Code wohl unter DelphiXE, Delphi2010 und vermutlich auch noch Delphi2009 kompilierbar.

Wobei die String-Operationen inzwischen so umgestellt wurden, daß sie auch für Nicht-Unicode-Delphis geeignet wären.
Wenn alles läuft, werd' ich mal sehn, wie ich das mit den anonymen Methoden und den Generics umgehe.
Nja, und der HID-Controler hat halt noch ein kleines Problem ... bin noch nicht mit der Umstellung auf die RAWInputs fertig (hab wohl irgendwo was vergessen).
Und das Problem mit den "reference to" ist auch noch nicht gelöst. :cry:

shmia 10. Nov 2010 18:22

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Ich würde bei "procedure of Object", also intern Datentyp TMethod, bleiben.
Diese Art von Events sind deutlich schneller und schlanker als das neue "reference to procedure" (auch bekannt als Closures).

Closures wurden IHMO nie als Ersatz für Events entwickelt.
Ausserdem können mit Closures unerwarte Dinge passieren, weil der Compiler die lokalen Variablen zum Zeitpunkt der Erzeugung des Closure "reinwurstelt".
Beispiel:
Delphi-Quellcode:
procedure TMyClass.DoStuff;
var
  j: integer;
  ShowCounter: TProc; // Method without parameter.
begin
  ShowCounter :=
    procedure
    begin
      // j is known here because it is wrapped in a closure
      // and made available to us! 
      writeln(IntToStr(j));
    end;

  for j := 1 to 10 do
    ShowCounter;
end;

himitsu 10. Nov 2010 18:29

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Dafür wäre es aber praktisch, wenn der OI diese "of Object" dann auch anzeigt, was er leider nicht macht.

Obwohl er es doch eigentlich zun sollte. :gruebel:

shmia 10. Nov 2010 19:07

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Zitat:

Zitat von himitsu (Beitrag 1060820)
...wenn der OI diese "of Object" dann auch anzeigt, was er leider nicht macht...

"Eigentlich" sollten die Events angezeigt werden.
Delphi-Quellcode:
Property OnRecive:  THIDEOnRecive    Read FOnRecive   Write FOnRecive;
Property OnArrival: THIDENotifyEvent Read FOnRemoval  Write FOnRemoval;
Property OnRemoval: THIDENotifyEvent Read FOnRemoval  Write FOnRemoval;
FOnRemoval wurde doppelt verwendet; das ist nicht ganz richtig.

Mir fällt auch auf:
Du hast 10 Konstruktoren, wobei man bei Komponenten nur einen Konstruktor verwenden darf/sollte:
Delphi-Quellcode:
constructor Create(AOwner: TComponent);override;
Nur ein Konstruktor mit dieser Signatur wird von der VCL aufgerufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr.
Seite 1 von 2  1 2      

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