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:
												| 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
 
 type
 ClickProc = procedure (Sender : TObject);
 
 TVF = class(TForm)
 :
 :
 procedure TVF.miSendClick(Sender: TObject);     procedure FormCreate(Sender: TObject);   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;
 
 
 unit Hauptunit;
 
 interface
 
 uses
 :
 UnterUnit,
 :
 
 type
 TMF : class(TForm)
 :
 procedure mVerknuepfungenClick(Sender: TObject);
 :
 :
 end;
 
 procedure SendClick(Sender: TObject);
 
 
 implementation
 
 procedure SendClick(Sender: TObject);
 begin
 end;
 
 
 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.