Delphi-PRAXiS

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.

himitsu 10. Nov 2010 19:23

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

Zitat von shmia (Beitrag 1060822)
FOnRemoval wurde doppelt verwendet; das ist nicht ganz richtig.

Blödes Copy&Paste :oops:

Dennoch sollten diese Property doch eigentlich angezeigt werden.

Zitat:

Zitat von shmia (Beitrag 1060822)
Mir fällt auch auf:
Du hast 10 Konstruktoren, wobei man bei Komponenten nur einen Konstruktor verwenden darf/sollte:

Für die IDE/VCL ist der erste Constructor.
Ansonsten ist diese Komponente eben für eine nichtvisuelle Verwendung gedacht, wobei hier zuerst die Verwendung außerhalb der VCL implementiert wurde.

Bei der manuellen Erzeugung famd ich es halt praktischer wenn man dort auch direkt die nötigen Informationen übergeben kann und es nicht erst über Property nachreichen muß.
Wobei Letzeres nun auch möglich ist, seit es zur VCL-Komponente erweitert wurde.

Das ist wie mit dem TXPManifest ... es gibt welche, die ziehen gerne Komponenten auf eine Form und Andere binden sie lieber manuell ein.

himitsu 11. Nov 2010 17:35

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

Zitat von shmia (Beitrag 1060819)
Diese Art von Events sind deutlich schneller und schlanker als das neue "reference to procedure" (auch bekannt als Closures).

Nja, soooo schlimm ist es nun auch nich. :roll:

Delphi-Quellcode:
program Project1;

uses
  Windows,
  SysUtils,
  Dialogs;

type
  TReference = reference to procedure;
  TMethod = procedure of object;
  TProcedure = procedure;

  TTest = class
    procedure Test;
  end;

procedure TTest.Test;
begin
end;

procedure Test;
begin
end;

var
  ref: TReference;
  method: TMethod;
  proc: TProcedure;
  t: TTest;
  c, c2, c3: Cardinal;
  i: Integer;

begin
  t := TTest.Create;

  c := GetTickCount;
  for i := 0 to 10000000 do
  begin
    ref := t.Test;
    ref;
    ref := nil;
  end;
  c := GetTickCount - c;

  c2 := GetTickCount;
  for i := 0 to 10000000 do
  begin
    method := t.Test;
    method;
    method := nil;
  end;
  c2 := GetTickCount - c2;

  c3 := GetTickCount;
  for i := 0 to 10000000 do
  begin
    proc := Test;
    proc;
    proc := nil;
  end;
  c3 := GetTickCount - c3;

  ShowMessage(Format('%d %d %d', [c, c2, c3]));
end.
Zitat:

~500 ~90 ~80
500 / 10000000 = 0,00005 ms pro Zuweisung+Aufruf
90 / 10000000 = 0,000009 ms pro Zuweisung+Aufruf

Und wenn nun noch irgendwas innerhalb der Prozedur und zwischen den Aufrufen passiert, dann verliert sich diese zusätzliche Zeit.
Schließlich wird Delphi auch nicht grade schneller, da fällt das "Bissl" nun och nicht mehr auf :roll:

himitsu 12. Nov 2010 16:56

AW: Non-Visual-Komponente > Ereignisse im OI verknüpfen
 
Ähhhhhhhhh :oops:

Hatte es grade nochmal mit dem vordefinierten TNotifyEvent versucht und auch da waren diese Property weg.

Nur dann ist was "Komisches" aufgefallen.


Es war alles die ganze Zeit da, nur hab ich an der falschen Stelle gesucht.
- ein "reference to ..."-Property wird als Eigenschaft angezeigt
- und wo ich dachte es wäre weg ... nja, ich hätte besser mal unter "Ereignisse" suchen sollen. :wall:

Es funktioniert also doch. :stupid:




Dazu dann Einiges/Vieles auf "... of object" geändert und nun sieht es schonmal ganz nett aus.

aktueller Code siehe http://www.delphipraxis.net/155160-w...ml#post1061174


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz