Autor Beitrag
Xearox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Sa 07.08.10 21:15 
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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 444
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)
ausblenden 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:
ausblenden 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:
www.delphi-forum.de/....php?p=548760#548760
Mehr dazu steht hier:
www.delphi-treff.de/...olean-werten/page/4/
Und warum das auch vollkommen unlogisch ist:
www.delphi-forum.de/....php?p=560637#560637
Also:
ausblenden Delphi-Quelltext
1:
  if Aktiv then					
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.08.10 21:45 
Das steht auch in den Links. Dann wäre es:
ausblenden Delphi-Quelltext
1:
if not Active then					
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: 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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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"

ausblenden 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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: So 08.08.10 10:51 
nein Leider nicht, habs ausprobiert, kommt immer noch die selbe Mitteilung...
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ausblenden 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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Xearox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260
Erhaltene Danke: 3



BeitragVerfasst: Di 10.08.10 15:06 
Jop, lag am close, nun geht es, nach dem es draußen ist...