التعامل مع ملفات ini بالدلفي : حفظ الإعدادات بالملفات Ini
#1
السلام عليكم و رحمة الله و بركاته :
في الحقيقة أردت طرح إشكال حول الملفات Ini (بقسم الأسئلة) ، و أثناء الإعداد للسؤال أردت أن أفيد البعض من المبتدئين أمثالي ، بمعلومات أو ما أشبه حول ، حفظ إعدادات برنامج معين بملف ذو اللاحقة ini ، ثم يليها الإشكال_ إن شاء الله :

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

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

[صورة: 803563012.jpg]
و هذا مثال تطبيقي للاستخدام يشمل العناصر: Edit+Memo+CheckBox+Image
نضع زر لحفظ الإعدادات و آخر لجلب الصورة ، و كذلك لدينا كود بالحدث OnCreate للفورم :

كود :
[COLOR=Black] procedure TForm1.Button1Click(Sender: TObject)[/COLOR]; begin with tinifile.create('D:\star.ini')do begin writebool('Checkbox','CheckboxValue',checkbox1.Checked); writestring('Edit','EditValue',edit1.Text); writestring('Memo','MemoValue',memo1.Text); writestring('img','imgValue',OpenPictureDialog1.FileName); end; [COLOR=Black] end;[/COLOR] [COLOR=Black] procedure TForm1.FormCreate(Sender: TObject);[/COLOR] begin with tinifile.create('D:\star.ini')do begin checkbox1.Checked:=readbool('Checkbox','CheckboxValue',false); edit1.Text:=readstring('Edit','EditValue',edit1.Text); Memo1.text:=readstring('Memo','MemoValue',memo1.Text); img:=readstring('img','imgValue',img); end; image1.Picture.LoadFromFile(img); [COLOR=Black] end;[/COLOR] [COLOR=Black] procedure TForm1.Button2Click(Sender: TObject);[/COLOR] begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); [COLOR=Black] end;[/COLOR]
ملاحظة : إذا لم يتم تحديد مسار الملف Ini فإنه سوف ينشأ تلقائيا بمجلد Windows / في قطاع الذي نصب فيه النظام.
إذا أردنا وضعه مع مجلد البرنامج و لا نعلم أين سيتم وضع هذا المجلد عند المستخدم فإننا نصيف :
إقتباس : '\ini\star.ini..'


الملفات المرفقة
.rar   Ini.rar (الحجم : 304.83 ك ب / التحميلات : 1,011)
الرد
#2
لماذا لاتحرر ال tinifile بعد إنشائه ؟؟
الرد
#3
السلام عليكم
بارك الله فيك أخي نبيل
mohfa كتب :لماذا لاتحرر ال tinifile بعد إنشائه ؟؟
أجل، يجب إضافة الإجراء Free في النهاية.
الرد
#4
PHP كود :
FreeAndNil( tinifile ); 

تفي بالغرض
الرد
#5
mohfa كتب :
PHP كود :
FreeAndNil( tinifile ); 

tinifile : انتبه أخي الدلفي لا يسمح لك بتسمة متغير باسم وحدة Unit أو كلمة محجوزة، سمه مثلا Myinifile أو inifile.
الإجراء Free وحده يكفي هنا.
الأوامر التي فيها إنشاء ثم تدمير مكون يستحسن وضعها في حلقات محمية أقصد: Try...Finally
هذا مثال يجمع كل ما قلناه (ضع في مشروع جديد ستة مكونات من النوع TButton ومكون TListBox ثم قم بتشغيل المشروع):
PHP كود :
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
وشكرا كثيرا.
الرد
#6
بارك اللة فيك أخي [COLOR="Red"]nabilkeb ويبارك لك في بنتك الغالية
الكود فية أخطاء بسيطة ولكن المهم هي فكرة الجميلة في الدرس

تحياتي لك
[/COLOR]
الرد
#7
السلام عليكم ,, بارك الله فيك درس ممتع وشيق وجميل جدا ,,

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

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

كود :
ini.WriteInteger('Section_Name', 'Key_Name', 2002);

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

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

وهنا :

كود :
ini.WriteBool('Section_Name', 'Key_Name', True);;

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

,,

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

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

والسلام عليكم
شكوت إلى وكيع سوء حفظي ... فأرشدني إلى ترك المعاصي
وأخــبـرنـي بــأن الـعـلـم نـور ... ونـور الله لا يـهدى لـعـاصي
الرد
#8

إقتباس :ما معنى الرقم : 2002 ؟
قيمة المفتاح
Key_Name اسم المفتاح
اي لديك متغير اسمه Key_Name وقيمته 2002
والتغيير يظهر في مفتاح الرجيستري بعد التنفيذ، انظر جيدا

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم