Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 07.11.13 14:57 
Im Zusatz zu meinem letzten Thread habe ich bei einer Unit, die gekapselt werden sollte, folgende Aufgabe gehabt: Die Unit soll für das Hauptprogramm einen Container von Verknüpfungen realisieren. Die Verknüpfungen sollen in ein Fenster gezogen, abgelegt, gespeichert und wieder neu geladen, umbenannt werden können, in ihrer Position auf dem Fenster verschoben und exakt so wieder beim Fensteraufruf rekonstruiert werden. Das ist insoweit kapselbar, ohne Probleme. Ein Punkt, der dann jedoch sich der Kapselung widersetzte, war, bestimmte Verknüpfungen an mehrere User im System zu verteilen. Die habe ich über Ini-Dateien geregelt. Dort liegen alle Informationen der Verknüpfungen. Nun brauchte die Unit jedoch eine Information über die Nutzer. Dazu musste ich zu Anfang die Definitionsunit des Hauptprogramms mit einbinden. Das gefiel mir nach der Diskussion doch nicht mehr. Also habe ich einen Ausweg gesucht. Ich habe die Prozedur, die das Verteilen der Verknüpfungen besorgte, dann in die Haupt-Unit verschoben udn habe der Unit nur die Adresse dieser Prozedur als prozedurale Variable übergeben. Das sieht dann so aus:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
unit UnterUnit;

interface
//Definition im Interface-Teil der Verknüpfungs-Unit:

type
  ClickProc = procedure (Sender : TObject);

 TVF = class(TForm)
:
:
    procedure TVF.miSendClick(Sender: TObject); // Clickproc des Menue-Eintrags zum Versenden
    procedure FormCreate(Sender: TObject); // OnCreate-Prozedur;
  private
    fpSend : ClickProc;
:
    function GetSendProc: ClickProc;
    procedure SetSendProc(const Value: ClickProc);
  public
    property SendProc : ClickProc read GetSendProc write SetSendProc;
  end;


var
  VF : TVF;

implementation

procedure TVF.miSendClick(Sender: TObject);
var
  f : ClickProc;
begin
  f := SendProc;
  if @f<>NIL then
    f(Sender);
end;

function TVF.GetSendProc: ClickProc;
begin
  Result := fpSend;
end;

procedure TVF.SetSendProc(const Value: ClickProc);
begin
  fpSend := Value;
end;

procedure TVF.Create(Sender : TObject);
begin
  fpSend := NIL;
end;

// und in der Hauptunit:

unit Hauptunit;

interface

uses 
:
  UnterUnit,
:

type
  TMF : class(TForm)
:
      procedure mVerknuepfungenClick(Sender: TObject);
:
:
  end;

procedure SendClick(Sender: TObject);


implementation

procedure SendClick(Sender: TObject);
begin
//Arbeitsschritte
end;

// Zuweisung der Clickprozedur an die property Sendproc

procedure TMF.mVerknuepfungenClick(Sender: TObject);
begin
  VF.SendProc := SendClick;
end;


Jetzt habe ich eine komplette Trennung der Unterunit von der Hauptunit, weil die relevanten Daten über die Hauptunit abgearbeitet werden.

Auch benötige ich keine uses-Klausel in der Unterunit zur Hauptunit, jedoch eine - logischerweise - zur Unterunit von der Hauptunit aus.

Das ist eine Möglichkeit der Trennung. Die mir so eingefallen ist. Gibt es noch andere? Wäre interessiert, dies zu erfahren. Klar, kann man auch Messages nutzen, um die Verknüpfungen zu verteilen, statt diese über ini.Dateien zu realisieren. Auch das, aber mir geht es mehr um Möglichkeiten, solche - sehr unterschiedliche Verbindungen über sehr unterschiedliche Wege zu realisieren. Bin gespannt auf die Vorschläge.


Änderung: Fehlerabfangen, falls die Zuweisung nicht existiert. Bei Create des Unterunit.Formulars wird die Eigenschaft fpSend auf NIL gesetzt und bei dem Menueaufruf "Senden" wird auf NIL geprüft.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.