با سلام
در برنامه من چندین فرم وجود دارد می خواهم برای اجرای هر فرم و با اجرا شدن آن و هر عملیاتی پیامی مبنی بر ( لطفا منتظر بمانید ) را نشان دهد
آیا برای هر عملیاتی باید کدی بنویسم یا راه آسانتری وجود دارد ؟
با سلام
در برنامه من چندین فرم وجود دارد می خواهم برای اجرای هر فرم و با اجرا شدن آن و هر عملیاتی پیامی مبنی بر ( لطفا منتظر بمانید ) را نشان دهد
آیا برای هر عملیاتی باید کدی بنویسم یا راه آسانتری وجود دارد ؟
با تشکر از شما
لینکها را قبلا دیدم چیزی که میخواستم نبود
در برنامه هایی که قبلا دیدم موقع ذخیره یا باز کردن فرم و انجام عملیات خاصی که در برنامه بود چند ثانیه نصبت به نوع عملیات فرمی مثل عکس بالا نشان میداد
چطور میشه در برنامه چنین کاری را انجام داد ؟
کسی راه حلی نداره
چندتا راه :
سادش اینه که بیاید یه پنجره اسپلش طراحی کنید که تو اون یه تابع باشه که مثل تابع نمایش پیام ShowMessage اون پنجره اسپلش رو نشون بده و اونو تو جایی که میخواید صدا بزنید مثل موقع نمایش فرم .
راه دیگه اینه که خودتون یه کلاس فرم سفارشی از کلاس TCustomForm و یا TForm بسازید و تو رویدادهای مورد نظرتون کارهایی که میخواید رو انجام بدید و بعد از اون همه فرمایی رو که ایجاد میکنید بجای کلاس TForm از اون کلاس خودتون ارث ببرید .
موفق باشید
اون عکسی که گذاشتی, چیز پیچیده ای نیستش.
یه progress bar هستش و با یه lable.
یعنی با ترکیب این 2 تا, میتونی یه چیز خوشگل درست کنی ... !
به نظر من میتونی اون رو داخل یه فرم بزاری, و وقتی که خواستی از اون اسپلش استفاده کنی, فرم رو نمایش بدی.
یا اینکه یه کامپیوننت بسازی که خب این کار یه کم سخت هستش.
سلام.
با استفاده از کد هم می تونی در زمان اجرا یک فرم بسازی و این اجزا رو بهش اضافه کنی. یعنی یک تابع بنویسی که موقع فراخوانی شدن این رو بسازه و نمایش بده و موقع بسته شدن اون رو آزاد کنی. مثل MessageBox شما هم یک تابع میسازی و از کامپوننت های دلخواهت با رنگ و اندازه ی دلخواه نمایش میدی. رویدادهای کامپوننت ها رو هم می تونی قبلا تعریف کنی و در زمان اجرا نسبت بدی. مثال :
procedure MessageWaite();
var
f : TForm;
labl : TLabel;
prgs : TProgressBar;
begin
f := TForm.Create( nil );
labl := TLabel.Create( f );
labl.Parent := f;
labl.AutoSize := False;
labl.Align := alTop;
labl.Height := 40;
labl.Caption := ' ...لطفا منتظر بمانید ';
labl.Alignment := TAlignment.taCenter;
labl.Layout := tlCenter;
labl.Font.Style := [fsBold];
labl.Font.Color := $00800000;
labl.Font.Size := 12;
prgs := TProgressBar.Create( f );
prgs.Parent := f;
prgs.Align := alTop;
prgs.Position := 100;
f.Color := $00FFFF00;
f.Width := 200;
f.Height := 100;
f.Position := TPosition.poScreenCenter;
f.ShowModal;
f.Free;
end;
فرم جدا گانه باید بسازم ؟
کجا این کد را قرار بدهم ؟
من زیاد اطلاعی ندارم.
ولی اون کد, یه پروسیجر هستش, و وقتی اون رو فراخوانی کنی, خودش یه فرم میسازه و بقیه کارها رو خود اون پروسیجر انجام میده.
فکر کنم تنها کاری که تو باید بکنی, این هستش که اون موقعی که میخوای اسپلش نمایش داده بشود, پروسیجر رو فراخوانی کنی.
چندان کار خاصی نیاز نیست که انجام بدی.
این procedure خودش فرم رو میسازه و نمایش میده و بعد از اینکه کاربر اونو بست فرم رو آزاد میکنه و شما می تونید این تابع رو داخل یک یونیت مستقل قرار بدی و در قسمت uses هم یونیت های لازم رو اضافه کنی (مربوط به فرم و لیبل و پروگرس بار) و یا اینکه تو هر یونیتی که دوست داشتی اون رو تعریف کن و تو یونیت های دیگه که قراره این تابع صدا زده بشه، یونیتش رو uses کن و تو هر کدوم از فرم هاتون که لازم دارید (یا هر جای برنامه) این procedure رو صدا بزنید. برای ProgressBar هر می تونی داخل همون تابع که نوشتم یک تایمر روی فرم بگذاری (با همون روش که بقیه ی چیزا رو ساختیم) و هر کاری که لازم داری رو همون جا انجام بدی. ولی اگه چیزی مفصل تر می خوای بهتره که این رو به شکل یه فرم ویژوال دلفی بسازی نه یک تابع که با کد همه چیزو میسازه. این روش برای جمع و جور شدن برنامه و نساختن فرم اضافه هست. شما می تونید یک کلاس هر تعریف کنی که این فرم رو داره، نمایش می ده و آزاد میکنه. ولی اگه بخوای کلاس تعریف کنی همون بهتر که از فرم ویژوال خود دلفی استفاده کنی. اما اگه چیز پیچیده نمی خوای روشی مشابه همین تابعی که نوشتم می تونه خوب باشه.
می تونی اون رو پیچیده تر کنی و با دریافت ورودی در procedure متن نوشته و یا زمان انتظار و یا رنگ و ... هر چیزی که لازم دارید هنگام فراخونی تابع تنظیم کنید.
با تشکر
اگر نمونه کاری میگذاشتید بهتر متوجه میشدیم ( نمونه برنامه )
یا سورسی که چنین کاری توش باشه
1. خودت یه نیو پروجکت بساز.
2. اون کدی که آقا محمد ( annanas ), نوشتند رو, توی کد برنامه اضافه کنید.
3. بعدش مثلا توش یه tbutton بزار.
4. توی اون tbutton, کد پرسیجر رو فراخوانی کن.
نیاز به توضیح بیشتری داره ... !؟
اگر داره, بگو تا بگم.
پست اشتبهاهی دادم ویرایش کردم،ببخشید
آخرین ویرایش به وسیله shayanstar : سه شنبه 17 مرداد 1391 در 17:13 عصر
این نمونه برای دو ثانیه انتظار :
WaiteMessage.zip
با تشکر از شما
با دلفی 7 کار نمیکنه ارور میده
[Fatal Error] Project1.dpr(6): File not found: 'Vcl.Forms.dcu'
نام یونیت ها در دلفی XE 2 کمی تغییر کرده است و شما باید به جای VCL.Forms در نسخ قدیمی تر از Forms استفاده کنید.
// شروع برنامه
Form1.Show
ProgressBar1.Max := 100;
While i < 100 Do
Begin
Inc(i);
From1.ProgressBar1.Position := ProgressBar1.Position + 1;
End;
Form1.Close;
این کد را آزمایش کردم جواب نمیده نمیدانم برای چه
سلام و درود بر بزرگترها
میشه من هم نظر بدم؟
به نظر من فرم انتظار نباید Modal باشه چون قراره هنگام انجام عملیات احضار بشه.
دو راه دارین: از یه پنل استفاده کنین و توش ProgressBar به همراه چند تا Label بذارین و وقتی عملیات زمانبر رو انجام میدین Enabled همه چیز رو False کنین تا وقتی کارتون تموم بشه و پنل رو مخفی کنین.
راه دیگه استفاده از یه فرم هست که با Show نشونش میدین.
برنامه Ananas رو مطابق با دلفی شما کردم و میتونم بذارم اما اونی نیست که شما میخواین(با عرض معذرت از دوست خوبم Ananas!)
خیلی پیش یه برنامه نوشته بودم که میخواستم همون ابتدای اجرای برنامه و همچنین در اثنای اجرای برنامه فایلهای کتاب رو بخونم به این منظور یه
فرم ساده بی لبه طراحی کردم با چندتا Label که یکی از اونها شماره فایل جاری رو گزارش می کرد.این فرم بعد از فرم اصلی ساخته میشد!
با یه چنین کدی قبل از یه حلقه که عملیات رو روی فایلها انجام میداد فرم رو می ساختم و نمایش میدام و بعد از حلقه فقط مخفی می کردم.
(راستش این ایده یکی از دوستان بود و نمی دونم چرا Free نمی کردم مشکلی هم پیش نمی اومد):
ProgressUnit.ProgressForm:=TProgressForm.Create(Se lf);
ProgressUnit.ProgressForm.Show;
و در اثناء حلقه خواندن فایلها:
ProgressForm.FileNameLabel.Caption:=FileList.Items[J];
ProgressForm.Refresh;
و در آخر حلقه:
ProgressForm.Hide;
نمی دونم مفید بود یا نه. امیدوارم بدرتون خورده باشه.
اما استفاده از پنل راحت تره.
من style اش رو تغییر دادم. آخه کاری نمیکنه که بخواد پر بشه. البته میتونی به نسبت 2 ثانیه ای که نوشتیم، داخل همون تایمر به مقدار position پروگرس بار اضافه کنی.ProgressBar حرکت نمیکنه پر نمیشه ؟
در این صورت باید برای هر فرم یکی درست کنیم
چطور میشه یک فرم برای همه عملیاتها داشته باشیم
لطفا نمونه کار را اینجا بگذارید تا نحوه کارکرد را همه بدونند ترجیحا با دلفی 7 باشه
نه نه نه. فقط باید تو یونیت هر فرم تو قسمت uses اسم یونیتش رو بنویسی، بعد هر جا خواستی فقط مثل کد من تابع TForm::ShowModal رو فراخوانی کن. دقت کن اسم فرم خودت رو بنویسی. کلا از نمونه کد بنده می تونی طرز نوشتنش رو ببینی.در این صورت باید برای هر فرم یکی درست کنیم
نمونه ی بنده هم یک فرم میسازه و هر زمان که شما تابع ShowModal اش رو فراخونی کنی فرم رو نمایش می ده (دوباره نمی سازدش، یک بار این کار رو کرده فقط شما باید با تابع Show یا ShowModal اون فرم، به نمایش در بیاریش)چطور میشه یک فرم برای همه عملیاتها داشته باشیم
به قول معلم ریاضیمون که کتابی صحبت می کرد : این را دیگر می گذاریم به عهده ی شما!لطفا نمونه کار را اینجا بگذارید تا نحوه کارکرد را همه بدونند ترجیحا با دلفی 7 باشه