نمایش نتایج 1 تا 4 از 4

نام تاپیک: مشکل با Minimized

  1. #1

    مشکل با Minimized

    با سلام
    من یه مشکلی با Minimized دارم
    وقتی کاربر می خواد این کارو بکنه اون صفحه بصورت کامل مخفی نمیشه و نمیره زیر taskbar بلکه یه پنجره کوچکی از فرم در کنار کلید strat حالت نشسته قرار میگیره

    چطوری میشه اونو مثل دیگر برنامه های ویندوز در حالت مینیوم مخفی کرد؟

    البته اگه main فرم رو خوب مخفی میکنه اما صفحات بعدی رو نه.

  2. #2

    نقل قول: مشکل با Minimized

    در دلفی با دو نوع برنامه عمومی سر و کار داریم : SDI و MDI.

    SDI یا Single Document Interface برنامه هایی است که اغلب اوقات اونا رو ایجاد کردیم. در واقع در این برنامه ها FormStyle تمامی فرمهای برنامه ما خاصیت fsNormal دارند. بنابراین IDE دلفی این برنامه را SDI قلمداد خواهد کرد.

    در برنامه های SDI میتونیم چندین فرم داشته باشیم اما تنها یک فرم فرم اصلی برنامه ما خواهد بود.

    این فرم اصلی اولین فرمی است که در برنامه ما ساخته (Create) میشود. در یونیت Project خود بعد از Initialize برنامتان اگر نگاه کنید متوجه خواهید شد که فرم اصلی برنامه شما کدام فرم است؛ مثلا :

    program Project1;

    uses
    Forms,
    Unit1 in 'Unit1.pas' {Form1},
    Unit2 in 'Unit2.pas' {Form2};

    {$R *.res}

    begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    Application.Run;
    end.

    فرم1 در این مثال Main Form ما خواهد بود.

    بنابراین رفتار ما با این فرم اصلی سرنوشت کل برنامه را تعیین خواهد کرد. با بستن آن کل برنامه بسته شده و با Minimize کردن آن، تمامی فرمهای دیگر نیز مخفی می شوند.
    و تنها فرم اصلی دکمه اش در TaskBar میماند و سایر فرمها را نخواهیم دید. در صورتی که یک فرم فرزند از فرم اصلی Minimize شود بر روی دسکتاپ Minimize خواهد شد.

    بر خلاف SDI در مقابل در برنامه های MDI میتوان بیش از یک فرم Child را در یک والد ایجاد کرد. که با آنها هم کار کرده ایم. FormStyle فرم اصلی ما در این برنامه ها fsMDIForm و در مورد فرمهای فرزند، fsMDIChind خواهد بود.

    اما در مورد سوال شما :

    اگر بخواهیم فرمهای فرزند ما در زمان Minimize شدن فرم اصلی مخفی نشوند یا بتوانیم آن ها را بر روی Taskbar کمینه کنیم بایستی از طریق متد CreateParams، ExStyle خاصیت Params مربوط به فرم فرزند خود را Override کنیم. بعلاوه بایستی والد فرم فرزند را به دسکتاپ ویندوز تغییر دهیم. برای این منظور در یونیت فرم فرزند خود می نویسیم :


    interface

    type
    TForm2 = class(TForm)
    ...
    protected
    procedure CreateParams(var Params: TCreateParams) ; override;
    ...

    implementation

    procedure TForm2.CreateParams(var Params: TCreateParams) ;
    begin
    inherited;

    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;

    Params.WndParent := GetDesktopWindow;
    end;


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

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

  3. #3

    نقل قول: مشکل با Minimized

    تشکر..

    بسیار عالی بود
    ببنید برنامه من جوری هست که اول یک صفحه میاد(همون صفحه اصلی)بعد توی اون صفحه صفحاتی دیگه که حقیقتا هدف برنامه اون صفحات هست انتخاب می شوند
    حال وقتی اون صفحات انتخاب شد دیگه کاری به صفحه اولی نداریم
    با متدی که شما گفتید وقتی صفحه فرزند بالا اومد دوتا دکمه در taskbar نمایش داده میشه
    حالا چیطوری میشه کاری کرد فقط دکمه صفحه ای انتخاب شده در taskbar بمونه..

  4. #4

    نقل قول: مشکل با Minimized

    اگر فرمی را نیاز ندارید آن را Free کنید.

    اما در مورد اینکه میخواهید دکمه اصلی پروژه شما در Taskbar مخفی شود میتوانید دکمه های نوار وظیفه را مدیریت کنید. این کد از جناب احدی است :

    یک پروسیجر تعریف کنید :

    procedure TForm1.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;


    و بعد آن را در بخش Public یونیت خود تعریف کنید تا بتوانید از آن در همه جا استفاده کنید :


    public
    { Public declarations }
    procedure InTaskbar(_AppHandle:THandle;_Be:Boolean);


    حالا هر زمانی که خواستید میتوانید دکمه هر فرمی را با دادن Handle آن مخفی کنید یا نشان دهید مثلا :


    procedure TForm1.FormCreate(Sender: TObject);
    begin
    InTaskbar(Application.Handle, False);
    end;


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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •