![]() |
Infofenster im Systembereich erzeugen, einblenden und ausblenden
Ich arbeite gerade an einer Idee, die ich noch nicht in die Tat umsetzen kann.
Ich hätte gerne die Möglichkeit ein Informationsfenster im Systembereich einblenden zu können. Es gibt mittlerweile aber schon 2 verschiedene Forms dafür mit unterschiedlichen Inhalten und aktuell ist es so, dass Form 2 mit der Anzeige warten muss, bis Form 1 geschlossen wurde. Wie würdet ihr das lösen, sodass es auch eine Anfängerin wie ich versteht? Meine Idee ist, dass wenn schon ein Fenster angezeigt wird, das zweite einfach oben draufzupacken (hier als Beispiel wenn die Taskleiste unten ist). Meine Anwendung ist zweisprachig und in einer anderen Unit setze ich die Label-Captions dieser Informationsfenster. Das kann ich aber auch gerne in die Forms selber auslagern. |
AW: Infofenster dynamisch erzeugen und einblenden
Ich verstehe nur Bahnhof. Kannst Du mal ein Bild posten, wie Du Dir das vorstellst?
|
AW: Infofenster dynamisch erzeugen und einblenden
Info1 wird angezeigt, kommt Info2 hinzu, plaziere es über Nummer 1, wenn Nummer 1 geschlossen wird muss Info2 runterrutschen.
So würde ich vorgehen falls ich das richtig entziffert habe was Du da schreibst. Ps: Das was ich meine kann man sich mit dem Tool JDownloader anschauen, kommt ein Link hinzu popt ein Fenster auf, kommt ein weiterer Link hinzu, popt nächstes Fenster über dem alten auf, ist altes weg rutscht das neue runter. Da wird es über Timer gesteuert. |
AW: Infofenster dynamisch erzeugen und einblenden
Das ist richtig aber die Frage ist, wie es technisch gemacht würde.
Zitat:
Das Bild ist nicht von mir aber das was man im Bild sieht meine ich mit Infofenster. ![]() Und bevor der Vorschlag kommt die windowseigenen Mittel zu nutzen: nein. KodeZwergs Erklärung ist im Prinzip das, was ich erklären wollte. Das aber technisch korrekt und wiederverwendbar umzusetzen ist die (sehr) große Herausforderung. Hier ist meine Idee was einen Teil der Umsetzung angeht: eine einzige leere aber kleine randlose Form, die dynamisch erzeugt wird, wenn man sie braucht. Der Inhalt könnte dann aus einem Frame kommen den man bei Erzeugung der Form-Instanz zugibt. Ich habe hier mal ein sehr simples Beispiel erstellt
Delphi-Quellcode:
type
TTaskBarPos = (_TOP, _BOTTOM, _LEFT, _RIGHT, _NONE); function GetTaskBarPos(Handle: THandle): TTaskBarPos; var hTaskbar: HWND; T: TRect; scrW, scrH: Integer; CurrentScreen: TMonitor; begin Result := _BOTTOM; hTaskbar := FindWindow('Shell_TrayWnd', nil); if hTaskbar <> 0 then begin CurrentScreen := Screen.MonitorFromWindow(Handle); GetWindowRect(hTaskbar, T); scrW := CurrentScreen.Width; scrH := CurrentScreen.Height; if (T.Top > scrH div 2) and (T.Right >= scrW) then Result := _BOTTOM else if (T.Top < scrH div 2) and (T.Bottom <= scrW div 2) then Result := _TOP else if (T.Left < scrW div 2) and (T.Top <= 0) then Result := _LEFT else if T.Left >= scrW div 2 then Result := _RIGHT; end; end; function GetTaskBarDimension(Handle: THandle): Integer; var SysTray: Winapi.Windows.HWND; Rect: TRect; begin Result := -1; SysTray := FindWindow('Shell_TrayWnd', nil); if SysTray <> INVALID_HANDLE_VALUE then begin if GetWindowRect(SysTray, Rect) then begin case GetTaskBarPos(Handle) of _LEFT, _RIGHT: if GetWindowRect(SysTray, Rect) then Result := Rect.Right - Rect.Left; _TOP: if GetWindowRect(SysTray, Rect) then Result := Rect.Bottom; _BOTTOM: if GetWindowRect(SysTray, Rect) then begin Result := Screen.MonitorFromWindow(Handle).Height - Rect.Top; end; end; end; end; end; procedure TForm1.Button5Click(Sender: TObject); var Form: TForm; TaskbarPos: TTaskBarPos; CurrentScreen: TMonitor; TaskBarHeight: Integer; begin Form := TForm.Create(Self); Form.BorderStyle := bsNone; Form.Caption := ''; Form.Width := 345; Form.Height := 145; CurrentScreen := Screen.MonitorFromWindow(Handle); TaskbarPos := GetTaskBarPos(Form.Handle); TaskBarHeight := GetTaskBarDimension(Form.Handle); case TaskbarPos of _TOP: begin Form.Top := TaskBarHeight; Form.Left := CurrentScreen.Width - Form.Width; end; _BOTTOM: begin Form.Top := CurrentScreen.Height - TaskBarHeight - Form.Height; Form.Left := CurrentScreen.Width - Form.Width; end; _LEFT: begin Form.Top := CurrentScreen.Height - Form.Height; Form.Left := TaskBarHeight; end; _RIGHT: begin Form.Top := CurrentScreen.Height - Form.Height; Form.Left := CurrentScreen.Width - Form.Width - TaskBarHeight; end; end; Form.Show; end; |
AW: Infofenster im Systembereich erzeugen, einblenden und ausblenden
Mein Ansatz wäre mit grundsätzlich zwei Klassen:
|
AW: Infofenster im Systembereich erzeugen, einblenden und ausblenden
Könntest du dafür ein kleines Beispiel liefern? Das hört sich für mich sehr gut und schlüssig an.
|
AW: Infofenster im Systembereich erzeugen, einblenden und ausblenden
Wenn nur und ausschliesslich Windows 10 (auf dem Zielsystem), dann würd ich die Windows 10 Notifications dafür nehmen:
![]() ![]() |
AW: Infofenster im Systembereich erzeugen, einblenden und ausblenden
Wie oben schon geschrieben möchte ich diese nicht verwenden. Ein Grund ist, da nicht nur Windows 10 verwendet wird (XP bis 10).
ConnorMcLeod's Ansatz gefällt mir wirklich sehr gut. Das mit dem Einblenden, Ausblenden und Rutschen würde ich rechnerisch hinbekommen. Ich habe ja Zeit genug. Aber das Umsetzen der Klassenstrukturen und die Liste die ja vermutlich die Fenster halten und löschen können soll würde ich nicht ansatzweise realisieren können. |
AW: Infofenster dynamisch erzeugen und einblenden
Zitat:
|
AW: Infofenster im Systembereich erzeugen, einblenden und ausblenden
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz