View Full Version : ارسال فرم به عنوان متغیر به یک پروسیجر
hadisalahi2
سه شنبه 02 مهر 1387, 20:47 عصر
سلام به همگی دوستان.
من چند تا فرم دارم که داخل اونها چند تا editbox وجود داره از این EditBox ها برای نمایش تاریخ استفاده میکنم.
حالا برای اینکه تاریخ رو داخل هر کدوم از این فرم ها بنویسم ، مجبورم به کادرهای هر فرم جداگانه مقدار بدم. من تمام کدهام رو داخل یک دیتا ماژول مینویسم.
من برای اینکه فرم رو به داخل یک پروسیجر بفرستم به صورت زیر عمل کردم
Procedure Dateshow(FormName:Tform);
begin
FormName.editYear.text:=CalcDate.Year;
FormName.editMonth.text:=CalcDate.Month;
FormName.editDay.text:=CalcDate.Day;
end;
لازمه ذکر کنم CalcDate یک پروسیجره که خودم برای محاسبه تاریخ نوشتم.
حالا موقعی که برنامه رو کامپایل می کنم ، پیغام میده که متغیر FormName برام قابل شناسایی نیست.
من چطور میتونم یک فرم رو به عنوان یک متغیر به یک تابع یا پروسیجر ارسال کنم تا همه کنترلهای اون رو بتونم فقط با یک روال یا تابع مقدار دهی کنم؟
میدوارم منظورم رو متوجه شده باشید.
التماس دعا در این شب قدر
یا حق
Mahmood_M
سه شنبه 02 مهر 1387, 21:19 عصر
در زمانی که پروژه کامپایل میشه مشخص نیست که FormName کدوم فرم برنامه هست و اصلا آیا EditYear رو داره یا نه ، در این صورت EditYear و سایر Edit ها هم شناخته شده نیستن ، شما باید کدتون رو به صورت زیر تغییر بدید :
Procedure Dateshow(FormName : TForm);
begin
(FormName.FindComponent('editYear') as TEdit).Text := CalcDate.Year;
(FormName.FindComponent('editmonth') as TEdit).Text := CalcDate.Month;
(FormName.FindComponent('editday') as TEdit).Text := CalcDate.Day;
end;
در کد بالا ابتدا برنامه در فرمی که اسمش رو دادید ، دنبال Edit ها می گرده و Text اونها رو مقدار میده ، به اشیاء نامشخص ( مثلا اینجا فرم نامشخص هست ) باید به این صورت دسترسی داشته باشید ...
البته به این صورت هم میشه : ( مثلا )
TEdit(FormName.FindComponent('editYear')).Text := CalcDate.Year;
موفق باشید ...
hadisalahi2
سه شنبه 02 مهر 1387, 22:36 عصر
جناب محمودی ، ممنون از لطف شما.
حالا اگه نام EditBox های من داخل هر فرم متغیر باشه باید چی کار کنم.
مثلا در یک فرم نام Edit1 داره و در یک فرم EditYear . در این صورت باید چه کار کنم؟
ممنون از لطفتون.
یا حق
Hsimple11
چهارشنبه 03 مهر 1387, 13:54 عصر
اگر نام کنترلهای خود را ندونید نمیتونید از FindComponent یا FindGlobalComponent استفاده کنید.
hadisalahi2
چهارشنبه 03 مهر 1387, 14:17 عصر
آقای ابراهیم نژاد مشکل توی قسمت اول حل شده، فقط مشکل دوم مشکل دارم که اگه نام Edit های من در هر فرم با هم فرق کنه باید چی کار کنم؟
Mahmood_M
چهارشنبه 03 مهر 1387, 14:46 عصر
اگه نام Edit های من در هر فرم با هم فرق کنه باید چی کار کنم؟
اگه تعداد فرمها کم هست ، یه راهش اینه که در Procedure خودتون چک کنید که فرم داده شده به Procedure کدوم فرم هست ، و اسم Edit های همون فرم رو بنویسید ...
شما باید Edit هاتون رو به صورت خاصی نامگذاری کنید ، یا همه به یک نام باشن ، یا اینکه مثلا نام فرم + نام Edit یا همچین چیزی ، به عنوان مثال فرض کنید دو تا فرم دارید روی هرکدوم همین Edit های مربور به تاریخ هست ، اسم فرمهاتون هم به ترتیب Frm1 و Frm2 هست ، حالا اگه نام Edit هاتون Frm1Year و Frm1Month و Frm1Day و Frm2Year و Frm2Month و Frm2Day باشه می تونید به صورت زیر کد نویسی کنید :
(FormName.FindComponent(FormName.name+'Year') as TEdit).Text := CalcDate.Year;
اینطوری ، نام کامپوننتی که در FindComponent وارد میشه ، میشه نام فرمی که بهش داده شده + نام Edit و در واقع میشه همون نام Edit روی اون فرم ...
البته مورد بالا برای زمانی هست که شما می خواید حتما Edit هاتون نامهای متفاوت داشته باشن .
به هر حال باید نامهای خاصی برای Edit هاتون بزارید تا قابل تشخیص باشه ، در غیر اینصورت من راه دیگه ای به ذهنم نمی رسه ...
موفق باشید ...
hadisalahi2
چهارشنبه 03 مهر 1387, 16:52 عصر
دوست عزیز ممنون از راهنمایی تون.
خوشبختانه من مشکلم حل شد ، من پروسیجر رو به صورت زیر تعریف کردم.
procedure TMainForm.DateCalculate(valueDate:string;FormName: TForm;YearEdit,MonthEdit,DayEdit:TEdit);
(FormName.FindComponent(YearEdit.Name) as TEdit).Text := Year;
(FormName.FindComponent(MonthEdit.Name) as TEdit).Text := Month;
(FormName.FindComponent(DayEdit.Name) as TEdit).Text := Day;
end;
موقع فراخوانی هم با هر نام Edit می تونم اون رو به صورت زیر فراخوانی کنم.
MainForm.DateCalculate(MainForm.CalcDate,ErrorAddF orm,ErrorAddForm.Edit3,ErrorAddForm.Edit2,ErrorAdd Form.Edit1);
MainForm.DateCalculate(MainForm.CalcDate,ErrorAddF orm,ErrorAddForm.Edit9,ErrorAddForm.Edit8,ErrorAdd Form.Edit7);
MainForm.DateCalculate(MainForm.CalcDate,ErrorAddF orm,ErrorAddForm.YearEdit,ErrorAddForm.MonthEdit,E rrorAddForm.DayEdit);
یا حق
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.