PDA

View Full Version : مشکل توی کد نویسی چند تا Button ! کمکم کنین!



Narges-s
جمعه 13 شهریور 1388, 01:32 صبح
من روی پروژه ی حقوق و دستمزد کار میکنم.

Delphi 7 + SQL Server 2000

یکی از فرم هام به نام PersList لیست کارمندان رو با اطلاعات جزئی ازشون نمایش میده. برای ثبت اطلاعات توی این فرم دو تا Button دارم. یکی واسه صدور فرم پرسنلی جدید یکی هم واسه اصلاح فرم پرسنلی. این دو تا Button باید طوری کار کنن که وقتی روی صدور فرم جدید کلیک میکنیم یه فرم با نام Persinfo باز بشه تا اطلاعات مربوط به یه کارمند جدید رو وارد کنیم و بعد از وارد کردن اطلاعات و بستن فرم مذکور اسم کارمند جدید به لیست کارمندای در فرم PersList اضافه بشه
همینطور وقتی روی دکمه ی اصلاح فرم کلیک میکنیم فرم Persinfo مجددا باز بشه در حالی که اطلاعات مربوط به کارمند جاری رو که قبلا وارد کردیم نمایش بده تا ما بتونیم در صورت نیاز اطلاعات رو اصلاح کنیم. و با بستنش هم PersList آپدیت بشه.

میشه برای کدهایی که باید توی OnClick اون Button ها بنویسم راهنماییم کنین؟

Mahmood_M
جمعه 13 شهریور 1388, 03:10 صبح
نگفتید مشکلتون کجاست ؟
لطفا بگید برای کدوم قسمت مشکل دارید ... ، سئوالتون خیلی کلی هست ...

موفق باشید ...

Narges-s
جمعه 13 شهریور 1388, 03:36 صبح
نگفتید مشکلتون کجاست ؟
لطفا بگید برای کدوم قسمت مشکل دارید ... ، سئوالتون خیلی کلی هست

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

من برای اولین باری که وارد Perslist میشم و روی دکمه ی صدور فرم جدید کلیک میکنم، با باز شدن Persinfo اطلاعات رو وارد اون میکنم و با ثبت اطلاعات، اسم کارمندی رو که اطلاعاتش رو وارد کردم توی لیست موجود در Perslist میبینم. اما وقتی میخوام اطلاعات یک کارمند دیگه رو وارد کنم، زمانی که روی دکمه ی صدور فرم جدید کلیک میکنم فرم مربوط به کارمند قبلی رو باز میکنه، یعنی Persinfo رو در حالی باز میکنه که اطلاعاتی که واسه کارمند قبلی وارد کردم توش هست! در واقع من میخوام وقتی واسه دومین باز صدور فرم جدید رو کلیک میکنم Persinfo رو خالی و آماده برای ثبت اطلاعات کارمند بعدی باز کنه!

نمیدونم توی OnClick دکمه ی صدور فرم جدید چی باید بنویسم تا این مشکلم حل بشه.

Mahmood_M
جمعه 13 شهریور 1388, 04:17 صبح
شما باید کنترل هایی که برای وارد کردن اطلاعات در فرم PersInfo قرار دادید رو قبل از نمایش فرم خالی کنید ...
مثلا اگه در فرم PersInfo یک Edit قرار دادید ، به این صورت بنویسید :


PesrInfo.Edit.Text := '';
PersInfo.ShowModal;


موفق باشید ...

Felony
جمعه 13 شهریور 1388, 04:50 صبح
PesrInfo.Edit.Clear;

vcldeveloper
جمعه 13 شهریور 1388, 05:21 صبح
اگر بجای کنترل های عادی دلفی، در فرم مربوطه از کنترل های Data-aware (کنترل های موجود در صفحه Data Controls مثل DBEdit) استفاده کنید، هر زمان که جدول به مد Insert بره، کنترل ها بطور خودکار خالی میشند، و لزومی نداره شما آنها را دستی خالی کنید.

اگر به هر دلیلی نمیخواید از کنترل های Data-aware استفاده کنید، می تونید فرم مورد نظر را در هر بار فراخوانی Create کنید، و بطور ShowModal باز کنید، و هر وقت فرم بسته شد، آن را آزاد کنید. اینطوری چون فرم در هر بار فراخوانی یک بار Create میشه، کنترل ها بطور پیش فرض خالی هستند.

Narges-s
جمعه 13 شهریور 1388, 14:54 عصر
شما باید کنترل هایی که برای وارد کردن اطلاعات در فرم PersInfo قرار دادید رو قبل از نمایش فرم خالی کنید ...
مثلا اگه در فرم PersInfo یک Edit قرار دادید ، به این صورت بنویسید :


PesrInfo.Edit.Text := '';
PersInfo.ShowModal;


موفق باشید ...

ممنونم اما من توی فرم ام کلی DBEdit دارم. و سخته که همه رو تک تک خالی کنم .

Narges-s
جمعه 13 شهریور 1388, 15:01 عصر
اگر بجای کنترل های عادی دلفی، در فرم مربوطه از کنترل های Data-aware (کنترل های موجود در صفحه Data Controls مثل DBEdit) استفاده کنید، هر زمان که جدول به مد Insert بره، کنترل ها بطور خودکار خالی میشند، و لزومی نداره شما آنها را دستی خالی کنید.

اگر به هر دلیلی نمیخواید از کنترل های Data-aware استفاده کنید، می تونید فرم مورد نظر را در هر بار فراخوانی Create کنید، و بطور ShowModal باز کنید، و هر وقت فرم بسته شد، آن را آزاد کنید. اینطوری چون فرم در هر بار فراخوانی یک بار Create میشه، کنترل ها بطور پیش فرض خالی هستند.

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

خب من توی OnClick دکمه ی صدور فرم پرسنلی از این کد استفاده کردم :

persinfo:=Tpersinfo.Create(Application);
try
persinfo.ShowModal();
finally
persinfo.Free;
end;

که یکی از بلوک هاش رو هم خودتون بهم معرفی کردید.

مشکل اصلی من اینه که نمیتونم چند تا کارمند رو تعریف کنم. در واقع هر بار صدور فرم پرسنلی رو باز میکنم علاوه بر اینکه اطلاعات کارمندی که قبلا وارد کردم رو نشون میده، امکان اضافه کردن کارمند جدید رو هم نداره . حتی اگه اطلاعات رو هم تغییر بدم بازم این تغییرات رو برای همون کارمند قبلی ذخیره میکنه . من میخوام با هر بار باز کردن فرم پرسنلی بتونم یه کارمند جدید رو تعریف کنم

چقدر سخته آدم مشکلش رو اینجوری توصیف کنه :ناراحت: امیدوارم تونسته باشم منظورم رو برسونم :افسرده:

majid_ramak
جمعه 13 شهریور 1388, 15:48 عصر
ببخشید متوجه نشدم. مگه خود به خود با کلیک روی دکمه ی صدور فرم پرسنلی میشه توی مود Insert قرار گرفت؟

با کلیک بر روی Button صدور فرم پرسنلی و بعد از Show شدن فرم (OnShow) می تونید کانکشن مربوط به DataBase رو در مود Insert قرار بدید.
با این کار با هر بار باز کردن فرم DataControl ها خالی میشن و آماده ورود اطلاعات جدید هستن.
و احتیاجی هم به خالی کردن DBEdit ها نیست.

Narges-s
جمعه 13 شهریور 1388, 16:11 عصر
با کلیک بر روی Button صدور فرم پرسنلی و بعد از Show شدن فرم (OnShow) می تونید کانکشن مربوط به DataBase رو در مود Insert قرار بدید.
با این کار با هر بار باز کردن فرم DataControl ها خالی میشن و آماده ورود اطلاعات جدید هستن.
و احتیاجی هم به خالی کردن DBEdit ها نیست.

مرسی از جوابتون . اما اون فرم از طریق دو تا دکمه باز میشه . یکی واسه اطلاعات جدید و یکی هم واسه ویرایش اطلاعات قبلی . اگه من توی OnShow فرم، کد مروبط به Insert رو بنویسم امکان استفاده از فرم برای ویرایش اطلاعات قبلی از بین میره . درسته؟ :متفکر:

Felony
جمعه 13 شهریور 1388, 16:37 عصر
ممنونم اما من توی فرم ام کلی DBEdit دارم. و سخته که همه رو تک تک خالی کنم .
میتونید با یک حلقه تمام Edit ها رو خالی کنید .

vcldeveloper
جمعه 13 شهریور 1388, 16:49 عصر
ببخشید متوجه نشدم. مگه خود به خود با کلیک روی دکمه ی صدور فرم پرسنلی میشه توی مود Insert قرار گرفت؟


اما اون فرم از طریق دو تا دکمه باز میشه . یکی واسه اطلاعات جدید و یکی هم واسه ویرایش اطلاعات قبلی . اگه من توی OnShow فرم، کد مروبط به Insert رو بنویسم امکان استفاده از فرم برای ویرایش اطلاعات قبلی از بین میره . درسته؟

اگر از DBEdit استفاده کرده باشید، با رفتن به مد Insert، فیلدها بطور خودکار خالی میشند.
اگر فرض بگیریم شما یک دکمه با نام btnInsert برای افزودن رکورد، و یک دکمه با نام btnEdit برای ویرایش رکورد دارید، و دیتاست شما اسمش AdoQuery1 باشه، و فرمی که باید توسط این دو دکمه نمایش داده شود، اسمش perinfo باشه، کدی که برای OnClick آن دو دکمه می نویسید، شبیه به کد زیر خواهد بود:


if Sender is TComponent then
begin
if SameText(TComponent(Sender).Name, 'btnInsert') then
AdoQuery1.Insert
else
if SameText(TComponent(Sender).Name, 'btnEdit') then
AdoQuery1.Edit;
end;

persinfo:=Tpersinfo.Create(Application);
try
persinfo.ShowModal();
finally
persinfo.Free;
end;

majid_ramak
جمعه 13 شهریور 1388, 21:56 عصر
دوست عزیز یه پیشنهاد دارم واستون:
به جای اینکه این فرم توسط دو تا Button باز بشه دو تا Button رو یکی کنید و در خود فرم دوتا Button قرار بدین یکی برای ورود اطلاعات جدید و دیگری برای ویرایش اطلاعات وارد شده.

Narges-s
شنبه 14 شهریور 1388, 05:39 صبح
if Sender is TComponent then
begin
if SameText(TComponent(Sender).Name, 'btnInsert') then
AdoQuery1.Insert
else
if SameText(TComponent(Sender).Name, 'btnEdit') then
AdoQuery1.Edit;
end;

persinfo:=Tpersinfo.Create(Application);
try
persinfo.ShowModal();
finally
persinfo.Free;
end;

من کد شما رو به اینصورت مطابق پروژه ام تغییر دادم :

if Sender is TComponent then
begin
if SameText(TComponent(Sender).Name, 'Button1') then
begin
persinfo.ADODataSet1.Insert;
persinfo.ADODataSet2.Insert;
persinfo.ADODataSet3.Insert;
persinfo.ADODataSet4.Insert;
end
else
if SameText(TComponent(Sender).Name, 'Button2') then
begin
persinfo.ADODataSet1.Edit;
persinfo.ADODataSet2.Edit;
persinfo.ADODataSet3.Edit;
persinfo.ADODataSet4.Edit;
end;
end;
persinfo:=Tpersinfo.Create(Application);
try
persinfo.ShowModal();
finally
persinfo.Free;
end;
end;

