IT NEWS PC REVUE PC FORUMInternet time: @765
Obsah fóra
Pravidlá  •  Kontakt  •  Prihlásenie  •  Registrácia

Investujte s rozumom

Servery Cisco UCS vám ušetria 30 percent prevádzkových nákladov www.ucsservery.sk

Neuveriteľne lacná .sk doména

Rýchla registrácia domén za výborné ceny. www.exohosting.sk

Ste správcom siete?

Zlepšite svoje vedomosti v oblasti správy sietí na našich kurzoch! www.gopas.sk

PZP Genertel online

Garancia najnižšej ceny pre autá nad 70 kw a do 2250 kg! Iba do stredy 15.2. www.genertel.sk

Štýlové hodinky za super ceny

Veľký výber hodiniek za super ceny. Všetko skladom, odosielame do 24 hod. www.redstone.sk

Ako nastaviť všetkým EditBoxom jedno PopUp menu s funkciami?

Zaslať odpoveď
AutorSpráva
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Št 29.07.10 15:35Odpovedať s citátomNávrat hore

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?
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 911

PríspevokZaslal: Št 29.07.10 17:06Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Pi 30.07.10 8:27Odpovedať s citátomNávrat hore

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ť).
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 911

PríspevokZaslal: Pi 30.07.10 8:52Odpovedať s citátomNávrat hore

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 );
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Pi 30.07.10 9:33Odpovedať s citátomNávrat hore

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!'); 
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 911

PríspevokZaslal: Pi 30.07.10 10:35Odpovedať s citátomNávrat hore

Á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...
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Pi 30.07.10 12:13Odpovedať s citátomNávrat hore

Len informatívne, ak by som napriek tomu porovnával ClassType, tak by to robilo problémy?
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Fico
Skúsený užívateľ
Skúsený užívateľ

Založený: 11.01.2009
Príspevky: 911

PríspevokZaslal: Pi 30.07.10 12:19Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
coldak
Skúsený užívateľ
Skúsený užívateľ

Založený: 29.10.2008
Príspevky: 927

PríspevokZaslal: Pi 30.07.10 15:54Odpovedať s citátomNávrat hore

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
Zobraziť informácie o autoroviOdoslať súkromnú správu
Manny
Užívateľ
Užívateľ

Založený: 30.09.2009
Príspevky: 61

PríspevokZaslal: Ne 01.08.10 21:22Odpovedať s citátomNávrat hore

Luxusne vyriešená téma Díky chlapi.
Zobraziť informácie o autoroviOdoslať súkromnú správuICQ
Zobraziť príspevky z predchádzajúcich:    
Zaslať odpoveď
Nemôžete pridávať nové témy do tohto fóra.
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.
Nemôžete hlasovať v tomto fóre.

Powered by phpBB 2.x.x © 2005 - 2012 PCforum, webhosting by WebSupport, edited by JanoF