PDA

View Full Version : چطوری میشه یه صفحه در ابتدای برنامه تا زمانی که فرم اول نمایش پیدا کند نمایش داد؟



oghab
چهارشنبه 05 بهمن 1384, 17:43 عصر
سلام
نتونستم عنوان بهتری برای تاپیک انتخاب کنم.
من وقتی برنامه ام را run می کنم حدود 7 ثانیه طول میکشه تا فرم اول نمایش پیدا کنه. نمی دونم چرا اینقدر طول میکشه. (اگه میدونید مشکل از کجاست بگید لطفا)
حالا می خواهم تو این 7 ثانیه یه صفحه ای به کاربر نشون داده بشه که مثلا بگه به برناهم فلان خوش آمدید و یکی توضیح و لطفا صبر کنید تا این 7 ثایه خیلی به کاربر نمود نکنه و فکر نکنه برنامه باز نشده و دوباره روش دابل کلیک کنه. یه چیزی مثل همونی که اول خود دلفی یا outlook یا خیلی برنامه های دیگه نمایش داده میشه و بعد محیط برنامه باز میشه.
واسه نمایش این صفحه چیکار باید کرد؟
متشکرم
با آرزوی موفقیت

mzjahromi
چهارشنبه 05 بهمن 1384, 17:59 عصر
Splash
به این فرمی که شما می خواهید میگن Splash
چندین روش داره.
1- Splash فرم اصلی تون باشه و وقتی که همه فرمها ایجاد شدن اونوقت فرم بعدی تون یعنی Main برنامه اجرا بشه.
وقتی Main داره Show میشه Splash نشون داده بشه و عملیات Initialization انجام بشه و بعد کنترل به Main برگردانده بشه

اَرژنگ
چهارشنبه 05 بهمن 1384, 17:59 عصر
یک فرمه جدید به برنامه تان اضافه کنید.
اسمه فرمتان را به SplashScreen تغییر بدید
از Project->Options menue انتخوانب کنید وSplashScreen را از لیست AutoRun حذف کنید.


کد ذیلاً را بعد از begin در فایل dpr. پروژه تان اضافه کنید.

ِ
SplashScreen := TSplashScreen.Create(Application) ;
SplashScreen.Show;
Application.Initialize; //this line exists!
SplashScreen.Update;


بعد از آخرین Application.Create() و قبل از Application.Run statement این کد را اضافه کنید:



SplashScreen.Hide;
SplashScreen.Free;

mzjahromi
چهارشنبه 05 بهمن 1384, 18:16 عصر
این کد رو من قبلا استفاده کردم. ولی یه مشکلی داشت. الان دقیق یادم نیست چی بود ولی یه جائی گیر افتادم و مجبور شدم روش رو عوض کنم. همون جائی هم که نوشتتش این عیب رو نوشته(Delphi about)

اَرژنگ
چهارشنبه 05 بهمن 1384, 18:36 عصر
این کد رو من قبلا استفاده کردم. ولی یه مشکلی داشت. الان دقیق یادم نیست چی بود ولی یه جائی گیر افتادم و مجبور شدم روش رو عوض کنم. همون جائی هم که نوشتتش این عیب رو نوشته(Delphi about)

در این سورت، مثال MastApp درDelphi Demos Folder یک ایده مبده

mzjahromi
چهارشنبه 05 بهمن 1384, 18:39 عصر
در این سورت، مثال MastApp درDelphi Demos Folder یک ایده مبده
نمی دونم منظورتون چیه ولی من این روش رو تو About.delphi خوندم ولی خودش هم گفته بود این روش فقط در فلان حالت جواب میده. الان پیداش نکردم

mzjahromi
چهارشنبه 05 بهمن 1384, 18:55 عصر
http://delphi.about.com/od/formsdialogs/a/splashscreen.htm

اَرژنگ
چهارشنبه 05 بهمن 1384, 19:04 عصر
http://delphi.about.com/od/formsdialogs/a/splashscreen.htm

من همینو با http://fingilish.com ترجمه کردم فرستادم!:لبخند:
در دلفی File->Open Project->Demoes-> DB->MastApp -> Open MastApp Project

mzjahromi
چهارشنبه 05 بهمن 1384, 19:08 عصر
ولی من با این مشکل داشتم. البته زیاد هم باهش ور نرفتم تا دیدم نمیشه از روشهای خودم استفاده کردم
راستی

من همینو با http://fingilish.com ترجمه کردم فرستادم
مگه Finglish اینجور متنها رو هم ترجمه می کنه

