Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...? (https://www.delphipraxis.net/193391-die-alte-leier-zirkulaere-referenzen-aber-warum-nicht-so.html)

EWeiss 26. Jul 2017 05:44

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Zitat:

@Fritzew Das unterschreibe ich sofort.
Ich auch ;)

Nachdem du mir dabei geholfen hast mit den Interfaces zurecht zu kommen arbeite ich auch sehr gerne damit.
Da ist man wirklich sehr flexibel.

gruss

hzzm 26. Jul 2017 07:00

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Zitat:

Zitat von EWeiss (Beitrag 1377484)
Nachdem du mir dabei geholfen hast mit den Interfaces zurecht zu kommen

Gibt es zu Deinem Lern-Prozess Threads hier?
Ich moechte mir diese Technik auch aneignen, finde aber leider keine interface Beispiele, die genau fuer diesen Zweck angelegt sind.
Ich brauch das einfach mal schwarz auf weiss, minimal und vollstaendig.

jaenicke 26. Jul 2017 07:21

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Ein minimales Beispiel:
Delphi-Quellcode:
// MyMain.pas
uses
  UnitX, MainInterface;

type
  TMyMain = class(TForm, IMainInterface)
    StatusEdit: TEdit;
  public
    procedure SetStatusMessage(const AValue: string);
  end;

[...]

procedure TMyMain.SetStatusMessage(const AValue: string);
begin
  StatusEdit.Text := AValue;
end;

// Aufruf:
PerformHCoreOperation(Self);
Delphi-Quellcode:
unit MainInterface;
...
type
  IMainInterface = interface
  ['{2A2A7B02-5612-44C4-8A76-D90C857C36C7}']
    procedure SetStatusMessage(const AValue: string);
  end;
Delphi-Quellcode:
unit UnitX;

uses
  MainInterface;

procedure PerformHCoreOperation(const AStatusInterface: IMainInterface);
begin
  AStatusInterface.SetStatusMessage('PowerMonger status ON!');
end;
Das ist nur ein minimales Beispiel und eine Trennung des Formulars von der Klasse, die IMainInterface implementiert wäre durchaus wünschenswert, aber für den Anfang reicht das so vollkommen aus.

Die GUID (im Interface, hier ['{2A2A7B02-5612-44C4-8A76-D90C857C36C7}']) dient dazu das Interface eindeutig zu identifizieren. Du kannst diese mit Strg + Shift + G in Delphi erzeugen.

bra 26. Jul 2017 09:11

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Ist die GUID für das Interface eigentlich zwingend notwendig, wenn man das nur in seinem eigenem Projekt verwendet?

Fritzew 26. Jul 2017 09:14

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Zitat:

Ist die GUID für das Interface eigentlich zwingend notwendig, wenn man das nur in seinem eigenem Projekt verwendet?
Nicht zwingend aber manches geht nicht ohne. Z.B Supports, cast mit as oder auch der is Operator.
Um Problemen aus dem Weg zu gehen würde ich immer eine GUID empfehlen

freimatz 26. Jul 2017 14:28

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Was habe ich da nur losgetreten? :shock:

[QUOTE=Fritzew;1377492]
Zitat:

Um Problemen aus dem Weg zu gehen würde ich immer eine GUID empfehlen
Und der Haarspalter meldet sich wieder: :twisted:
bei interfaces mit generics rate ich entschieden davon ab.

Fritzew 26. Jul 2017 14:35

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Zitat:

Und der Haarspalter meldet sich wieder:
bei interfaces mit generics rate ich entschieden davon ab.
Ja die sind wirklich ein Spezialfall ....

jaenicke 26. Jul 2017 15:30

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Um aus dem Skript bestimmte Interfaces anfragen zu können, müssen diese bei uns alle eine GUID haben. Aus dem Grund sind generische Interfaces bei uns immer noch einmal abgeleitet und dort mit einer GUID versehen.

Rollo62 27. Jul 2017 06:04

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
+1 Guter Vorschlag :lol:

Bislang habe ich generische Interfaces vermieden um Probleme zu Vermeiden ...

Rollo

freimatz 27. Jul 2017 12:19

AW: Die alte Leier: Zirkulaere Referenzen, aber warum nicht so: ...?
 
Machen wir auch so. Zum Beispiel:

Delphi-Quellcode:
  IViewValueBase = interface(IViewBase)
    ['{3EF209C2-81FD-44C6-B231-328BA2FAABE5}']
    procedure RegisterHostValidation(const p_ValidationMethod: THostPropertyValidationDelegate);
    procedure ClearRegisteredHostValidation();
  end;

  IViewValueBase<T> = interface(IViewValueBase)
    function GetValue(): T;
    property Value: T read GetValue;
  end;

  IViewValue<T> = interface(IViewValueBase<T>)
    procedure SetValue(const p_Value: T);
    property Value: T read GetValue write SetValue;
  end;

  IViewValueBoolean = interface(IViewValue<Boolean>)
    ['{13871F02-44C4-40C4-B2D7-4A592D2A86D3}']
  end;

  IViewValueString = interface(IViewValue<String>)
    ['{1322615D-4628-4398-806D-E4E34BCF3BCE}']
  end;

  IViewValueInteger = interface(IViewValue<Integer>)
    ['{42524A7C-8BAF-41B4-90D0-77D8C457EDC9}']
  end;

  IViewValueDouble = interface(IViewValue<Double>)
    ['{016EE305-1856-4CD5-ACC2-9021F52DED63}']
  end;
  ...
Die implementierenden Klassen sind dann analog dazu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 Uhr.
Seite 2 von 2     12   

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