سلام مجدد
ادامه آموزش :
- [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;
برنامه را اجرا نموده و از منوی مخاطبین زیر منوی لیست مخاطبین را کلیک میکنیم:
ادامه دارد...