PDA

View Full Version : سوال: ساخت اسپلش انتظار یا لطفا منتظر بمانید



ahmadbh
یک شنبه 08 مرداد 1391, 10:56 صبح
با سلام
در برنامه من چندین فرم وجود دارد می خواهم برای اجرای هر فرم و با اجرا شدن آن و هر عملیاتی پیامی مبنی بر ( لطفا منتظر بمانید ) را نشان دهد
آیا برای هر عملیاتی باید کدی بنویسم یا راه آسانتری وجود دارد ؟

کامروا
یک شنبه 08 مرداد 1391, 11:21 صبح
http://barnamenevis.org/showthread.php?162695-%D9%86%D8%AD%D9%88%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA-splash&highlight=splash

http://barnamenevis.org/showthread.php?22310-%D9%86%D9%85%D8%A7%D9%8A%D8%B4-%DA%86%D9%86%D8%AF%D9%8A%D9%86-%D8%B9%D9%83%D8%B3-%D8%AF%D8%B1-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-splash-form&highlight=Splash

ahmadbh
یک شنبه 08 مرداد 1391, 13:45 عصر
با تشکر از شما
لینکها را قبلا دیدم چیزی که میخواستم نبود
در برنامه هایی که قبلا دیدم موقع ذخیره یا باز کردن فرم و انجام عملیات خاصی که در برنامه بود چند ثانیه نصبت به نوع عملیات فرمی مثل عکس بالا نشان میداد
چطور میشه در برنامه چنین کاری را انجام داد ؟

ahmadbh
دوشنبه 09 مرداد 1391, 15:40 عصر
کسی راه حلی نداره

MohsenB
شنبه 14 مرداد 1391, 01:00 صبح
چندتا راه :


سادش اینه که بیاید یه پنجره اسپلش طراحی کنید که تو اون یه تابع باشه که مثل تابع نمایش پیام ShowMessage اون پنجره اسپلش رو نشون بده و اونو تو جایی که میخواید صدا بزنید مثل موقع نمایش فرم .


راه دیگه اینه که خودتون یه کلاس فرم سفارشی از کلاس TCustomForm و یا TForm بسازید و تو رویدادهای مورد نظرتون کارهایی که میخواید رو انجام بدید و بعد از اون همه فرمایی رو که ایجاد میکنید بجای کلاس TForm از اون کلاس خودتون ارث ببرید .


موفق باشید

me.enik
یک شنبه 15 مرداد 1391, 12:35 عصر
اون عکسی که گذاشتی, چیز پیچیده ای نیستش.
یه progress bar هستش و با یه lable.
یعنی با ترکیب این 2 تا, میتونی یه چیز خوشگل درست کنی ... !

ahmadbh
دوشنبه 16 مرداد 1391, 14:53 عصر
اون عکسی که گذاشتی, چیز پیچیده ای نیستش.
یه progress bar هستش و با یه lable.
یعنی با ترکیب این 2 تا, میتونی یه چیز خوشگل درست کنی ... !
اونو خودم ساختم ولی نمیدونم با چه کدی و چطوری اونو فرا خوانی کنم اگه کسی راه حلش را بلده کدش را اینجا بزاره تا بقیه استفاده کنند

me.enik
دوشنبه 16 مرداد 1391, 15:21 عصر
به نظر من میتونی اون رو داخل یه فرم بزاری, و وقتی که خواستی از اون اسپلش استفاده کنی, فرم رو نمایش بدی.
یا اینکه یه کامپیوننت بسازی که خب این کار یه کم سخت هستش.

Ananas
دوشنبه 16 مرداد 1391, 15:56 عصر
سلام.
با استفاده از کد هم می تونی در زمان اجرا یک فرم بسازی و این اجزا رو بهش اضافه کنی. یعنی یک تابع بنویسی که موقع فراخوانی شدن این رو بسازه و نمایش بده و موقع بسته شدن اون رو آزاد کنی. مثل 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;

ahmadbh
دوشنبه 16 مرداد 1391, 16:25 عصر
فرم جدا گانه باید بسازم ؟
کجا این کد را قرار بدهم ؟

me.enik
دوشنبه 16 مرداد 1391, 18:29 عصر
من زیاد اطلاعی ندارم.

ولی اون کد, یه پروسیجر هستش, و وقتی اون رو فراخوانی کنی, خودش یه فرم میسازه و بقیه کارها رو خود اون پروسیجر انجام میده.
فکر کنم تنها کاری که تو باید بکنی, این هستش که اون موقعی که میخوای اسپلش نمایش داده بشود, پروسیجر رو فراخوانی کنی.
چندان کار خاصی نیاز نیست که انجام بدی.

Ananas
دوشنبه 16 مرداد 1391, 21:36 عصر
فرم جدا گانه باید بسازم ؟
کجا این کد را قرار بدهم ؟
این procedure خودش فرم رو میسازه و نمایش میده و بعد از اینکه کاربر اونو بست فرم رو آزاد میکنه و شما می تونید این تابع رو داخل یک یونیت مستقل قرار بدی و در قسمت uses هم یونیت های لازم رو اضافه کنی (مربوط به فرم و لیبل و پروگرس بار) و یا اینکه تو هر یونیتی که دوست داشتی اون رو تعریف کن و تو یونیت های دیگه که قراره این تابع صدا زده بشه، یونیتش رو uses کن و تو هر کدوم از فرم هاتون که لازم دارید (یا هر جای برنامه) این procedure رو صدا بزنید. برای ProgressBar هر می تونی داخل همون تابع که نوشتم یک تایمر روی فرم بگذاری (با همون روش که بقیه ی چیزا رو ساختیم) و هر کاری که لازم داری رو همون جا انجام بدی. ولی اگه چیزی مفصل تر می خوای بهتره که این رو به شکل یه فرم ویژوال دلفی بسازی نه یک تابع که با کد همه چیزو میسازه. این روش برای جمع و جور شدن برنامه و نساختن فرم اضافه هست. شما می تونید یک کلاس هر تعریف کنی که این فرم رو داره، نمایش می ده و آزاد میکنه. ولی اگه بخوای کلاس تعریف کنی همون بهتر که از فرم ویژوال خود دلفی استفاده کنی. اما اگه چیز پیچیده نمی خوای روشی مشابه همین تابعی که نوشتم می تونه خوب باشه.
می تونی اون رو پیچیده تر کنی و با دریافت ورودی در procedure متن نوشته و یا زمان انتظار و یا رنگ و ... هر چیزی که لازم دارید هنگام فراخونی تابع تنظیم کنید.

ahmadbh
سه شنبه 17 مرداد 1391, 14:09 عصر
با تشکر
اگر نمونه کاری میگذاشتید بهتر متوجه میشدیم ( نمونه برنامه )
یا سورسی که چنین کاری توش باشه

me.enik
سه شنبه 17 مرداد 1391, 15:16 عصر
1. خودت یه نیو پروجکت بساز.
2. اون کدی که آقا محمد ( annanas ), نوشتند رو, توی کد برنامه اضافه کنید.
3. بعدش مثلا توش یه tbutton بزار.
4. توی اون tbutton, کد پرسیجر رو فراخوانی کن.

نیاز به توضیح بیشتری داره ... !؟
اگر داره, بگو تا بگم.

shayanstar
سه شنبه 17 مرداد 1391, 17:02 عصر
پست اشتبهاهی دادم ویرایش کردم،ببخشید

Ananas
سه شنبه 17 مرداد 1391, 19:57 عصر
این نمونه برای دو ثانیه انتظار :
90913

ahmadbh
چهارشنبه 18 مرداد 1391, 14:37 عصر
با تشکر از شما
با دلفی 7 کار نمیکنه ارور میده

[Fatal Error] Project1.dpr(6): File not found: 'Vcl.Forms.dcu'

BORHAN TEC
چهارشنبه 18 مرداد 1391, 14:42 عصر
نام یونیت ها در دلفی XE 2 کمی تغییر کرده است و شما باید به جای VCL.Forms در نسخ قدیمی تر از Forms استفاده کنید.

ahmadbh
چهارشنبه 18 مرداد 1391, 15:16 عصر
نام یونیت ها در دلفی XE 2 کمی تغییر کرده است و شما باید به جای VCL.Forms در نسخ قدیمی تر از Forms استفاده کنید.
تغییر دادم ولی باز هم ارور میده

ahmadbh
چهارشنبه 18 مرداد 1391, 15:30 عصر
// شروع برنامه
Form1.Show
ProgressBar1.Max := 100;
While i < 100 Do
Begin
Inc(i);
From1.ProgressBar1.Position := ProgressBar1.Position + 1;
End;
Form1.Close;
این کد را آزمایش کردم جواب نمیده نمیدانم برای چه

ahmadbh
چهارشنبه 18 مرداد 1391, 15:46 عصر
این نمونه برای دو ثانیه انتظار :
90913
ProgressBar حرکت نمیکنه پر نمیشه ؟

mbshareat
چهارشنبه 18 مرداد 1391, 21:22 عصر
سلام و درود بر بزرگترها
میشه من هم نظر بدم؟
به نظر من فرم انتظار نباید 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;
نمی دونم مفید بود یا نه. امیدوارم بدرتون خورده باشه.
اما استفاده از پنل راحت تره.

Ananas
چهارشنبه 18 مرداد 1391, 22:07 عصر
ProgressBar حرکت نمیکنه پر نمیشه ؟
من style اش رو تغییر دادم. آخه کاری نمیکنه که بخواد پر بشه. البته میتونی به نسبت 2 ثانیه ای که نوشتیم، داخل همون تایمر به مقدار position پروگرس بار اضافه کنی.

ahmadbh
شنبه 21 مرداد 1391, 15:02 عصر
در این صورت باید برای هر فرم یکی درست کنیم
چطور میشه یک فرم برای همه عملیاتها داشته باشیم
لطفا نمونه کار را اینجا بگذارید تا نحوه کارکرد را همه بدونند ترجیحا با دلفی 7 باشه

Ananas
شنبه 21 مرداد 1391, 16:11 عصر
در این صورت باید برای هر فرم یکی درست کنیم
نه نه نه. فقط باید تو یونیت هر فرم تو قسمت uses اسم یونیتش رو بنویسی، بعد هر جا خواستی فقط مثل کد من تابع TForm::ShowModal رو فراخوانی کن. دقت کن اسم فرم خودت رو بنویسی. کلا از نمونه کد بنده می تونی طرز نوشتنش رو ببینی.

چطور میشه یک فرم برای همه عملیاتها داشته باشیم
نمونه ی بنده هم یک فرم میسازه و هر زمان که شما تابع ShowModal اش رو فراخونی کنی فرم رو نمایش می ده (دوباره نمی سازدش، یک بار این کار رو کرده فقط شما باید با تابع Show یا ShowModal اون فرم، به نمایش در بیاریش)

لطفا نمونه کار را اینجا بگذارید تا نحوه کارکرد را همه بدونند ترجیحا با دلفی 7 باشه
به قول معلم ریاضیمون که کتابی صحبت می کرد : این را دیگر می گذاریم به عهده ی شما!