Autor Téma: Dynamická událost  (Přečteno 8757 krát)

Offline jiimdk

  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Dynamická událost
« kdy: 10-03-2014, 20:37:02 »
Zdravím ve spolek,
nevíte někdo jak do události onclick  na tlačítko přidat dynamicky kód?
Příklad: vytvořím si v programu toolbox s tlačítky, třeba takto
http://docwiki.embarcadero.com/CodeExamples/XE2/en/TToolButtonCreate_(C%2B%2B)
http://docwiki.embarcadero.com/CodeExamples/XE2/en/TToolButtonCreate_(Delphi)
a nevím jak si do nich přidat události po kliku, které mám uložené v externím souboru.
Píšu to v c++ ale klidně i návod v delphi by mi stačil


Díky za odpověď

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Dynamická událost
« Odpověď #1 kdy: 10-03-2014, 21:29:14 »
Jednoduše ne, v takových jazycích tam musíš dát nějakou existující metodu. Ale mohl bys tam pak třeba zavolat něco z externího dll nebo použít něco, co dokáže interpretovat nějaký skript (teď si ale žádnou knihovnu pro Delphi nevybavuji). Co konkrétně se snažíš dělat?

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Dynamická událost
« Odpověď #2 kdy: 11-03-2014, 03:09:54 »
...např. Pascal Script... ;)

Offline jiimdk

  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:Dynamická událost
« Odpověď #3 kdy: 11-03-2014, 07:44:18 »
Konkrétně se snažím udělat IDE pro KIVY s možností přidávat si  vlastní komponenty. Mám to vymyslené pomocí speciálního strukturovaného souboru a narazil sem na to že neumím do vytvořeného tlačítka vložit kód. 

Offline jiimdk

  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:Dynamická událost
« Odpověď #4 kdy: 11-03-2014, 08:13:17 »
Možná to zkusím vyřešit unikátníma "caption" a řídit se podle nich

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1297
  • Karma: 28
    • Pepak.net
Re:Dynamická událost
« Odpověď #5 kdy: 11-03-2014, 08:33:29 »
Nejjednodušší by to bylo s DLL knihovnou - v DLL exportuješ nějakou proceduru, v obsluze tlačítka si načteš DLL (LoadLibrary), načteš adresu procedury (GetProcAddress) a pak tu proceduru zavoláš. Triviální a přitom snadno použitelné.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #6 kdy: 11-03-2014, 09:07:11 »
Já stále nechápu co chceš dělat. Kivy myslíš tohle ? http://en.wikipedia.org/wiki/Kivy.

To znamena ze v externim souboru mas nejaky Python kod a ten chces zavolat?
Embarcadero MVP - Czech republic

Offline jiimdk

  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:Dynamická událost
« Odpověď #7 kdy: 11-03-2014, 09:17:41 »
Já mám nějaké memo a dookola tlačítka, po kliku se mi do mema vepíše python kód. Teď je tam natvrdo, ale to se mi moc nelíbí, tak sem tu udělal strukturu kterou čtu ze souboru a podle toho se mi vytvářejí tlačítka, ale zatím nedokážu nějak inteligentně vepsat do tlačítek události, ale mám určitou myšlenku : udělám si funkci která se zavolá a argument bude název. Snad to bude fungovat :)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #8 kdy: 11-03-2014, 09:29:34 »
Tlačítko má property Tag.

Při vytváření tlačítek ze souboru si (např.) vytvoř TStringList, a jakmile máš vytvořit tlačítko, přidej si do listu ten Python kod, a do Tag tlačítka dej index do toho listu.
Všechny tlačítka mají společnou obsluhu a v ní se podíváš na tag (přes sender) a tím máš index do listu těch python kodů a voilá máš ten kod.

to byl přiklad řešení
Embarcadero MVP - Czech republic

Offline jiimdk

  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:Dynamická událost
« Odpověď #9 kdy: 11-03-2014, 09:31:40 »
Hmm velmi zajímavé řešení, hned večer to vyzkouším :)
Díky!!

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Dynamická událost
« Odpověď #10 kdy: 11-03-2014, 12:43:02 »
Property Tag měli dávno z VCL vyhodit. Viděl jsem už pár "řešení" používajících tuto všemocnou property a popravdě bych za ně střílel.

