PDA

View Full Version : ساخت فایل ini



Delphi_OnLine999
پنج شنبه 16 فروردین 1386, 01:29 صبح
من در یک فایل ini مربوط به یک برنامه ساختاری با این شکل دیدم:

GRID:
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ c ~
~ b a t ~ ~ ~ ~ ~ ~ p i n e t a r
~ ~ m ~ ~ ~ ~ ~ ~ b ~ ~ ~ ~ ~ t ~
END GRID

چطور میشه در یک فایل ini این چنین ساختاری تعریف کرد؟
در ظمن از این ساختار برای ذخیره محتوای هر یک از خانه های grid استفاده کرده بود(یک آرایه دو بعدی)

Hamid_PaK
پنج شنبه 16 فروردین 1386, 17:31 عصر
احتمالا این ساختار را در برنامه تعریف کرده و فقط پسوند فایل مورد نظر INI است ...
در حالت معمولی و تا جایی که من می دانم این ساختار فایلهای INI نیست ...
ساختار اصلی INI مرتبط با توابع GetPrivateProfile* , WritePrivateProfile که جزو API ویندوز هستند ، می باشد . (برای مثال ذخیره رشته : WritePrivateProfileString)

یا حق ...

Delphi_OnLine999
جمعه 17 فروردین 1386, 02:19 صبح
مرسی دوست عزیز ولی در این فایل از section های ini file استفاده کرده بود و در انتها هم از این ساختار..
چه طور می شود چنین ساختاری را ایجاد کرد?

GRID:
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ c ~
~ b a t ~ ~ ~ ~ ~ ~ p i n e t a r
~ ~ m ~ ~ ~ ~ ~ ~ b ~ ~ ~ ~ ~ t ~
END GRID


یا


THEME WORDS:
0 -- Bat |Wooden stick
0 -- Ball |Not a strike; the other half of base____
0 -- strike |Not a ball (pitch)
END THEME WORDS

توجه شود که این ساختار به در داخل فایل هم به همین صورت مرتب قرار دارد.

Hamid_PaK
جمعه 17 فروردین 1386, 07:32 صبح
مرسی دوست عزیز ولی در این فایل از section های ini file استفاده کرده بود و در انتها هم از این ساختار..
باز هم دلیل بر این نمی تواند باشد که شخص از ساختار INI برای خواندن و نوشتن داده استفاده کرده است .


چه طور می شود چنین ساختاری را ایجاد کرد?
روش بسیار ابتدایی البته در این مورد باید کامپوننت ساخت :


{GRID:
1,2,3 // -> Key 1
11,22,33 // -> Key 2
END GRID//}

// Seprator
const
TheSeprator: Char = ',';
EndSeprator: String[4] = 'END ';

function ReadINIExString(Sec: String; Key: Integer): String;
var
idx, i: Integer;
s: String;
begin
// find the strat of section by the COLUMN char -> ":".
idx := Pos(Sec +TheSeprator, FileStr);
s := Copy(FileStr, idx, Pos(EndSeprator +Sec, FileStr));

i := 0;
repeat
idx := Pos(#13#10, s);
Delete(s, 1, idx +Length(#13#10));

idx := Pos(#13#10, s);
Result := Copy(s, 1, idx -Length(#13#10));

Inc(i);
until i = Key;
end;

// Usage
begin
ShowMessage(ReadINIExString('GRID', 1))
end;

البته من کد رو فقط برای درک ساختار نوشتم ( ممکن هست خیلی مشکل داشته باشه ).

یا حق ...

Delphi_OnLine999
یک شنبه 19 فروردین 1386, 02:04 صبح
مرسی ...از این روش هم می شود استفاده کرد ولی فکر می کنم در این رابطه یک کامپوننت وجود داشته باشد.

Valadi
یک شنبه 19 فروردین 1386, 08:43 صبح
من قبلا یک کامپونتی دیده بودم که این قابلیت راداشت که اطلاعات هر آبجکتی را یک فایل ini می ساخت اگر خواستی بگو بگردم

hossein taghi zadeh
یک شنبه 19 فروردین 1386, 11:15 صبح
من قبلا یک کامپونتی دیده بودم که این قابلیت راداشت که اطلاعات هر آبجکتی را یک فایل ini می ساخت اگر خواستی بگو بگردم


Function ComponentToString(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 StringToComponent(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;

Delphi_OnLine999
پنج شنبه 23 فروردین 1386, 00:38 صبح
این توابع که شما معرفی کرده اید فقط اشیائ از نوع Component را به String تبدیل می کند و برعکس. منظور من کامپوننت یا تابعی است که بتوان هر Object را فیلدهایش را ذخیره و بتواند بازیابی کند.
در تابع StringToComponent در خط Result := BinStream.ReadComponent(nil); پیغام خطا در مورد پیدا نکردن نوع component ساخته شده می دهد.مثلا در مورد یک button پیغام (Not Font Class Tbutton)

hossein taghi zadeh
پنج شنبه 23 فروردین 1386, 23:20 عصر
در تابع StringToComponent در خط Result := BinStream.ReadComponent(nil); پیغام خطا در مورد پیدا نکردن نوع component ساخته شده می دهد.مثلا در مورد یک button پیغام (Not Font Class Tbutton)

شما باید قبل از استفاده از این تابع، از تابع RegisterClasses برای ثبت کامپوننت‌ها و کلاس‌هایشان استفاده کنید.

Delphi_OnLine999
جمعه 24 فروردین 1386, 00:20 صبح
کسی از دوستان کامپوننت یا تابعی است که بتوان به وسیله آن فیلدهای یک object به غیر از نوع کامپوننت که دوست خوبم آقای تقی زاده معرفی کردند را در یک فایل ذخیره و دوباره بتوان آن را بازیابی کرد.