| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | Napísal Manny: 29.07.2010 16:35 | |
|
Zdravím vás.
Predstavme si aplikáciu, v ktorej máme veľmi veľa TEditov. V aplikácii sa nachádza aj TPopupMenu, ktoré obsahuje položky:
Kód: Kopírovať Vystrihnúť Vložiť Vymazať Označiť všetko V prípade, že by sa jednalo o jeden editbox, tak by som to bežne nalinkoval a do udalosti onClick na jednotlivé položky to riešil cez kód: Kód: Edit1.CopyToClipboard; Edit1.CutToClipboard; Edit1.PasteFromClipboard; Edit1.ClearSelection; Edit1.SelectAll;
Lenže v tomto prípade nemôžem napísať Edit1, zrejme tam musí byť niečo ako "odosielateľ". Treba teda spraviť tieto dve základné veci:
1. Priradiť hromadne všetkým komponenentám typu TEdit vybrané popupmenu.
2. Ošetriť udalosti onClick položiek popup menu tak, aby fungovalo kopírovanie, vkladanie atď presne pre ten edit, v ktorom bolo popup menu vyvolané.
Napadá niekoho niečo?
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 29.07.2010 18:06 | |
|
1.) niekde v kóde napíš:
Kód: for i := 0 to (Form1.ComponentCount-1) do if (Form1.Components[i] is TEdit) then (Form1.Components[i] as TEdit).PopupMenu := PopupMenu1; 2.) v tele jednotlivých funkcií pre PopupMenu: Kód: (PopupMenu1.PopupComponent as TEdit).CopyToClipboard; // tak isto pre ostatne zlozky PopUp menu
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | Napísal autor témy Manny: 30.07.2010 9:27 | |
|
Kód sa skompiluje, ale v momente, keď nastane udalosť kliknutia na položku z popup menu, ohlási program chybu "Invalid type cast.".
Keď však napíšem:
Kód: if PopupMenu1.PopupComponent = Editbox1 then Editbox1.CopyToClipboard;
... tak to ide všetko správne (ale samozrejme, vypisovať tam všetky používané Editboxy je nepraktické, nakoľko ich mám v projekte dosť).
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 30.07.2010 9:52 | |
|
Komponent Editbox1 je v tvojom projekte TEdit? Alebo iný komponent (prípadne odvodený)? Lebo mne to funguje korektne a takisto som to skúsil na x prvkoch TEdit.
// napíš sem, čo vypíše toto: ShowMessage( PopupMenu1.PopupComponent.ClassName );
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | Napísal autor témy Manny: 30.07.2010 10:33 | |
|
Aha, moja chyba. Použil som to na TLabeledEdit (iná komponenta s label nad editom). Tak ma napadá otázka, ak by som chcel spraviť univerzálne PopupMenu tak, aby rozlišoval aká komponenta ho vyvolala a na základe toho potom následne pracovalo.
Neviem či píšem zrozumiteľne, skrátka vytvoriť tento systém aj pre Memo, aj Edit s tým, že by sa to potom asi vetvilo.. "ak je komponenta triedy TEdit, tak rob toto, ak je TMemo, tak rob toto".
// edit: heh, ja dneska fakt neuvažujem, veď príspevok nad týmto to obsahuje...
Klasika = TPopupMenu
Kód: if Klasika.PopupComponent.ClassType = TEdit then (Klasika.PopupComponent as TEdit).CopyToClipboard else if Klasika.PopupComponent.ClassType = TMemo then (Klasika.PopupComponent as TMemo).CopyToClipboard else if Klasika.PopupComponent.ClassType = TMaskEdit then (Klasika.PopupComponent as TMaskEdit).CopyToClipboard else ShowMessage('Neznámy typ!');
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 30.07.2010 11:35 | |
|
Áno, dalo by sa to aj takto, ale miesto ClassType treba použiť ClassName, čo je funkcia vracajúca reťazec (ClassType vracia objekt TClass):
Kód: if ( Klasika.PopupComponent.ClassName = 'TEdit' ) then ( Klasika.PopupComponent as TEdit ).CopyToClipboard; // tak podobne pre ostatne...
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | Napísal autor témy Manny: 30.07.2010 13:13 | |
|
Len informatívne, ak by som napriek tomu porovnával ClassType, tak by to robilo problémy?
_________________ Bad news: Time flies. God news: You are the pilot! |
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 30.07.2010 13:19 | |
|
Nie, nerobilo, ale zdalo sa mi, že to tak neskompiluje. Skúsil som to a ide to aj takto, takže teraz sa ospravedlňujem ja
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 30.07.2010 16:54 | |
|
tak zase prispejem svojou troskou do mlyna kedze vsetky spominane komponenty maju jedneho z predkov TCustomEdit , tak som mal tu drzost hodit vam sem aj takuto moznost
Kód: var I : Integer; begin for I := 0 to Form1.ComponentCount - 1 do begin if Form1.Components[i].InheritsFrom(TCustomEdit) then TCustomEdit(Form1.Components[i]).CopyToClipboard; end; end;
netvrdim ze doteraz uvadzane priklady su zle, no len som chcel ukazat aj moznost vyuzitia RTTI
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | Napísal autor témy Manny: 01.08.2010 22:22 | |
|
Luxusne vyriešená téma Díky chlapi.
_________________ Bad news: Time flies. God news: You are the pilot! |
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|