اَرژنگ
چهارشنبه 05 بهمن 1384, 19:41 عصر
ولی من با این مشکل داشتم. البته زیاد هم باهش ور نرفتم تا دیدم نمیشه از روشهای خودم استفاده کردم
راستی

مگه Finglish اینجور متنها رو هم ترجمه می کنه

نه ولی برایه تغییر دادن یک متن که از راست به چپ نوشته شده راحتره. من کیبرد فارسی ندارم و تمام متنهام را بوسیله همون سایت مینویسیم، تبدیل متن لاتین به فارسی را سادهتر میکنه. همانطوری که فارسی مینویسیم منتها با لاتین، برایه مثال لاتین همین متن را در زیر اضافه کردم.


nh vly brayh tQyyr dadn yk mtn kh az rast bh Jp nvwth wdh raHtrh. mn kybrd farsy ndarm v tmam mtnham ra bvsylh hmvn sayt mynvysym, tbdyl mtn latyn bh farsy ra sadhtr myknh. hmanTvry kh farsy mynvysym mntha ba latyn, brayh mcal latyn hmyn mtn ra dr zyr axafh krdm.

Identifier
چهارشنبه 05 بهمن 1384, 19:45 عصر
فکر نمیکنی از Keyboard فارسی استفاده کنی راحت تر باشی؟
البته برای مواقع ضروری بد نیست

اَرژنگ
چهارشنبه 05 بهمن 1384, 20:47 عصر
فکر نمیکنی از Keyboard فارسی استفاده کنی راحت تر باشی؟
البته برای مواقع ضروری بد نیست

۱- کیبرد فارسی نصب کردم، ولی من ترکی هم مینویسم ، میشه ۲ زبان چپ به راست و یک زبان راست به چپ
۲- اول با کیبرد لاتین شروع کردم و الان بهش عادت کردم. استفاده از (a) ا برایه الف،(b) ب برایه ب، (d) د برایه د ...، راحتره و برایه من منطقیتره. به راحتی همه متن فارسی را میشه نوشت. اگر به کیبرد لاتین عادت کرده باشید، جایه کلیدهایه فارسی عجیب میاد ، این دو تا کیبردها را با هم مقایسه کنید،
http://www.microsoft.com/globaldev/keyboards/kbdus.htm
http://www.microsoft.com/globaldev/keyboards/kbdfa.htm
به هر حال، این بیشتر برایه استفاده برایه کسانیه که به کیبرد فاسی عادت ندارند و یا هم دسترسی ندارند.

Hamid_PaK
چهارشنبه 05 بهمن 1384, 21:53 عصر
شاید بدرد بخوره ...



procedure InTaskbar(_AppHandle:THandle;_Be:Boolean);
begin
ShowWindow(_AppHandle, SW_HIDE);
if _Be then
SetWindowLong(_AppHandle, GWL_EXSTYLE,WS_EX_WINDOWEDGE)
else
SetWindowLong(_AppHandle, GWL_EXSTYLE,WS_EX_APPWINDOW-WS_EX_TOOLWINDOW);
ShowWindow(_AppHandle, SW_SHOW);
end;

procedure splashScreen(const _App: TApplication;const imgBit: TBitmap;delayShow: Integer = 2000);
var
frm_loader: TForm;
begin
frm_loader := TForm.Create(_App);
InTaskbar(_App.Handle,False);
with frm_loader do
begin
with TImage.Create(nil) do
begin
Parent := frm_loader;
Align := alClient;
Picture.Bitmap := imgBit;
end;
try
Height := imgBit.Height;
Width := imgBit.Width;
FormStyle := fsStayOnTop;
Position := poScreenCenter;
BorderStyle := bsNone;
Show;
_App.ProcessMessages;
Sleep(delayShow);
finally
InTaskbar(_App.Handle,True);
Free;
end;
end;
end;

// put the code on create form event ...
var
aStrm: TBitmap;
begin
aStrm := TBitmap.Create;
try
aStrm.LoadFromFile('...\untitled1.bmp');
splashScreen(Application,aStrm);
finally
aStrm.Free;
end;
end;



یا حق !!!

babak869
چهارشنبه 05 بهمن 1384, 22:39 عصر
دوست عزیز اینم یه نمونه از برنامه Splash Screen البته من از کامپوننت VclSkin در این پروژه استفاده کردم و چون در حال حاضر برنامه دلفی روی سیستمم نصب نیست نتونستم اون کامپوننت رو بردارم.اگه نتونستید استفاده کنید بگید تا برنامه ساده رو آپلود کنم
موفق باشید

Hamid_PaK
پنج شنبه 06 بهمن 1384, 00:33 صبح
یک نمونه که Splash حاوی نوشته و تصویر می تونه باشه ... امیدوارم که مفید باشه ...

یا حق !!!

mzjahromi
پنج شنبه 06 بهمن 1384, 07:55 صبح
nh vly brayh tQyyr dadn yk mtn kh az rast bh Jp nvwth wdh raHtrh. mn kybrd farsy ndarm v tmam mtnham ra bvsylh hmvn sayt mynvysym, tbdyl mtn latyn bh farsy ra sadhtr myknh. hmanTvry kh farsy mynvysym mntha ba latyn, brayh mcal latyn hmyn mtn ra dr zyr axafh krdm
بابا این که خودش نیاز به یک دوره آموزشی داره چون این همون Finglish خودمون نیست بعضی جاهاش فرق می کنه

Hamid_PaK
پنج شنبه 06 بهمن 1384, 09:01 صبح
این یکی رو با کمی تغییرات با کدهای دوستان ترکیب کردم و فکر میکنم چیز جالبی شده ... تست کنید و نظراتتون رو در موردش بگید ...

یا حق !!!

oghab
شنبه 08 بهمن 1384, 13:03 عصر
سلام
از همه دوستان که راهنمایی کردند خیلی خیلی متشکرم.
متاسفانه تا امروز وقت نکردم بشینم سر برنامه و امتحانش کنم.
من یه فرم جدید به اسم splashScreen ساختم و یه image روش قرار دادم و یه عکس برای اول برنامه که تو فتوشاپ ساخته بودم از طریق picture بهش نسبت دادم.

Splash
به این فرمی که شما می خواهید میگن Splash
چندین روش داره.
1- Splash فرم اصلی تون باشه و وقتی که همه فرمها ایجاد شدن اونوقت فرم بعدی تون یعنی Main برنامه اجرا بشه.
وقتی Main داره Show میشه Splash نشون داده بشه و عملیات Initialization انجام بشه و بعد کنترل به Main برگردانده بشه
من درست متوجه نشدم، البته شما خوب گفتید مشکل از مبتدی بودنه منه.

یک فرمه جدید به برنامه تان اضافه کنید.
اسمه فرمتان را به SplashScreen تغییر بدید
از Project->Options menue انتخوانب کنید وSplashScreen را از لیست AutoRun حذف کنید.


کد ذیلاً را بعد از begin در فایل dpr. پروژه تان اضافه کنید.

ِ
SplashScreen := TSplashScreen.Create(Application) ;
SplashScreen.Show;
Application.Initialize; //this line exists!
SplashScreen.Update;


بعد از آخرین Application.Create() و قبل از Application.Run statement این کد را اضافه کنید:



SplashScreen.Hide;
SplashScreen.Free;

این راه خیلی راحت بود و انجامش دادم ولی به یه مشکل برخوردم. (نمی دونم شاید همون مشکلی باشه که آقای ذوالقدر داشتند.)
در ابتدا فرم splash نشون داده میشه. با عکس روش. و بعد از یک ثانیه فرم همچنان نشون داده میشه ولی بدون image که روش گذاشتم (امتحان کردم و کنترلهای دیگه ای مثل lable هم گذاشتم اینها هم ناپدید میشند) و فرم splash بصورت یه فرم خاکستری رنگ خالی نمایش پیدا می کنه تا 7 ثانیه و بعد فرم اصلی نمایش پیدا کنه.

شاید بدرد بخوره ...



procedure InTaskbar(_AppHandle:THandle;_Be:Boolean);
begin
ShowWindow(_AppHandle, SW_HIDE);
if _Be then
SetWindowLong(_AppHandle, GWL_EXSTYLE,WS_EX_WINDOWEDGE)
else
SetWindowLong(_AppHandle, GWL_EXSTYLE,WS_EX_APPWINDOW-WS_EX_TOOLWINDOW);
ShowWindow(_AppHandle, SW_SHOW);
end;

procedure splashScreen(const _App: TApplication;const imgBit: TBitmap;delayShow: Integer = 2000);
var
frm_loader: TForm;
begin
frm_loader := TForm.Create(_App);
InTaskbar(_App.Handle,False);
with frm_loader do
begin
with TImage.Create(nil) do
begin
Parent := frm_loader;
Align := alClient;
Picture.Bitmap := imgBit;
end;
try
Height := imgBit.Height;
Width := imgBit.Width;
FormStyle := fsStayOnTop;
Position := poScreenCenter;
BorderStyle := bsNone;
Show;
_App.ProcessMessages;
Sleep(delayShow);
finally
InTaskbar(_App.Handle,True);
Free;
end;
end;
end;

// put the code on create form event ...
var
aStrm: TBitmap;
begin
aStrm := TBitmap.Create;
try
aStrm.LoadFromFile('...\untitled1.bmp');
splashScreen(Application,aStrm);
finally
aStrm.Free;
end;
end;



یا حق !!!

این یکی رو با کمی تغییرات با کدهای دوستان ترکیب کردم و فکر میکنم چیز جالبی شده ... تست کنید و نظراتتون رو در موردش بگید ...

یا حق !!!
از شما هم منونم. این آخری با حالت محو شدنش خیلی جالب بود. ولی نتونست تو برنامه ام استفاده کنم. اول خطا میداد و بعد من با توجه به برنامه ام و اسم فرم و image ام تغییرش دادم و دیگه خطا نداد ولی فرم splash را هم نشون نداد. نفهمیدم چرا. چون نمنونه برنامه را با دقت نگاه کردم که کدی را از قلم نداخته باشم.

دوست عزیز اینم یه نمونه از برنامه Splash Screen البته من از کامپوننت VclSkin در این پروژه استفاده کردم و چون در حال حاضر برنامه دلفی روی سیستمم نصب نیست نتونستم اون کامپوننت رو بردارم.اگه نتونستید استفاده کنید بگید تا برنامه ساده رو آپلود کنم
موفق باشید


دوست عزیز اینم یه نمونه از برنامه Splash Screen البته من از کامپوننت VclSkin در این پروژه استفاده کردم و چون در حال حاضر برنامه دلفی روی سیستمم نصب نیست نتونستم اون کامپوننت رو بردارم.اگه نتونستید استفاده کنید بگید تا برنامه ساده رو آپلود کنم
موفق باشید
خیلی ممنونم آقای احدی
خوشبختانه تونستم برنامه را باز کنم و کامپونتتی را که گفتید حذف کنم تا برنامه اجرا بشه و از روش شما هم استفاده کردم ولی همون مشکل اول پیش اومد. یعنی
در ابتدا فرم splash نشون داده میشه. با عکس روش. و بعد از یک ثانیه فرم همچنان نشون داده میشه ولی بدون image که روش گذاشتم (امتحان کردم و کنترلهای دیگه ای مثل lable هم گذاشتم اینها هم ناپدید میشند) و فرم splash بصورت یه فرم خاکستری رنگ خالی نمایش پیدا می کنه تا 7 ثانیه و بعد فرم اصلی نمایش پیدا کنه.

نمی دونم کجا اشتباه می کنم که توی برنامه من هیچکدوم ار روشها جواب نمیده! :گریه:

mzjahromi
شنبه 08 بهمن 1384, 17:16 عصر
فکر می کنم شما اگر یه کار بکنید مشکلتون حل میشه
بعد از هر چند تا دستور که تو Splash اجرا می شه یه بار Application.processmessages رو صدا بزن. اینطوری باعث میشه که برنامه ات Not respond نشه. ولی سرعت یکم میاد پائین

oghab
شنبه 08 بهمن 1384, 17:31 عصر
فکر می کنم شما اگر یه کار بکنید مشکلتون حل میشه
بعد از هر چند تا دستور که تو Splash اجرا می شه یه بار Application.processmessages رو صدا بزن. اینطوری باعث میشه که برنامه ات Not respond نشه. ولی سرعت یکم میاد پائین
سلام
مرسی
ولی من تو unit مربوط به splash کدی ننوشتم. فقط یه عکس روش گذاشتم. راه حل آقای آرژنگ و آقای احدی نیازی به اضافه کردن کد توی splash نبود. فقط در قسمت مربوط به prpject لازم بود کد اضافه کنم.

mzjahromi
شنبه 08 بهمن 1384, 18:13 عصر
ولی من تو unit مربوط به splash کدی ننوشتم. فقط یه عکس روش گذاشتم. راه حل آقای آرژنگ و آقای احدی نیازی به اضافه کردن کد توی splash نبود. فقط در قسمت مربوط به prpject لازم بود کد اضافه کنم.

خوب ببینید:
وقتی که Splash نمایش داده میشه بعدش یک کارائی انجام میشه و بعد Splash برداشته میشه. بین همون کارائی که انجام می دی ProccessMessages رو صدا بزن. (حالا هر جا که اون کدها انجام میشه فرقی نمی کنه)

oghab
شنبه 08 بهمن 1384, 18:41 عصر
سلام
ممنون
:تشویق: :لبخندساده