نمایش نتایج 1 تا 5 از 5

نام تاپیک: آموزش استفاده از TMS Aurelius ORM در دلفی

  1. #1
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    آموزش استفاده از TMS Aurelius ORM در دلفی

    به نام خدا

    آموزش استفاده از TMS Aurelius در دلفی

    درباره ORM

    یکی از حوزه های دارای اهمیت بین برنامه نویسان، حوزه برنامه های مرتبط با بانک اطلاعاتی می باشد. به واسطه امکانات و ابزارهایی که محیط RAD Studio Delphi ارائه نموده، دلفی کارها در این حوزه بیشتر و موفق تر ظاهر شده اند.
    بی شک اقداماتی چون ارتباط با پایگاه داده، واکشی داده ها، ارسال پارامتر ها، نوشتن کوئری ها ووو و از همه مهمتر بهینه سازی و تست صحت عملکرد آن همیشه جزو دغدغه های برنامه نویسان این حوزه بوده و هست.
    یکی از ابزارهایی که به نوعی قسمت اعظمی از دغدغه های مورد اشاره را پوشش داده و از مشکلات برنامه نویس میکاهد، ابزار ORM (Object-relational mapping) می باشد.(برای روانی نوشته ها از کلمه "ابزار" استفاده شده است).

    یک تعریف ساده

    وقتی در زبان های برنامه نویسی میخواهید به پایگاه داده وصل شوید و از آن استفاده کنید، باید کدهای SQL را بدانید تا بتوانید با داده ها کار کنید برای مثال برای انتخاب داده ها باید بنویسید:

    SELECT * FROM users

    که لیست همه کاربران را بگیرید. کارهایی از این دست در دراز مدت خیلی زیاد هستند و اگر شما بخواهید پایگاه داده خودتان را عوض کنید، می بایست خیلی از این کد ها را عوض کرده و متناسب با پایگاه داده جدید بنویسید. حالا ORM ها یک لایه ای برای شما بوجود می اورد که نیازی نباشد کدهای SQL رو خودتان بنویسید. مثلا شما مینویسید:

    User.all();

    و این خط خودش کد SQL تولید میکند و از جدول کاربران مشخصات تمام کاربران را لیست می کند. حالا اگر بخواهید پایگاه داده تان را هم عوض کنید ORM کدهای مربوط به پایگاه داده جدید را تولید میکند و نیازی نیست خودتان این کار را انجام دهید.


    شروع سریع

    بدون هیچ مقدمه ای سر اصل مطب می رویم : نحوه استفاده از TMS Aurelius ORM در برنامه:

    1- ساخت کلاس مدل

    به بیان ساده، آنچه که قرار است بین برنامه و دیتابیس توسط Aurelius ارسال و دریافت شـــــود می بایست در قالبی قرار گیرند که برای Aurelius قابل فهم باشد. این قالب برای برنامه نویس نیز بسیار قابل درک و آشناست. این قالب چیزی نیست جز "کلاس"! بله کلاس.
    یک کلاس (که می تواند بصورت مشتق شده از دیگر کلاس ها نیز باشد) همانند یک رکورد از بانک اطلاعاتی خواهد بود که هر یک از پراپرتی ها نقش فیلد ها(یا همان ستون) بانک را خواهند داشت.
    پس کلاس(یا بهتر است بگوییم جداول) خود را بسازید :


    type
    TPerson = class
    private
    FLastName: string;
    FFirstName: string;
    FEmail: string;
    public
    property LastName: string read FLastName write FLastName;
    property FirstName: string read FFirstName write FFirstName;
    property Email: string read FEmail write FEmail;
    end;


    2- نگاشت کلاس

    بعد از تعریف کلاس مدل، برای اینکه Aurelius بداند چگونه بین کلاس و پروپرتی های آن با جداول و فیلد ها ارتباط برقرار کند، نیاز هست تا نگاشت های مورد نیاز انجام پذیرد. لذا ابتدا دو Attribute( [Entity] و [Automapping]) و سپس فیلد Fid از نوع Integer را به کلاس اضافه می نمائیم.


    uses
    {...}, Aurelius.Mapping.Attributes;

    type
    [Entity]
    [Automapping]
    TPerson = class
    private
    FId: integer;
    FLastName: string;
    FFirstName: string;
    FEmail: string;
    public
    property Id: integer read FId;
    property LastName: string read FLastName write FLastName;
    property FirstName: string read FFirstName write FFirstName;
    property Email: string read FEmail write FEmail;
    end;


    - با افزودن ویژگی [Entity] به هر کلاس، Aurelius آن کلاس را شناسایی کرده و جدولی بنام همان کلاس(البته بدون حرف T) در دیتابیس خواهد ساخت. (امکان تعیین نام دلخواه برای جدول وجود دارد که در آموزش های بعدی ارائه خواهد شد).
    - با افزودن ویژگی [Automapping] به هر کلاس، Aurelius تمام نگاشت های مورد نیاز را انجام خواهد داد. به این معنی که با توجه به پروپرتی ها مواردی چون نام فیلد، نوع فیلد، کلیدهای خارجی، ایندکس ها و ... را ایجاد خواهد کرد.)


    3- تعریف اینترفیس IDBConnection

    همانطور که گفته شد، یکی از ویژگی های اصلی و بارز ORM ها، تسهیل در تولید کدهای SQL جهت دیتابیس های مختلف و ساده سازی فرآیند مربوطه است. شما با استفاده از هر یک از کامپوننت های مورد نظر خود نظیر (FireDAC, UniDAC, ADO, dbExpress, …) میتوانید به دیتابیس متصل شده و باقی کارها را به عهده Aurelis بسپارید. نقطه شروع ایجاد IDBConnection است. برای این منظور با استفاده از Adaptor هایی که توسط Aurelius فراهم شده، کامپوننت اتصال را بعنوان ورودی به آن پاس داده و خروجی تابع نتیجه مورد نظر ما خواهد بود.


    uses
    {...}, Aurelius.Drivers.Interfaces, Aurelius.Drivers.dbExpress;

    var
    MyConnection: IDBConnection
    begin
    // SQLConnection1 is a dbExpress TSQLConnection component
    // You can use several different data-access component libraries
    MyConnection := TDBExpressConnectionAdapter.Create(SQLConnection1, false);


    4- تعیین the SQL dialect

    با اضافه کردن یونت های Aurelius.SQL.XXX (که در اینجا XXX نشان دهنده نام SQL Dialect خواهد بود) به Aurelius خواهیم گفت که چه SQL dialect هایی در برنامه استفاده خواهد شد. برای نمونه در مثال زیر به Aurelius خواهیم گفت که Dialect های MySQL و MSSQL Server در برنامه مورد استفاده خواهند بود. Aurelius با توجه به کانکشن تعریف شده در مرحله قبل، Dialect درست را انتخاب خواهد نمود.


    uses
    {...}, Aurelius.SQL.MySQL, Aurelius.SQL.MSSQL;


    5- ساختن دیتابیس

    با استفاده از DatabaseManager میتوان جداول و فیلدهای یک دیتابیس را ساخت. تنها کافیست دستور BuildDatabase را فراخوانی کنید!( درحال حاضر امکان ایجاد خودکار فایل دیتابیس توسط اورلیوس وجود نداشته و فایل مربوطه میبایست بصورت دتسی توسط کاربر ایجاد گردد!)


    uses
    {...}, Aurelius.Engine.DatabaseManager;

    DBManager := TDatabaseManager.Create(MyConnection);
    DBManager.BuildDatabase;


    نکته : در صورتیکه جداول و فیلدهای آن درحال حاضر در دیتابیس وجود دارد، نیازی به انجام این مرحله نیست.


    6- نمونه سازی از کلاس ها و ذخیره در دیتابیس

    جهت ذخیره کلاس ها در دیتابیس، از ObjectManager استفاده خواهیم نمود. با نمونه سازی از یک کلاس و پاس دادن آن به ObjectManager، اطلاعات کلاس بصورت یک رکورد در دیتابیس ذخیره می گردد.


    uses
    {...}, Aurelius.Engine.ObjectManager;

    Person := TPerson.Create;
    Person.LastName := 'Lennon';
    Person.FirstName := 'John';
    Person.Email := 'lennon@beatles.com';
    Manager := TObjectManager.Create(MyConnection);
    try
    Manager.Save(Person);
    PersonId := Person.Id;
    finally
    Manager.Free;
    end;


    7- دریافت و یا بروزرسانی رکورد های جدول

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


    Manager := TObjectManager.Create(MyConnection);
    Person := Manager.Find<TPerson>(PersonId);
    Person.Email := 'john.lennon@beatles.org';
    Manager.Flush;
    Manager.Free;



    8- جستجو در دیتابیس

    اگر بخواهیم لیست تمام افرادی که ایمیل با دامنه "beatles.org" دارند را داشته باشیم، بصورت زیر عمل خواهیم کرد:


    uses
    {...}, Aurelius.Criteria.Base, Aurelius.Criteria.Linq;

    Manager := TObjectManager.Create(MyConnection);
    Results := Manager.Find<TPerson>
    .Where(
    TLinq.Like('Email', '%beatles.org%')
    or TLinq.Like('Email', '%beatles.com%')
    )
    .List;

    // Iterate through Results here, which is a TList<TPerson> list.
    for person in Results do
    // use person variable here, it's a TPerson object

    Manager.Free;



    در ادامه یک برنامه ساده ذخیره و بازیابی اطلاعات دفترچه تلفن را قدم به قدم اجرا خواهیم کرد.
    آخرین ویرایش به وسیله hp1361 : چهارشنبه 26 آبان 1395 در 14:50 عصر

  2. #2
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: آموزش استفاده از TMS Aurelius ORM در دلفی

    نوشتن برنامه دفترچه تلفن با استفاده از TMS Aurelius ORM در دلفی

    برای اینکه بصورت عملی با Aurelius کار کرده باشیم، برنامه ای جهت مدیریت شماره تلفن ها(دفترچه تلفن) که در آن نام و نام خانوادگی ، شماره تلفن ثابت، شماره تلفن همراه و آدرس افراد ذخیره شده و امکان جستجو بر اساس فیلد نام و نام خانوادگی نیز در آن وجود داشته باشد را طراحی و پیاده سازی خواهیم نمود.
    پیش فرض های برنامه:
    - کامپوننت اتصال به پایگاه داده : FireDAC
    - محل قرارگیری کامپوننت اتصال : DataModule
    - نوع پایگاه داده : SQLite
    ابتدا یک برنامه VCL Application ایجاد کرده و یک DataModule نیز به آن اضافه می نمائیم. برای اینکه از همین ابتدا خوانایی کدها را بالا برده و کار را بصورت مرتب و تمیز انجام داده باشیم، کدهای مربوط به تعریف موجودیت های برنامه (Entity ها) را در فایلی جداگانه ذخیره خواهیم کرد. لذا یک Unit جدید به برنامه اضافه کرده و نام آنرا Entities قرار می¬دهیم:


    حالا در این Unit، کلاس های مورد نظر را تعریف می نمائیم.(قدم های پیاده سازی همانند آموزش قبل خواهد بود)

    1. [1]تعریف کلاس مدل



    1. TContact = class
    2. private
    3. FFirstName: string;
    4. FLastName: string;
    5. FPhoneNumber: string;
    6. FMobileNumber: string;
    7. FAddress: string;
    8. public
    9. property FirstName: string read FFirstName write FFirstName;
    10. property LastName: string read FLastName write FLastName;
    11. property PhoneNumber: string read FPhoneNumber write FPhoneNumber;
    12. property MobileNumber: string read FMobileNumber write FMobileNumber;
    13. property Address: string read FAddress write FAddress;
    14. end;



    1. [2]نگاشت کلاس


    همانطور که در آموزش پیشین اشاره شد، برای آنکه Aurelius یک کلاس را به عنوان یک موجودیت در نظر گرفته و آنرا در دیتابیس ذخیره و یا بازیابی نماید، ابتدا باید ویژگی(Attribute) موجودیت ([Entity]) را به کلاس اضافه نمائیم و به اصطلاح کلاس را به این ویژگی آراسته نمائیم (Decorate). با توجه به هوشمند بودن Aurelius، سایر نگاشت ها (مواردی چون نام گذاری فیلدها، تعیین طول رشته ها، نوع فیلد ها و...) را به عهده Aurelius می گذاریم. لذا علاوه بر ویژگی [Automapping]، فیلدی بنام Id به پروپرتی های کلاس اضافه می نمائیم.(این فیلد با همین نام جهت عملکرد صحیح Automapping ضروری می¬باشد).

    نکته : برای اینکه ویژگی های مورد اشاره توسط دلفی قابل شناسایی باشند و در زمان کامپایل خطای عدم شناسایی ندهد، می بایست یونیت Aurelius.Mapping.Attributes به قسمت Interface اضافه گردد.


    1. uses
    2. Aurelius.Mapping.Attributes;
    3.
    4. type
    5.
    6. [Entity]
    7. [Automapping]
    8. TContact = class
    9. private
    10. FId: Integer;
    11. FFirstName: string;
    12. FLastName: string;
    13. FPhoneNumber: string;
    14. FMobileNumber: string;
    15. FAddress: string;
    16. public
    17. property Id: Integer read FId write FId;
    18. property FirstName: string read FFirstName write FFirstName;
    19. property LastName: string read FLastName write FLastName;
    20. property PhoneNumber: string read FPhoneNumber write FPhoneNumber;
    21. property MobileNumber: string read FMobileNumber write FMobileNumber;
    22. property Address: string read FAddress write FAddress;
    23. end;



    1. [3]تعریف اینترفیس IDBConnection

    و
    1. [4]تعیین the SQL dialect


    برای تسهیل در روند دسترسی به اینترفیس IDBConnection، در یونیت DataModule، تابعی تعریف می¬کنیم که خروجی آن IDBConnection باشد.(یونیت های Aurelius.Drivers.Interfaces و Aurelius.Drivers.FireDac و Aurelius.SQL.SQLite را به قسمت Uses اضافه می کنیم). حال هرگاه نیاز به IDBConnection داشتیم، این تابع را فراخوانی خواهیم نمود.


    1. unit DM;
    2.
    3. interface
    4.
    5. uses
    6. System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
    7. FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
    8. FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, Data.DB,
    9. FireDAC.Comp.Client,
    10. Aurelius.Drivers.Interfaces, Aurelius.Drivers.FireDAC, Aurelius.Sql.SQLite;
    11.
    12. type
    13. TDataModule1 = class(TDataModule)
    14. FDConnection1: TFDConnection;
    15. private
    16. { Private declarations }
    17. public
    18. { Public declarations }
    19. function GetConnection: IDBConnection;
    20. end;
    21.
    22. var
    23. DataModule1: TDataModule1;
    24.
    25. implementation
    26.
    27. {$R *.dfm}
    28.
    29. function TDataModule1.GetConnection: IDBConnection;
    30. begin
    31. Result := TFireDacConnectionAdapter.Create(FDConnection1, False);
    32. end;
    33.
    34. end.



    1. [5]آماده سازی اتصال به دیتابیس و ساخت آن


    قبل از اینکه اقدام به ساخت جداول توسط Aurelius نمائیم، لازم است ابتدا فایل فیزیکی دیتابیس ساخته و سپس کدهای اتصال FDConnection را بنویسیم. همچنین درایور مورد نیاز دیتابیس نیز باید در دسترس فایل اجرایی باشد. لذا فایل فیزیکی دیتابیس و درایور مربوطه را در پوشه ای بنام Data در مجاورت فایل اجرایی قرار می دهیم.
    نکته : برای ساخت فایل فیزیکی دیتابیس، از هر ابزاری که این توانایی را داشته باشد می توان استفاده نمود و محدودیت در آن نیست(حتی میتوان فایلی را که پیش از این برای برنامه های دیگر ساخته شده را کپی نمود). برای نمونه نرم افزار SQLite Expert بسیار کاربر پسند می باشد.

    نکته : آدرس دانلود درایور های SQLite : https://sqlite.org/
    نکته : آدرس دانلود SQLite Expert : http://soft98.ir/software/programmin...te-Expert.html


    همانطور که در تصویر بالا مشخص است، در نرم افزار SQLite Expert صرفا فایل دیتا بیس را می سازیم و ساخت جداول و سایر موارد بر عهده Aurelius خواهد بود.

    در رویداد Create دیتاماژول نیز کدهای مربوط به تنظیمات اتصال به دیتابیس را به صورت زیر می نویسیم :


    1. procedure TDataModule1.DataModuleCreate(Sender: TObject);
    2. begin
    3. with FDConnection1 do
    4. begin
    5. Close;
    6. Params.Clear;
    7. Params.Add('DriverID=SQLite');
    8. Params.Add('Database=' + ExtractFilePath(ParamStr(0)) + 'Data\PhoneBookDB.db')
    9. end;
    10. end;



    حالا می توانیم دستورات مربوط به ساخت جداول را بنویسیم. عملیات ساخت جداول، از بین بردن جداول و نیز اعتبارسنجی صحت شمای دیتابیس(Schema Validation) با استفاده از شیء DatabaseManager انجام می شود. جهت ساخت این شیء میبایست یک IDBconnection به تابع Create آن پاس داده شود. برای این منظور از تابع ای که در مراحل قبل تهیه شد(GetConnection) استفاده خواهیم نمود.

    یک MainMenu بر روی فرم اصلی برنامه قرار داده و منوی "تنظیمات" و سپس زیرمنوی "ساخت دیتایس" را به آن اضافه می کنیم(همانند تصویر زیر) :


    بر روی منوی "ساخت دیتابیس" دوبار کلیک نموده و کدهای زیر را می نویسیم( اضافه نمودن یونیت Aurelius.Engine.DatabaseManager به قسمت Uses فراموش نشود) :


    1. procedure TForm_Main.MnuItm_N2Click(Sender: TObject);
    2. var
    3. DBManager: TDatabaseManager;
    4. begin
    5. try
    6. DBManager := TDatabaseManager.Create(DataModule1.GetConnection) ;
    7. DBManager.DestroyDatabase;
    8. DBManager.BuildDatabase;
    9. finally
    10. FreeAndNil(DBManager);
    11. end;
    12. end;



    در دستورات بالا، ابتدا جداولی که پیش از این ساخته شده توسط دستور DestroyDatabase تخریب شده و سپس جداول جدید با توجه به کلاسی هایی که به عنوان Entity معرفی شده اند با استفاده از دستور BuildDatabase ساخته می شود(در برنامه های رسمی، این دستورات باید با توجه و احتیات کامل فراخوانی گردد).


    اگر برنامه را اجرا کرده و بر روی دکمه کلیک نمائید، دیتابیس ساخته خواهد شد. برنامه را ببندید و نتیجه را در SQLite Express مشاهده نمائید.
    نتیجه مایوس کننده خواهد بود! هیچ جدولی ساخته نشده است!
    این بخاطر آن است که Aurelius تا زمانیکه از موجودیت ها درون کدهای برنامه استفاده ای نشود، هیچ چیز را بعنوان موجودیت نمی شناسد، لذا شیء DatabaseManager نیز موجودیتی را تبدیل به جدول نخواه نمود. برای این منظور از تابع RegisterEntity در قسمت initialization یونیت Entities استفاده مینمائیم. این تابع به Aurelius میفهماند که این کلاس در برنامه استفاده شده است.



    1. unit Entities;
    2.
    3. interface
    4.
    5. uses
    6. Aurelius.Mapping.Attributes;
    7.
    8. type
    9.
    10. [Entity]
    11. [Automapping]
    12. TContact = class
    13. private
    14. FId: Integer;
    15. FFirstName: string;
    16. FLastName: string;
    17. FPhoneNumber: string;
    18. FMobileNumber: string;
    19. FAddress: string;
    20. public
    21. property Id: Integer read FId write FId;
    22. property FirstName: string read FFirstName write FFirstName;
    23. property LastName: string read FLastName write FLastName;
    24. property PhoneNumber: string read FPhoneNumber write FPhoneNumber;
    25. property MobileNumber: string read FMobileNumber write FMobileNumber;
    26. property Address: string read FAddress write FAddress;
    27. end;
    28.
    29. implementation
    30.
    31. initialization
    32.
    33. RegisterEntity(TContact);
    34.
    35. end.


    مجددا برنامه را اجرا نموده و بعد از فشردن دکمه و بستن برنامه، نتیجه را در SQLite Express مشاهده می نمائیم:


    همانطور که در تصویر بالا قابل مشاهده است، جدولی با نام Contact و فیلدهای مربوطه(بر اساس نام پروپرتی ها) ساخته شده است.

    1. [6]نمونه سازی از کلاس و ذخیره اطلاعات در دیتابیس


    علاوه بر شیء DatabaseManager، شیء مهم دیگری نیز وجود دارد که عملیات ذخیره و بازیابی اطلاعات را بر عهده دارد. این شیء ObjectManager بوده که همانند DatabaseManager جهت انجام عملیات نیاز است در زمان ساخت، مقدار IDBConnection به آن پاس داده شود.
    یک فرم جدید ساخته و با نام Editors.ContactForm ذخیره می نمائیم.(این نام فایل بوده و نام فرم را ContactForm تعیین میکنیم). برای هر یک از پروپرتی های کلاس Contact یک Label و یک Edit بر روی فرم قرار می دهیم:


    اگر دقت کنیم، عملیات ایجاد یک مخاطب جدید همانند ویرایش آن بوده، با این تفاوت که در زمان ذخیره مخاطب جدید، مقدار فیلد Id خالی بوده و توسط Aurelius مشخص و مقداردهی می گردد اما در زمان ویرایش مقدار Id مشخص بوده و Aurelius بر اساس همین مقدار عملیات بروزرسانی را انجام می دهد.
    برای اینکه از کدنویسی تکراری جلوگیری کنیم، از فرم بالا علاوه بر ایجاد مخاطب جدید، جهت ویرایش مخاطب نیز استفاده خواهیم نمود. لذا لازم است که از چند ویژگی خوب زبان شیرین دلفی استفاده کنیم.
    در بخش Public فرم TcontactForm یک Class function بنام EditContact نوشته که وظیفه ایجاد یک نمونه از فرم TcontactForm و نمایش آن بشکل Modal را بر عهده خواهد داشت. همچنین یک Property بنام Contact نیز تعریف میکنیم که وظیفه نگهداری مقدار اطلاعات مخاطب جدید و یا مخاطب ویرایشی را بر عهده خواهد داشت(فراموش نشود که فرم ContactForm از حالت ساخت خودکار(AutoCreate) خارج شود):


    1. type
    2. TContactForm = class(TForm)
    3. btn_Save: TBitBtn;
    4. grp_1: TGroupBox;
    5. lbl_1: TLabel;
    6. lbl_11: TLabel;
    7. lbl_12: TLabel;
    8. lbl_13: TLabel;
    9. lbl_14: TLabel;
    10. edt_FirstName: TEdit;
    11. edt_LastName: TEdit;
    12. edt_PhoneNumber: TEdit;
    13. edt_MobileNumber: TEdit;
    14. edt_Address: TEdit;
    15. btn_Cancel: TBitBtn;
    16. procedure btn_SaveClick(Sender: TObject);
    17. procedure btn_CancelClick(Sender: TObject);
    18. private
    19. FContact: TContact;
    20. procedure SetContact(const Value: TContact);
    21. { Private declarations }
    22. public
    23. { Public declarations }
    24. property Contact: TContact read FContact write SetContact;
    25. class function EditContact(Contact: TContact): Boolean;
    26. end;



    1. class function TContactForm.EditContact(Contact: TContact): Boolean;
    2. var
    3. AForm: TContactForm;
    4. begin
    5. try
    6. AForm := TContactForm.Create(nil);
    7. AForm.Contact := Contact;
    8. Result := (AForm.ShowModal = mrOk);
    9. finally
    10. FreeAndNil(AForm);
    11. end;
    12. end;



    1. procedure TContactForm.SetContact(const Value: TContact);
    2. begin
    3. FContact := Value;
    4.
    5. edt_FirstName.Text := FContact.FirstName;
    6. edt_LastName.Text := FContact.LastName;
    7. edt_PhoneNumber.Text := FContact.PhoneNumber;
    8. edt_MobileNumber.Text := FContact.MobileNumber;
    9. edt_Address.Text := FContact.Address;
    10. end;


    مقادیر کلاس Contact که به فرم پاس داده میشود(خواه جهت ویرایش و خواه جهت ایجاد) در متد SetContact، به Edit های متناظر بر روی فرم تخصیص داده می شود. واضح است که اگر مخاطب جدید باشد، فیلد های مربوطه خالی بوده و لذا مقدار خالی به Edit ها اختصاص می یابد و اگر مخاطب بمنظور ویرایش باشد، Edit ها خالی نبوده و مقادیر را نمایش خواهند داد.

    در MainMenu مربوط به فرم اصلی، منوی "مخاطبین" و ذیل آن زیرمنوی "ایجاد مخاطب جدید" را ایجاد نموده و در رویداد Click آن کد نمایش فرم ContactForm را می نویسیم:


    1. procedure TForm_Main.N3Click(Sender: TObject);
    2. var
    3. AContact: TContact;
    4. ObjManager: TObjectManager;
    5. begin
    6. try
    7. AContact := TContact.Create;
    8. if TContactForm.EditContact(AContact) then
    9. begin
    10. try
    11. ObjManager := TObjectManager.Create(DataModule1.GetConnection);
    12. ObjManager.Save(AContact);
    13. finally
    14. FreeAndNil(ObjManager);
    15. end;
    16. end
    17. else
    18. begin
    19. FreeAndNil(AContact);
    20. end;
    21. except
    22. on E: Exception do
    23. begin
    24. FreeAndNil(AContact);
    25. raise;
    26. end;
    27. end;
    28. end;



    در کد بالا، ابتدا یک نمونه از کلاس Tcontact ساخته و آنرا به تابع EditContact که بصورت Class function است پاس داده می شود. در ادامه فرم مذکور بصورت مودال نمایش داده شده و کاربر میتواند مقادیر را وارد نماید. در صورتیکه کاربر بر روی دکمه ذخیره کلیک نماید، مقادیر Edit ها به فیلدهای Contact تخصیص داده می شود و ModalResult نیز mrOk میشود، در نتیجه فرم بسته شده و ادامه کدهای منوی کلیک شده اجرا میشود.

    یک نمونه از شیء ObjectManager ساخته شده و نمونه Acontact ذخیره می گردد.


    مجددا برنامه را اجرا کرده و از منوی "مخاطبین"، بر روی زیرمنوی "مخاطب جدید" کلیک کرده و پس از ورود مقادیر بر روی دکمه "ذخیره" کلیک می نمائیم.


    حال برنامه را بسته و نتیجه را در SQLite Express مشاهده می نمائیم!


    اگر مقادیر رشته های ذخیره شده همانند تصویر بالا بصورت ؟؟؟؟ است جای هیچ نگران ای نیست. تنها کافیست دستور زیر به بخش initialization یونیت Entities اضافه گردد(یونیت Aurelius.Global.Config نیز باید Use گردد) :


    1. TGlobalConfigs.GetInstance.MapStringToNationalChar := True;




    موفق باشیم
    آخرین ویرایش به وسیله hp1361 : شنبه 21 اسفند 1395 در 12:24 عصر

  3. #3
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: آموزش استفاده از TMS Aurelius ORM در دلفی

    سلام مجدد

    ادامه آموزش :


    1. [7]دریافت و یا بروزرسانی رکوردها


    در مرحله قبل، یک نمونه از کلاس Tcontact ساختیم و آنرا به تابع EditContact پاس دادیم تا کاربر اطلاعات مربوطه را وارد نموده، بعد از تایید آن، اطلاعات دریافتی را با استفاده از شیء ObjectManager در دیتابیس ذخیره نمودیم.
    حال می خواهیم لیست تمام مخاطبین را نمایش بدهیم. ابتدا با استفاده از شیء ObjectManager لیست تمام مخاطبین ذخیره شده در دیتابیس را دریافت کرده و سپس عملیات ویرایش را برای هر یک از مخاطبینی که کاربر انتخاب کرده اجرا می نمائیم.

    نکته : هرگاه یک نمونه از شیء مخاطب(TContact) توسط Aurelius در دیتابیس ذخیره شود و یا از دیتابیس خوانده شود، فرآیند آزادسازی حافظه مربوطه (تخصیص داده شده به این اشیاء) توسط Aurelius انجام خواهد شد. به همین خاطر در مرحله قبل بعد از ذخیره مخاطب(Acontact)، اقدام به آزادسازی آن ننمودیم(Acontact.Free).(مگر اینکه کاربر از ایجاد و ذخیره مخاطب جدید انصراف دهد که در آن صورت شیء ساخته شده را آزاد می نمائیم).

    سوال :اگر Aurelius لیستی(List<T>) از مخاطبین را برای ما از دیتا بیس واکشی نماید نحوه آزادسازی چگونه خواهد بود؟
    جواب : تنها کافیست که لیست(یا همان نگهدارنده آیتم ها) آزاد شود. آیتم های داخل لیست بصورت خوکار آزاد خواهند شد.

    برای نمایش لیست مخاطبین یک فرم جدید ساخته و با نام List.ContactsForm ذخیره می¬نمائیم. بر روی فرم یک DBGrid و سه دکمه با Caption های "ذخیره"، "ویرایش" و "حذف" قرار می¬دهیم. همانطور که میدانیم، DBGrid اطلاعات یک Dataset را نمایش میدهد. Aurelius یک Dataset مختص به خود دارد که از همان TDataset دلفی مشتق شده، اما با ویژگی های جدیدی، که در فرایند کار تسهیل ایجاد می کند و در ادامه با آن آشنا خواهیم شد. پس یک نمونه از کامپوننت TaureliusDataset و یک DataSource بر روی فرم قرار داده و DBGrid را از طریق Datasource به آن متصل می کنیم.



    بر روی AureliusDataset دوبار کلیک کرده و در پنجره بازشده راست کلیک نموده و گزینه NewField را انتخاب میکنیم. در پنجره باز شده نام فیلدها، نوع فیلد و اندازه آن(در صورت String بودن فیلد) همانند پراپرتی های کلاس TContact) تعریف می¬کنیم. FieldType را نیز Data انتخاب می کنیم.


    نکته : جهت نمایش صحیح فیلد های از نوع string، در این قسمت نوع فیلدها را WideString انتخاب میکنیم(صرفا برای بانک SQLite. برای باقی بانک ها نوع string بدرستی اطلاعات را نمایش میدهد)


    بعد از تعریف شدن تمام فیلد ها، با راست کلیک کردن بر روی DBGrid و انتخاب گزینه ColumnEditor، در پنجره باز شده بر روی دکمه Add All Field کلیک میکنیم تا فیلد های تعریف شده به DBGrid نیز اضافه شود.


    برای واکشی اطلاعات از دیتابیس و نمایش آن در DBGrid، احتیاج به شیء ObjectManager داریم، به همین منظور یک متغیر با نام FManager از نوع TObjectManager بصورت Privite تعریف میکنیم. همچنین نمونه سازی از کلاس TObjectManager و تخصیص آن به متغیر FManager را در رویداد OnCreate فرم انجام می دهیم. آزادسازی FManager را نیز در OnDestroy انجام می¬دهیم. ضمناً یک متغیر نیز برای لیست مخاطبین با نام Fcontacts تعریف می¬کنیم که در انتها باید آزاد شود.


    1. type
    2. TContactsForm = class(TForm)
    3. dbgrdh_Contacts: TDBGridEh;
    4. sbitbtn_NewContact: TsBitBtn;
    5. sbitbtn_EditContact: TsBitBtn;
    6. sbitbtn_DeleteContact: TsBitBtn;
    7. AureliusDataset1: TAureliusDataset;
    8. DataSource1: TDataSource;
    9. procedure FormCreate(Sender: TObject);
    10. procedure FormDestroy(Sender: TObject);
    11. private
    12. FManager: TObjectManager;
    13. FContacts: TList<TContact>;
    14. Procedure LoadContacts;
    15. public
    16. end;
    17.
    18. var
    19. ContactsForm: TContactsForm;
    20.
    21. implementation
    22.
    23. uses
    24. DM;
    25. {$R *.dfm}
    26.
    27. procedure TContactsForm.FormCreate(Sender: TObject);
    28. begin
    29. FManager := TObjectManager.Create(DataModule1.GetConnection);
    30. end;
    31.
    32. procedure TContactsForm.FormDestroy(Sender: TObject);
    33. begin
    34. FreeAndNil(FManager);
    35. FreeAndNil(FContacts);
    36. end;



    خوب. حالا می خواهیم لیست مخاطبین را از پایگاه داده واکشی کرده و در DBGrid نمایش دهیم. یک پروسجر بنام LoadContacts بصورت زیر تعریف می¬کنیم:


    1. procedure TContactsForm.LoadContacts;
    2. begin
    3. FContacts.Free;
    4. FContacts := FManager.Find<TContact>().List;
    5.
    6. AureliusDataset1.Close;
    7. AureliusDataset1.SetSourceList(FContacts);
    8. AureliusDataset1.Open;
    9. end;


    در کد بالا، ابتدا با استفاده از متد Find<T> به اورلیوس میگوییم که دنبال چه میگردیم. با دستور List به اورلیوس میگوییم که هر آنچه از نوع T در دیتابیس وجود دارد واکشی کن. لذا لیستی از مخاطبین واکشی می شود.
    با استفاده از دستور AureliusDataset1.SetSourceList(FContacts); لیست مخاطبین را به AureliusDataset پاس می دهیم تا نتیجه در DBGrid نمایش داده شود.
    چون میخواهیم در زمان نمایش فرم ContactsForm اطلاعات مخاطبین نمایش داده شود، پس پروسیجر LoadContacts را در OnCreate فرم فراخوانی میکنیم(با توجه به منطق برنامه امکان فراخوانی در قسمت های دیگر همچون OnShow نیز قابل انجام است).


    1. procedure TContactsForm.FormCreate(Sender: TObject);
    2. begin
    3. FManager := TObjectManager.Create(DataModule1.GetConnection);
    4.
    5. LoadContacts;
    6. end;


    در فرم اصلی، به MainMenu یک زیرمنوی جدید در بخش مخاطبین اضافه کرده و Caption آنرا "لیست مخاطبین" قرار می دهیم.


    بر روی منوی "لیست مخاطبین" دوبار کلیک کرده و کد زیر را برای نمایش فرم ContactsForm می نویسیم: (فراموش نشود فرم ContactsForm نیز از حالت AutoCreate خارج شود)


    1. procedure TForm_Main.g1Click(Sender: TObject);
    2. var
    3. AForm: TContactsForm;
    4. begin
    5. AForm := TContactsForm.Create(nil);
    6. try
    7. AForm.ShowModal;
    8. finally
    9. FreeAndNil(AForm);
    10. end;
    11. end;


    برنامه را اجرا نموده و از منوی مخاطبین زیر منوی لیست مخاطبین را کلیک میکنیم:


    ادامه دارد...
    آخرین ویرایش به وسیله hp1361 : شنبه 21 اسفند 1395 در 12:26 عصر دلیل: --

  4. #4
    کاربر دائمی آواتار SayeyeZohor
    تاریخ عضویت
    اسفند 1387
    محل زندگی
    ا-ص-ف-ه-ا-ن
    پست
    631

    نقل قول: آموزش استفاده از TMS Aurelius ORM در دلفی

    خیلی کار ارزنده و عالی ای انجام دادی. کمتر کسی پیدا میشه دیگه تجربیاتش رو به این شکل کامل و خلاصه به اشتراک بذاره.
    نتونستم تشکر نکنم و به یک لایک بسنده کنم. درسته که تاپیک مال دو سال پیش اه اما واقعا در خور تقدیر بود.

    ضمنا به نظر میاد اگه این توضیحات و مثال به صورت یک فیلم در اورده بشه خیلی عالی میشه. بازم تشکر

  5. #5
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750

    نقل قول: آموزش استفاده از TMS Aurelius ORM در دلفی

    سلام مجدد

    ادامه آموزش :


    1.[8] جستجو

    پیاده سازی جستجو همانند بخش قبل(دریافت رکوردها) بوده، با این تفاوت که واکشی رکوردها بر اساس پارامتر مشخص شده ای صورت می پذیرد.
    با این اوصاف باید ابتدا مقدار پارامتر مشخص شود و سپس نحوه واکشی و نمایش اطلاعات دریافتی پیاده سازی شود.
    فرض میکنیم که در فرم TContactsForm یک Edit جهت دریافت پارامتر مورد نظر کاربر بر روی فرم قرار گرفته و دکمه ای نیز جهت اجرای جستجو در مجاورت این Edit قرار دارد. با فشرده شدن دکمه جستجو، پروسیجر جستجو اجرا شده و نتیجه جستجو در گرید نمایش داده خواهد شد.


    procedure TContactsForm.FindContacts(Param:string);
    begin
    FContacts.Free;
    FContacts := FManager.Find<TContact>().Where(TLinq['FirstName'].Contains(Param)).List;

    AureliusDataset1.Close;
    AureliusDataset1.SetSourceList(FContacts);
    AureliusDataset1.Open;
    end;

تاپیک های مشابه

  1. استفاده از بانک اطلاعات وب در دلفی
    نوشته شده توسط ghasemjen در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 27
    آخرین پست: پنج شنبه 15 اسفند 1387, 00:13 صبح
  2. استفاده از آدرس بار IE در دلفی
    نوشته شده توسط vahid64 در بخش برنامه نویسی در Delphi
    پاسخ: 1
    آخرین پست: پنج شنبه 21 تیر 1386, 23:05 عصر
  3. چگونگی استفاده از یک فایل matlab در دلفی
    نوشته شده توسط jandaghian در بخش کامپوننت های سایر شرکت ها، و توسعه کامپوننت
    پاسخ: 5
    آخرین پست: دوشنبه 13 فروردین 1386, 19:17 عصر
  4. چند سوال درباره استفاده از بهترین بانک اطلاعاتی در دلفی
    نوشته شده توسط MOHSEN731 در بخش برنامه نویسی در Delphi
    پاسخ: 1
    آخرین پست: جمعه 26 فروردین 1384, 02:40 صبح
  5. استفاده از فایل های sql در دلفی
    نوشته شده توسط پریسا نامدار در بخش برنامه نویسی در Delphi
    پاسخ: 3
    آخرین پست: جمعه 05 فروردین 1384, 00:24 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •