AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Non-Visual-Komponente > Ereignisse im OI verknüpfen
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von himitsu · begonnen am 10. Nov 2010 · letzter Beitrag vom 12. Nov 2010
Antwort Antwort
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#1

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

  Alt 10. Nov 2010, 10:55
was sollte Dir denn der OI zur Auswahl anbieten?
Ich bezweifle dass sowas machbar ist.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 10. Nov 2010, 11:19
@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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

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

  Alt 10. Nov 2010, 11:34
meine Zweifel bezogen sich nicht auf:
THIDEOnRecive = Procedure(Sender: THIDDeviceEx; Const Data; Len: Integer) of Object;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 10. Nov 2010, 11:47
meine Zweifel bezogen sich nicht auf
Ich weiß.
"reference to" kann aber auch Objekt-Methoden aufnehmen,
sowie einfache Prozeduren, Klassen-Methoden, anonyme Methoden usw.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 10. Nov 2010, 18:01
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.
Angehängte Dateien
Dateityp: 7z HIDCtrl_OfObject.7z (19,4 KB, 4x aufgerufen)
Dateityp: 7z HIDCtrl_ReferenceTo.7z (19,4 KB, 1x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Nov 2010 um 18:03 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

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

  Alt 10. Nov 2010, 18:22
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 10. Nov 2010, 18:29
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 11. Nov 2010, 17:35
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.

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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Nov 2010 um 17:40 Uhr)
  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 18:10 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