| Autor | Správa |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Št 29.07.10 15: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? |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 911
 | Zaslal: Št 29.07.10 17: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 |
|
| |
   |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 |
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ť). |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 911
 |
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 ); |
| |
   |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 |
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!'); |
|
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 911
 | Zaslal: Pi 30.07.10 10: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... |
|
| |
   |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Pi 30.07.10 12:13 |   |
Len informatívne, ak by som napriek tomu porovnával ClassType, tak by to robilo problémy? |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 911
 | Zaslal: Pi 30.07.10 12: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  |
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Pi 30.07.10 15: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  |
| |
  |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Ne 01.08.10 21:22 |   |
Luxusne vyriešená téma Díky chlapi. |
| |
   |
 |
|