PDA

View Full Version : سوال: ایجاد و ذخیره خصوصیات عنصر توسط کاربر



idehrayan
چهارشنبه 24 دی 1393, 08:02 صبح
با عرض سلام و وقت بخیر به اساتید محترم
من میخوام برنامم به کاربر امکان ایجاد عناصر رو بده.
چونکه نمی خوام اشتباهات گذشته رو تکرار کنم از اساتید میخوام راهنمایی کنند بهترین روش برای این کار چیه.
خصوصیات عنصر (رنگ - فونت - سایز - اندازه - مکان عنصر - قابلیت نمایش و... ) ساخته شده توسط کاربر ذخیره و عنصر هنگام باز شدن برنامه خودکار بازسازی بشه.
چیزی که تو ذهنم هستش اینه که کلیه خصوصیات رو توی دیتا بیس ذخیره کنم.
ممنون میشم اساتید راهنمایی کنند ایا روش بهتری هستش با نه؟

hadisalahi2
چهارشنبه 24 دی 1393, 09:44 صبح
روش منطقی همین ذخیره در بانک اطلاعاتی هستش
اما میتونی از فایلهای XML و INI هم استفاده کنی

یوسف زالی
چهارشنبه 24 دی 1393, 12:21 عصر
روش درستش Serialize کردن شی هست تا تبدیل بشه به متن و برعکس. شما نمی دونید اشیای جدید چه خصوصیاتی دارند.

idehrayan
چهارشنبه 24 دی 1393, 12:45 عصر
ضمن عرض سلام خدمت استاد گرامی You-See (http://barnamenevis.org/member.php?70247-You-See)

اگه امکان داره یکم توضیح بدین یا یک مثال بزارین ممنون میشم

یوسف زالی
چهارشنبه 24 دی 1393, 12:54 عصر
ابنجا رو ببینید:
http://barnamenevis.org/showthread.php?401663-Serialization-Object-%D8%AF%D8%B1-%D8%AF%D9%84%D9%81%DB%8C-%D8%9F&highlight=serialize

idehrayan
چهارشنبه 24 دی 1393, 21:27 عصر
سلام جناب you-see عزیز
ببخشید من هرکار کردم نتونستم از روشی که گفته بودین استفاده کنم
نمی دونم شاید باید از یونیت یا چیزی استفاده کنم ولی هرچی جستجو کردم به نتیجه ای نرسیدم.
اگه امکان داره یک مثال از نحوه ذخیره و بازیابی اطلاعات بزارین
قبلا از شما متشکرم

var
coTest: TStorage;
coStore: TStorageItem;
i: Integer;
begin
coTest := TStorage.Create(TStorageItem);
with TXMLSerializer.Create(self) do
begin
XMLSettings.WellFormated := true;
SpecialClasses := [scTCollection];
LoadFromFile('C:\test.xml');
LoadObject(coTest, 'Test');
end;
ListBox1.Clear;
for i := 0 to coTest.Count - 1 do
begin
ListBox1.AddItem(coTest.Items[i].Text, nil);
end;

idehrayan
یک شنبه 28 دی 1393, 16:23 عصر
خودم به یه جاهایی رسیدم اینجا میزارم شاید به درد کسی بخوره
این کد مشخصات یک لیبل رو درون یک ممو نمایش میده و دوباره از طریق همین مشخصات لیبل رو میسازه

unit Unit1;


interface


uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;


type
TForm1 = class(TForm)
lbl1: TLabel;
btn1: TBitBtn;
btn2: TBitBtn;
btn3: TBitBtn;
dlgFont1: TFontDialog;
mmo1: TMemo;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
lbl1 = class(Tlabel)
end;


var
Form1: TForm1;
implementation


{$R *.dfm}


function ComponentToStringProc(Component: TComponent): string;
var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;


function StringToComponentProc(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result:= BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;




procedure TForm1.btn1Click(Sender: TObject);
begin
Mmo1.Text:= ComponentToStringProc(lbl1);
end;


procedure TForm1.btn2Click(Sender: TObject);
var
lbl2:Tlabel;
begin
lbl1.Free;
lbl1:=(StringToComponentProc(Mmo1.Text) as TLabel);
lbl1.Parent:= Form1;
lbl1.Visible:= TRUE;


end;




procedure TForm1.btn3Click(Sender: TObject);
begin
if dlgFont1.Execute then lbl1.Font:=dlgFont1.Font;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
lbl1.Free;
end;
initialization


RegisterClass(Tlabel);

end.