Autor Téma: TTrayIcon v FMX  (Přečteno 2009 krát)

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 124
  • Karma: 1
    • Verze Delphi: D7, XE7
TTrayIcon v FMX
« kdy: 27-02-2019, 19:19:36 »
Zdar,
Vo VCL je komponenta TTrayIcon ktora umoznuje minimalizovat aplikaciu na systenove menu k hodinam a pripadne rozbalit popup menu. V FMX aplikaciach tato moznost chyba, je jasne ze na Androidoch to zmysel nema, ale vo win verzii aplikacie tuto funkcionalitu potrebujem vyuzivat.
Dakujem za rady

Offline dee

  • Plnoletý
  • ***
  • Příspěvků: 124
  • Karma: 1
    • Verze Delphi: D7, XE7
Re:TTrayIcon v FMX
« Odpověď #1 kdy: 27-02-2019, 20:31:59 »
mnohe komponenty su pre niektore platformy nepristupne, to je OK, ale ta trayicon v FMXku proste nieje ani pre Windows. Nejde ani o tak zivotne dolezitu funkcionalitu ale pri behu aplikacie pod win sa to proste hodi mat moznost zobrazit na liste nejake stavove informacie v podobe ikonky, pod androidom to je mozne riesit inak napriklad push upozorneniami

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 953
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:TTrayIcon v FMX
« Odpověď #2 kdy: 28-02-2019, 11:17:23 »
Excellent
Rated 1 time
schválně jsem si založil windowsovskou aplikaci na FMX, a opravdu se trayicon nenabízí. Musí se udělat nevizuálně anebo použít komponent třetí strany.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1126
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:TTrayIcon v FMX
« Odpověď #3 kdy: 28-02-2019, 16:49:57 »
Chapu, ale komponenty FMX jsou od toho aby konkretni funkcionalitu nejak sjednotily, coz v tomto pripade nelze.

Nelze je trochu silné tvrzení. Kdyby to nešlo, tak neexistuje FMX.
Mám takové tušení, že Lazarus by mohl mít multi-platformní tray ikonu, ze které by se dalo inspirovat.

Jinak je potřeba si poradit sám
https://stackoverflow.com/questions/8171942/how-do-you-create-a-tray-icon-with-firemonkey (na konci je čínské řešení)
nebo se inspirovat např.
https://stackoverflow.com/questions/20109686/fmx-trayicon-message-handling

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 953
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:TTrayIcon v FMX
« Odpověď #4 kdy: 28-02-2019, 17:59:30 »
Zkusit třeba trxtrayicon,trxtrayiconex, ty se dají použít vizuálně.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #5 kdy: 01-03-2019, 07:44:51 »
A proč by prostě tray icon pro FMX nemohla na systémech, které ji nepodporují, nic nedělat a na ostatních systémech být dostupná?
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #6 kdy: 01-03-2019, 13:41:32 »
A proč by prostě tray icon pro FMX nemohla na systémech, které ji nepodporují, nic nedělat a na ostatních systémech být dostupná?

Mohla, ale...

Jak bys ocekaval chovani aplikace jenz bys "omylem" navesil "zivotne dulezitou" funkcionalitu na nekterou z udalosti takove FMX TTrayIcon a cilova platforma nic ve smyslu tray ikony nema?

Očekávám, že na té cílové platformě aplikace nebude žít. V čem je problém?
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #7 kdy: 01-03-2019, 13:46:37 »
Podle tvé logiky bys neměl mít plíce, protože pod vodou nebo na Marsu není funkce plic dostupná ???
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #8 kdy: 01-03-2019, 14:07:06 »
Podle tvé logiky bys neměl mít plíce, protože pod vodou nebo na Marsu není funkce plic dostupná ???

Presne tak. A pokud se v danych prostredich neda dychat, nemel bych se tvarit, ze jsou k preziti dostatkem (tedy jako IDE nabidnu komponentu tray ikony).

Přesně tak co? Já za sebe teda musím říct, že plíce mám a od boha mi byly nabídnuty, ještěže tak! Jsem s nimi veskrze spokojen a naučil jsem se žít s tím, že pod vodou nefungují.

---

Mimochodem, všimnul sis existence ComponentPlatformsAttribute? http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.ComponentPlatformsAttribute

Prohledej si zdrojáky FMX, najdeš ho u poměrně dost komponent.

Nechápu, proč by nějaké specifické vlastnosti/komponenty nemohly být platform-only. Ve VCL máš třeba TButton.Font.Color, v FMX máš TWindowsStore:

Kód: Delphi [Vybrat]
  1.   [ComponentPlatformsAttribute(pidWin32 or pidWin64)]
  2.   TWindowsStore = class(TComponent)

ComponentPlatformsAttribute najdeš třeba i u TOpenDialog a TSaveDialog.

Takže ještě jednou: podle tvé logiky by TOpenDialog a TSaveDialog vůbec v FMX neměly být protože ne všechny FMX platformy je podporují ??? To je hodně na pána  8)
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #9 kdy: 01-03-2019, 14:30:37 »
Přesně tak co? Já za sebe teda musím říct, že plíce mám a od boha mi byly nabídnuty, ještěže tak! Jsem s nimi veskrze spokojen a naučil jsem se žít s tím, že pod vodou nefungují.

Aha, takze Ty mas za to, ze diky plicim danym Tvym bohem muzes na Mars bez skafandru. Hodne zdaru! ;D O atributech platformy vim...

Ty jseš vážně zabedněnec. Ne, to jsem nikdy netvrdil - prosím o referenci, kde se zmiňuju o tom, že chci na Mars bez skafandru.

Naopak: ty tvrdíš, že FMX vůbec nemá nabízet tray icon, protože na některých platformách nefunguje - v analogii pro plíce to znamená, že by plíce vůbec neměly existovat, protože se s nimi nedá dýchat na Marsu, ale jen na Zemi (a dokonce ještě ani ne všude na Zemi).

Stále mi dlužíš odpověd ohledně TOpenDialog a TSaveDialog. Prosím, vysvětli mi jejich existenci podle tvojí logiky.
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #10 kdy: 01-03-2019, 16:40:22 »
Ty jseš vážně zabedněnec. Ne, to jsem nikdy netvrdil - prosím o referenci, kde se zmiňuju o tom, že chci na Mars bez skafandru.

Aha, takze:

Podle tvé logiky bys neměl mít plíce, protože pod vodou nebo na Marsu není funkce plic dostupná ???

znamena, ze mi Tvuj buh dal plice, ale nemam je mit protoze chci na Mars, nebo jak to myslis? ;D OMG. Ale k tematu, u platforme neutralniho frameworku, jenz nemuze mit tray icon, protoze tray icon nektera z platforem nema, nepatri takova komponenta do palety. Vytvor si ji za behu, cert vem, ale nedavej ji do palety FMX komponent. Chapeme?

Velmi správně mě oslovuješ v první osobě množného čísla. Ještě jsi zapomněl připojit "Vaše Blahorodí" - prosím, příště si na to dej pozor.

Ne, nechápeme, proč by nemohla být v paletě např. spolu s informací, na kterých platformách je podporována.

A vůbec. Vždyť si odporuješ - ještě před chvílí jsi tvrdil, že v FMX nemá být vůbec:

Pochop ze funkcionalitu, jenz neni pro podporovane platformy spolecna nelze sjednotit.

a tady:

Chapu, ale komponenty FMX jsou od toho aby konkretni funkcionalitu nejak sjednotily, coz v tomto pripade nelze.

A teď najednou píšeš, že si takovou komponentu mám vytvořit za běhu - t.j. má být dostupná v FMX, ale nemá být v FMX paletě ??? Co to je za blbost ???

Stále mi dlužíš odpověd ohledně TOpenDialog a TSaveDialog. Prosím, vysvětli mi jejich existenci podle tvojí logiky.

Nedluzim Ti nic. Bavime se tu o tray ikone. Mas na Android tray ikony? Mas, a vis jak je pridat jinym zpusobem nez upravou operacniho systemu? A za me ohledne dialogu ne, pokud nemas ve vsech platofmach dialogy, necht se ta komponenta jmenuje treba TFileSelector.

Sakra, vždyť ty tvoje bláboly ani nedávají smysl. Na otázku "prosím, vysvětli mi", dáš odpověď "[...]A za me ohledne dialogu ne, pokud [...]". Vždyť to nemá ani hlavu ani patu.
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #11 kdy: 01-03-2019, 16:48:26 »
Ale k tematu, u platforme neutralniho frameworku, jenz nemuze mit tray icon, protoze tray icon nektera z platforem nema, nepatri takova komponenta do palety. Vytvor si ji za behu, cert vem, ale nedavej ji do palety FMX komponent. Chapeme?

Ne, fakt nechápeme - vždyť máš rozpor i v téhle jedné jediné větě: jak si ve frameworku mám vytvořit komponentu za běhu, když ji ten framework zároveň nemůže mít?
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #12 kdy: 01-03-2019, 18:32:03 »
Celou dobu se tu snazim vysvetlit, ze na paletu komponent nemuzes umistit komponentu, jenz neni na vsech platformach podporovana.
  • Není pravda, že právě toto se tu snažíš vysvětlit. Ty se snažíš celou dobu vysvětlit, že FMX tray icon mít nemůže:

    Ale k tematu, u platforme neutralniho frameworku, jenz nemuze mit tray icon, protoze tray icon nektera z platforem nema [...]

    Přečti si ještě jednou dotaz:

    Zdar,
    Vo VCL je komponenta TTrayIcon ktora umoznuje minimalizovat aplikaciu na systenove menu k hodinam a pripadne rozbalit popup menu. V FMX aplikaciach tato moznost chyba, je jasne ze na Androidoch to zmysel nema, ale vo win verzii aplikacie tuto funkcionalitu potrebujem vyuzivat.
    Dakujem za rady

    Dotaz je na to, že v FMX ta komponenta není vůbec, a ne že není na paletě. A ty stále obhajuješ, že v FMX tray icon není a nemůže být. O paletě jsi začal mluvit až v odpovědi #18 a sám od sebe. Nikdy předtím o paletě nepadlo slovo - ani to nemělo smysl, protože FMX TTrayIcon teď prostě nemá - ani na paletě a ani schovanou kdesi ve zdrojácích, abych si ji mohl vytvořit za běhu.

    A ty mně radíš, že si tray icon mám v "platforme neutralnim frameworku" vytvořit za běhu a zárověn tvrdíš, že ve stejném "platforme neutralnim frameworku" nemůže existovat.

  • I kdyby ses mně snažil právě toto vysvětlit, tak je to blbost. Samotné FMX má několik komponent, které nejsou na všech platformách podporované a stejně jsou na paletě. Uvedl jsem ti TOpenDialog, TSaveDialog, TMicrosoftStore.

    O informaci, kde jsou komponenty podporovány, se stará ComponentPlatformsAttribute. Ten má taky na starost, že když vybereš pro projekt např. Target=Android, tak právě tyto komponenty nemůžeš přidat na form - jsou sice v paletě ukázány, ale jsou deaktivovány. Stačí ale přepnout target a už je tam můžeš na form hodit. A ano, tak to má smysl.

Nechapeme, no. Vlakno zacalo tim, ze OP nemuze najit TTrayIcon. Coz nelze protoze ne vsechny platformy ji maji.

Nemůže najít TTrayIcon, protože ji FMX vůbec nemá a ne protože "ne vsechny platformy ji maji".

FMX by TTrayIcon klidně mít mohla - stejně tak, jako má TOpenDialog. TOpenDialog také "ne všechny platformy mají", ale přesto v FMX je.

TTrayIcon je pouze ve VCL v Vcl.ExtCtrls, v FMX vůbec neexistuje.

Hm, co vic, Ty jsi pozdeji poslal radu ve smyslu:

A proč by prostě tray icon pro FMX nemohla na systémech, které ji nepodporují, nic nedělat a na ostatních systémech být dostupná?

Jako jak? Ze v aplikaci navesis na udalost takove TTrayIcon nejaky kod a ten se, protoze jej cilova platforma nepodporuje, nikdy nespusti? Bez jakehokoli varovani?

Jak se ošetří nepodporované platformy, je už věc výrobců frameworků a mně to zajímá jenom okrajově. Hlavní je, že ve frameworku mohu používat i komponenty, které nejsou ve všech platformách podporované.

Kdyby chtěli v Embarcaderu uživatele upozornit, tak zabudují podporu ComponentPlatformsAttribute přímo do kompilátoru. Ten, když zjistí vytvoření nepodporovaného objektu (ať pomocí designeru nebo pomocí konstruktoru v runtime), by mohl vyhodit upozornění:

[DCC Warning]: Symbol 'TTrayIcon' is not supported on target platform.

To by bylo úplně dostačující.

Koneckonců už na to mají klíčové slovo platform:
Kód: Delphi [Vybrat]
  1.   TPlatformComponent = class(TComponent)
  2.   end platform;
které při použití vyhodí
[DCC Warning] Unit1.pas(?): W1002 Symbol 'TPlatformComponent' is specific to a platform

Ale i "žádné varování" je lepší než "žádná komponenta".

Za mě co se týče událostí: samozřejmě se kód nikdy nespustí - a to bez žádného varování. Tray icon na cílové platformě není, tudíž není vidět, tudíž na ni uživatel nikdy nemůže kliknout a tudíž se nikdy nemůže vykonat TTrayIcon.OnClick. Na co chceš tady varování?
Nevidím tray icon -> nemůžu na ni kliknout -> nemůže se provést událost kliknutí. Důvody neviditelnosti tray icon mohou být různé: OS si ji schoval sám (MS Windows to dělá), program si ji schoval pomocí Visible:=False, OS ji nepodporuje... Všechno jsou validní důvody, proč tray icon není vidět a proč se na ni nedá kliknout a proč se nemůže vykonat událost. Když kompilátor vyhodí upozornění, jak jsem psal nahoře, tak je to bonus, ale přežiju to i bez něj. Každopádně se kód musí dát přeložit i tam, kde není TTrayIcon podporována.

Vezmu konkrétní příklad TOpenDialog na Androidu, jak to funguje teď v Delphi 10.3 a který si můžeš sám vyzkoušet: při OpenDialog1.Execute neudělá nic a vrátí True. To se mi upřímně řečeno nelíbí - já bych vyhodil ENotSupportedException nebo alespoň bych vrátil False. Ale jak vidíš, na FMX androidí form si pomocí mezikroku s Windows TOpenDialog dát můžu a můžu si ho vytvořit i za běhu - a to je pro mě důležité.

Tvoje obhajoba, že TTrayIcon nemá na FMX paletě být nebo že v rámci FMX nemá vůbec existovat, je prostě lichá. Embarcadero prostě zatím mělo jiné priority (třeba ten TWindowsStore) a nemělo čas TTrayIcon do FMX dát. Nedivil bych se, kdyby ji v nějaké budoucnosti do FMX přidali, a to i na paletu.

Za me uz :-X

Jo, to bude nejlepší.
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TTrayIcon v FMX
« Odpověď #13 kdy: 01-03-2019, 20:00:42 »
FMX by TTrayIcon klidně mít mohla - stejně tak, jako má TOpenDialog. TOpenDialog také "ne všechny platformy mají", ale přesto v FMX je.

Coz je spatne. Nebo Ti prijde v poradku, ze kompilator FMX projekt s na formulari vlozenou, platforme specifickou komponentou po pridani platformy, jenz nema danou funkcionalitu bez varovani prelozi (nebo tu komponentu z formulare odstrani, nebo...)?

Takže zaprvé: jestli to je špatně nebo ne, není vůbec důležitá otázka. Důležitý je fakt, že to tak je. Jednou někdo rozhodl, že to tak bude, tak to tak má být všude. A basta. Tečka. Konec diskuze. Když to tak je v TOpenDialog, má to tak být i v TTrayIcon.

Zadruhé: proč se ptáš na něco, na co jsem už odpověděl? Viz:

Jak se ošetří nepodporované platformy, je už věc výrobců frameworků a mně to zajímá jenom okrajově. Hlavní je, že ve frameworku mohu používat i komponenty, které nejsou ve všech platformách podporované.

a

Kdyby chtěli v Embarcaderu uživatele upozornit, tak zabudují podporu ComponentPlatformsAttribute přímo do kompilátoru. Ten, když zjistí vytvoření nepodporovaného objektu (ať pomocí designeru nebo pomocí konstruktoru v runtime), by mohl vyhodit upozornění:

[DCC Warning]: Symbol 'TTrayIcon' is not supported on target platform.

To by bylo úplně dostačující.

a

Vezmu konkrétní příklad TOpenDialog na Androidu, jak to funguje teď v Delphi 10.3 a který si můžeš sám vyzkoušet: při OpenDialog1.Execute neudělá nic a vrátí True. To se mi upřímně řečeno nelíbí - já bych vyhodil ENotSupportedException nebo alespoň bych vrátil False.

Takže ještě jednou: ano, je to úplně v pořádku, že kompilátor takový projekt přeloží. Bylo by hezké, kdyby kompilátor vyhodil varování ([DCC Warning]) a/nebo kdyby v run-time vyhodil exception, ale nemá to pro mě vysokou prioritu.

Stejně tak fungují neimplementované abstraktní metody - kompilátor je přeloží, ale vyhodí [DCC Warning] při kompilaci a v run-time vyhodí EAbstractError:

Kód: Delphi [Vybrat]
  1. program Project1;
  2. {$APPTYPE CONSOLE}
  3. type
  4.   TMy = class(TObject)
  5.   public
  6.     procedure A; virtual; abstract;
  7.   end;
  8. begin
  9.   TMy.Create.A;
  10. end.

Podobně by se měl chovat při použití komponent/vlastností, které nejsou na cílové platformě podporovány - to jest: projekt přeložit (to každopádně), ale programátora nějakým způsobem upozornit (to by bylo hezké, ale budiž, tady fušeřinu Embarcaderu odpustím).

Konkrétně u použití nepodporovaných vlastností (třeba Color) jsem za to, aby se třeba ukázalo [DCC Warning], ale aby jinak použití prošlo bez Exception. Je fakt otrava furt podmínečně ošetřovat nepodporované vlastnosti:
Kód: Delphi [Vybrat]
  1. {$IFDEF MSWINDOWS}
  2. MojeKomponenta.Color := clRed;
  3. {$ENDIF}

No nic, těžko se dohadovat s člověkem, který neumí číst ani svoje příspěvky:

mnohe komponenty su pre niektore platformy nepristupne, to je OK, ale ta trayicon v FMXku proste nieje ani pre Windows. Nejde ani o tak zivotne dolezitu funkcionalitu ale pri behu aplikacie pod win sa to proste hodi mat moznost zobrazit na liste nejake stavove informacie v podobe ikonky, pod androidom to je mozne riesit inak napriklad push upozorneniami

Chapu, ale komponenty FMX jsou od toho aby konkretni funkcionalitu nejak sjednotily, coz v tomto pripade nelze.

Ani slovo o tom, že by FMX měla mít TTrayIcon k dispozici někde mimo paletu - naopak tvrzení, že FMX nemůže mít TTrayIcon vůbec, protože "komponenty FMX jsou od toho aby konkretni funkcionalitu nejak sjednotily, coz v tomto pripade nelze.".

Navíc ten výrok "komponenty FMX jsou od toho aby konkretni funkcionalitu nejak sjednotily, coz v tomto pripade nelze." není pravdivý, protože konkrétně TOpenDialog a TWindowsStore dokazují opak - třeba ten TWindowsStore nesjednocuje vůbec nic. TTrayIcon by odpovídal v podporovaných platformách TOpenDialog a dokonce by na těch podporovaných platformách právě funkcionalitu sjednocoval.

Čím víc se z toho snažíš vykecat, tím víc ze sebe děláš hlupáka...
Embarcadero Technology Partner

op

  • Host
Re:TTrayIcon v FMX
« Odpověď #14 kdy: 02-03-2019, 09:09:46 »
Good
Rated 2 times
Čím víc se z toho snažíš vykecat, tím víc ze sebe děláš hlupáka...

Z niceho se nevykecavam. V FMX palete nema TTrayIcon co delat, stejne tak jako TWindowsStore.

Ještě jsi zapoměl připojit, že v FMX paletě nemají co dělat:
  • TPopupMenu
  • TMenuBar
  • TOpenDialog
  • TSaveDialog
  • TPrintDialogDialog
  • TPrinterSetupDialog
  • ... and counting ...

Jo, zákazníci Embarcadera by určitě měli radost, kdyby v FMX desktopové aplikaci nemohli v design-time vytvořit popup menu a svázat ho s kontrolkou. Fakt.

Asi by se Ti libilo v tymu Embarcadera, tam zrejme neni treba moc myslet...

Tohle může napsat pouze nízký člověk v úzkých, který nemá žádné rozumné argumenty.