Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Programm minimieren und als Tray ablegen, Taskbar Icon....


Xearox - Sa 07.08.10 21:15
Titel: Programm minimieren und als Tray ablegen, Taskbar Icon....
Hai Leute

Ich bin auch mal wieder da :D

Passt auf, hab mir da mal einen Wecker fürn PC geschrieben, der läuft auch Super, hab keine Probleme mit dem, Klar werdet ihr nun sagen, das würde ich aber anders machen mit TimePicker usw. aber ich arbeite erstmal so...

Nun wollte ich das Programm ins Tray ablegen, jedoch klappt das nicht so ganz, wie ich das möchte, desweiteren wird das Tray nach Doppelklick auf diesem, nicht mehr nachdem Minimieren angezeigt.

Ein Icon hab ich erstellt und dieses wird auch im Tray angezeigt.
Jedoch wird nach minimieren das Programm immer noch in der Taskbar angezeigt und des möcht ich ganz gerne vermeiden.

Ich arbeite mit TTrayIcon aus Delphi 2010...
Den Code hab ich aus der Hilfe/Code-Beispiele und habe den Code auch in Soweit verstanden...

Hier nun der Code, vielleicht könntet ihr mir da weiter helfen, wie ich das schaffen kann.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
unit Main;

interface

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

type
  TForm1 = class(TForm)
    TimerUhr: TTimer;
    BT_On: TButton;
    Bt_Off: TButton;
    Label_H: TLabel;
    Label_M: TLabel;
    L_Clock: TLabel;
    Bt_H_Plus: TButton;
    Bt_H_Minus: TButton;
    Bt_M_Plus: TButton;
    Bt_M_Minus: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    P_Status: TPanel;
    Debug_Wecker: TLabel;
    MediaPlayer1: TMediaPlayer;
    TrayIcon1: TTrayIcon;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TimerUhrTimer(Sender: TObject);
    procedure BT_OnClick(Sender: TObject);
    procedure Bt_OffClick(Sender: TObject);
    procedure Bt_H_MinusClick(Sender: TObject);
    procedure Bt_H_PlusClick(Sender: TObject);
    procedure Bt_M_MinusClick(Sender: TObject);
    procedure Bt_M_PlusClick(Sender: TObject);
    procedure WeckerStellen;
    procedure MediaPlayer1Notify(Sender: TObject);
    procedure FormDeactivate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure TrayIcon1DblClick(Sender: TObject);
  Private

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Stunden, Minuten, WeckerAktiv: integer;
  WeckerZeit, StundenStr, MinutenStr: String;
  Aktiv: Boolean;

implementation

{$R *.dfm}

procedure TForm1.WeckerStellen;
begin
  if (Stunden <= 9then
    StundenStr := '0' + IntToStr(Stunden)
  else
    StundenStr := IntToStr(Stunden);

  if (Minuten <= 9then
    MinutenStr := '0' + IntToStr(Minuten)
  else
    MinutenStr := IntToStr(Minuten);
  WeckerZeit := StundenStr + ':' + MinutenStr + ':' + '00';

  if (TimeToStr(Now) = WeckerZeit) then
  begin
    if (WeckerAktiv = 0then
    begin
      MediaPlayer1.Close;
      MediaPlayer1.Filename := (ExtractFilePath(ParamStr(0)) + 'wecker.wav');
      MediaPlayer1.Open;
      MediaPlayer1.Notify := True;
      MediaPlayer1.Play;
      WeckerAktiv := WeckerAktiv + 1;
    end;
  end;

end;

// ------------------------------------------------------------------------------
procedure TForm1.Bt_H_MinusClick(Sender: TObject);
begin
  if Stunden = 0 then
    Stunden := 23
  else
    Stunden := Stunden - 1;
  Label_H.Caption := IntToStr(Stunden);
end;

// ------------------------------------------------------------------------------
procedure TForm1.Bt_H_PlusClick(Sender: TObject);
begin
  if Stunden = 23 then
    Stunden := 0
  else
    Stunden := Stunden + 1;
  Label_H.Caption := IntToStr(Stunden);
end;

// ------------------------------------------------------------------------------
procedure TForm1.Bt_M_MinusClick(Sender: TObject);
begin
  if Minuten = 0 then
    Minuten := 59
  else
    Minuten := Minuten - 1;
  Label_M.Caption := IntToStr(Minuten);
end;

// ------------------------------------------------------------------------------
procedure TForm1.Bt_M_PlusClick(Sender: TObject);
begin
  if Minuten = 59 then
    Minuten := 0
  else
    Minuten := Minuten + 1;
  Label_M.Caption := IntToStr(Minuten);
end;

// ------------------------------------------------------------------------------
procedure TForm1.Bt_OffClick(Sender: TObject);
begin
  P_Status.Color := clRed;
  P_Status.Caption := 'Ausgeschaltet';
  Aktiv := false;
  MediaPlayer1.Open;
  MediaPlayer1.Stop;
  MediaPlayer1.Close;
end;

// ------------------------------------------------------------------------------
procedure TForm1.BT_OnClick(Sender: TObject);
begin
  P_Status.Color := clLime;
  P_Status.Caption := 'Eingeschaltet';
  Debug_Wecker.Caption := WeckerZeit;
  Aktiv := True;
end;

// ------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

// ------------------------------------------------------------------------------
procedure TForm1.FormActivate(Sender: TObject);
begin
  TrayIcon1.Visible := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MyIcon: TIcon;

begin
  Stunden := 0;
  Minuten := 0;
  WeckerAktiv := 0;
  L_Clock.Caption := TimeToStr(Now);
  { Load the tray icons. }
  TrayIcon1.Icons := TImageList.Create(Self);
  MyIcon := TIcon.Create;
  MyIcon.LoadFromFile('icons/wecker.ico');
  TrayIcon1.Icon.Assign(MyIcon);
  TrayIcon1.Icons.AddIcon(MyIcon);

  MyIcon.LoadFromFile('icons/wecker.ico');
  TrayIcon1.Icons.AddIcon(MyIcon);
  MyIcon.LoadFromFile('icons/wecker.ico');
  TrayIcon1.Icons.AddIcon(MyIcon);
  MyIcon.LoadFromFile('icons/wecker.ico');
  TrayIcon1.Icons.AddIcon(MyIcon);

  { Set up a hint message and the animation interval. }
  TrayIcon1.Hint := 'Wecker';
  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;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
  TrayIcon1.Visible := false;
end;

procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
  if MediaPlayer1.Notify = True then
  begin
    MediaPlayer1.Play;
  end
  else
  begin
    MediaPlayer1.Stop;
  end;
end;

// ------------------------------------------------------------------------------
procedure TForm1.TimerUhrTimer(Sender: TObject);
begin
  L_Clock.Caption := TimeToStr(Now);
  if (Aktiv = True) then
    WeckerStellen;

end;
// ------------------------------------------------------------------------------

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
  { Hide the window and set its state variable to wsMinimized. }
  Hide();
  WindowState := wsMinimized;
  Form1.Visible:=true;
  { Show the animated tray icon and also a hint balloon. }
  TrayIcon1.Visible := True;
  TrayIcon1.Animate := True;
  TrayIcon1.ShowBalloonHint;
end;

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;

end.



Und wenn ihr sagt, das wie ich den Wecker so aufgebaut hab, anders machen sollte, dann würde ich noch einen Extra Thread erstellen, wo ihr mir Tipps geben könntet.
Aber so klappt der Wecker ganz gut, ohne Probs. Bis auf, das nachdem Ausschalten des Weckers, die Meldung kommt "Kein MDI-Gerät geöffnet"


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 08.08.2010 um 22:44


chickenfigt1989 - Sa 07.08.10 21:18

wieso nimmst du nicht die TJVTrayicon da komm sogar ich klar damit und das hat was zu heißen.
lg


jaenicke - Sa 07.08.10 21:25

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Jedoch wird nach minimieren das Programm immer noch in der Taskbar angezeigt und des möcht ich ganz gerne vermeiden.
Schau dir einfach einmal ShowWindow an. ;-)

Delphi-Quelltext
1:
ShowWindow(Self.Handle, SW_HIDE);                    
Das sollte zum Verstecken schon reichen.

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Aber so klappt der Wecker ganz gut, ohne Probs. Bis auf, das nachdem Ausschalten des Weckers, die Meldung kommt "Kein MDI-Gerät geöffnet"
Mir fällt auf, dass du Close benutzt ohne zu prüfen ob da überhaupt etwas zu schließen ist, ob an der Stelle hab ich nicht drauf geachtet.

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  if (Aktiv = True) then                    
Aua, das tut weh...
Der Vergleich mit Booleanwerten ist nicht nur unschön und unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637
Also:

Delphi-Quelltext
1:
  if Aktiv then                    


Xearox - Sa 07.08.10 21:43

also im Klartext, bei einer If then Abfrage, wird immer nur Abgefragt, ob die Boolische Wert wahr ist, richtig?
Und was ist, wenn man abfragen will, ob er False ist?
Muss man dann if Aktiv = False then ...? oder reicht das auch nur if Aktiv then ?


jaenicke - Sa 07.08.10 21:45

Das steht auch in den Links. Dann wäre es:

Delphi-Quelltext
1:
if not Active then                    


Xearox - Sa 07.08.10 21:52

ahh okay...dann weiß ich bescheid, ist auch dann weniger zu schreiben...

So hab hier mal jetzt mein Code Überarbeitet...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button2Click(Sender: TObject); // Minimieren Button
begin
  ShowWindow(Self.Handle, SW_HIDE);
  { Hide the window and set its state variable to wsMinimized. }
  Hide();
  WindowState := wsMinimized;
  //Form1.Visible:=true;
  { Show the animated tray icon and also a hint balloon. }
  TrayIcon1.Visible := True;
  TrayIcon1.Animate := True;
  TrayIcon1.ShowBalloonHint;
end;


jedoch musst ich ein Eigenen Button machen, weil durch das klicken auf das Fenster Eigene Minimieren, passiert nichts...
Das Prob ist, System Basierende oder gar Hardeware Basierende Programmieren, habe ich mich noch nie mit auseinander gesetzt...
Also kenne daher keine Befehle, wie man zum Beispiel, ein Laufwerk checken kann, oder das Abfangen vom Fenster minimieren erreichen kann...


ALF - So 08.08.10 10:44

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:
Bis auf, das nachdem Ausschalten des Weckers, die Meldung kommt "Kein MDI-Gerät geöffnet"


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Bt_OffClick(Sender: TObject);
begin
  P_Status.Color := clRed;
  P_Status.Caption := 'Ausgeschaltet';
  Aktiv := false;
  MediaPlayer1.Open;   //<-----diese Zeile löschen
  MediaPlayer1.Stop;
  MediaPlayer1.Close;
end;
und die Meldung dürfte nicht mehr kommen
Gruss Alf


Xearox - So 08.08.10 10:51

nein Leider nicht, habs ausprobiert, kommt immer noch die selbe Mitteilung...


ALF - So 08.08.10 10:55

Moment, gleich ne Frage hinterher.
jo ist klar. vermute mal das die Meldung kommt, wenn Du den Wecker ausstellst, und er noch nicht geklingelt hat. Richtig?
Ansonsten frage vorher ab

Delphi-Quelltext
1:
2:
3:
4:
5:
if MediaPlayer1.Notify then
begin
Mediaplayer1.Stop;
Mediaplayer1.Close;
end


Anmerkung: Wobei dies ja eigentlich nichts mit Dein Topic zu tun hat :wink:
Gruss Alf


Xearox - So 08.08.10 12:28

das ist leider auch, während er am klingeln ist :-(
ich probiers mal mit dem Code von dir...ma schauen

also hab nun folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Bt_OffClick(Sender: TObject);
begin
  P_Status.Color := clRed;
  P_Status.Caption := 'Ausgeschaltet';
  Aktiv := false;
  if MediaPlayer1.Notify then
  begin
    Mediaplayer1.Stop;
    Mediaplayer1.Close;
  end
end;


aber es wird immer noch angezeigt, das "Kein MCI-Gerät geöffnet" ist...ich weiß mir echt keinen Rat mehr.

[edit] Also musik wird zwar ausgeschaltet, aber halt nicht ohne diese Fehler meldung...


ALF - So 08.08.10 12:50

Ok, dann so. nimm das Close da raus.
Du erstellst eh beim Weckerstellen den Player neu!Was Du nicht machen müsstest!
Gruss Alf


Xearox - Di 10.08.10 15:06

Jop, lag am close, nun geht es, nach dem es draußen ist...