2012-08-05 8 views
10

में डेल्फी फॉर्म को छोटा करें मैं डेल्फी शिक्षार्थी हूं। मैं समाधान की तलाश में हूं ताकि डेल्फी मेनफॉर्म को टास्कबार की बजाय सिस्टम ट्रे में कम किया जाना चाहिए। सिस्टम ट्रे आइकन पर राइट क्लिक पर कुछ मेनू "पुनर्स्थापना" और "इसके बारे में" और "सहायता" आदि होना चाहिए। सिस्टम ट्रे आइकन इमेजेलिस 1 से लोड किए जाएंगे और यह एनिमेट होगा। "पुनर्स्थापित" पर क्लिक करने पर मेनफॉर्म को पुनर्स्थापित किया जाएगा, "फ़ॉर्म" पर क्लिक करने पर "फॉर्म 2" को पुनर्स्थापित किया जाएगा और "सहायता" "Foprm3" पर क्लिक करने पर पुनर्स्थापित किया जाएगा। मैं की तरह इंटरनेट पर इतने सारे समाधान मिल गया है:सिस्टम ट्रे

Solution 01

Solution 02

लेकिन हर समाधान कुछ कमियां हैं। कुछ बार एक बार किया जा सकता है। कुछ विंडोज 7 में धुंधला आइकन है। कोई यह बता सकता है कि मेरे लिए कोड लिखने के लिए कोई नहीं है और मुझे अपने कोड दिखाना है। Plaese इस संबंध के लिए मुझे माफ कर दो। कृपया मुझे ठोस समाधान दें कि इसे विंडोज़ की संस्करण निर्भरता के बिना सार्वभौमिक रूप से कार्यान्वित किया जा सकता है। यह हर किसी की मदद करेगा। क्रिप्या मेरि सहायता करे।

+2

डेल्फी द्वारा प्रदान की trayicon घटक का प्रयोग करें। धुंधला आइकन का अर्थ है कि आपके ट्रे आइकन से जुड़े आइकन सिस्टम ट्रे आइकन आकार के समान आकार नहीं हैं (इस प्रकार, विंडोज़ को इसका आकार बदलना है), इसलिए आपको अपने आइकन को कई आकारों में प्रदान करना होगा जिसमें बुद्धि सिस्टम ट्रे से मेल खाता है आइकन आकार – Jay

+1

आइकन के आवश्यक आकार को काम करने के लिए 'GetSystemMetrics (SM_CXSMICON)' का उपयोग करें। यदि आपके पास सही आकार नहीं है, तो दाएं आकार का 32 बीपीपी बिटमैप बनाएं, इसे पारदर्शी पिक्सल से भरें, और फिर इस बिटमैप के बीच में घुमाएं, दाएं आकार से छोटा निकटतम आइकन। फिर बिटमैप को एक आइकन में कनवर्ट करें और आप सुनहरे हैं। 100% से अलग फ़ॉन्ट स्केलिंग के लिए आप 'SM_CXSMICON' मीट्रिक के लिए विभिन्न मान प्राप्त कर सकते हैं। –

+0

मैं एक शिक्षार्थी हूं, मुझे नहीं पता कि "GetSystemMetrics (SM_CXSMICON)" का उपयोग कैसे करें। कृपया एक पूरा समाधान दें। अगर मैं फॉर्म आइकन सेट करता हूं, तो यह Win7 में और "Alt + Tab" में धुंधला हो जाता है। क्रिप्या मेरि सहायता करे। –

उत्तर

18

यह आपको जाना चाहिए। अपने फॉर्म पर TTrayIcon और TApplicationEvents ड्रॉप करें। यह निम्नलिखित कोड docwiki से TTrayIcon - Delphi Example से है। आईडीई मुख्य मेनू का उपयोग करें, और Project->View Source चुनें, और वह पंक्ति जो Application.ShowMainFormOnTaskbar := True; को 'एप्लिकेशन' पर पढ़ती है .ShowMainFormOnTaskbar: = गलत; ' एप्लिकेशन के बटन को विंडोज टास्कबार पर दिखने से रोकने के लिए।

यह उदाहरण एक ट्रे आइकन और एक फॉर्म इवेंट घटक का उपयोग करता है। जब एप्लिकेशन चलता है, तो यह ट्रे आइकन लोड करता है, एनिमेटेड होने पर प्रदर्शित आइकन, और यह एक संकेत गुब्बारा भी सेट करता है। जब आप खिड़की को कम करते हैं, तो फॉर्म छिपा हुआ होता है, एक संकेत गुब्बारा दिखाई देता है, और ट्रे आइकन प्रदर्शित होता है और एनिमेटेड होता है। सिस्टम ट्रे आइकन पर डबल-क्लिक करने से विंडो को पुनर्स्थापित किया जाता है।

// Add this to the `TApplicationEvents.OnMinimize` event handler 
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); 
begin 
    { Hide the window and set its state variable to wsMinimized. } 
    Hide(); 
    WindowState := wsMinimized; 

    { Show the animated tray icon and also a hint balloon. } 
    TrayIcon1.Visible := True; 
    TrayIcon1.Animate := True; 
    TrayIcon1.ShowBalloonHint; 
end; 

// Add this to the `TForm.OnCreate` event handler 
procedure TForm1.FormCreate(Sender: TObject); 
var 
    MyIcon : TIcon; 
begin 
    { Load the tray icons. } 
    TrayIcon1.Icons := TImageList.Create(Self); 
    MyIcon := TIcon.Create; 
    MyIcon.LoadFromFile('icons/earth1.ico'); 
    TrayIcon1.Icon.Assign(MyIcon); 
    TrayIcon1.Icons.AddIcon(MyIcon); 

    MyIcon.LoadFromFile('icons/earth2.ico'); 
    TrayIcon1.Icons.AddIcon(MyIcon); 
    MyIcon.LoadFromFile('icons/earth3.ico'); 
    TrayIcon1.Icons.AddIcon(MyIcon); 
    MyIcon.LoadFromFile('icons/earth4.ico'); 
    TrayIcon1.Icons.AddIcon(MyIcon); 

    { Set up a hint message and the animation interval. } 
    TrayIcon1.Hint := 'Hello World!'; 
    TrayIcon1.AnimateInterval := 200; 

    { Set up a hint balloon. } 
    TrayIcon1.BalloonTitle := 'Restoring the window.'; 
    TrayIcon1.BalloonHint := 
    'Double click the system tray icon to restore the window.'; 
    TrayIcon1.BalloonFlags := bfInfo; 
end; 

// Add this to the `TTrayIcon.OnDoubleClick` event handler 
procedure TForm1.TrayIcon1DblClick(Sender: TObject); 
begin 
    { Hide the tray icon and show the window, 
    setting its state property to wsNormal. } 
    TrayIcon1.Visible := False; 
    Show(); 
    WindowState := wsNormal; 
    Application.BringToFront(); 
end; 

मेनू आप पर मिल के लिए राइट क्लिक करें, अपने फार्म के लिए एक TPopupMenu जोड़ने के लिए, आइटम आप उस पर चाहते हैं जोड़ने के लिए, हमेशा की तरह उन वस्तुओं के लिए ईवेंट हैंडलर्स लिखते हैं, और उसके बाद PopupMenu को असाइन TrayIcon.PopupMenu संपत्ति।

"धुंधले आइकन" आपके द्वारा उचित आइकन आकारों का उपयोग नहीं कर रहे हैं और विंडोज़ को स्केल करने के लिए मजबूर किया जा रहा है। प्रत्येक आइकन के लिए एकाधिक आकार छवियां बनाने के लिए आइकन संपादक का उपयोग करें (एक आइकन फ़ाइल में कई आकार हो सकते हैं)।

+0

बहुत बहुत धन्यवाद। आपका समाधान मेरे लिए एक छोटी सी समस्या के साथ ठीक काम कर रहा है। मेरी प्रोजेक्ट में, मैं "फॉर्ममिनेमाइजिंग" "फॉर्मशोइंग" "फॉर्महाइडिंग" और "फॉर्म रीस्टोरिंग" के लिए "टाइमर" का उपयोग कर रहा हूं। आप मेरी परियोजना को निम्न लिंक में पा सकते हैं। [** मेरा प्रोजेक्ट **] (http://stackoverflow.com/questions/11699277/delphi-form-switching-using-timer/11705857#11705857) फॉर्म को कम करने के बाद, यह "SystemTray" पर जाता है लेकिन यह भी उपलब्ध है "TaskBar"। तो मैंने [** समाधान **] (http://stackoverflow.com/questions/681621/hide-the-main-form-in-a-delphi-2009- अनुप्रयोग) में मिले समाधान का प्रयास किया, तो फॉर्म अदृश्य है । –

+1

'आवेदन .ShowMainFormOnTaskbar' के बारे में पहले पैराग्राफ में मेरा संपादन देखें। :-) –

+0

