sp; OnChanged : TNotifyChange; // Vereinbarung einer ... // Referenzvariablen/Ereignismethode end;
IMPLEMENTATION // ====================================================================== ... procedure TPerson.SetGroesse (gr : real); (* ----------------------------------------- *) begin Groesse := gr; if assigned(OnChanged) // Ereignis auslösen then OnChanged; end;
procedure TPerson.Abnehmen; (* ----------------------------------------- *) begin Gewicht := Gewicht - 1; if assigned(OnChanged) // Ereignis auslösen then OnChanged; end;
... END. // ----- UNIT -------
In der GUI-Klasse sorgt die Methode Person.OnChanged in FormCreate dafür, daß bei jedem Event die GUI-Methode MaskeAktualisieren ausgeführt wird.
Leider kann das in bestimmten Fällen zu Problemen führen. Editfelder, die sich gut für kombinierte Ein- und Ausgabe eignen, dürfen nicht für die Ausgabe von Rechenoperationen angesprochen werden; es sind also andere GUI-Komponenten dafür erforderlich. Die korrekte Initialisierung von Gewicht und Groesse mit 0 führt zu einer Exception wegen der unerlaubten Division durch Null bei Errechnung des BMI. Reine Textfelder sind unproblematisch.
unit uFenster;
INTERFACE // ====================================================================== uses ... uPerson;
type TFensterFrm = class(TForm) GroesseLbl : TLabel; ... procedure FormCreate (Sender: TObject); procedure updModelBtnClick (Sender: TObject); procedure AbnehmBtnClick (Sender: TObject); procedure EndeBtnClick (Sender: TObject);
private Person : TPerson; // --- Model PERSON procedure Init; procedure DatenAktualisieren; // --- hier der Datentransport procedure MaskeAktualisieren; public end;
var FensterFrm: TFensterFrm;
IMPLEMENTATION // ====================================================================== {$R *.DFM}
procedure TFensterFrm.FormCreate(Sender: TObject); // ---------------------------------------------------------------------- begin FensterFrm.Init; Person := TPerson.Create; Person.OnChanged := MaskeAktualisieren; // Methodenzeiger mit Methode end; // verknüpfen
... procedure TFensterFrm.DatenAktualisieren; // ---------------------------------------------------------------------- // wie vorher ... procedure TFensterFrm.updModelBtnClick(Sender: TObject); // ---------------------------------------------------------------------- begin DatenAktualisieren; end;
procedure TFensterFrm.MaskeAktualisieren; // ---------------------------------------------------------------------- begin NameEdt.Text := Person.GetName; BmiEdt.Text := FloatToStr(Person.HatBMI); end;
procedure TFensterFrm.AbnehmBtnClick(Sender: TObject); // ---------------------------------------------------------------------- begin Person.Abnehmen; end;
end. // ------ UNIT -------
Bewertung
1. Polling
Manuelles Polling (1.1. und 1.2) haben sich seit 10 Jahren im Unterricht bewährt und sind unaufwendig. An unserer Schule werden alle Programme, beginnend im Anfangsunterricht mit einer Fachklasse bis zu großen Projekten, in dieser Weise von den Schülern bearbeitet. Die Datenklassen sind frei von jeder technischen Erweiterung. Das erlaubt eine sehr einfache und klare OOA und Implementierung.
2. Observer Pattern Design
Viel Technik, wenig Erkenntnisgewinn (s.o.). Der Programmieraufwand pro observiertem Objekt ist so umfangreich, daß er sich für den Unterricht verbietet, wenn Schüler den kompletten Observer-Code schreiben sollten, zumal das durchaus nicht trivial ist. Eine Möglichkeit wäre, das ganze Paket als Bibliothek abzulegen. Bei dieser als auch der dritten Variante bleiben Fachklassen nicht von proprietärem Code frei, der sie mit dem Betriebssystem verknüpft, was einer Portierung im Wege steht. Der schöne Anspruch, das in Fachklassen auch nur Anwendungsdaten und Anwendungslogik enthalten sein sollen, ist dahin.
3. Selbstgeschriebene Ereignisroutinen
Die selbstgeschriebene Ereignissteuerung ist eher eine Bastlerlösung. TNotifyChange ist ein Prozedurtyp, ein ebenso mächtiges wie undurchsichtiges Konstrukt. Onchange eine Prozedurvariable, also gleichermaßen Attribut und Prozedur und damit proprietär belastet. Die o. g. Restriktionen und Fehler lassen Zweifel an einen routinemäßigen Einsatz im Unterricht aufkommen.
------------------- Literatur u. Links
Hilfehandbuch Delphi 7 Amrhein, B.: Designpattern für Graphische Benutzeroberflächen http://www.hta-be.bfh.ch/~amrhein/Skripten/Swing/Pattern.pdf Höstklint, C.: Simple Observer Pattern http://www.delphi3000.com/member.asp?ID=9713 Paulus, H.: Das MVC-Konzept. (Schöne Präsentation) http://informatikag.bildung-rp.de/assets/download/D1-Paulus-Farben.pps
© 15. Oktober 2004 Siegfried Spolwig
上一页 [1] [2] [系统软件]InstallShield Express for delphi制作安装程序定… [常用软件]InstallShield Express制作Delphi数据库安装程序 [Delphi程序]为什么选择Delphi.Net ? [Delphi程序]《关于VisiBroker For Delphi的使用》(4) [Delphi程序]Delphi 程序员代码编写标准指南 [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro… [Delphi程序]Borland Delphi 9 的新特性 [Delphi程序]Delphi 键盘码表 [Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗? [Delphi程序]Delphi Access violations 问题的解决之道
|