PDA

View Full Version : مشکل در برنامه Run Time و عدم اجرای فرامین



Mask
یک شنبه 05 اردیبهشت 1389, 00:46 صبح
با سلام به دوستان عزیز
بنده در حال نوشتن برنامه ای هستم که بنا به نیاز به تعداد نامشخصی فرم در حالت ران تایم ایجاد می کنم که بر روی این فرمها دکمه و یک ادیت هست.
اکنون که در دکمه ام دستوری را فراخانی میکنم انجام نمیشود
نمونه ای را اینجا گذاشتم تا دوستان نظرشون رو بدهند.
برای اعمال دستورات باید ابتدا در درایو c سیستمتان 5 فایل به نامهای
1.txt
2.txt
3.txt
4.txt
5.txt
ایجاد کنید.
ممنون از وقتی که میزارید

Felony
یک شنبه 05 اردیبهشت 1389, 06:21 صبح
ضمیمه رو ببینید .

Mask
یک شنبه 05 اردیبهشت 1389, 10:27 صبح
با سلام
ممنون از برنامتون.
اما هنوز مشکل پا برجاست و برنامه قادر به اجرای دستورات زیر نیست.(حذف فایل مقصد وارد شده در ادیت و سپس بسته شدن فرم جاری)

DeleteFile(MyEdit.Text);
MyForm.Visible:=False;

Felony
یک شنبه 05 اردیبهشت 1389, 11:42 صبح
معلومه که مشکل داره ! ، شما با یک متغییر 5 تا Edit ساختید ، وقتی کدتون رو فرا میخونید متن داخل آخرین Edit ساخته شده برگشت داده میشه و این طبیعی هست ، باید یک خصیصه منحصر به فرد برای کنترل ها در نظر بگیرید و با توجه به اون فرم جاری و بعد Edit روی اون رو به دست بیارید و بعد متنش رو استخراج کنید .

کدتون رو اصلاح کردم ، برنامه ضمیمه رو ببینید .

Mask
یک شنبه 05 اردیبهشت 1389, 14:50 عصر
ممنون دوست من بابته اینکه وقت میزارید.
بازم این برنامه فایلهارو در مسیرهای مورد نظر پاک نمیکنه.
مشکل همچنان پا برجاست.
ممنون.

Felony
یک شنبه 05 اردیبهشت 1389, 15:32 عصر
من تست کردم ، فایل ها رو درست پاک میکنه و فرم رو هم مخفی میکنه ، احتمالا دسترسی لازم برای خذف از درایو سیستم عامل رو ندارید ، آدرس فایل ها رو یک درایو به غیر از درایو سیستم عامل بدید .

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

Mahmood_M
یک شنبه 05 اردیبهشت 1389, 16:39 عصر
من تست کردم ، فایل ها رو درست پاک میکنه و فرم رو هم مخفی میکنه
در آخر کار به جای اینکه MyForm رو مخفی کنی باید فرم ساخته شده رو با توجه به نامش مخفی کنی :
(FindComponent('FRM'+IntToStr(TButton(Sender).Tag) ) as TForm).Close;

یک راه ساده ترش اینه که یک متغیر با نوع TForm تعریف کنی و اون رو به عنوان فرم قرار بدی ، یک نمونه ضمیمه کردم ...

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

Felony
یک شنبه 05 اردیبهشت 1389, 18:48 عصر
در آخر کار به جای اینکه MyForm رو مخفی کنی باید فرم ساخته شده رو با توجه به نامش مخفی کنی :
(FindComponent('FRM'+IntToStr(TButton(Sender).Tag) ) as TForm).Close;



بله درسته ، من به قسمت آخر توجه نکرده بودم ، این کد :
MyForm.Visible:= False;
رو با این کد تعویض کنید :

(FindComponent('FRM'+IntToStr(TButton(Sender).Tag) ) as TForm).Visible:= False;

Mask
یک شنبه 05 اردیبهشت 1389, 21:07 عصر
ممنون از دوستان گل.
یه سوال دیگه برام پیش اومده و اینه که چکاری باید انجام داد که با کلید کردن مجدد روی باتن چنین پیغامی نیاد و مجددا این کار انجام بشه.

Felony
یک شنبه 05 اردیبهشت 1389, 21:15 عصر
مقدار Action در رویداد OnClose فرم ها رو با caFree مقدار دهی کنید تا در زمان بسته شدن فرم ها و کنترل های روی آنها آزاد شوند .

Mask
یک شنبه 05 اردیبهشت 1389, 21:30 عصر
ممنون.
اما یه بار درست شد و با کلیک مجدد دیگه پیغام نداد.
اما برای بار سوم دوباره همین پیغام اومد.
و در ضمن اگه با دکمه ضربدر گوشه فرمهای ایجاد شده ، فرم رو ببندیم بازم مشکل حل میشه.
اما وقتی روی دکمه کلیک میکنیم و پنجره بسته میشه این اتفاق نمیوفته.

Felony
یک شنبه 05 اردیبهشت 1389, 21:52 عصر
خوب برای اینکه دکمه ها فرم رو مخفی میکنن و رویداد onClose اجرا نمیشه ، تو رویداد OnHide فرم ها باید اون ها رو آزاد کنید ، نمونه ضمیمه شده رو ببینید ، در ضمن در زمان بسته شدن فرم حتما رویداد OnHide اجرا میشه ولی زمان اجرا رویداد OnHide لزوما رویداد OnClose اجرا نمیشه .

پس در این صورت آزاد کردن فرم ها در رویداد OnHide کافی هست و نیازی به مقدار دهی به Action در رویداد OnClose نیست .

Mahmood_M
یک شنبه 05 اردیبهشت 1389, 22:04 عصر
ممنون از دوستان گل.
یه سوال دیگه برام پیش اومده و اینه که چکاری باید انجام داد که با کلید کردن مجدد روی باتن چنین پیغامی نیاد و مجددا این کار انجام بشه.
یک راه دیگش اینه که برای فرمها نام قرار ندید ، مثل همون مثالی که ضمیمه کردم ...

ممنون.
اما یه بار درست شد و با کلیک مجدد دیگه پیغام نداد.
اما برای بار سوم دوباره همین پیغام اومد.
و در ضمن اگه با دکمه ضربدر گوشه فرمهای ایجاد شده ، فرم رو ببندیم بازم مشکل حل میشه.
اما وقتی روی دکمه کلیک میکنیم و پنجره بسته میشه این اتفاق نمیوفته.
به جای اینکه Visible فرمها رو False کنید اون ها رو Close کنید ، Close هم کارش False کردن Visible هست ...

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

Mask
سه شنبه 07 اردیبهشت 1389, 15:05 عصر
ممنون از دوستان خوبم.
در ابتدا میشه در مورد نحوه کلی کار این برنامه توضیح بدید.
و در ضمن کدهای زیر رو یه توضیحی بدید.

EDText:= ((FindComponent('FRM'+IntToStr(TButton(Sender).Tag )) as TForm).
FindComponent('ED'+IntToStr(TButton(Sender).Tag)) as TEdit).Text;
DeleteFile(EDText);
(FindComponent('FRM'+IntToStr(TButton(Sender).Tag) ) as TForm).Visible:= False;
و همچنین آیا میشه کاری کرد که اگه کاربر روی دکمه فرمهای ایجاد شده کلیک نکرد بازم اشیائ ایجاد شده free بشوند.
چون گاهی کاربر بدون بستن فرمهای ایجاد شده دوباره بر روی باتن اصلی روی برنامه کلیک میکنه و با پیغام زیر مواجه میشه.

Felony
سه شنبه 07 اردیبهشت 1389, 19:47 عصر
EDText:= ((FindComponent('FRM'+IntToStr(TButton(Sender).Tag )) as TForm).
FindComponent('ED'+IntToStr(TButton(Sender).Tag)) as TEdit).Text;
در کد بالا به وسیله خصیصه Tag کلید ها فهمیدیم که کدوم کلید ( 1 تا 5 ) فشار داده شده و به وسیله این Tag فرم جاری رو پیدا کردیم ( Tag = 1 یعنی دکمه 1 و دکمه 1 هم روی فرم 1 هست ، Tag = 2 یعنی دکمه 2 و دکمه 2 هم روی فرم 2 هست و ... ) حالا که فرم جاری که کلید روی آن کلیک شده رو پیدا کردیم باید روی این فرم به دنبال شئ Edit بگردیم تا متنش رو به دست بیاریم ، به وسیله همون تگ شئ Button به شئ Edit دسترسی پیدا کردیم و مقدار Text اون رو به دست آوردیم .