مشکلش کجاست که این ارور رو میده؟ :

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0051D476 in module 'Project1.exe'. Read of address 000003D4'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Narges-s
شنبه 14 شهریور 1388, 05:41 صبح
دوست عزیز یه پیشنهاد دارم واستون:
به جای اینکه این فرم توسط دو تا Button باز بشه دو تا Button رو یکی کنید و در خود فرم دوتا Button قرار بدین یکی برای ورود اطلاعات جدید و دیگری برای ویرایش اطلاعات وارد شده.

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

majid_ramak
شنبه 14 شهریور 1388, 08:43 صبح
یه راهی داره:
یک متغییر FFlag تعریف کن از نوع Boolean .
حالا تو OnShow فرمی که میخوای باز کنی این کد رو بنویس:



if FFlag then
ADoQuery1.Insert;
end
else
if FFlag = False then
ADoQuery1.Edit;




حالا تو فرمی که دو تا Button داره تو Insert Button این کد رو بنویس:





Form2:= TForm2.Create(Application);
try
FFlag:= True;
Form2.ShowModal;
finally
Form2.Free;
end;





و تو Edit Button این کد رو:






Form2:= TForm2.Create(Application);
try
FFlag:= False;
Form2.ShowModal;
finally
Form2.Free;
end;

vcldeveloper
شنبه 14 شهریور 1388, 18:04 عصر
مشکلش کجاست که این ارور رو میده؟
دارید از شی ایی استفاده می کنید که یا هنوز Create نشده، یا قبل از اینکه ازش استفاده کنید، Free شده. AV یک خطای خیلی عمومی هست، و فقط با داشتن پیام خطا نمیشه کمک چندانی برای رفعش کرد.

موقع وقوع خطا، دیباگر دلفی روی چه خطی از کد قرار میگیره؟ چه کدی در اون خط نوشته شده؟

nilidelphi
شنبه 14 شهریور 1388, 18:40 عصر
مگه شما نمیگین که دو تا دکمه دارید؟
خوب عزیز همون کاری رو که آقای علی کشاورز گفتن بکنین با این تفاوت که تو یکی از دکمه ها بنویسید:



formx.show;
adotable1.insert;


و در دکمه بعدی هم بنویسید :



formx.show;
adotable1.edit;


البته بستگی به نوع جزئ ساختتون داره منظورم اینه که اگه از dataset یا از کوئری استفاده
کنید کد متناسب با جزء ساخت تغییر میکند.
اینم بگم که این زمانی است که شما از کامپوننت های صفحه ی Data-Control استفاده کنید

Narges-s
یک شنبه 15 شهریور 1388, 03:06 صبح
موقع وقوع خطا، دیباگر دلفی روی چه خطی از کد قرار میگیره؟ چه کدی در اون خط نوشته شده؟

کد مربوط به ایجاد فرم اصلی رو نشون میداد . اما خب به هر حال رفع شد . ممنون :چشمک:

Narges-s
یک شنبه 15 شهریور 1388, 03:15 صبح
مگه شما نمیگین که دو تا دکمه دارید؟ خوب عزیز همون کاری رو که آقای علی کشاورز گفتن بکنین

من از روشی که آقای majid_ramak پیشنهاد دادن استفاده کردم. مشکل ارور هم رفع شد .

یه مشکل کوچولو داره که دیگه اونو میرم هر جور شده از استادمون میپرسم. آخه وقتی حضوری پروژه رو نشون میدی و مشکلش رو میپرسی خیلی راحت تره :چشمک:

ولی تا همین جا رو هم خیلی از آقای کشاورز و majid_ramak ممنونم. کلی کمکم کردید :لبخندساده:

majid_ramak
یک شنبه 15 شهریور 1388, 20:44 عصر
مگه شما نمیگین که دو تا دکمه دارید؟
خوب عزیز همون کاری رو که آقای علی کشاورز گفتن بکنین با این تفاوت که تو یکی از دکمه

دوست عزیز form داره ShowModal میشه اینکه شما میگین در صورتیکه Form.Show اتفاق بیفته.