PDA

View Full Version : ذخیره فرم



ghazal20
دوشنبه 19 اردیبهشت 1384, 16:10 عصر
سلام
من فرمی دارم شبیه به فاکتور که می خواهم آن را ذخیره کنم از چه متدی باید استفاده کنم؟
:(

ghazal20
دوشنبه 19 اردیبهشت 1384, 16:15 عصر
من نمی تونم از گزارشها هم استفاده کنم چون دوباره موقع باز کردن فرم ذخیره شده به مشکل بر می خورم

m-khorsandi
دوشنبه 19 اردیبهشت 1384, 16:42 عصر
درود
منظورتون رو متوجه نمیشم، میشه یه مقدار توضیح بدید.

ghazal20
دوشنبه 19 اردیبهشت 1384, 18:34 عصر
یعنی اینکه کاربر وقتی حسابها را در این فاکتور وارد کند می خواهد آنها را جایی ذخیره کند . مثلا فاکتور طرف حساب : آقای x . بعد که فاکتور جدیدی برای شخص دیگری صادر می کند فاکتور آقای x از بین می رود . برای همین باید بتواند آن را ذخیره کند.
ضمنا برای ذیره از savedialog استفاده می کنم

ghazal20
دوشنبه 19 اردیبهشت 1384, 18:36 عصر
در حقیقت می خواهم اطلاعات فرم یعنی ستونهای dbgrid , مقادیر edit ها و جمع کل و ... را ذخیره کنم.

mkalone
دوشنبه 19 اردیبهشت 1384, 18:57 عصر
سلام

ببین من یکبار مشکلت رو مرور می کنم
سرکار می خواهی یک فرم برای فاکتور طراحی کنی و بعد اطلاعات فرم رو در بانک ذخیره کنی
استفاده از گرید کار سخت و کم قابلیتی است
بهتر است شما یک کلید روی فرم قراردهید سپس با زدن این کلید بانک به حالت Append رفته و فرمی نمایش داده میشود که اطلاعات فاکتور را از کاربر می گیرد که این ها هم یکسری DBEditBox هستند که مستقیم
به بانک وصل می شوند خوب
برای لیست آیتم های فاکتور هم می تونی از یک StringGrid استفاده کنی و بعد هنگام تائید توسط کاربر
اطلاعات استرینگ گرید رو بررسی کنی و در فیلدهایی که طراحی کردی در بانک ذخیره کنی
حالا در ورود شخص بعد دوباره مقادیر خالی شده و اطلاعات شخص قبل هم ذخیره می گردد.

نمی دونم تونستم کمکت کنم یا نه
درهر صورت باز هم در موردش صحبت کن تا به نتیجه بررسی

:D
بای
مهرداد

ghazal20
دوشنبه 19 اردیبهشت 1384, 20:02 عصر
ببخشید اما من مشکلی در رابطه با ذخیره در بانک ندارم مشکلم در رابطه ا ذخیره اطلاعات فرم در فایل است :embr:

majid_afra222
دوشنبه 19 اردیبهشت 1384, 21:26 عصر
سلام
روشی که من بهت میگم درسته فقط باید فرم تو حالت AutoCreate نباشه و بصورت دستی اونرو ایجاد کنی
برای ذخیره فرم در یک فایل فیزیکی :
ابتدا تابع زیر رو به برنامت اضافه کن :


function EndUserFormCreate(AFormClass: TFormClass; AOwner: TComponent; strFormFileName: string): TForm;
برای ایجاد فرم از کد زیر استفاده کن :


FormConfig : TForm;
...
FormConfig := EndUserFormCreate(TFormName, Application, FileName);
اینم پیاده سازی تابع ایجاد فرم :


function TFormPassword.EndUserFormCreate(AFormClass: TFormClass; AOwner: TComponent;
strFormFileName: string): TForm;
begin
if FileExists(strFormFileName) then
begin
Result:=(AFormClass).CreateNew(AOwner);
ReadComponentResFile(strFormFileName, Result);
end
else
Result:=(AFormClass).Create(AOwner);
end;
برای ذخیره فرم در یک فایل هم از تابع زیر استفاده کن :


WriteComponentResFile(FileName, self);
البته این تابع آخر رو تو فرم مقصد میذاری و اونرو تو یه فایل ذخیرش می کنی

امیدوارم به دردت بخوره :wise1:

ghazal20
سه شنبه 20 اردیبهشت 1384, 00:58 صبح
ممنون از جوابت . امتحان می کنم :)

vcldeveloper
سه شنبه 20 اردیبهشت 1384, 02:44 صبح
می تونی از TClientDataSet برای ذخیره این اطلاعات استفاده کنی (حتی امکان ذخیره اونها بصورت XML هم داری).

WriteComponentResFile(FileName, self);
فکر نکنم این تابع مقادیر نوشته شده در داخل Grid رو هم ذخیره کنه.

در هر حال کار با ClientDataSet ساده و سریع هست. می تونی برای هر یک از ستون ها ی گرید و مقادیر labelها و edit ها یک فیلد در ClientDataSet تعریف کنی و با اون مثل یک جدول بانک اطلاعاتی (البته در داخل RAM) کار کنی. برای ذخیره مقادیر اون هم می تونی اطلاعات فاکتور رو بصورت رکورد به رکورد به ClientDataSet وارد کنی و با استفاده از متد SaveToFile شی TClientDataSet اونها رو در یک فایل ذخیره کنی.
البته اگر تمامی اطلاعات فاکتور شما مربوط به یک شی TTable (یا ADOTable) و یا یک TQuery (یا TADOQuery) هست، می تونید بجای استفاده از TClientDataSet مستقیما از متد SaveToFile شی جدول یا query مربوطه استفاده کنید.

majid_afra222
سه شنبه 20 اردیبهشت 1384, 08:56 صبح
سلام آقای کشاورز عزیر
درسته این تابع مقادیر Grid رو ذخیره نمیکینه
منم با ذخیره یک فرم در XML در موافقم
تا اونجایی هم که یادم میاد باید حدود 2 سال پیش یه مقاله جناب معموری تو سایت www.Irandevelopers.com به نام نوشتن همه کمپوننتهاى در یک فایل XML با استفاده از TXMLDocument گذاشتن.
شاید خوندن اون هم بد نباشه.
البته من روش خودم رو ترجیح میدم.

m-khorsandi
سه شنبه 20 اردیبهشت 1384, 09:57 صبح
معمولا فاکتور دارای دو بخش هست: سربرگ و اقلام

در قسمت سربرگ : اطلاعاتی از قبیل شماره فاکتور، کد مشتری، تاریخ، ساعت و... قرار میگیره.
در قسمت اقلام : کد کالا، تعداد، قیمت و... قرار میگیره.

همونطوری که می بینید یه "شماره فاکتور" داریم که عمل جستجو یا بازیابی اطلاعات رو میتونیم بر اساس
اون انجام بدیم.
فرضا میتونیم در یک EditBox با وارد کردن شماره فاکتور، مقدار مربوطه را در جدول سربرگ جستجو کنیم و
مقدار فیلدهای که قبلا گفتم رو نمایش میدیم.

مواردی که گفتم خیلی مختصر هست اگه لازم دونستید، میتونم کاملتر توضیح بدم.
من فکر میکنم ذخیره به صورت فایل روش اشتباهی هست.

m-khorsandi
سه شنبه 20 اردیبهشت 1384, 11:53 صبح
این مثال خوبیه.

لطفا اول Script رو توی Pubs اجرا کنید. و بعد هم مثال رو.

m-khorsandi
سه شنبه 20 اردیبهشت 1384, 13:06 عصر
فراموش کردم بگم که بعد از اجرای Script تو جدول Tab_DfnGoods چند تا رکورد به عنوان "کالا" وارد کنید. :oops:

ghazal20
چهارشنبه 21 اردیبهشت 1384, 00:44 صبح
مقادیر labelها و edit ها یک فیلد در ClientDataSet تعریف کنی و با اون مثل یک جدول بانک اطلاعاتی (البته در داخل RAM) کار کنی.
منظورتون اینه که مثلا برای هرکدوم از edit ها باید یک فیلد جدید در adotable تعریف کنم؟ آخه اونا که به ازای هر فاکتور فقط یک مقدار دارن.یعنی انیکه به ازای هر فاکتور فقط یک شماره فاکتور و یک تاریخ داریم :گیج:

ghazal20
چهارشنبه 21 اردیبهشت 1384, 00:47 صبح
سلام

WriteComponentResFile(FileName, self);
البته این تابع آخر رو تو فرم مقصد میذاری و اونرو تو یه فایل ذخیرش می کنی

امیدوارم به دردت بخوره :wise1:
ممنون از روشت اما من میخوام بعدا هم این اطلاعات save شده load بشن.از readcomponentResFile() استفاده کردم اما نشد میشه این را هم بگید؟

ghazal20
چهارشنبه 21 اردیبهشت 1384, 00:51 صبح
معمولا فاکتور دارای دو بخش هست: سربرگ و اقلام

در قسمت سربرگ : اطلاعاتی از قبیل شماره فاکتور، کد مشتری، تاریخ، ساعت و... قرار میگیره.
در قسمت اقلام : کد کالا، تعداد، قیمت و... قرار میگیره.

همونطوری که می بینید یه "شماره فاکتور" داریم که عمل جستجو یا بازیابی اطلاعات رو میتونیم بر اساس
اون انجام بدیم.
فرضا میتونیم در یک EditBox با وارد کردن شماره فاکتور، مقدار مربوطه را در جدول سربرگ جستجو کنیم و
مقدار فیلدهای که قبلا گفتم رو نمایش میدیم.

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

vcldeveloper
چهارشنبه 21 اردیبهشت 1384, 02:16 صبح
منظورتون اینه که مثلا برای هرکدوم از edit ها باید یک فیلد جدید در adotable تعریف کنم؟
خیر، برای هر کدوم از ستون های گرید و edit ها فیلدی در ClientDataSet ایجاد کنید.
اگر کلیه داده های فاکتور شما از یک جدول یا query استخراج میشه، نیازی به استفاده از TClientDataSet و اضافه کردن فیلدها به اون نیست.

majid_afra222
چهارشنبه 21 اردیبهشت 1384, 10:56 صبح
سلام
روشی رو که آقای کشاورز گفتند رو هم میتونید استفاده کنید. یا مقاله آقای معموری رو تو سایت گفته شده در بالا بخونید.
خوب راهی که من گفتم یه مشکلی که داشت همون اطلاعات توی گرید بود. یه راه حل خیلی ساده میتونه
این باشه که یه متغیر تو فرم مقصد ایجاد کنید٬ که شماره کلید اطلاعاتی تو گرید رو نگهداری کنه٬
و به محض لود شدن فرم اگه فرم رو قبلا ذخیره کرده بودید (مقدار کلید مربوط به گرید خالی نبود)
یه query رو با اون کلید روی بانک اجرا کنه و گرید رو پر کنه.
لبته راه چندان مناسبی نیست ولی فکر کنم از همه راههای مربوط به xml ساده تر باشه.

در مورد اینکه گفتی اطلاعاتی لود نمی شن٬ اینم یه مثال برای راحتی کار٬‌ با بانک northwind روی local کار میکنه (فایل FormInfo.frm همون فرم ذخیره شدس٬‌اگه پاکش کنی فرم تو حالت پیش فرض لود می شه) :