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
Gutelo

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

Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 01:21
Hallo,

ich habe eine selbstgeschriebene Komponente. Diese Komponente enthaelt eine Listbox, welche als Items die Dateinamen von Dateien in einem bestimmten Verzeichnis enthaelt. Nun moechte ich innerhalb der Komponente soetwas wie folgende Prozedur haben:

Procedure DoWithFile(Filename : String);

Diese Procedure soll von einer andere Procedure innerhalb der Komponente aufgerufen werden, in etwa soetwas:

Procedure AndereProzedur();
begin
DoWithFile(LV.items[1]);
end;

Nun die Frage. Wie muss ich DoWithFile deklarieren so dass ich sie im Hauptprogramm (das die Komponente verwendet) implementieren kann? In Java waere das soetwas wie ein Interface.

Gutelo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 02:26
Möchtest du einen Event haben?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 09:06
Du kannst das mit einem Interface, mit einer Action (Reference to procedure) oder mit einem Event machen. Hier würde ich persönlich ein Interface vorziehen, der Intention entsprechend.
  Mit Zitat antworten Zitat
Blup

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

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 10: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
 
#5

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 16: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 16:40 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Implementierung einer Interface Prozedur

  Alt 2. Okt 2014, 17: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: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Implementierung einer Interface Prozedur

  Alt 3. Okt 2014, 13: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:46 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