( تعداد نمایش : 762 )

ارث بری فرم ویژوال در دلفی قسمت دوم

پشت نقاب VFI
یکی از چیزهایی که مرا به دلفی علاقمند می کند، رو راست بودنش است. دلفی هیچ چیز را از ما مخفی نمی کند، هر کاری انجام دهیم، به کد برنامه منعکس می کند. برای اینکه بدانید VFI دقیقا چگونه کار می کند، کافی است کدی را که ابزار طراحی فرم دلفی تولید کرده بررسی کنید. اجازه بدهید با کدی شروع کنیم که با انتخاب گزینهء Copy در Object Repository تولید می شود. دوباره همان Dual list box را انتخاب می کنیم. شکل ۳ تعریف کلاس ایجاد شده را نشان می دهد.

type
  TDualListDlg = class(TForm)
    OKBtn: TButton;
    CancelBtn: TButton;
    HelpBtn: TButton;
    SrcList: TListBox;
    DstList: TListBox;
    SrcLabel: TLabel;
    DstLabel: TLabel;
    IncludeBtn: TSpeedButton;
    IncAllBtn: TSpeedButton;
    ExcludeBtn: TSpeedButton;
    ExAllBtn: TSpeedButton;
    procedure IncludeBtnClick(Sender: TObject);
    procedure ExcludeBtnClick(Sender: TObject);
    procedure IncAllBtnClick(Sender: TObject);
    procedure ExcAllBtnClick(Sender: TObject);
    procedure MoveSelected(List: TCustomListBox;
      Items: TStrings);
    procedure SetItem(List: TListBox; Index: Integer);
    function GetFirstSelection(List: TCustomListBox):
      Integer;
    procedure SetButtons;
  private
    { Private declarations }
  public
    { Public declarations }
end;

شکل ۳

این فقط بخش interface برنامه است. بخش implementation در اینجا نشان داده نشده. برای ما همان خط اول مهم است که تعریف کلاس باشد:

TDualListDlg = Class(Tform)

این کلاس وارث TForm است. همه چیز Dual list box در همین فایل PAS. و DFM. مربوطه اش آمده. حال شکل ۴ را در نظر بگیرید. این شکل فایل PAS. مربوط به Dual list box را در حالتی نشان می دهد که گزینهء Inherit را انتخاب کرده باشیم.

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, DUALLIST, StdCtrls, Buttons;

type
  TDualListDlg3 = class(TDualListDlg)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DualListDlg3: TDualListDlg3;

implementation

{$R *.DFM}

end.

شکل ۴

باز خط مهم همان خط تعریف کلاس است:

TDualListDlg3 = class(TDualListDlg)

که نشان می دهد فرم جدید وارث کلاس دیگری به نام TDualListDlg است. روشن است که TDualListDlg همان فرم توی انبار است. به عبارت uses این کلاس توجه کنید، ببینید که شامل یونیت DUALLIST است. اگر دقت کنید می بینید که این یونیت در عبارت uses فایل .DPR یعنی خود پروژه هم هست:

uses
Forms,
Unit1 in 'Unit1.pas' { Form1 },
Unit2 in 'Unit2.pas' { Form2 },

DualList in '..\OBJREPOS\DUALLIST.pas' { DualListDlg },
Unit3 in 'Unit3.pas' { DualListDlg3 };

چون فرم جدیدتان وارث فرم دیگری است، پروژهء شما باید هر دو را در بر داشته باشد.

تغییراتی که در فرم خود می دهید، فقط در فایلهای PAS. و DFM. فرم خودتان منعکس می شود. برای نمونه اگر روی فرمتان جای چیزی را عوض کنید، این تغییر فقط در فایل DFM. کلاس پایین دست (کلاس شما) ثبت و ضبط می شود. در واقع فایل DFM. یک فرم پایین دست، در بر دارندهء آن ویژگیهای فرم پایین دست است که نسبت به فرم بالادست تغییر کرده. بهترین راه برای فهمیدن تغییرات بین دو فرم همین است.

برای حسن ختام این بخش نگاهی هم به ساختار خود انبار اشیاء می اندازیم. انبار اشیاء دلفی یک فایل INI. بیشتر نیست. انبار اشیاء دلفی در فایلی با نام Delphi32.DRO در زیر شاخهء bin\ شاخهء نصب دلفی نگهداری می شود. می توانید آن را با Notepad یا یک ویرایشگر متن دیگر باز کنید تا خودتان ببینید. شکل ۵ بخش مربوط به Dual list box را نمایش می دهد.

[C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS\DUALLIST]
Type=FormTemplate
Name=Dual list box
Page=Forms
Icon=C:\PROGRAM FILES\BORLAND\DELPHI6\OBJREPOS\DUALLIST.ICO
Description=Dialog box with two list boxes. Supports moving items from one list to the other.
Author=Borland
DefaultMainForm=0
DefaultNewForm=0
Ancestor=
Designer=dfm

شکل پنج

مهمترین خط همان خط اول است. می بینید که این خط جای فایلها را روی دیسک به دلفی نشان می دهد. همهء فرمها همین جور در انبار نگهداری می شوند.

