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 end;
var Form1: TForm1; Stunden, Minuten, WeckerAktiv: integer; WeckerZeit, StundenStr, MinutenStr: String; Aktiv: Boolean;
implementation
{$R *.dfm}
procedure TForm1.WeckerStellen; begin if (Stunden <= 9) then StundenStr := '0' + IntToStr(Stunden) else StundenStr := IntToStr(Stunden);
if (Minuten <= 9) then MinutenStr := '0' + IntToStr(Minuten) else MinutenStr := IntToStr(Minuten); WeckerZeit := StundenStr + ':' + MinutenStr + ':' + '00';
if (TimeToStr(Now) = WeckerZeit) then begin if (WeckerAktiv = 0) then 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); 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);
TrayIcon1.Hint := 'Wecker'; TrayIcon1.AnimateInterval := 200;
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(); WindowState := wsMinimized; Form1.Visible:=true; TrayIcon1.Visible := True; TrayIcon1.Animate := True; TrayIcon1.ShowBalloonHint; end;
procedure TForm1.TrayIcon1DblClick(Sender: TObject); begin 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
Narses: 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
Xearox hat folgendes geschrieben : |
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.
Xearox hat folgendes geschrieben : |
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.
Xearox hat folgendes geschrieben : |
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:
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:
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); begin ShowWindow(Self.Handle, SW_HIDE); Hide(); WindowState := wsMinimized; 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
Xearox hat folgendes geschrieben : |
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; 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...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!