उत्कृष्ट उदाहरण, धन्यवाद! – TheSteven

1

मैंने निम्नलिखित कोड लागू किए हैं। यहां सब कुछ ठीक है। फार्म को न्यूनतम करने के बाद, यह हो जाता है "SystemTray" लेकिन में "TaskBar। अपने आवेदन के लिए," AlphaBlend Form001 "की संपत्ति" "सच है और" AlphaBlendValue भी उपलब्ध करने के लिए "" है "0।

unit KoushikHalder001; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls, Vcl.Imaging.pngimage, 
    Vcl.AppEvnts, Vcl.ImgList, Vcl.Menus; 

type 
    TForm001 = class(TForm) 
    Edit001: TEdit; 
    Background: TImage; 
    BitBtn001: TBitBtn; 
    BitBtn002: TBitBtn; 
    FadeInTimer: TTimer; 
    FadeOutTimer: TTimer; 
    FormMinimizeTimer: TTimer; 
    FormRestoreTimer: TTimer; 
    TrayIcon: TTrayIcon; 
    PopupMenu: TPopupMenu; 
    ImageList: TImageList; 
    ApplicationEvents: TApplicationEvents; 
    Form001Close: TMenuItem; 
    Form001Hide: TMenuItem; 
    Form001Show: TMenuItem; 
    Form002Close: TMenuItem; 
    Form002Hide: TMenuItem; 
    Form002Show: TMenuItem; 
    N01: TMenuItem; 
    N02: TMenuItem; 
    N03: TMenuItem; 
    N04: TMenuItem; 
    N05: TMenuItem; 
    N06: TMenuItem; 
    N07: TMenuItem; 
    N08: TMenuItem; 
    N09: TMenuItem; 
    N10: TMenuItem; 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    procedure FormCreate(Sender: TObject); 
    procedure FormHide(Sender: TObject); 
    procedure FormShow(Sender: TObject); 
    procedure BitBtn001Click(Sender: TObject); 
    procedure BitBtn002Click(Sender: TObject); 
    procedure FadeInTimerTimer(Sender: TObject); 
    procedure FadeOutTimerTimer(Sender: TObject); 
    procedure FormMinimizeTimerTimer(Sender: TObject); 
    procedure FormRestoreTimerTimer(Sender: TObject); 
    procedure ApplicationEventsMinimize(Sender: TObject); 
    procedure TrayIconDblClick(Sender: TObject); 
    procedure Form001CloseClick(Sender: TObject); 
    procedure Form001HideClick(Sender: TObject); 
    procedure Form001ShowClick(Sender: TObject); 
    procedure Form002CloseClick(Sender: TObject); 
    procedure Form002HideClick(Sender: TObject); 
    procedure Form002ShowClick(Sender: TObject); 
    private 
    { Private declarations } 
    CrossButtonClick: Boolean; 
    procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest; 
    procedure WMSysCommand(var Msg: TWMSysCommand) ; message WM_SysCommand; 
    public 
    { Public declarations } 
    end; 

var 
    Form001: TForm001; 

implementation 

{$R *.dfm} 

uses KoushikHalder002; 


procedure TForm001.WMNCHitTest(var Msg: TWMNCHitTest); 
begin 
    inherited; 
    if ControlAtPos(ScreenToClient(Msg.Pos), True, True, True)= nil 
    then 
     begin 
     if Msg.Result=htClient then Msg.Result := htCaption; 
     end; 
end; 

procedure TForm001.WMSysCommand(var Msg: TWMSysCommand); 
begin 
    case Msg.CmdType of 
    SC_MINIMIZE: 
     begin 
     if Form001.AlphaBlendValue > 0 then 
      begin 
      Form001.FormMinimizeTimer.Enabled := true; 
      Exit; 
      end; 
     end; 
    SC_RESTORE: 
     begin 
     if Form001.AlphaBlendValue < 220 then 
      begin 
      Form001.FormRestoreTimer.Enabled := True; 
      end; 
     end; 
    end; 
    inherited; 
end; 

procedure TForm001.ApplicationEventsMinimize(Sender: TObject); 
begin 
    Form001.FormMinimizeTimer.Enabled := true; 
    TrayIcon.Visible := True; 
    TrayIcon.Animate := True; 
    TrayIcon.ShowBalloonHint; 
end; 

procedure TForm001.BitBtn001Click(Sender: TObject); 
begin 
    if Form002.WindowState = wsMinimized then 
    begin 
     Form002.Perform(WM_SYSCOMMAND, SC_RESTORE, 0); 
    end 
    else 
    Form002.show; 