DeleteFile(EDText);
حالا متنی که داخل متغیر EDText هست برابر با متن داخل شئ Edit ی هست که روی دکمه اون کلیک شده .


(FindComponent('FRM'+IntToStr(TButton(Sender).Tag) ) as TForm).Visible:= False;
به وسیله Tag کلید درخواست کننده فهمیدیم که کلید روی کدوم فرم قرار داره و اون فرم رو مخفی کردیم .

دقت کنید که Tag ها رو در زمان ساخت اشیاء خودمون به اون ها اختصاص دادیم .


و همچنین آیا میشه کاری کرد که اگه کاربر روی دکمه فرمهای ایجاد شده کلیک نکرد بازم اشیائ ایجاد شده free بشوند.
چون گاهی کاربر بدون بستن فرمهای ایجاد شده دوباره بر روی باتن اصلی روی برنامه کلیک میکنه و با پیغام زیر مواجه میشه.
به وسیله تابع Assigned میتونید تشخیص بدید که شئ مورد نظرتون ساخته شده یا نه ، با هر بار کلیک روی دکمه ساخت فرم ها ابتدا چک کنید اگر فرم ها قبلا ساخته شده بود اونها رو آزاد کنید و بعد دوباره بسازیدشون ، نمونه ای که ضمیمه کردم ببینید .

Mask
چهارشنبه 08 اردیبهشت 1389, 14:53 عصر
ممنون دوست عزیز واقعا عالی بود.
یه سوال دیگه داشتم و اینه که حالا اگه بخواهیم دوتا دکمه روی صفحه داشته باشیم و دکمه دوم عمل دیگه ای رو انجام بده .خاصیت onclick رو چطوری باید تعریف کرد که با دکمه قبلی قاطی نشه.؟
به نظر tag این دکمه رو میشه در همون حلقه با یه متغیر دیگه اختصاص داد.
درسته؟

Mahmood_M
چهارشنبه 08 اردیبهشت 1389, 16:36 عصر
خاصیت onclick رو چطوری باید تعریف کرد که با دکمه قبلی قاطی نشه.؟
شما هر چند تا OnClick که خواستید می تونید تعریف کنید و به هر دکمه ی دلخواه اختصاص بدید ، فقط کافیه اونها رو برای کلاس فرم ( مثلا در بخش Public فرم ) یا ... به صورت زیر :
type
TForm1 = class(TForm)
...
procedure MyOnClick1(Sender : TObject);
procedure MyOnClick2(Sender : TObject);
...
private
{ Private declarations }
public
{ Public declarations }
end;

و در پایین Implementation هم به صورت زیر تعریف کنید :
var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyOnClick1(Sender : TObject);
begin
...
end;

procedure TForm1.MyOnClick2(Sender : TObject);
begin
...
end;

...

بعد هر جایی که خواستید می تونید به این صورت اون رو به OnClick دکمه ها اختصاص بدید :
begin
Button1.OnClick := MyOnClick1;
Button2.OnClick := MyOnClick2;
...
end;

می تونید یک Procedure رو به دو Button هم اختصاص بدید ...

این مقاله (http://www.delphiplus.com/post/39) هم می تونه کمکتون کنه ...

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

Mask
چهارشنبه 15 اردیبهشت 1389, 14:32 عصر
ممنون از دوستان خوب
فرم و ادیت و باتن رو در حالت run time ساختم.
اما حالا یه مشکل پیش اومده.
در اون ادیتی که در این حالت ساخته شده مسیر جاری کاربر ریخته میشه اما Length ادیت ساخته شده تا 50 کارکتر بیشتر متن داخلش قرار نمیگیره.
اومدم زمانی که میخاد ادیت ساخته بشه MaxLength رو برابر با 0 گزاشتم . اما بازم فایده نداشت.
به نظرتون باید چیکار کرد؟

Felony
چهارشنبه 15 اردیبهشت 1389, 21:43 عصر
سورس رو قرار بدید .