PDA

View Full Version : سوال: ذخيره كردن مشخصات كمپوننت ها



max2004
دوشنبه 11 شهریور 1387, 09:06 صبح
سلام
من ميخوام در زمان اجرا مشخصات كمپوننت هاي روي فرم رو در يك فايل ذخيره كنم تا بعدا دوباره بتونم به اون مشخصات دسترسي پيدا كنم (اونها رو لود كنم)
البته كمپوننت هايي براي اين كار وجود داره اما امكان استفاده از كمپوننت رو ندارم و بايد خودم اين كار رو انجام بدم
ممنون

Hsimple11
دوشنبه 11 شهریور 1387, 10:16 صبح
سوالتون رو مطرح نکردید. با چه بخشی مشکل دارید؟ گرفتن مشخصات؟ ذخیره کردن در فایل؟ لود دوباره؟

Mahmood_M
دوشنبه 11 شهریور 1387, 13:57 عصر
سلام
من ميخوام در زمان اجرا مشخصات كمپوننت هاي روي فرم رو در يك فايل ذخيره كنم تا بعدا دوباره بتونم به اون مشخصات دسترسي پيدا كنم (اونها رو لود كنم)
البته كمپوننت هايي براي اين كار وجود داره اما امكان استفاده از كمپوننت رو ندارم و بايد خودم اين كار رو انجام بدم
ممنون
برای این کار استفاده از فایلهای INI گزینه خوبی میتونه باشه ...
به این لینک برید :
http://barnamenevis.org/forum/showthread.php?t=79040
موفق باشید ...

hadisalahi2
دوشنبه 11 شهریور 1387, 15:20 عصر
اگه میخوای اطلاعات و مقادیر رو ذخیره کنی ، بهترین راه استفاده از فایلهای باینریه. البته اگه میخوای کارت راحت تر باشه از یه جدول استفاده کن و فیلدهای اون رو نام مشخصات کامپوننت ها قرار بده.

merced
دوشنبه 11 شهریور 1387, 18:09 عصر
اينو قبلاً تو delphi3000 پيدا کردم



Table Structure
DROP TABLE IF EXISTS `consolidatetaxe`.`storereports`;
CREATE TABLE storereports` (
`id_report` int(11) NOT NULL auto_increment,
`id_user` varchar(255) character set latin1 NOT NULL default '',
`id_object` int(11) NOT NULL default '0',
`obj_name` varchar(20) character set latin1 NOT NULL default '',
`obj_propertie` varchar(50) character set latin1 NOT NULL default '',
`obj_propertie_value` varchar(255) NOT NULL,
`id_type` int(10) unsigned NOT NULL default '0',
`rpt_name` varchar(255) character set latin1 NOT NULL default '',
`rpt_create_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id_report`),
KEY `Index` (`id_report`,`id_user`,`id_object`,`obj_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

{*------------------------------------------------------------------------------
Store the report config into database
@Param Sender is the TObject class
-------------------------------------------------------------------------------}
procedure TfrmReportGenerator.Store(aFilename: string);
var
I,iIndex,iCheck,iTotal,iType: Integer;
Temp: TComponent;
obj_name,
obj_propertie,
obj_propertie_value:string;
id_object:string;
sql:string;
doSql:Boolean;
begin
zqyStoreReport.Close;
zqyStoreReport.SQL.Clear;
doSQL:=False;

For i:=0 to High(CompCbss) do
begin
obj_name := EmptyStr;
obj_propertie := EmptyStr;
obj_propertie_value := EmptyStr;
id_object := EmptyStr;
iType := pcPanel.ActivePageIndex;
Case pcPanel.ActivePageIndex of
0:Temp := FindComponent(CompCbss[i]);
1:Temp := FindComponent(CompConso[i]);
2:Temp := FindComponent(CompNIBS[i]);
3:begin
Temp := FindComponent(CompNM1[i]);
iType := StrToInt(IntToStr(pcPanel.ActivePageIndex) + IntToStr(bxppSubPanel.ActivePageIndex));
end;
4:Temp := FindComponent(CompSAP[i]);
end;

if(Temp is TRadioGroup) then
begin
id_object := IntToStr(Temp.ComponentIndex);
obj_name := Temp.Name;
obj_propertie := 'ItemIndex';
obj_propertie_value := IntToStr((Temp as TRadioGroup).ItemIndex);
doSQL:=True;
end;

if(Temp is TCheckBox) then
begin
id_object := IntToStr(Temp.ComponentIndex);
obj_name := Temp.Name;
obj_propertie := 'Checked';
obj_propertie_value := BoolToStr((Temp as TCheckBox).Checked);
doSQL:=True;
end;

if(Temp is TCheckListBox) then
begin
id_object := IntToStr(Temp.ComponentIndex);
obj_name := Temp.Name;
obj_propertie := 'Checked';
iTotal := 0;
iCheck := 0;
for iIndex:=0 to (Temp as TCheckListBox).Count -1 do
begin
if (Temp as TCheckListBox).Checked[iIndex] then
begin
obj_propertie_value := obj_propertie_value + IntToStr(iIndex)+'|';
Inc(iCheck);
end;
Inc(iTotal);
end;
if ((iCheck) = iTotal) then obj_propertie_value := 'ALL';
doSQL:=True;
end;


if(Temp is TDateTimePicker) then
begin
id_object := IntToStr(Temp.ComponentIndex);
obj_name := Temp.Name;
obj_propertie := 'Date';
obj_propertie_value := DateTimeToStr((Temp as TDateTimePicker).Date);
doSQL:=True;
end;

if(Temp is TComboBox) then
begin
id_object := IntToStr(Temp.ComponentIndex);
obj_name := Temp.Name;
obj_propertie := 'Text';
obj_propertie_value := (Temp as TComboBox).Text;
doSQL:=True;
end;

if doSql then
begin
sql:='Insert Into storereports(id_user,id_object,obj_name,obj_proper tie,obj_propertie_value,id_type, rpt_name, rpt_create_date) '+
'values("'+zcBell.User+'",'+id_object+',"'+obj_name+'","'+obj_propertie+'","'+obj_propertie_value+'",'+IntToStr(iType)+',"'+aFilename+'",current_timestamp());';
zqyStoreReport.Close;
zqyStoreReport.SQL.Text := sql;
zqyStoreReport.ExecSQL;
end;
doSQL:=False;
end;

frmStoredReport := TfrmStoredReport.Create(Self);
frmStoredReport.zqySelectStoredReport.ParamByName( 'vUser').AsString := zcBell.User;
frmStoredReport.ShowModal;
if frmStoredReport.bLoad then
Restore(frmStoredReport.LoadName);
frmStoredReport.Free;
end;

use:

Store('StoreAsName');


--------------------------------------------------------------

Table Structure

