转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Delphi Implementation MVC         ★★★★

Delphi Implementation MVC

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1581 更新时间:2009/4/23 18:30:27

OSZ Handel I
Informatik

Objektorientierte Programmierung (OOP)
M-V-C Implementierung

S. Spolwig


[Home | Gymn. Oberstufe | Informatik | Unterrichtsmaterialien | Delphi ]
 

Hinweise zur Implementation von MVC mit DELPHI

Die allgemeine Beschreibung finden Sie unter MVC-Konzept. Den kompletten Quellcode unter den Links im Text, weitere Programmbeispiele unter Modellierung mit UML und downloads.

Alle Rahmenplanentwickler, die etwas auf sich halten, haben in den letzten Jahren die Behandlung des MVC-Konzepts in die Unterrichtspläne geschrieben. Was auch immer unter Behandlung verstanden wird, für unsere Schule hieß das schon immer, alle Programme (also auch die sogenannten kleinen) werden unter diesem Design entwickelt und geschrieben. Das bedeutet, daß die Implementierung der Einfachheit des Konzepts (Trenne Daten und ihre Repräsentation!) zu folgen hat und  der Programmieraufwand niedrig gehalten werden muß.

Genauso einfach ist scheinbar die Programmieraufgabe: benötigt werden Mechanismen, die die  Daten zwischen GUI und Model hin- und hertransportieren, wenn entsprechende Ereignisse aufgetreten sind. Dazu kommen in Frage:
 

  1. Polling 
    D. h. das GUI fragt das Model nach den Daten ab und aktualisiert den View.
     
  2. Observer Pattern Design
    ist ein Mechanismus, der automatisch jede Änderung des Zustands des Datenobjekts überwacht und erforderliche Aktualisierungen vornimmt. Näheres in der Fachliteratur. JAVA bietet dazu passende Klassen an, um Controller/View-Ereignisse ''''zu Fuß'''' zu programmieren. In DELPHI ist das eher unüblich.
     
  3. Selbstgeschriebene Ereignisroutinen
    Das Model erhält eine Ereignismethode (Zeiger), die vom GUI ausgewertet wird und automatisch den View aktualisiert.
     
  4. Bewertung
     
Die Aufgabe / Beispiel

Ein Programm berechnet den B.M.I.-Faktor einer Person. Es hat eine Fachklasse TPerson und die GUI-Klasse TFensterFrm.

Der Button
updateModel schickt die Daten ans Model
updateView holt die Daten und aktualisiert den View
Abnehmen reduziert den Wert von Gewicht.

Polling1
Bild 1
 

1.1  Manuelles Polling über GUI-Komponenten

Die Aktionen werden durch getrennte GUI-Komponenten realisiert, was bei den meisten Anwenderprogrammen angebracht ist.

Die Fachklasse TPerson hat nur die notwendigen Set- und Get-Methoden.

TPerson = class(TObject)
   private
    Name    : string;
    Groesse : real;
    Gewicht : real;
   public
   ...
    procedure SetName (n : string);
    function  GetName : string;
   ...

Die GUI-Klasse übernimmt Control- und Viewaufgaben.

unit uFenster;
INTERFACE
// ======================================================================
uses
  ...
  uPerson;


TFensterFrm = class(TForm)
    GroesseLbl: TLabel;
    ...
    procedure updModelBtnClick (Sender: TObject);
    procedure updViewBtnClick(Sender: TObject);
   
procedure AbnehmBtnClick(Sender: TObject);
   private
    Person : TPerson;             // ---  Model PERSON
   
procedure Init;
    procedure DatenAktualisieren;
// -- hier der Datentransport
    procedure MaskeAktualisieren;

end; 

IMPLEMENTATION
// ======================================================================
....
Procedure TFensterFrm.DatenAktualisieren;
// ----------------------------------------------------------------------
// Eingaben aus den Editfeldern an das Model-Objekt übergeben

begin
  Person.SetName (NameEdt.Text);
  Person.SetGroesse (StrToFloat (GroesseEdt.Text));
  Person.SetGewicht (StrToFloat (GewichtEdt.Text));
end;

procedure TFensterFrm.updModelBtnClick(Sender: TObject);
// ----------------------------------------------------------------------
// Ereignis starten

begin
  DatenAktualisieren;
 
Init;               // Eingaben im Fenster löschen
end;

procedure TFensterFrm.MaskeAktualisieren;
// ----------------------------------------------------------------------
// Objektdaten an die View-Komponenten übergeben

begin
  NameEdt.Text    := Person.GetName;
  GroesseEdt.Text := FloatToStr (Person.GetGroesse);
  GewichtEdt.Text := FloatToStr (Person.GetGewicht);
  BmiEdt.Text     := FloatToStr (Person.HatBMI);
end;

procedure TFensterFrm.updViewBtnClick(Sender: TObject);
// ----------------------------------------------------------------------
// Ereignis starten
begin
  MaskeAktualisieren
end;

...

 

1.2  Manuelles Polling (halbautomatisch) über GUI-Komponenten
 
Wenn die Ausgabe von Ergebnissen und Daten unmittelbar nach der Eingabe erwünscht ist, kann man den Aufruf MaskeAktualisieren in die upDateModel-Komponente legen und auf die upDateView-Komponente verzichten. Der Rest bleibt gleich.
  procedure TFensterFrm.updModelBtnClick(Sender:TObject);
// ----------------------------------------------
// Ereignis starten

begin
  DatenAktualisieren;
 
Init;
  MaskeAktualisieren;
end;

 

Polling2
Bild 2
 

2. Observer Pattern Design

Observer Pattern
Bild 3 - [Klicken Sie für den Quelltext auf die Klasse]

Reichlich Aufwand, um eine Klasse Person zu observieren ...
Durch die Auslagerung von Observer-Code in die Oberklasse bleibt dann aber nur der RunObservers-Aufruf in den Set-Methoden.
 

procedure TPerson.SetName (n : string);
//----------------------------------------------
begin
  fName := n;
  fObserverMgr.RunObservers; // Message absenden
end;

und im GUI
 

procedure TFensterFrm.FormShow(Sender: TObject);
// ---------------------------------------------
begin
  Person := TPerson.Create;
  Person.AddObserver(MaskeAktualisieren,self);
end;

 

Observer-GUI
Bild 4

Dem GUI ist ein zweiter View hinzugefügt, der vom Observer mit bedient wird.

 

3. Automatische Aktualisierung durch selbstgeschriebene Ereignisroutinen
 
Die Fachklasse hat außer den üblichen Set.. / Get-Methoden zusätzlich Code zur Ereignisbehandlung. Will man sicherstellen, daß die Änderung eines jeden Attributwertes verarbeitet wird, so braucht jede betreffende Methode die Variable OnChanged, die in der GUI-Klasse referenziert wird und die Aktualisierung anstößt.

Hier wird mit einem selbstdefinierten Typ TNotifyChange gearbeitet. Delphi stellt einen Typ TNotifyEvent zur Verfügung, der mit Properties ähnlich arbeitet.
 

Notify
Bild 5

unit uPerson;
INTERFACE
// ======================================================================
type
  TNotifyChange = procedure of object; // Deklaration eines Methodenzeigertyps
 
  TPerson = class(TObject)
   private
    Name    : string;
    ...
   public
&nb

[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 问题的解决之道
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台