المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : التعامل مع ملفات ini بالدلفي : حفظ الإعدادات بالملفات Ini


nabilkeb
11-02-2009, 11:06 PM
السلام عليكم و رحمة الله و بركاته :
في الحقيقة أردت طرح إشكال حول الملفات Ini (بقسم الأسئلة) ، و أثناء الإعداد للسؤال أردت أن أفيد البعض من المبتدئين أمثالي ، بمعلومات أو ما أشبه حول ، حفظ إعدادات برنامج معين بملف ذو اللاحقة ini ، ثم يليها الإشكال_ إن شاء الله :

قبل ظهور نظام الرجيستري المرفق بالويندوز و هو المسؤول على حفظ إعدادات النظام و بياناته كانت الأنظمة القديمة تعتمد على هذا النوع من الملفات ، أما الأن فيقتصر إستعمالها على حفظ إعدادت البرامج التي لا تحتاج للرجيستري


التعامل مع ملفات ini بالدلفي :
أولا يجب التعريف بقسم use باضافة Uses ...., Inifiles ; وبما أن الملفات تحفظ بها اعدادات البرنامج ، فلابد من التخزين و القراءة ، و الصورتين أدناه تبينان ذلك :

http://www10.0zz0.com/2009/02/11/21/803563012.jpg
و هذا مثال تطبيقي للاستخدام يشمل العناصر: Edit+Memo+CheckBox+Image
نضع زر لحفظ الإعدادات و آخر لجلب الصورة ، و كذلك لدينا كود بالحدث OnCreate للفورم :


procedure TForm1.Button1Click(Sender: TObject);
begin
with tinifile.create('D:\star.ini')do begin
writebool('Checkbox','CheckboxValue',checkbox1.Che cked);
writestring('Edit','EditValue',edit1.Text);
writestring('Memo','MemoValue',memo1.Text);
writestring('img','imgValue',OpenPictureDialog1.Fi leName);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with tinifile.create('D:\star.ini')do begin
checkbox1.Checked:=readbool('Checkbox','CheckboxVa lue',false);
edit1.Text:=readstring('Edit','EditValue',edit1.Te xt);
Memo1.text:=readstring('Memo','MemoValue',memo1.Te xt);
img:=readstring('img','imgValue',img);
end;
image1.Picture.LoadFromFile(img);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.Fil eName);
end;
ملاحظة : إذا لم يتم تحديد مسار الملف Ini فإنه سوف ينشأ تلقائيا بمجلد Windows / في قطاع الذي نصب فيه النظام.
إذا أردنا وضعه مع مجلد البرنامج و لا نعلم أين سيتم وضع هذا المجلد عند المستخدم فإننا نصيف :
'\ini\star.ini..'

mohfa
12-02-2009, 10:14 AM
لماذا لاتحرر ال tinifile بعد إنشائه ؟؟

kachwahed
14-02-2009, 08:49 AM
السلام عليكم
بارك الله فيك أخي نبيل
لماذا لاتحرر ال tinifile بعد إنشائه ؟؟
أجل، يجب إضافة الإجراء Free في النهاية.

mohfa
14-02-2009, 06:02 PM
FreeAndNil( tinifile );

تفي بالغرض

kachwahed
18-02-2009, 01:19 PM
FreeAndNil( tinifile );


tinifile : انتبه أخي الدلفي لا يسمح لك بتسمة متغير باسم وحدة Unit أو كلمة محجوزة، سمه مثلا Myinifile أو inifile.
الإجراء Free وحده يكفي هنا.
الأوامر التي فيها إنشاء ثم تدمير مكون يستحسن وضعها في حلقات محمية أقصد: Try...Finally
هذا مثال يجمع كل ما قلناه (ضع في مشروع جديد ستة مكونات من النوع TButton ومكون TListBox ثم قم بتشغيل المشروع):
uses
IniFiles;

// Write values to a INI file

procedure TForm1.Button1Click(Sender: TObject);
var
ini: TIniFile;
begin
// Create INI Object and open or create file test.ini
ini := TIniFile.Create('c:\MyIni.ini');
try
// Write a string value to the INI file.
ini.WriteString('Section_Name', 'Key_Name', 'String Value');
// Write a integer value to the INI file.
ini.WriteInteger('Section_Name', 'Key_Name', 2002);
// Write a boolean value to the INI file.
ini.WriteBool('Section_Name', 'Key_Name', True);
finally
ini.Free;
end;
end;


// Read values from an INI file

procedure TForm1.Button2Click(Sender: TObject);
var
ini: TIniFile;
res: string;
begin
// Create INI Object and open or create file test.ini
ini := TIniFile.Create('c:\MyIni.ini');
try
res := ini.ReadString('Section_Name', 'Key_Name', 'default value');
MessageDlg('Value of Section: ' + res, mtInformation, [mbOK], 0);
finally
ini.Free;
end;
end;

// Read all sections

procedure TForm1.Button3Click(Sender: TObject);
var
ini: TIniFile;
begin
ListBox1.Clear;
ini := TIniFile.Create('MyIni.ini');
try
ini.ReadSections(listBox1.Items);
finally
ini.Free;
end;
end;

// Read a section

procedure TForm1.Button4Click(Sender: TObject);
var
ini: TIniFile;
begin
ini:= TIniFile.Create('WIN.INI');
try
ini.ReadSection('Desktop', ListBox1.Items);
finally
ini.Free;
end;
end;


// Read section values

procedure TForm1.Button5Click(Sender: TObject);
var
ini: TIniFile;
begin
ini := TIniFile.Create('WIN.INI');
try
ini.ReadSectionValues('Desktop', ListBox1.Items);
finally
ini.Free;
end;
end;

// Erase a section

procedure TForm1.Button6Click(Sender: TObject);
var
ini: TIniFile;
begin
ini := TIniFile.Create('MyIni.ini');
try
ini.EraseSection('My_Section');
finally
ini.Free;
end;
end;
(وفي النهاية لا تنسى حذف الملف MyIni.ini من جذر القرص C
وشكرا كثيرا.

ThePrince
19-02-2009, 10:33 AM
بارك اللة فيك أخي nabilkeb ويبارك لك في بنتك الغالية
الكود فية أخطاء بسيطة ولكن المهم هي فكرة الجميلة في الدرس

تحياتي لك

Dr.MOT
20-02-2009, 10:17 PM
السلام عليكم ,, بارك الله فيك درس ممتع وشيق وجميل جدا ,,

لكن أخي الكريم لدي بعض الإستفسارات لو سمحت لي ,,

في الكود الآخير في المشاركه رقم : 11

ini.WriteInteger('Section_Name', 'Key_Name', 2002);

ما معنى الرقم : 2002 ؟؟؟

وقد جربت تغييرهـ ولم ألاحظ شيء ؟؟

وهنا :

ini.WriteBool('Section_Name', 'Key_Name', True);;

ما الفرق لو وضعت True او False ؟؟ جربت الإثنين ولم أجد أي فرق !؟؟

,,

**** أن تعذرني على إزعاجك فأنا مبتدئ كما ترىا ,,,

وشكرا جزيلا لك مرة أخرىا

والسلام عليكم

B.M.AbdelAziZ
20-02-2009, 10:43 PM
ما معنى الرقم : 2002 ؟
قيمة المفتاح
Key_Name اسم المفتاح
اي لديك متغير اسمه Key_Name وقيمته 2002
والتغيير يظهر في مفتاح الرجيستري بعد التنفيذ، انظر جيدا

ما الفرق لو وضعت True او False ؟
نفس ما سبق
المتغير منطقي اما تعطيه قيمة صحيحة او خاطئة
والسلام عليكم