CREATE TABLE storereports` (
`id_report` int(11) NOT NULL auto_increment,
`id_user` varchar(255) character set latin1 NOT NULL default '',
`id_object` int(11) NOT NULL default '0',
`obj_name` varchar(20) character set latin1 NOT NULL default '',
`obj_propertie` varchar(50) character set latin1 NOT NULL default '',
`obj_propertie_value` varchar(255) NOT NULL,
`id_type` int(10) unsigned NOT NULL default '0',
`rpt_name` varchar(255) character set latin1 NOT NULL default '',
`rpt_create_date` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id_report`),
KEY `Index` (`id_report`,`id_user`,`id_object`,`obj_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

{*------------------------------------------------------------------------------
Restore the report config from database
@Param Sender is the TObject class
-------------------------------------------------------------------------------}
procedure TfrmReportGenerator.Restore(aFilename: string);
var
I,iIndex: Integer;
Temp: TComponent;
obj_name,
obj_propertie,
obj_propertie_value:string;
id_object:string;
sql:string;
doSql:Boolean;
begin
bFocused := False;
bLoadReport := True;

rgConsoROutputFormat.ItemIndex := -1;
for iIndex:=0 to rgConsoReport.Count -1 do
rgConsoReport.Checked[iIndex]:=False;

iIndex:=0;

clearListbox([clbSubMarket, clbLOB, clbCurrency, clbProvince, clbCharger, clbTaxType, clbDebitCredit, clbLegacy, clbTaxCategory, clbWriteOffRecovery, clbBan, clbConsoFields, clbConsoGroup, clbConsoOrder]);


zqyStoreReport.Close;
sql:='SELECT id_report, id_user, id_object, obj_name, obj_propertie, obj_propertie_value, id_type, rpt_name, rpt_create_date '+
'FROM storereports WHERE rpt_name = "'+aFilename+'" and id_user = "'+zcBell.User+'";';
zqyStoreReport.SQL.Text := sql;
zqyStoreReport.Open;

zqyStoreReport.First;
While Not zqyStoreReport.Eof do
begin
obj_name := EmptyStr;
obj_propertie := EmptyStr;
obj_propertie_value := EmptyStr;
id_object := EmptyStr;

if not (zqyStoreReport.FieldByName('id_type').AsInteger in[30,31]) then
begin
pcPanel.ActivePageIndex := zqyStoreReport.FieldByName('id_type').AsInteger;
pcPanelChange(nil);
end
else
begin
pcPanel.ActivePageIndex := StrToInt(zqyStoreReport.FieldByName('id_type').AsS tring[1]);
pcPanelChange(nil);
bxppSubPanel.ActivePageIndex := StrToInt(zqyStoreReport.FieldByName('id_type').AsS tring[2]);
end;

Temp := FindComponent(zqyStoreReport.FieldByName('obj_name ').AsString);


if(Temp is TRadioGroup) then
begin
if (Temp.ComponentIndex = zqyStoreReport.FieldByName('id_object').AsInteger) and
(Temp.Name = zqyStoreReport.FieldByName('obj_name').AsString) then
(Temp as TRadioGroup).ItemIndex := zqyStoreReport.FieldByName('obj_propertie_value'). AsInteger;

// if Temp.Name = 'rgConsoROutputFormat' then iConsoROutputFormat := (Temp as TRadioGroup).ItemIndex;
end;

if(Temp is TCheckListBox) then
begin
if (Temp.ComponentIndex = zqyStoreReport.FieldByName('id_object').AsInteger) and
(Temp.Name = zqyStoreReport.FieldByName('obj_name').AsString) then
begin
obj_propertie_value := zqyStoreReport.FieldByName('obj_propertie_value'). AsString;
for iIndex:=0 to (Temp as TCheckListBox).Count -1 do
if obj_propertie_value <> 'ALL' then
begin
if Pos(IntToStr(iIndex),obj_propertie_value)<>0 then
(Temp as TCheckListBox).Checked[iIndex]:=True;
end
else
(Temp as TCheckListBox).Checked[iIndex]:=True;

end;

if ((pcPanel.ActivePageIndex = 1) and (Temp.Name = 'rgConsoReport'))
then rgConsoReportClickCheck(nil);

if ((pcPanel.ActivePageIndex = 3) and (Temp.Name = 'rgNM1Report'))
then rgNM1ReportClickCheck(nil);

if ((pcPanel.ActivePageIndex = 4) and (Temp.Name = 'clbSAPCompany'))
then clbSAPCompanyClickCheck(nil);
end;



if(Temp is TCheckBox) then
begin
if (Temp.ComponentIndex = zqyStoreReport.FieldByName('id_object').AsInteger) and
(Temp.Name = zqyStoreReport.FieldByName('obj_name').AsString) then
(Temp as TCheckBox).Checked := StrToBool(zqyStoreReport.FieldByName('obj_properti e_value').AsString);
end;


if(Temp is TDateTimePicker) then
begin
if (Temp.ComponentIndex = zqyStoreReport.FieldByName('id_object').AsInteger) and
(Temp.Name = zqyStoreReport.FieldByName('obj_name').AsString) then
(Temp as TDateTimePicker).Date := zqyStoreReport.FieldByName('obj_propertie_value'). AsDateTime;
end;

if(Temp is TComboBox) then
begin
if (Temp.ComponentIndex = zqyStoreReport.FieldByName('id_object').AsInteger) and
(Temp.Name = zqyStoreReport.FieldByName('obj_name').AsString) then
(Temp as TComboBox).Text := zqyStoreReport.FieldByName('obj_propertie_value'). AsString;
end;

zqyStoreReport.Next;
end;
end;


use:

Restore('StoreAsName')

vcldeveloper
دوشنبه 11 شهریور 1387, 19:32 عصر
از یک TFileStream و متدهای WriteComponent و ReadComponent آن استفاده کنید. این همون کاری هست که دلفی برای ذخیره فرم ها و کنترلهاشون در فایل DFM انجام میده.

gbg
سه شنبه 12 شهریور 1387, 01:56 صبح
سلام از متدهای WriteComponent و ReadComponent مي تونی استفاده کنی
ولی موقع لود کردن کمی اذیتت می کنه احتمالا چون من خودم یه کامپوننت برای همین کار 2 سال پیش نوشتم فقط یادم مونده که تو لود کردن خیلی اذیتم می کرد مخصوصا وقتی فرم از قبل موجود باشه و بخوای اطلاعات جدید رو لود کنی

max2004
پنج شنبه 14 شهریور 1387, 10:50 صبح
ممنون از همه دوستان
در نهايت مجبور شدم از همون روش WriteComponent و ReadComponent استفاده كنم كه اقاي كشاورز اينجا توضيح دادن :
http://barnamenevis.org/forum/showthread.php?p=74346#post74346

اما يك مشكل وجود داره كه با يه مثال توضيح ميدم:
مثلا يك checkbox روي فرم بذاريد (تيك اون غير فعال باشه) و برنامه رو اجرا كرده و مشخصات اون رو ذخيره كنيد بعد تيك اون رو فعال كنيد و اين بار مشخصات رو بخونيد ميبينيد كه تيك هنوز فعال هست و به حالت اول برنگشه!

vcldeveloper
پنج شنبه 14 شهریور 1387, 12:31 عصر
مثلا يك checkbox روي فرم بذاريد (تيك اون غير فعال باشه) و برنامه رو اجرا كرده و مشخصات اون رو ذخيره كنيد بعد تيك اون رو فعال كنيد و اين بار مشخصات رو بخونيد ميبينيد كه تيك هنوز فعال هست و به حالت اول برنگشه!
خصوصیت Checked در TCheckBox بصورت default False تعریف شده، یعنی مقدار پیش فرضش False هست، و دلفی این مقدار را در DFM ذخیره نمیکنه. وقتی شما CheckBox را با خصوصیت Checked = False ذخیره می کنید، اگر به فایل ذخیره شده نگاه کنید، مقداری برای Checked ذخیره نشده. حالا وقتی شما یک CheckBox دارید که از قبل وجود داره، و میخواید آن را دوباره لود کنید، اگر خصوصیت CheckBox آن True باشه، چون مقداری برای این خصوصیت در فایل ذخیره نشده، مقدارش به همان شکل باقی میمانه.
برای رفع مشکل باید یکجوری CheckBox را قبل از لود کردن مشخصات از فایل Reset (حداقل خصوصیت هایی که default دارند) کنید، یا حذفش کنید و دوباره بسازیدش.

max2004
پنج شنبه 14 شهریور 1387, 12:46 عصر
خصوصیت Checked در TCheckBox بصورت default False تعریف شده، یعنی مقدار پیش فرضش False هست، و دلفی این مقدار را در DFM ذخیره نمیکنه. وقتی شما CheckBox را با خصوصیت Checked = False ذخیره می کنید، اگر به فایل ذخیره شده نگاه کنید، مقداری برای Checked ذخیره نشده. حالا وقتی شما یک CheckBox دارید که از قبل وجود داره، و میخواید آن را دوباره لود کنید، اگر خصوصیت CheckBox آن True باشه، چون مقداری برای این خصوصیت در فایل ذخیره نشده، مقدارش به همان شکل باقی میمانه.
برای رفع مشکل باید یکجوری CheckBox را قبل از لود کردن مشخصات از فایل Reset (حداقل خصوصیت هایی که default دارند) کنید، یا حذفش کنید و دوباره بسازیدش.
دقيقا همين طور هست
اما همون طور كه خودتون هم اشاره كرديد خود دلفي هم از همين روش براي ذخيره مشخصات كنترل ها در فايل dfm استفاده ميكنه
پس اونجا هم ميگه اگر مقدار خصوصيتي تعريف نشده بود از مقدار default استفاده كن درسته؟

vcldeveloper
پنج شنبه 14 شهریور 1387, 12:58 عصر
اما همون طور كه خودتون هم اشاره كرديد خود دلفي هم از همين روش براي ذخيره مشخصات كنترل ها در فايل dfm استفاده ميكنه
پس اونجا هم ميگه اگر مقدار خصوصيتي تعريف نشده بود از مقدار default استفاده كن درسته؟
بله، البته وقتی دلفی داره کامپوننت ها رو لود میکنه، کامپوننت مربوطه از قبل وجود نداره، تازه اون موقع ساخته شده و مقادیر خصوصیاتش بصورت پیش فرض هستند و هنوز تغییر نکردند، پس مثلا Checked = False هست، و طبیعی هست که نیازی به ثبتش در فایل نیست.