end; 

procedure TForm001.BitBtn002Click(Sender: TObject); 
begin 
    Form002.FadeOutTimer.Enabled := true; 
    Form001.FadeOutTimer.Enabled := true; 
end; 

procedure TForm001.Form001CloseClick(Sender: TObject); 
begin 
    Form002.FadeOutTimer.Enabled := true; 
    Form001.FadeOutTimer.Enabled := true; 
end; 

procedure TForm001.Form001HideClick(Sender: TObject); 
begin 
Form001.FormMinimizeTimer.Enabled := true; 
end; 

procedure TForm001.Form001ShowClick(Sender: TObject); 
begin 
    if Form001.WindowState = wsMinimized then 
    begin 
     Form001.Perform(WM_SYSCOMMAND, SC_RESTORE, 0); 
    end 
    else 
    Form001.show; 
end; 

procedure TForm001.Form002CloseClick(Sender: TObject); 
begin 
Form002.FadeOutTimer.Enabled := true; 
end; 

procedure TForm001.Form002HideClick(Sender: TObject); 
begin 
Form002.FormMinimizeTimer.Enabled := true; 
end; 

procedure TForm001.Form002ShowClick(Sender: TObject); 
begin 
    if Form002.WindowState = wsMinimized then 
    begin 
     Form002.Perform(WM_SYSCOMMAND, SC_RESTORE, 0); 
    end 
    else 
    Form002.show; 
end; 

procedure TForm001.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Form001.FadeOutTimer.Enabled := true; 
end; 

procedure TForm001.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    if CrossButtonClick = true 
    then 
     begin 
     CanClose := true; 
     Exit; 
     end; 
    CanClose := false; 
    Form001.FadeOutTimer.Enabled := true; 
end; 

procedure TForm001.FormCreate(Sender: TObject); 
begin 
    Form001.FadeInTimer.Enabled := true; 
end; 

procedure TForm001.FormHide(Sender: TObject); 
begin 
    Form001.FadeOutTimer.Enabled := true; 
end; 

procedure TForm001.FormShow(Sender: TObject); 
begin 
    Form001.FadeInTimer.Enabled := true; 
end; 
procedure TForm001.TrayIconDblClick(Sender: TObject); 
begin 
    Form001.FormRestoreTimer.Enabled := true; 
    TrayIcon.Visible := False; 
    WindowState := wsNormal; 
    Application.BringToFront(); 
end; 

procedure TForm001.FadeInTimerTimer(Sender: TObject); 
begin 
    if Form001.AlphaBlendValue >= 220 
    then 
     begin 
     Form001.FadeInTimer.Enabled := false; 
     end 
    else 
     begin 
     Form001.AlphaBlendValue := Form001.AlphaBlendValue + 10; 
     CrossButtonClick := false; 
     end; 
end; 

procedure TForm001.FadeOutTimerTimer(Sender: TObject); 
begin 
    if Form001.AlphaBlendValue <= 0 
    then 
     begin 
     Form001.FadeOutTimer.Enabled := false; 
     CrossButtonClick := true; 
     Self.Close; 
     end 
    else 
     begin 
     Form001.AlphaBlendValue := Form001.AlphaBlendValue - 10; 
     CrossButtonClick := true; 
     end; 
end; 

procedure TForm001.FormMinimizeTimerTimer(Sender: TObject); 
begin 
    if Form001.AlphaBlendValue > 0 then 
    begin 
     Form001.AlphaBlendValue := Form001.AlphaBlendValue - 10; 
    end 
    else 
    begin 
     Form001.FormMinimizeTimer.Enabled := false; 
     Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0); 
    end; 
end; 

procedure TForm001.FormRestoreTimerTimer(Sender: TObject); 
begin 
    if Form001.AlphaBlendValue < 220 then 
    begin 
     Form001.AlphaBlendValue := Form001.AlphaBlendValue + 10; 
    end 
    else 
    begin 
     Form001.FormRestoreTimer.Enabled := false; 
    end; 
end; 

end. 

हैं मैं निम्नलिखित

Application.MainFormOnTaskbar := false; 

प्रपत्र पूरी तरह से invissible है। मुझे लगता है कि एक बग होना चाहिए। लेकिन मैं इसे खोजने में असमर्थ हूँ।

4

मैं MyForm पर एक trayicon ड्रॉप, तो मैं इस सरल कोड जोड़ें:

type 
    TmyForm = class(TForm) 
    ... 
    TrayIcon: TTrayIcon; 
    procedure FormCreate(Sender: TObject); 
    ... 
    procedure TrayIconClick(Sender: TObject); 
    ... 
    private 
    { Private declarations } 
    procedure OnMinimize(Sender:TObject); 
    public 
    { Public declarations } 
    end; 

procedure TmyForm.FormCreate(Sender: TObject); 
begin // When form is created 
    Application.OnMinimize:=OnMinimize; // Set the event handler for application minimize 
end; 

procedure TmyForm.OnMinimize(Sender:TObject); 
begin // When application is minimized by user and/or by code 
    Hide; // This is to hide it from taskbar 
end; 

procedure TmyForm.TrayIconClick(Sender: TObject); 
begin // When clicking on TrayIcon 
    if Visible 
    then begin // Application is visible, so minimize it to TrayIcon 
       Application.Minimize; // This is to minimize the whole application 
      end 
    else begin // Application is not visible, so show it 
       Show; // This is to show it from taskbar 
       Application.Restore; // This is to restore the whole application 
      end; 
end; 

यह एक trayicon allways दिखाई बनाता है, और जब आप उस पर क्लिक करें:

  • तो आवेदन दिख रहा है , यह छिपी हुई फॉर्म टास्कबार और स्क्रीन से
  • यदि एप्लिकेशन छिपा हुआ है, तो इसे दिखाया जाएगा टास्कबार और स्क्रीन

दूसरे शब्दों में, ट्रेयॉन पर क्लिक करने से एप्लिकेशन इसकी दृश्यता बदल देगा; बस इसे ट्रेयकॉन बार में कम करने के रूप में।

+0

यह अच्छा है, लेकिन यह 2 चीजों का ख्याल नहीं रखता है: ट्रे आइकन पर क्लिक करते समय, ऐप केंद्रित नहीं है। यह कम रहता है। और जब "एक्स" पर क्लिक करते हुए ऐप ट्रे को कम करने के बजाए बंद हो जाता है। इन 2 मुद्दों के लिए कोई समाधान? – bashan

2

... और डेल्फी 6, जहां कोई TTrayIcon मौजूद है, तो आप इस सरल कोड का उपयोग कर सकते हैं:

unit MainUnit; 

interface 

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

const WM_ICONTRAY = WM_USER+1; 

type 
    TForm1 = class(TForm) 
    PopupMenu1: TPopupMenu; 
    ShowForm1: TMenuItem; 
    HideForm1: TMenuItem; 
    Exit1: TMenuItem; 
    procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure ShowForm1Click(Sender: TObject); 
    procedure HideForm1Click(Sender: TObject); 
    procedure Exit1Click(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
    TrayIconData: TNotifyIconData; 
    end; 

var 
    Form1: TForm1; 
    MustExit:boolean; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    MustExit:=false; 
    TrayIconData.cbSize:=SizeOf(TrayIconData); 
    TrayIconData.Wnd:=Handle; 
    TrayIconData.uID:=0; 
    TrayIconData.uFlags:=NIF_MESSAGE + NIF_ICON + NIF_TIP; 
    TrayIconData.uCallbackMessage:=WM_ICONTRAY; 
    TrayIconData.hIcon:=Application.Icon.Handle; 
    StrPCopy(TrayIconData.szTip,Application.Title); 
    Shell_NotifyIcon(NIM_ADD, @TrayIconData); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    Shell_NotifyIcon(NIM_DELETE, @TrayIconData); 
end; 

procedure TForm1.TrayMessage(var Msg: TMessage); 
var p:TPoint; 
begin 
    case Msg.lParam of 
    WM_LBUTTONDOWN: begin 
        Form1.Show; 
        Application.Restore; 
        end; 
    WM_RBUTTONDOWN: begin 
        GetCursorPos(p); 
        PopUpMenu1.Popup(p.x,p.y); 
        end; 
    end; 
end; 

// Popup "Form Show" menu item OnClick 
procedure TForm1.ShowForm1Click(Sender: TObject); 
begin 
Form1.Show; 
end; 

// Popup "Form Hide" menu item OnClick  
procedure TForm1.HideForm1Click(Sender: TObject); 
begin 
Form1.Hide; 
end; 

// Popup "Exit" menu item OnClick 
procedure TForm1.Exit1Click(Sender: TObject); 
begin 
MustExit:=true; 
Close; 
end; 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
if MustExit then exit; 
Form1.Hide; 
Action:=caNone; 
end; 

end. 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^