عرض جدول التحميل عند بدء التطبيق
-
21-12-2019 - |
سؤال
أود أن يتذكر طلبي أي صف محدد في جدول قاعدة البيانات تم استخدامه (محدد) قبل إغلاق التطبيق ثم قم بتحميله (هل تم تحديده) في المرة التالية التي يبدأ فيها التطبيق. يحتوي الجدول على 4 سجلات فقط ويتم قراءة لذلك لا داعي للقلق إذا حاول شخص ما تغيير أي شيء.الآن أستخدم:
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
Clientdataset1.DisableControls;
try
cxGrid1DBTableView1.DataController.KeyFieldNames := 'ID';
cxGrid1DBTableView1.DataController.LocateByKey('4');
finally
Clientdataset1.EnableControls;
end;
end;
لكن هذا مشفر.أريدها مرنة.كيف يمكنني حفظ هذه الإعدادات في ملف INI الموجود في مجلد Application.exe وتحميلها عند بدء التطبيق؟لذلك ، على سبيل المثال ، إذا كان المفتاح "3" (عندما يكون التطبيق.خرجت) أقوم بتحميله في المرة القادمة.
المحلول
استخدم ال TDataSet.OnAfterOpen
و TDataSet.OnBeforeClose
أحداث لتحميل وحفظ القيم المطلوبة
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
var
LIni : TIniFile;
begin
DataSet.DisableControls;
try
LIni := TIniFile.Create( '<YourIniFileName.ini>' );
try
DataSet.Locate( 'ID', LIni.ReadString( 'MyDataSet', 'ID', '' ), [] );
finally
LIni.Free;
end;
finally
DataSet.EnableControls;
end;
end;
procedure TForm3.ClientDataSet1BeforeClose(DataSet: TDataSet);
var
LIni : TIniFile;
begin
LIni := TIniFile.Create( '<YourIniFileName.ini>' );
try
LIni.WriteString( 'MyDataSet', 'ID', DataSet.FieldByName( 'ID' ).AsString ) );
finally
LIni.Free;
end;
end;
هذا هو جدا بسيط و إلى الأمام بشكل مستقيم عينة ويجب عدم تنفيذ ذلك في التطبيقات الحقيقية.
في التطبيقات الحقيقية، سوف تقوم بتفويض هذا إلى شخص واحد يعتني بقراءة وكتابة قيم التطبيق هذه
// Very simple KeyValue-Store
IKeyValueStore = interface
function GetValue( const Key : string; const Default : string ) : string;
procedure SetValue( const Key : string; const Value : string );
end;
// Global Application Value Store as Singleton
function AppGlobalStore : IKeyValueStore;
ويعطيك حلا ذكيا جدا
procedure TForm3.ClientDataSet1AfterOpen(DataSet: TDataSet);
begin
DataSet.DisableControls;
try
DataSet.Locate( 'ID', AppGlobalStore.GetValue( 'MyDataSet\ID', '' ), [] );
finally
DataSet.EnableControls;
end;
end;
procedure TForm3.ClientDataSet1BeforeClose(DataSet: TDataSet);
begin
AppGlobalStore.SetValue( 'MyDataSet\ID', DataSet.FieldByName( 'ID' ).AsString ), [] );
end;