تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 3 از 3

نام تاپيک: يه مقاله ميخوام در مورد آموزش کلي و کامل فايلها در دلفي

  1. #1
    پروفشنال Arash_XL7710i_207's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    Shiraz
    پست ها
    762

    پيش فرض يه مقاله ميخوام در مورد آموزش کلي و کامل فايلها در دلفي

    بصورت حرفه اي باشه

  2. #2
    حـــــرفـه ای R£ɀД's Avatar
    تاريخ عضويت
    Nov 2004
    پست ها
    2,354

    پيش فرض

    آرش جان فعلا این رو داشته باش تا ببینم دیگه چی پیدا می کنم.

    AssignFile procedure
    برای ست کردن یک متغییر به یک فایل خارجی
    ChDir procedure
    تغییر دایرکتوری فعال
    CloseFile procedure
    بستن فایل مرتبت با متغییر اغلانی ما
    CreateDir function
    ساخت یک دایرکتوری
    DeleteFile function
    حذف یک فایل
    DirectoryExists function
    وجود یا عدم وجود یک دایرکتوری بر روی دیسک
    DiskFree function
    بازگرداندن میزان فضای خالی یک دیسک
    DiskSize function
    باز گرداندن میزان فضای موجود بر روی دیسک
    File mode constants
    ثابت های دست رسی به یک فایل (خواندنی یا نوشتنی و ...)
    File open mode constants
    مدل باز کردن یک فایل از روی دیسک (خواندنی یا نوشتنی)
    FileAccessRights variable
    شکل یا نقاط دست رسی توسط خط فرمان برای اجرا
    FileAge function
    زمان ساخت یا نشانه گزاری یک فایل
    FileClose procedure
    بستن یک فایل باز
    FileCreate function
    ساخت یک فایل
    FileDateToDateTime function
    تبدیل تاریخ ساخت یک فایل به تاریخ قابل فهم برای انسان
    FileExists function
    وجود یا عدم وجود یک فایل
    FileGetAttr function
    گرفتن مشخصات یک فایل از قبیل مخفی و سیستمی و ...
    FileGetDate function
    تاریخ ساخت یک فایل
    FileIsReadOnly function
    آیا فایک خاصیت فقط خواندنی دارد
    FileOpen function
    باز کردن یک فایل
    FileRead function
    خواندن از یک فایل
    FileSearch function
    جستجوی یک فایل
    FileSeek function
    تغییر نقطه خواندن و نوشتن
    FileSetAttr function
    اعمال خواص بر روی یک فایل
    FileSetDate function
    تغییر تاریخ ساخت یک فایل
    FileSetReadOnly function
    تغییر خصلت فقط خواندنی یک فایل
    FileWrite function
    نوشتن در یک فایل
    FindClose procedure
    بستن یک عملیات جستجو و اتمام آن
    FindFirst function
    جستجوی اولین فایل برخوردی با مشخصات اعلام شده
    FindNext function
    جستجوی فایل بعدی برخوردی با مشخصات اعلام شده پس از FindFirst
    ForceDirectories function
    ساخت یک دایرکتوری در صورت نیاز به ساخت
    GetCurrentDir function
    باز گرداندن نام دایرکتوری فعال
    GetDir procedure
    باز گرداندن نام دایرکتوری فعال
    RemoveDir function
    حذف یک دایرکتوری
    RenameFile function
    تغییر نام یک فایل
    SetCurrentDir function
    تغییر دایرکتوری فعال
    کار با بانکهای اطلاعاتی در دلفی

    در این بخش می خواهیم به پر كاربردترین و پراستفاده ترین مبحث در دلفی، یعنی برنامه نویسی بانك های اطلاعاتی، بپردازیم. امید است كه با آموزش گام به گام بتوانیم به طور كامل و كاربردی این بحث طولانی و سنگین را توصیح دهم.

    مروری بر ADO
    ADO و یا به عبارتی ActiveX Data Object رابط كاربری سطح بالای مایكروسافت برای دستیابی به بانك های اطلاعاتی است. ADO - كه بر اساس فناوری OLE DB مایكروسافت پیاده سازی شده است - علاوه بر دستیابی به بانك های اطلاعاتی رابطه ای و غیر رابطه ای، دستیابی به پست الكترونیكی و فایل سیستمها و اشیاء شخصی را فراهم می سازد. اگر بخواهیم از Access یا از Sql Server مایكروسافت استفاده كنیم، ADO قطعا مزایای بسیاری برای ما خواهد داشت. اما نكته منفی در مورد ADO آنست كه در Linux یا سیستم های عامل دیگر قابل استفاده نیست.
    مدل برنامه سازی ADO بر پایه چند شیء استوار است، كه روشهایی را برای دستیابی به انواع منابع داده ای فراهم می سازند. برخی از این اشیاء به قرار زیرند:
    • شیء Connection كه نمایانگر اتصال به منابع داده ای با استفاده از رشته های اتصال است.
    • شیء Command كه امكان كار بر روی منابع داده ای را فراهم می سازند. مانند: عملیات حذف، درج، پرس و جو، بروز رسانی و . . .
    • شیء Recordset كه نتیجه فرمان Query است. هر Recordset را می توان یك جزء ساخت Table یا Query در نظر گرفت.
    چند جزء ساخت كه در برنامه ها و مثالهای آتی استفاده خواهیم كرد را به طور خلاصه معرفی می كنیم:

    اجزای ساخت تب Data Control
    این اجزای ساخت كه Data-Aware نامیده می شوند، اجزای ساختی هستند كه عموما مشابه آنها را در تب standard می بینیم. اما به گونه ای تغییر یافته اند تا محتوای داده های یك Dataset را نمایش یا تغییر دهند. به عنوان مثال از DBEDIT و DBDEMO برای نمایش یك ركورد استفاده می شود. اما از DBGRID زمانی استفاده می شود كه بخواهیم محتـوای كل یك Dataset را نمایش دهیم.
    بیـــشتر این اجزای ساخت را می توان به وســـــیله همان اجزا ساخت موجود در تب Standard پیاده سازی كرد. لذا از آنها به جز DBGRID كمتر استفاده خواهیم كرد.

    اجزا ساخت تب Dataset
    دلفی برای ایجاد برنامه های كاربردی مبتنی بر ADO چهار جزء Dataset معرفی كرده است:
    • TADODataset
    • TADOTable
    • TADOQuery
    • TADOStoredProc
    تمام این اجزا برای بازیابی، نمایش و تغییر داده ها طراحی شده اند، که می توانند از طریق خصوصیت Connection string خود مستقیماً با منبع داده ها ارتباط برقرار كنند.

    جزء ساخت Data Source
    این جزء ساخت مكانیزمی برای مرتبط كردن اجزای ساخت Dataset به اجزا ساخت Data-Aware - كه داده ها را نمایش می دهند - فراهم می سازد.

    برقراری اتصال با بانك اطلاعاتی
    همانطور كه عنوان شد اگرچه هر جزء ساخت Dataset خود مستقیماً می تواند به بانك اطلاعاتی وصل شود، اما ما برای این منظور از جزء ساخت ADOConnection موجود در تب ADO استفاده می كنیم. در این صورت اجزاء Dataset به جای برقراری ارتباط مستقیم با بانک اطلاعاتی به این جزء متصل می شوند. این عمل فواید بسیاری دارد. از جمله اینکه در صورت تغییر پپدا کردن رشته ارتباطی بانک اطلاعاتی تنها کافیست این جزء منفرد را تغییر دهیم. در حالت قبلی باید رشته ارتباطی تک تک اجزای Dataset را تغییر می دادیم.
    روال كار بدین صورت است:
    1. ابتدا یك جزء ساخت ADOConnection روی فرم قرار داده، و روی آن دو بار كلیك می كنیم. پنجره ای مشابه شكل 1 ظاهر می شود.
    2. سپس روی Build كلیك می كنیم تا پنجره شماره 2 ظاهر شود. فرض می کنیم از پایگاه داده Microsoft Access استفاده می كنیم. در صفحه جدید گزینه Microsoft jet 4.0 Ole DB Provider را انتخاب می كنیم.
    3. Next را كلیك كرده، در صفحه بعد - که در شكل 3 نمایش داده شده - از طریق دكمه Browse فایل mdb مربوط به Microsoft Access را انتخاب می كنیم.
    4. برای آنكه از اتصال موفق پایگاه داده مطمئن شویم دكمه Test Connection را كلیك می كنیم.
    5. در تب Advanced طریقه دستیابی به پایگاه داده را - مانند شکل ۴ - مشخص می كنیم.
    6. اكنون OK را كلیك می كنیم.
    7. روی ADOConnection كلیك كرده، و از طریق Object Inspector خاصیت LoginPrompt را False، و ارزش خاصــیت Connected را True می كنیم.
    8. اكنون از تب ADO یك ADOTable، از تب DataAccess یك DataSource، و از تب DataControl یك DBGrid روی فرم قرار می دهیم.
    9. از طریق Object Inspector مقدار خاصیت Connection جزء ADOTable1 را ADOConnection1 قرار داده، و در خاصیت Table Name یكی از جداول پایگاه داده را برمی گزینیم.
    10. بر روی DataSource كلیك كرده، خاصیت DataSet آنرا به ADOTable1 تغییر می دهیم.
    11. بر روی DBGrid كلیك كرده خاصیت DataSource آنرا به DataSource1 تغییر می دهیم.
    12. بالاخره ADOTable1 را انتخاب كرده و ارزش خاصیت Active آنرا True قرار می دهیم. اگر جدول مورد نظر دارای داده باشد، آن داده ها در DBGrid نمایش داده می شوند.

    در بخشهای بعدی مطالبی در مورد شبوه نوشتن در منبع داده، خواندن از منبع داده، و نمایش اطلاعات بحث خواهیم كرد.
    موتور بانك اطلاعاتی JET معمولا با بانك اطلاعاتی Microsoft Access مرتبط است، و از MS Access 97 , 2000 , 2003 و نرم افزارهای راه اندازی ISAM (اختصار Index Sequential Access Method) پشتیبانی می كند. لذا این موتور شامل نرم افزارهای راه اندازی Paradox, dBase, Access و Excel بوده، و از متن نبز پشتیبانی می كند. برای آنكه این موتور را با هر بانك اطلاعاتی به غیر از Microsoft Access به كار ببرید، كافیست در پنجره Data Link Properties و در تب All خاصیت Extended Properties را مقدار دهی كنید. مثلا برای استفاده از Excel آنرا به Excel 8.0 و برای استفاده از متن به Text تغییر دهید.
    به عنوان یک مثال ساده حالت برای متن، یك فایل متنی با محتویات زیر ایجاد كنید:
    Amin , Amani
    Reza , Sadegi
    Mohammad , Azimi
    یك ADOTable، یك DBGrid، و یك DataSource روی فرم قرار داده و خواص آنها را مطابق دستورالعمل ارائه شده در بالا تنظیم کنید. با این تفاوت که به جای Access از فایل متنی (Text) استفاده کنید(شكل ۲). البه باید در قسمت مسیر فایل فقط مسیر دایركتوری حاوی متن را بنویسید، و نام فایل را ننویسید. و بالاخره در تب All مقدار خاصیت Extended Properties را Text قرار دهید. حال اگر خاصیت Active جزء ADOTable1 را True كنیم DBGrid حاوی داده های فایل متنی خواهد شد.
    كار با بانكهای اطلاعاتی در دلفی - قسمت دوم

    جلسه قبل با نحوه اتصال به پایگاه داده و نمایش داده ها به صورت ابتدایی آشنا شدیم. در این جلسه می خواهیم برخی کارهای عملیاتی نظیر افزودن، حذف، بروز رسانی و ویرایش داده ها را مرور کنیم. ابتدا آسانترین راه را پیشنهاد می دهیم:

    1. استفاده از DBNavigator:
    این جزء ساخت که در پالت DataControls قرار دارد علاوه بر قابلیتهای پیمایشی، راهکاری را برای انجام عملیاتی چون افزودن، حذف یا لغو را فراهم می کند. وجود دکمه ها اختیاری بوده و با استفاده از خاصیت VisibleButtons می توان هر ترکیبی از دکمه ها را انتخاب نمود. برای استفاده از این جزء ساخت آن را روی فرم قرار داده و در قسمت Object Inspector خاصیت DataSource آنرا به DataSource مورد نظر مقدار دهی می کنیم. چهار دکمه اول دکمه های پیمایشی هستند که با استفاده از آنها می توان به اولین و آخرین رکورد انتقال یافت، یا بین رکوردها حرکت کرد. دکمه های بعدی عبارتند از افزودن، حذف کردن، ویرایش، تایید، لغو و Refresh.
    وقتی DataSet را در حال ویرایش یا Edit قرار داده ایم و اقدام به تغییر داده ها می کنیم تا زمانیکه عمل تایید یا Post را انجام ندهیم، تغییرات مورد نظر در پایگاه داده اعمال نخواهد شد.

    2. با استفاده از کدنویسی:
    با این روش متدهای مورد نظر یک DataSet را فراخوانی می کنیم. این متدها دقیقا همنام با دکمه های جزءساخت DBNavigator هستند. یکی از عملیات پیمایشی که جزء ساخت DBNavigator فراهم نمی کند حرکت رو به جلو یا عقب به اندازه چند رکورد است. از متد MoveBy یک DataSet برای انتقال نشانه رو یک رکورد نسـبت به رکورد فعال استفاده می شود. مـــثلا دسـتور (MoveBy(2 باعث حرکت با گامهای 2 تایی رو به جلو می شود، و دستور (MoveBy(-2 موجب حرکت رو به عقب با گام هایی به طول 2 می شود.
    اکنون تغییر و اصلاح داده ها را با هم مرور می کنیم. برای انجام هر کاری روی DataSet ها ابتدا باید DataSet مورد نظر باز باشد. در غیر اینصورت هیچ عملیاتی را روی داده ها نمی توان انجام داد. برای اینکار یا باید خاصیت Active را برای DataSet مورد نظر در حالت True قرار دهیم و یا از متد Open استفاده کرده و قطعه کدی مانند ;Adotable1.Open بنویسیم. برای بستن DataSet هم باید متد Close را فراخوانی کنیم.
    برای آگاهی یافتن از وضعیت جاری یا State یک DataSet می توانیم از متد State یا رویداد (Event) به نام OnStateChange استفاده کنیم که هر بار به هنگام تغییر وضعیت DataSet متناظرش فعال می شود. مثلا اگر قطعه کد زیر را در قسمت پاسخگویی به رویداد OnStateChange بنویسیم سبب می شود تا وضعیت جاری AdoTable1 در Edit1 نمایش داده شود:

    Var
    St : String ;
    Begin
    Case AdoTable1.State of
    dsInactive: st := ' closed ' ;
    dsEdit: st := ' Editing ' ;
    dsInsert: st:= ' Inserting ' ;
    Else st := ' other state ' ;
    End ;
    form1.caption := 'AdoTable1 state :' + st ;
    End ;

    با استفاده از متد های First و Last می توان به ترتیب نخستین یا آخرین رکورد را به عنوان رکورد جاری تعیین کرد. متد Next و Prior برای رفتن به رکوردهای بعدی و قبلی است. خصوصیت BOF و EOF نشان می دهد نشانه رو در آخرین سطر یا نخستین سطر DataSet است.

    به دست آوردن مقدار فیلدها
    قبل از اینکه عملیات دیگر را معرفی کنیم باید ببینیم که چگونه می توانیم مقدار یک فیلد از یک رکورد را بدست بیاوریم؟ وقتی شیء های DataAware نظیر DBGrid به یک DataSet متصل می شود مقادیر فیلدها در آن شیء های کنترلی نمایش داده می شود. اگر بخواهیم همان مقادیر را مستقیما در برنامه به کار ببریم باید شیوه خواندن آنها را بدانیم. برای دستیابی به مقدار داده یک فیلد چندین روش وجود دارد:
    1. ADOTable1.Fields[x].Value
    در کد بالا X شماره فیلد است، که از صفر شروع می شود. تمام فیلدهای یک DataSet در آرایه Fields ذخیره می شود و X نمایانگر موقعیت فیلد در آرایه است.
    2. ADOTable1.FieldsByName('name_of_field').Value
    در این روش به مقدار فیلد با نام آن دستیابی پیدا می کنیم.
    در هر دو این روشها چون Value از نوع Variant است، هنگام نیاز به مقدار فیلدها باید آن را به نوع مورد نظر تبدیل کنیم. مثلا اگر مقدار فیلدی به صورت رشته باشد، از خصوصیت AsString استفاده می کنیم.

    ویرایش یک رکورد:
    برای اینکه بتوان داده های یک DataSet را ویرایش نمود، DataSet باید در وضعیت Edit باشد. رفتار شیء های DataAware نظیر DBGrid - هنگامیکه مقدار True به خاصیت AutoEdit آنها تخصیص می یابد - این است که وقتی کاربر روی یکی از فیلدها کلیک می کند تا آنرا ویرایش کند، وضعیت DataSet از حالت Browse به حالت Edit تغییر می یابد. باید دقت کرد که پس از Edit باید عمل Post را هم انجام دهیم. مثلا در کد زیر:

    ADoTable1.Edit ;
    AdoTable1.name_of_field.AsString := 'delphi' ;
    Adotable1.Post ;

    در سطر نخست dataset در وضعیت Edit قرار می گیرد. در سطر دوم رشته Delphi به فیلد name_of_field تخصیص می یابد، و در سطر آخر هم داده ها Post می شوند. جالب است بدانید که در اثر اجرای سه دستور بالا رویدادهای زیر فعال می شوند:

    AdoTable1 BeforeEdit
    DataSource1 StateChange
    Datasource1 DataChange
    AdoTable1 AfterEdit
    Adotable1 name_of_field Validate
    Adotable1 name_of_field Change
    DataSource1 StateChange
    Datasource1 DataChange
    AdoTable1 BeforePost
    DataSource1 StateChange
    AdoTable1 AfterPost

    افزودن یک رکورد:
    برای اینکار از دو متد مربوط به DataSet می توانیم استفاده کنیم. اولین متد Insert و دومین متد Append است. هردو این متدها یک رکورد جدید خالی در جدول ایجاد کرده و رکورد جدید را به عنوان رکورد فعال (Active) در نظر می گیرند. تنها تفاوت ما بین این دو دستور اینست که متد Append این رکورد جدید را در انتهای DataSet ایجاد می کند (به انتهای جدول اصافه می کند)، اما در متد Insert این رکورد جدید ممکن است در هر جایی از DataSet اضافه شده باشد. قطعه کد زیر نحوه انجام این عمل را نشان می دهد:
    With AdoTable1 Do
    Begin
    Append ;
    FieldByName('name').Value.AsAtring := 'ali' ;
    FieldByName('Email').Value.AsString := 'ali@yahoo.com' ;
    FieldByName('id').Value.AsString := '50' ;
    Post ;
    End ;
    البته جزء ساخت AdoTable متدی به نام InsertRecord دارد که از آن می توان برای ایجاد یک رکورد خالی جدید در Dataset، پر کردن فیلدهای این رکورد جدید و Post کردن مقادیر به بانک اطلاعاتی استفاده نمود. کد زیر نحوه انجام این عمل را نشان می دهد:
    AdoTable1.InsertRecord ( ' ali' ,' ali@yahoo.com ' , '50' ) ;
    باید توجه داشت که ترتیب داده ها با ترتیب قرار گرفتن آنها در فیلدهای مورد نظر یکسان باشد.


    حذف یک رکورد:
    برای اینکار متد Delete مربوط به DataSet مورد نظر را فراخوانی می کنیم و نیازی به فراخوانی متد Post پس لز فراخواندن Delete نیست. با استفاده از رویداد BeforeDelete می توان جهت جلوگیری از حذف رکورد از جدول اقدام کرد. برای اینکه کاربر را از اینکه می خواهد رکوردی را حذف کند آگاه کنیم یا در حقیقت از کاربر بخواهیم که عمل حذف را تایید کند چندین راه وجود دارد. اولین روش استفاده از تابع MessageDlg است. این تابع در کتابخانه Dialogs به صورت زیز تعریف شده است :

    Function MessageDlg ( Const Msg : String ; DlgType : TMsgDlgType ; Buttons : TMsgDlgButtons ; HelpCtx : Longint )
    پارامتر اول پیامی است که می خواهیم به کاربر نشان داده شود. پارامتر دوم نوع پیام و پارامتر سوم ترکیب دکمه هایی است که در پیام می خواهیم ظاهر شود. MsgDlgBtn می تواند یکی از مقادیر mbOK, mbCancel, mbYes, mbNo, mbRetry و . . . را بپذیرد. برای اینکه بفهمیم کاربر کدامیک از دکمه ها را کلیک کرده است مثل کد زیر عمل می کنیم:
    If messagedlg ( 'Are you sure you want to delete book?' , mtWarning , mbOKCancel , 0 ) = mrOk Then
    AdoTable1.Costumer.Delete ;
    نمایش میزان كپی شدن فایل با ProgressBar در دلفی

    چطور میتوان زمان کپی شدن فایل را با استفاده از ProgressBar نمایش داد؟
    برای انجام این کار ابتدا بر روی یک فرم یک ProgressBar اضافه کنید سپس تابع زیر را تایپ کنید:


    procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
    var
    FromF, ToF: file of byte;
    Buffer: array[0..4096] of char;
    NumRead: integer;
    FileLength: longint;
    begin
    AssignFile(FromF, Source);
    reset(FromF);
    AssignFile(ToF, Destination);
    rewrite(ToF);
    FileLength := FileSize(FromF);
    with Progressbar1 do
    begin
    Min := 0;
    Max := FileLength;
    while FileLength > 0 do
    begin
    BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
    FileLength := FileLength - NumRead;
    BlockWrite(ToF, Buffer[0], NumRead);
    Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
    end;
    end;


    در این تابع شما در واقع فایل مبدا را خوانده و در مقصد مینویسید. حالا یک دکمه اضافه کرده کد زیر رو اضافه نمایید:


    procedure TForm1.Button1Click(Sender: TObject);
    begin
    CopyFileWithProgressBar1('c:\Welcome.exe', 'c:\temp\Welcome.exe');
    end;



    چطور می توان زمان کپی شدن فایل را محاسبه و نمایش داد؟
    برای این کار نیز میتوانید از تابع زیر استفاده کنید:


    procedure TForm1.CopyFileWithProgressBar1(Source, Destination: string);
    var
    FromF, ToF: file of byte;
    Buffer: array[0..4096] of char;
    NumRead: integer;
    FileLength: longint;
    t1, t2: DWORD;
    maxi: integer;
    begin
    AssignFile(FromF, Source);
    reset(FromF);
    AssignFile(ToF, Destination);
    rewrite(ToF);
    FileLength := FileSize(FromF);
    with Progressbar1 do
    begin
    Min := 0;
    Max := FileLength;
    t1 := TimeGetTime;
    maxi := Max div 4096;
    while FileLength > 0 do
    begin
    BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
    FileLength := FileLength - NumRead;
    BlockWrite(ToF, Buffer[0], NumRead);
    t2 := TimeGetTime;
    Min := Min + 1;
    // Show the time in Label1
    label1.Caption := FormatFloat('0.00', ((t2 - t1) / min * maxi - t2 + t1) / 100);
    Application.ProcessMessages;
    Position := Position + NumRead;
    end;
    CloseFile(FromF);
    CloseFile(ToF);
    end;
    end;


    در این تابغ ابتدا زمان اولیه در متغیر t1 ذخیره شده و سپس پس از کپی شدن هر قسمت از فایل، زمان در متغیر t2 ذخیره میشود و توسط فرمول زیر مقدار زمان باقی مانده تا کپی کامل فایل بدست می آید.


    ((t2 - t1) / min * maxi - t2 + t1) / 100

    منبع :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    + شبکه فن آوری اطلاعات ایران

  3. این کاربر از R£ɀД بخاطر این مطلب مفید تشکر کرده است


  4. #3
    پروفشنال Arash_XL7710i_207's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    Shiraz
    پست ها
    762

    پيش فرض

    ممنون رضا جان دستت درد نکنه بالاخره از هيچي بهتره...

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •