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.