AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?
Thema durchsuchen
Ansicht
Themen-Optionen

Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

Ein Thema von a.def · begonnen am 30. Dez 2016 · letzter Beitrag vom 30. Dez 2016
Antwort Antwort
a.def
(Gast)

n/a Beiträge
 
#1

Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 03:56
Meine Standardlösung für das Erzeugen eines eigenen Eintrags für Formular X in der Taskleiste war bisher immer
Delphi-Quellcode:
protected
 procedure CreateParams(var Params: TCreateParams); override;

//

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited; // CreateParams(Params);

 with Params do
  begin
   ExStyle := ExStyle or WS_EX_APPWINDOW;
   WndParent := GetDesktopWindow;
  end;
end;
Doch leider gruppiert Windows den Button meines Hauptformulars und den meines zweiten Formulars.
Gibt es einen Weg, um das mit Delphi zu umgehen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 05:42
Fenster der selben "EXE" werden gruppiert, also wenn man das nicht guppiert haben will, dann in eine andere EXE.
https://www.microsoft.com/resources/....mspx?mfr=true

GetDesktopWindow sollte unnötig sein?
In die Taskleiste kommen Top-Level-Fenster mit der entsprechenden Kennung, dass sie da rein wollen (WS_EX_APPWINDOW).
Und Top-Level ist alles ohne Parent.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Dez 2016 um 06:01 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 11:15
Verflickst das dachte ich mir schon, dass Windows hier mehr zu sagen hat als ich.
Denn sonst wäre die Option "Gruppieren" in der Windows-Taskleiste ja unnötig.

Das von mir angesprochene Formular hat ein paar Labels und 2 Buttons.
Die Labels werden von woanders (N Threads) sehr häufig gesetzt. Das ist mittlerweile alles so abgesichert, dass da nichts schief gehen kann (tat es früher, jetzt nicht mehr).

Wenn ich dieses Formular in eine eigene Exe auslagere, wie lasse ich dann diese beiden Exe'n kommunizieren? Da fällt mir gerade nur WMCopyData ein. Aber ist das "performant" genug, um
die Labels auf dem ausgelagerten Formular etwa alle 250 Millisekunden zu verändern?

Im Grunde genommen könnte ich mir diesen ganzen Käse sparen, würde TTaskBar seinen Dienst so tun wie ich gerne hätte.
Packe ich TTaskBar auf eben dieses zweite Formular was zur Laufzeit erzeugt wird und ändere Value, wird der Fortschritt von TTaskBar immer nur im Eintrag des Hauptformulars angezeigt.
Auch ein manuelles Erzeugen von TTaskBar mit Owner eben dieses zweite Formular zeigt den Fortschritt im Eintrag des Hauptformulars an.
Und zu guter letzt: selbst das Setzen des zweiten Formulars als MainForms zeigt den Fortschritt im ersten Eintrag an.

Geändert von a.def (30. Dez 2016 um 11:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 12:14
Hast du mehrere Fortschrittsanzeigen parallel?
Denn eigentlich ist das schon gut so, dass es nur eine Fortschrittsanzeige in der Taskleiste gibt und nicht für jedes Fenster uns jeden Tab einzeln. Da würde man ja wahnsinnig werden.

Gedacht ist das so, dass du mehrere "Unterfortschritte" zu einem bündelst und den dann anzeigst. Denn für den Benutzer ist ja normalerweise der Gesamtfortschritt vor allem relevant.

Interprozesskommunikation ginge hier sogar recht einfach, wenn du TStaticText statt TLabel benutzt. Das hat nämlich glaube ich ein Handle, so dass du aus der anderen Anwendung heraus direkt WM_SETTEXT benutzen könntest.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 12:24
Ich habe 2 ProgressBars.
Einmal eine auf dem Hauptformular und einer in meinem zweiten Formular.
Es wird aber immer nur eine benutzt und die andere ist Visible := False.

Die Verlagerung in eine weitere Exe-Datei könnte tatsächlich die Lösung sein, ist aber wieder viel Aufwand.

Bedeutet das also, dass die TTaskBar immer die erste ProgressBar nimmt die gefunden wird? Wofür übergibt man denn dann einen Owner?
oder muss der Owner die ProgressBar sein anstatt das Formular?

Ich habe folgende Notlösung parat... keine Lösung aber für den notfall eben
- ich erzeuge TTaskBar im Hauptfomular und sobald ich mich im zweiten Formular im OnShow befinde, rufe ich FreeAndNile(TaskBarMgr1_); auf.
Dann habe ich meinen zweiten, nicht-gruppierten Taskbar-Eintrag und keine Fortschrittsanzeige im ersten Formular.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 13:59
Denn sonst wäre die Option "Gruppieren" in der Windows-Taskleiste ja unnötig.
Das ist eine "andere" Gruppierung.
Wenn die Taskleiste voll ist, werden die vielen Buttons in "einem" Button zusammengefasst.

Du meinst ja das, wo die nebeneinander liegen und der Absand fehlt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 14:02
Das Formular hat mit der Business Logik ja nicht viel zu tun. Das dient ja nur zur Anzeige, egal wer das benötigt.

Wir haben nur eine Fortschrittsanzeige, die als Interface durch das Hauptfenster bereitgestellt wird. Dieses Interface kann dann überall in der GUI-Logik der Anwendung verwendet werden.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 14:03
Genau. Da liegt dann der eine Button auf dem anderen um ein paar Pixel nach rechts versetzt (nach Priorität geordnet nehme ich an).
Ich glaube ich werde absolut nicht drum rumkommen, eine zweite Exe zu erstellen.

TStaticText kann ich nur leider nicht verwenden, da ich TLabels und dann noch andere (andere Komponente) verwende.
Ich bastle mir gleich oder heute Abend mal eine kleine Demo und gucke wie oft und wie schnell ich mit WMCopyData Daten schicken kann.
Dann schicke ich nämlich immer alles in einem Rutsch (natürlich nur, wenn es eine Änderung gab).

Zitat:
Dieses Interface kann dann überall in der GUI-Logik der Anwendung verwendet werden.
Interfaces schön und gut. Ist mir aktuell aber zu kompliziert und möchte ich nicht unbedingt lernen, wenn es aktuell auch anders geht
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#9

AW: Formular mit eigenem, nicht gruppierten Taskbar-Eintrag erzeugen?

  Alt 30. Dez 2016, 20:29
Ich habe hier mal eine kleine Demo gebaut wie ich das realisieren würde.
Das geht sicher noch viel viel besser.

Test ist der Sender, Test2 ist der Empfänger

3 Buttons:
1: setzt das Formular Receiver zurück (ProgressBar.Position := 0; Label1.Caption := '-'
2: sendet 100x einen einen String und einen Integer an Receiver, dort wird eine ProgressBar gesetzt (dauert bei mir zwischen 5ms und 18ms)
3: sendet 50.000x einen String und einen Integer an Receiver, dort wird ein Label.Caption gesetzt (dauert bei mir zwischen 15 und 17 Sekunden)

Wenn man |exit an den zu sendenden String anfügt, stopt die Prüfung in Receiver > TForm1.WMCopyData nach dem ersten String.

Kann man das mit WMCopyData noch verbessern?
Angehängte Dateien
Dateityp: 7z SenderReceiver_WMCopyData_Test.7z (2,39 MB, 2x aufgerufen)

Geändert von a.def (30. Dez 2016 um 20:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz