PDA

View Full Version : ساخت پنجره ای برای waiting



ALIreza_nil
شنبه 07 شهریور 1383, 13:27 عصر
با سلام
من یک فرم ساخته ام که داخل آن یک شی
َAnimate
هست که یک فایل
AVI
را اجرا میکنه و این فرم موقعی نمایش داده میشه که مثلا من برای یک سری عملیات
پشت پرده وقت نیاز دارم وقتی آن عملیات ها تمام شد باید با یک کد
Form3.close
بسته شود
ولی این فرم با کد بسته نمیشه و فقط اگرشی مثل کلید روی آن بگذارم و این کد را
داخل آن بگذارم بسته میشه
این را هم بگم که با کد
ّform3.showmodal;
آن را باز میکنم اگه امکان داره راهنمائی کنید
:roll:[/b]

ara_prg
شنبه 07 شهریور 1383, 13:36 عصر
اگر آن را ShowModal کنی که دیگر اجرای برنامه به خط بعد نمی رود تا بتوانی آن را با کد Close کنی. برای اینکار بهتر است BorderStyle فرم را به bsNone تبدیل کرده و آن را Show کنی (و نه ShowModal) و بعد هر وقت که خواستی آن را Close کنی. :wink:

_alish_
شنبه 07 شهریور 1383, 13:40 عصر
unit SmallMes_Frm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TSmallMes = class(TForm)
Label1:TLabel;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
tm:integer;
Procedure MyMessage(str:AnsiString;Sec:integer);overload;
Procedure MyMessage(str:AnsiString);overload;

{ Public declarations }
end;

var
SmallMes: TSmallMes;

implementation

{$R *.dfm}

{/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-}

Procedure TSmallMes.MyMessage(str:AnsiString;Sec:integer);
begin
Label1.Caption:=str;
SmallMes.Width:=Label1.Width+15;
Label1.Align:=alClient;
tm:=Sec;
SmallMes.Show();
SmallMes.Update();
if(tm>0)then
Timer1.Enabled:=true
else
Screen.Cursor := crSQLWait;
end;

{/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-}

Procedure TSmallMes.MyMessage(str:AnsiString);
begin
Label1.Caption:=str;
SmallMes.Width:=Label1.Width+15;
Label1.Align:=alClient;
SmallMes.Show();
SmallMes.Update();
end;

{/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-}

procedure TSmallMes.Timer1Timer(Sender: TObject);
begin
Dec(tm);

if tm<=0 then
begin
Timer1.Enabled:=false;
Close();
end;
end;

{/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-}

procedure TSmallMes.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Screen.Cursor := crDefault;
Label1.Align:=alCustom;
Label1.Caption:=' ';
end;

end.



بعد SmallMess.mymeesage را در فرم فراخوانی کن حتی می توانی فرم صدا زننده را Enable:=False کنی تا وقتی که می خواهی فعال شود

SalarSoft
شنبه 07 شهریور 1383, 13:47 عصر
من قبلا یه کامپوننت نوشته ام برای این کار!

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

نام کامپوننت ThreadWorker است از آدرس زیر بگیرش:
http://www.geocities.com/salarsoftxp/downlist/all_downloads.htm

کارهایی رو که لازم است انجا بدی در رویداد OnExecute انجام بده.
و در پایان رویداد onEndExecute رخ خواهد داد.

نمونه استفاده شده از این کامپوننت برنامه Wrapper است! :wink:

در ضمن از ShowModal استفاده نکن!

ALIreza_nil
شنبه 07 شهریور 1383, 15:00 عصر
ممنون از همه :flower: :flower: :flower: :flower:

Mohammad S
یک شنبه 08 شهریور 1383, 00:12 صبح
در ضمن از ShowModal استفاده نکن!
این یعنی چی؟‌! :!:
نوشتن این جمله به این صورت، یک معنی داره اونم اینه که یعنی ShowModal مشکل داره.
اگر اینطوره مشکلش چیه؟

با تشکر :wink:

MiRHaDi
یک شنبه 08 شهریور 1383, 00:49 صبح
سلام
ShowModal یعنی فرم اصلی DEsable تا وقتی که ModalForm فعال هست ! و برای همین هم تا نبندیش به فرم اصلی نمیره ! باید Show کنی و میتونی مثلا وقتی اینو نشون میدی فرم اولی رو پنهان کنی تا کارشو بکنه بعد جاشونو عوض کنی اگه نمیخوای از thread ها استفاده کنی این یک ماس مالیه راحته
قربانت و بای !
راستی SalarSoft جان !‌ این URL که دادی تو اینترنت من فیلتر شده :o
اگه میشه اینجا بفرستش
قربانت

SalarSoft
دوشنبه 09 شهریور 1383, 14:52 عصر
این هم ThreadWorker