AGB  ·  Datenschutz  ·  Impressum  







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

Implementierung einer Interface Prozedur

Ein Thema von Gutelo · begonnen am 2. Okt 2014 · letzter Beitrag vom 3. Okt 2014
Antwort Antwort
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#1

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 09:53
Ein Interface scheint eigentlich schon zu viel Aufwand.
Delphi-Quellcode:
TProzessFileEvent = procedure(Sender: TObject; const AFilename: string) of object;

TMyComponent = class({...})
public
  procedure DoProzessFileList(AProzessFileEvent: TProzessFileEvent);
end;

procedure TMyComponent.DoProzessFileList(AProzessFileEvent: TProzessFileEvent);
var
  Filename: string;
begin
  Assert(Assigned(AProzessFileEvent), Self.Name + '.DoProzessFileList(nil)');

  for Filename in FFileList do
    AProzessFileEvent(Self, Filename);
end;
Eine mögliche Erweiterung für den Objektinspektor:
Delphi-Quellcode:
TMyComponent2 = class(TMyComponent)
private
  FOnProcessFile: TProzessFileEvent;
public
  procedure DoProzessFileList; reintroduce;
published
  property OnProcessFile: TProzessFileEvent read FOnProcessFile write FOnProcessFile;
end;

procedure TMyComponent2.DoProzessFileList;
begin
  if Assigned(FOnProcessFile) then
    inherited DoProzessFileList(FOnProcessFile);
end;
Den Auslöser(Sender) als Parameter mitzuliefern ist langfristig immer eine gute Idee.
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#2

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 15:26
Hallo,

allen vielen Dank fuer die Antworten. Blup, die Version sieht ganz gut aus und an Funktionsvariable habe ich auch schon gedacht. Allerdings wuerde ich anstatt einer eigenen Prozedur namens TMyComponent.DoProzessFileList(AProzessFileEvent: TProzessFileEvent); gerne den Aufruf aus dem OnClick Ereignis des Listviews ausfuehren. Wuerde folgendes gehen?:

Delphi-Quellcode:
TProzessFileEvent = procedure(AFilename: string) of object;

TMyComponent = class({...})
public
  VmyEvent : TProzessFileEvent;
  procedure SetMyProzessFileEvent(PFE : TProcessFileEvent);
  procedure OnClickListView(AProzessFileEvent: TProzessFileEvent);
end;

procedure TMyComponent.SetMyProzessFileEvent(PFE : TProcessFileEvent);
begin
  VmyEvent := PFE;
end;

procedure TMyComponent.OnClickListView(Sender: TObject);
var
  Filename: string;
  Li : TListItem;
begin
  Li := ListView1.selected;
  Filename := Li.caption;
  VMyEvent(Filename);
end;
Gutelo


Edit: Funktioniert prima, danke !!!!

Geändert von Gutelo ( 2. Okt 2014 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 16:09
Hier werden 'Events' verwendet, wo doch gar kein Ereignis eintritt. Nun ja.
Ein Interface scheint eigentlich schon zu viel Aufwand.
Aufwand? Du meinst Tippaufwand? Na wenn Du danach die richtige Vorgehensweise wählst...

Die Lösung mit dem Interface finde ich besser, weil erweiterbar. Eine Methode (die sich hinter dem 'Event' bzw. der Methodenvariablen) kann man nur aufblähen, aber ein Interface kann man erweitern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Implementierung einer Interface Prozedur

  Alt 3. Okt 2014, 12:49
Aufwand? Du meinst Tippaufwand? ...
Die Lösung mit dem Interface finde ich besser, weil erweiterbar.
Wenn man in Delphi ein Interface implementieren möchte dann muss man von einer kleinen Auswahl von Basisklassen (TInterfacedObject, TComObject, TTypedComObject, TAutoObject, TAutoIntfObject) ableiten.
(Oder man muss die Methoden QueryInterface(), _AddRef() und _Release() selbst implementieren)

Dies ist schon mal eine ganz erhebliche Einschränkung weil man nicht einfach von einer x-beliebigen Klasse ableiten kann und dann zusätzlich das Interface implementiert.

Aber es kommt noch schlimmer!
Es dürfte bekannt sein, dass wenn man in Delphi mit einem Objekt arbeitet und dabei den Objektzeiger als auch den Interfacezeiger benützt man in Teufels Küche kommt.
Entweder ruft man die Methode Free() auf obwohl der Interfacezeiger noch benützt wird.
=> Zugriff über den Interfacezeiger auf ein freigegebene Objekt
oder der Referenzzähler geht auf 0 und das Objekt wird freigegeben obwohl der Objektzeiger noch benützt wird
=> Zugriff über den Objektzeiger auf ein freigegebene Objekt

In C# ist das kein Problem weil die Lebenszeit der Objekte über eine Garbage Collection bestimmt wird.
In Delphi darf man aber nur über den Interfacezeiger oder den Objektzeiger arbeiten, niemals mit beiden gleichzeitig!

Ein Event hat in Delphi weniger Einschränkungen und ist weniger aufwändig.
fork me on Github
  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 09:39 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