Offline jiimdk

  • Příspěvků: 6
  • Karma: 0
    • Verze Delphi: 7
Re:Dynamická událost
« Odpověď #11 kdy: 11-03-2014, 13:23:23 »
:) Abych pravdu řekl nikdy sem nevěděl jaký má "tag" účel

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1297
  • Karma: 28
    • Pepak.net
Re:Dynamická událost
« Odpověď #12 kdy: 11-03-2014, 13:25:06 »
:) Abych pravdu řekl nikdy sem nevěděl jaký má "tag" účel
Účel Tagu je nabídnout property, které mají všechny komponenty a které si uživatel může použít k předávání svých dat. Nevidím na něm nic špatného, problém je akorát to, když tvůrce komponent Tagu přiřadí konkrétní význam.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Dynamická událost
« Odpověď #13 kdy: 11-03-2014, 13:53:28 »
Nevidím na něm nic špatného, problém je akorát to, když tvůrce komponent Tagu přiřadí konkrétní význam.

Vyznat se ve změti kódu využívající Tag stejného typu komponent pro 5 různých účelů na průplesk je.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #14 kdy: 11-03-2014, 14:06:40 »
Já Tag používám opatrně, ale v tomto případě je to nejjednoduší a celkem čisté řešení. Nevidím na občasném použítí Tag nic špatného a zvláště u dynamických komponent je to zajímavá možnost.

Mimochodem během beta testu XE2 se uvažovalo zda má být Tag jen 32bit nebo NativeInt (tj. že pro 64bit by byl 64bit) a v podstatě valná většina testerů tlačila na to, aby byl nativeInt - a já s tím souhlasím :-). To jen pro zajímavost.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1853
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Dynamická událost
« Odpověď #15 kdy: 11-03-2014, 14:23:28 »
Mimochodem během beta testu XE2 se uvažovalo zda má být Tag jen 32bit nebo NativeInt (tj. že pro 64bit by byl 64bit) a v podstatě valná většina testerů tlačila na to, aby byl nativeInt - a já s tím souhlasím :-). To jen pro zajímavost.
Me to prijde politovani hodne... Kdyz uz mermomoci chteji dat kladecum komponent  nejaky privesek, tak by to IMHO meli udelat v Delphi konzistetnim zpusobem a jako vsude ho udelat typu TObject, podobne jako to maji treba ve WinForms v .NET
« Poslední změna: 11-03-2014, 14:26:07 od pf1957 »

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Dynamická událost
« Odpověď #16 kdy: 11-03-2014, 14:47:35 »
Mimochodem během beta testu XE2 se uvažovalo zda má být Tag jen 32bit nebo NativeInt (tj. že pro 64bit by byl 64bit) a v podstatě valná většina testerů tlačila na to, aby byl nativeInt - a já s tím souhlasím :-). To jen pro zajímavost.

Je otázka, proč je to zrovna int, občas to pak lidi vede ještě k tomu, že se tam dávají objekty přetypované na int a pak se to přetypovává zpátky. Třeba v .Net jsou tagy taky, ale je to object, takže tam jde dát všechno přímo. Ale prakticky to taky nepoužívám.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #17 kdy: 11-03-2014, 15:04:34 »
Mimochodem během beta testu XE2 se uvažovalo zda má být Tag jen 32bit nebo NativeInt (tj. že pro 64bit by byl 64bit) a v podstatě valná většina testerů tlačila na to, aby byl nativeInt - a já s tím souhlasím :-). To jen pro zajímavost.
Me to prijde politovani hodne... Kdyz uz mermomoci chteji dat kladecum komponent  nejaky privesek, tak by to IMHO meli udelat v Delphi konzistetnim zpusobem a jako vsude ho udelat typu TObject, podobne jako to maji treba ve WinForms v .NET

Ano souhlasím, že by to bylo čisté. Víš kolik lidí by ale řvalo, že jim nejde přeložit kód z XE2 v Delphi 7? Pořád to tady poslouchám jak je nutná zpětná kompatibilita.

Pokud si pamatuji na jednu stranu sis tady nedávno stěžoval jak těch pár změn v XE3 v RTL byl pro tebe problém, na druhou stranu navrhovaná taková zásadní změna.

Chmm, Chmm
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #18 kdy: 11-03-2014, 15:07:12 »
Mimochodem během beta testu XE2 se uvažovalo zda má být Tag jen 32bit nebo NativeInt (tj. že pro 64bit by byl 64bit) a v podstatě valná většina testerů tlačila na to, aby byl nativeInt - a já s tím souhlasím :-). To jen pro zajímavost.

Je otázka, proč je to zrovna int, občas to pak lidi vede ještě k tomu, že se tam dávají objekty přetypované na int a pak se to přetypovává zpátky. Třeba v .Net jsou tagy taky, ale je to object, takže tam jde dát všechno přímo. Ale prakticky to taky nepoužívám.

Proto taky NativeInt - aby to byla relativně bezpečná operace - pokud jsi to nepochopil.
Embarcadero MVP - Czech republic

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Dynamická událost
« Odpověď #19 kdy: 11-03-2014, 15:11:32 »
Víš kolik lidí by ale řvalo, že jim nejde přeložit kód z Delphi 7 v XE2?

Tak přesně těm bych řekl, že neměli používat Tag ;D

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #20 kdy: 11-03-2014, 15:20:16 »
Víš kolik lidí by ale řvalo, že jim nejde přeložit kód z Delphi 7 v XE2?

Tak přesně těm bych řekl, že neměli používat Tag ;D

Kecy a to je tvůj názor.  V době Delphi 1 prostě nebylo tolik paměti a programátoři všude nervali objekty a mně taky nepřijde vhodné pokaždé tam cpát nějakou instanci - to je zhovadilost z .NETu a javy, kde je programátorům jedno kolik jejich program bere paměti.

Bohužel doba pokročila a v FMX je krome Tag:NativeInt z TComponent v následnících přidáno

    property TagObject: TObject read FTagObject write FTagObject;
    property TagFloat: Single read FTagFloat write FTagFloat;
    property TagString: string read FTagString write FTagString;


Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1853
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Dynamická událost
« Odpověď #21 kdy: 11-03-2014, 15:25:26 »
Kecy a to je tvůj názor.  V době Delphi 1 prostě nebylo tolik paměti a programátoři všude nervali objekty a mně taky nepřijde vhodné pokaždé tam cpát nějakou instanci
Muj nazore je to taky. A uz  D1 mel privesky v podobe TObject, protoze to nejspis videli na WinAPI, akorat se jim nezdal typ void pointer dost nobl, tak z toho udelali TObject. Ale proc zavedli integer tak, to cert vi...

Jinak ta predchozi poznamka byla myslena, ze zadnu Tag:integer nemel nikdy exitovat a pokud uz to nekdo natolik potreboval, mel tam dat property Object jako vsude jinde...

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 704
  • Karma: 41
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Dynamická událost
« Odpověď #22 kdy: 11-03-2014, 15:53:38 »
Kecy a to je tvůj názor.

Trochu se nám to tu přiostřuje. Ano, Tag musí zůstat, protože zpětná kompatibilita musí být zachována. Co se dá dělat. A ano, Tag je blbost (což ovšem nikdo ze zaujatých samozřejmě nemůže veřejně přiznat ;)).

[...] a zvláště u dynamických komponent je to zajímavá možnost.

Hmmm, tak to právě že určitě ne. Když to je dynamicky vytvořená komponenta, tak si můžu vždycky vytvořit potomka s potřebnou vlastností a nějakým normálním jménem:

Kód: [Vybrat]
type
TCodeButton = class(TButton)
private
  FSomeObject: TMyObject;
public
  property SomeObject: TMyObject read FSomeObject write FSomeObject;
end;

Nehledě na to, že NextGen za přetypovávání NativeInt <-> TObject klepe přes prsty...
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:Dynamická událost
« Odpověď #23 kdy: 11-03-2014, 15:58:08 »
Kecy a to je tvůj názor.  V době Delphi 1 prostě nebylo tolik paměti a programátoři všude nervali objekty a mně taky nepřijde vhodné pokaždé tam cpát nějakou instanci - to je zhovadilost z .NETu a javy, kde je programátorům jedno kolik jejich program bere paměti.

Tak jsou to kecy nebo názor ? Vyber si. Obojí to být nemůže ::) Názor mám takový, že není třeba mít univerzální property Tag a že její použití akorát zhoršuje čitelnost kódu.
Jak říkám, viděl jsem "ukázkové" využití v akci a není to dvakrát příjemné počtení - natož pak procházet formem a hledat hodnoty Tagů (a pak se taky při jejich zadávání nesplést).

Jinak jistě, existovat musí, protože ji lidé ve 20. století doporučovali používat.
« Poslední změna: 11-03-2014, 16:13:38 od TLama »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1765
  • Karma: 72
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Dynamická událost
« Odpověď #24 kdy: 11-03-2014, 16:10:42 »
Kecy bylo na to "Tak přesně těm bych řekl, že neměli používat Tag",  proste to tak musí být z hlediska kompatibility - to mne nastvalo.
Ne na to, že by se kdybych to ted delal neudelal jako TObject.

Musím vzdycky pocitat do deseti kdyz komunikuji s TLamou :-). Omlouvam se.
Embarcadero MVP - Czech republic

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Dynamická událost
« Odpověď #25 kdy: 11-03-2014, 16:47:55 »

[...] a zvláště u dynamických komponent je to zajímavá možnost.

Hmmm, tak to právě že určitě ne. Když to je dynamicky vytvořená komponenta, tak si můžu vždycky vytvořit potomka s potřebnou vlastností a nějakým normálním jménem:


To je otázka, jestli si kvůli tomu bude muset člověk definovat hromadu vlastních potomků tlačítek, to taky nevypadá na správnou cestu. A z každé třídy nemusí jít dědit (ale nejsem si jistý, jestli to v Delphi šlo říct).

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 704
  • Karma: 41
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Dynamická událost
« Odpověď #26 kdy: 11-03-2014, 17:48:30 »

[...] a zvláště u dynamických komponent je to zajímavá možnost.

Hmmm, tak to právě že určitě ne. Když to je dynamicky vytvořená komponenta, tak si můžu vždycky vytvořit potomka s potřebnou vlastností a nějakým normálním jménem:


To je otázka, jestli si kvůli tomu bude muset člověk definovat hromadu vlastních potomků tlačítek, to taky nevypadá na správnou cestu. A z každé třídy nemusí jít dědit (ale nejsem si jistý, jestli to v Delphi šlo říct).

U dynamických komponent není problém si je zadefinovat. Kód se dá redukovat až na 3 řádky:
Kód: [Vybrat]
TCodeButton = class(TButton)
  SomeObject: TMyObject;
end;

A protože se vytváří dynamicky, není je třeba registrovat do IDE. Když si dám na jednu stranu pomyslných vah mé 3 řádky kódu a na druhou stranu stálé přetypovávání Tagu, tak ten Tag prohrává dost silně.

Dědit jde ode všeho, k čemu má člověk přístup (to je taky nutná podmínka k vytvoření objektu). Nebo se pletu ???
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 567
  • Karma: 23
Re:Dynamická událost
« Odpověď #27 kdy: 11-03-2014, 19:01:09 »
Dědit jde ode všeho, k čemu má člověk přístup (to je taky nutná podmínka k vytvoření objektu). Nebo se pletu ???

V některých jazycích můžeš třídy označit, aby z nich dědit nešlo (sealed, final). Pak od nich potomky neuděláš.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1853
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:Dynamická událost
« Odpověď #28 kdy: 11-03-2014, 19:04:40 »
V některých jazycích můžeš třídy označit, aby z nich dědit nešlo (sealed, final). Pak od nich potomky neuděláš.
V Delphi to jde taky viz treba http://edn.embarcadero.com/article/34324

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 704
  • Karma: 41
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Dynamická událost
« Odpověď #29 kdy: 11-03-2014, 20:01:36 »
Že to je v C# a pod., jsem věděl, ale že je sealed i v Delphi, tak na to jsem už zapomněl. No nic, díky za upřesnění.

Dovoluji si ale tvrdit, že žádná komponenta, která připadá v úvahu na takové použití, sealed není. Trochu mi taková diskuze připomíná konspirační teorie :)
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: