AGB  ·  Datenschutz  ·  Impressum  







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

Generics

Ein Thema von TigerLilly · begonnen am 19. Sep 2017 · letzter Beitrag vom 19. Sep 2017
Antwort Antwort
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#1

Generics

  Alt 19. Sep 2017, 16:00
Wenn ich versuche, das zu komplilieren
Delphi-Quellcode:
type
  TEventChain<T> = class
    constructor Create;
    destructor Destroy;
    procedure ChainEvent(NewEvent: T);
    function AttachEvent(OldEvent:T):T;
    procedure BaseEvent<T>;
  end;
bekomme ich für BaseEvent
[dcc32 Hinweis] Unit4.pas(19): H2509 Bezeichner 'T' steht im Konflikt mit Typparametern des Container-Typs Warum?

Ich würde gern sowas machen: XY:=TEventChain<TNotifyEvent>.create;

Und hier

Delphi-Quellcode:
function TEventChain<T>.AttachEvent(OldEvent: T): T;
begin
  Result := BaseEvent;
  EventList.Add(OldEvent);
end;
erhalte ich
[dcc32 Fehler] Unit4.pas(74): E2531 Methode 'BaseEvent' erfordert explizite Typargumente Was übersehe ich da?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Generics

  Alt 19. Sep 2017, 17:43
BaseEvent<T> statt nur BaseEvent unten in der Funktion sollte das Problem beheben. Der Typ kann in diesem Falle nicht automatisch abgeleitet werden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Generics

  Alt 19. Sep 2017, 17:46
Nope.

[dcc32 Fehler] Unit4.pas(76): E2010 Inkompatible Typen: 'T' und 'procedure, untyped pointer or untyped parameter'
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#4

AW: Generics

  Alt 19. Sep 2017, 17:48
Wie schon gesagt: Da nichts über T bekannt ist, kannst du T auch nicht aufrufen oder eine Methode als T zurückgeben. Was du vorhast, geht so nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Generics

  Alt 19. Sep 2017, 18:21
Ok, ja, das hat Sinn, wenn man es so betrachtet. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Generics

  Alt 19. Sep 2017, 18:24
Bist du sicher, dass BaseEvent nicht eigentlich function BaseEvent: T sein soll, statt procedure BaseEvent<T> ? Anders macht es nämlich nicht wirklich Sinn.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Generics

  Alt 19. Sep 2017, 18:28
Das passt schon so. Der Aufruf wäre so:

AttachEvent(grid.OnResize);

Und die Methode sichert den aktuellen Event in einer Liste und weist einen neuen Event zu - eben BaseEvent, der dann dafür sorgt, dass der alte Event und allfällige weitere aufgerufen wird.

Das war der Plan :- )
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Generics

  Alt 19. Sep 2017, 18:52
Result := BaseEvent klappt aber trotzdem nur, wenn BaseEvent eine function ist
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Generics

  Alt 19. Sep 2017, 19:00
So geht´s natürlich - ohne Generics:

Delphi-Quellcode:
 TNotifyEventChain = class
    EventList: IList<TNotifyEvent>;
    constructor Create;
    destructor Destroy;
    procedure ChainEvent(NewEvent: TNotifyEvent);
    function AttachEvent(OldEvent:TNotifyEvent):TNotifyEvent;
    procedure BaseEvent(Sender:TObject);
  end;
  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 06:44 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