VFI در جهان واقع
مقالات فنی معمولا تصویری روشن و امید بخش از برنامه نویسی و تولید نرم افزار پیش رویتان می گذارند. همین چند کار را انجام دهید و… به بهشت برنامه نویسی خوش آمدید! در دنیای واقعی، VFI می تواند جلوی هدر رفتن وقتتان را بگیرد و برنامه هایتان را پایدارتر کند. ولی کار زیادی هم می برد. اولین باری که VFI را به کار ببرید، مدت زیادی از وقتتان صرف طراحی سلسله مراتب فرمها خواهد شد. اینجا سعی می کنم آنچه را بار اول استفاده تان از VFI پیش می آید برایتان مجسم کنم.

نوشتن برنامه تان را مانند همیشه آغاز می کنید. تعدادی فرم می سازید و مقداری کد می نویسید. یک باره متوجه می شوید که چندتا از فرمهایتان خیلی به هم شبیه هستند و کدهایی هم که برایشان می نویسید یکی است. این جا می فهمید که VFI جایش همین جاست و تصمیم می گیرید از آن استفاده کنید. اشتراکات کدها و طراحی فرمها را پیدا می کنید و آنها را به یک فرم کلی منتقل می کنید. آن فرم را در انبار اشیاء می گذارید و فرمهای اول کارتان را طوری بازسازی می کنید که وارث آن باشند. ولی این پایان داستان نیست. بعید است همان بار اول بتوانید یک طراحی بی عیب و نقص ارایه دهید. آنچه معمولا اتفاق می افتد این است که شما به توسعهء فرمهای پایین دست ادامه می دهید، ولی همیشه مراقبید که اگر مورد مشترکی پیدا شد، آن را به کلاسهای بالاتر ببرید. این جور طراحی کلاس خیلی شبیه نرمال سازی بانکهای اطلاعاتی است. می خواهید از دوباره کاری و تکرار داده ها جلوگیری کنید و این وقتگیر است.

این سبک طراحی یک عملیات مکرر است. ممکن است بار اولی که از آن استفاده می کنید تغییر محسوسی در بهره وری مشاهده نکنید، ولی بعدا خواهید دید. یک مثال از کارهای خودم یادم می آید. ما یک رابط کاربری استاندارد برای ویرایش جداول بانک اطلاعاتی طراحی کردیم. تمام امکانات لازم – مانند add، delete، edit، search – را ایجاد کردیم و به کاربر اجازه دادیم هم از راه منوها و هم با دکمه های روی Coolbar به آنها دستیابی داشته یاشد. همهء کد و ظواهر مشترک را در یک کلاس در بالادست جمع کرده و آن را در تمام برنامه هایمان به کار می بردیم. فرمهای اصلی برنامه مان همه از همان فرم مشتق می شدند. از قضا کاربر ما از Coolbar خوشش نیامد و دوست داشت که جایش با یک چیز ساده تر عوض شود. ما ۳۰ فرم را به همین صورت ساخته بودیم، ولی تمام کاری که حالا می بایست می کردیم، عوض کردن Coolbar در آن فرم کلی با یک Toolbar بود. بعد هم برنامه را کامپایل کردیم!

برتریهای واقعی VFI تازه بار دوم یا سومی که از یک طراحی خاص استفاده کنید معلوم می شود. به یاد داشته باشید که انبار اشیاء را می توانید برای به اشتراک گذاشتن فرمها بین برنامه هایتان به کار ببرید. در کار ما، مرحلهء اول طراحی برنامه تهیهء فهرست فرمهای لازم برای برنامه و شباهتهای میان آنهاست. پس از آن است که تصمیم می گیریم همان فرمهای پیش ساخته مان را به کار ببریم، آنها را کمی تغییر دهیم، یا اینکه اصلا فرمهای جدیدی بسازیم. به هر حال هیچ گاه از صفر آغاز نمی کنیم.

اگر می خواهید کار با VFI را آغاز کنید، پیشنهاد می کنم از یک فرم برای کار با بانکهای اطلاعاتی آغاز کنید. تصمیم خود را در مورد قیافه اش بگیرید، طراحی اش کنید و آن را در انبار اشیاء بگذارید. تا می توانید، و تا آنجا که می شود کدهای مشترکتان را به آن منتقل کنید. بعد فرمهای برنامه تان را از همین فرم به ارث ببرید و به آنها اطلاعات مختص جدولتان را بیافزایید. زمانی که دارید برای فرمها کد می نویسید همیشه توجه داشته باشد که اگر کد مشترکی پیدا شد، آن را به کلاسهای بالاتر ببرید. هر بخش از کد را که می نویسید، از خود بپرسید که آیا این کد مختص همین فرم است یا می شود آن را در فرمهای دیگر به کار برد. اگر کلی به نظر می رسد، حتما آن را به کلاسهای بالاتر ببرید.

خلاصه
VFI یه شما توانایی ساخت فرمهای جدید بر پایهء فرمهای موجود را فراهم می کند. VFI همان برتریهای وراثت را دارد، در نتیجه توسعهء برنامه را سریعتر و آن را استوار و متناسب تر می کند.

درک شیوهء کارکرد VFI وابسته به فهم درست مدل شیئی دلفی و بخصوص وراثت است. به نظر من یکی از قویترین امکانات دلفی است و خودم خیلی زیاد استفاده اش می کنم.

نویسنده اصلی: Rick Spence
منبع: Delphi Informant Magazine

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن