Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Korištenje TAction

[es] :: Pascal / Delphi / Kylix :: Korištenje TAction

[ Pregleda: 1534 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Korištenje TAction16.02.2010. u 14:20 - pre 171 meseci
Kreirao sam svoju kotrolu koja je prošireni DBNavigator. Nije kreirana kao nasljednik tDBNavigator-a, več kao zasebna klasa.

Na osnovnoj klasi koristim proširenu klasu tButton, kojoj sam dodao TAction kako bih ju mogao pokretati sa ShortCut-ima.

U konstruktoru kase tMyNavigator imam:
Code:

  fActionList := TActionList.Create(self);
  fActionList.State := asNormal;


U konstruktoru gumba imam:
Code:

...
  self.fAction := TAction.Create(AOwner);
  self.fAction.Visible := true;
  self.fAction.Enabled := true;


U proceduri tMyNavigator koja kreira gumb imam (npr gumb "Storno"):
Code:

  btnStorno := mBtn.Create(self);
  btnStorno.OnClick := ButtonStornoClick;
  ...
  btnStorno.fAction.ActionList := fActionList;
  btnStorno.ShortCut := TextToShortCut('(None)');
  btnStorno.fAction.OnExecute := ShortCutClick;
  btnStorno.SetSubComponent(true);
  btnStorno.fAction.Tag := 11;


'(None)' se zamjenjuje tipkom koja je shortcut za taj gumb. To radi ok.
Svakoj klasi tMyNavigator se može reći da li da koristi shotcut ili ne.

Na formi je više objekata tipa tMyNavigator od kom je samo jednom rečeno da može koristiti shortcut.

Pritiskom na tipku koja je definirana u TAction kao shortcut, event se okine, ali samo u jednom objektu MyNavigator. Pri tome se izvrši ok, ispoštuje postavku o dozvoli/zabrati pa se ili odradi ili ne.

Procedura klase koja određuje da li je shortcut omogućen ili ne je:
Code:

  fActiveShortcat := Value;  //koristim ju za provjeru...
  for i := 0 to self.ControlCount-1 do begin
     if self.Controls[i] is mBtn then mBtn(self.Controls[i]).fAction.Enabled := Value;
  end;




 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Korištenje TAction16.02.2010. u 19:44 - pre 171 meseci
> fActionList := TActionList.Create(self);

Sve akcije praviš u runtime?

> self.fAction := TAction.Create(AOwner);
> self.fAction.Visible := true;
> self.fAction.Enabled := true;

Ako dobro pratim ovako ćeš za svako dugme napraviti novu akciju iako možda rade istu stvar, bolje je da prvo napraviš sve akcije ubaciš ih u ActionList i onda samo buttonima dodeliš odgovarajuću akciju.

> btnStorno := mBtn.Create(self);
> btnStorno.OnClick := ButtonStornoClick;
> btnStorno.fAction.OnExecute := ShortCutClick;

Koja je svrha postojanja i OnClicka za button i akcije, jedno je višak. Akcija overajduje OnClick buttona.

> Pritiskom na tipku koja je definirana u TAction kao shortcut, event se okine, ali samo u jednom objektu MyNavigator. Pri tome se izvrši
> ok, ispoštuje postavku dozvoli/zabrati pa se ili odradi ili ne.

Da li je ovo pitanje, zašto se ne okida u svim navigator kontrolama?
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Korištenje TAction16.02.2010. u 22:08 - pre 171 meseci
> Sve akcije praviš u runtime?

Da.

> Ako dobro pratim ovako ćeš za svako dugme napraviti novu akciju iako možda rade istu stvar, bolje je da prvo napraviš sve akcije ubaciš ih u ActionList i onda samo buttonima dodeliš odgovarajuću akciju.

Svaki gumb unutar navigatora radi soj posao. Da li kreirati prije akcije pa ih dodjeliti gumbima ili pri kreiranju gumba kreirati i akcije? Ne moraju svi gumbi biti kreirani, ovisi o property-ima navigatora, svaki gumb se može isključiti i uključiti. Možda sam mogao mijenjati visible status gumba...

> Koja je svrha postojanja i OnClicka za button i akcije, jedno je višak. Akcija overajduje OnClick buttona.

Akcije su kasnije dodane u kontrolu. Najprije sam napravio gumbe i OnClick, pa proširio s akcijama...
U navigator kontroli imam event-e OnClick za svaki gumb koja, ako je definirana, izvršava se nakon ugrađenog OnClick-a

I da, osnovno pitanje je zašto se akcija ne okida u svim navigator kontrolama koje su na jednoj formi?

Izmjenom property-a dozvoljavam/onemogučujem okidanje tj. izvršenje akcije. Dozvola i zabrana se obavlja iz programa, kontrola sama nema uticaj na tu postavku, samo ju čita.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Korištenje TAction17.02.2010. u 01:27 - pre 171 meseci
> I da, osnovno pitanje je zašto se akcija ne okida u svim navigator kontrolama koje su na jednoj formi?

Ako više akcija ima isti shortcut samo će se jedna okinuti. Ako te akcije rade istu stvar onda napravi samo jednu akciju i dodeli je svim kontrolama, ako ne rade istu stvar onda ne treba da imaju isti shortcut.
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Korištenje TAction17.02.2010. u 07:57 - pre 171 meseci
Može ideja kako da to riješim?

Ako je na formi više navigatora, ovisno o korisnikovoj akciji bit će aktivan jedan od njih, ja pri izradi program ne znam koji. Odnosno, jedan od njih će se moći aktivirati sa shortcut-ima, a ostali samo pritiskom na gumb.

Za insert sloga mi je uvijek npr. Ctrl + INS, a treba se okinuti onaj koji je aktivan. Akcije je definirana unutar navigatora - navigator je konrola.
- Možda da akciju definiram preko property-a, tj. da ju kreiram u programu pa samo pridružim kontroli? Ovo mi se ne sviđa jer nije ugrađeno u kontrolu, a može biti.
- Sada akciju kreiram pri kreiranju kontrole. Možda je rješenje da ju kreiram - uništavam pri promjeni statusa property-a svake kontrole?
 
Odgovor na temu

franjo_tahi
Franjo Tahi
Zagreb

Član broj: 34712
Poruke: 399
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Korištenje TAction17.02.2010. u 11:40 - pre 171 meseci
Napravio sam da radi kako treba.
akciju ne kreiram kada i gumb već pri promjeni status property-a navigatora "ShotrCutActive". Tada radim free ako se postavlja na false ili kreiram ako se postavlja na true.

Isto tako sam morao izmjeniti način pamčenja shortcuta-a. Ranije sam postavio da akcija pamti shorctu, ali nakon free - create mi se shortcut postavljano na (Ctrl + F1).

Eto, možda još kome pomogne...

ovo je klasa gumba:
Code:

  tBtn = Class(TcxButton)
    constructor Create(AOwner: TWinControl);
    destructor Destroy; override;
  private
    fAuto: boolean;
    fAction: TAction;
    fShortCut: TShortCut;
    function GetShort: TShortCut;
    procedure SetShort(const Value: TShortCut);
  public  
  published
     property AutoAction: boolean read fAuto write fAuto;
     property ShortCut: TShortCut read GetShort write SetShort;
  End;

procedure tBtn.SetShort(const Value: TShortCut);
begin
   fShortCut := Value;
   if self.fAction <> nil then self.fAction.ShortCut := Value;
end;


i set property-a navigatora koji sadrži gumbe:

Code:

procedure TToolBar.SetfActiveShortcat(const Value: boolean);
var i: integer;
   mb: tBtn;
begin
  fActiveShortcat := Value;
  for i := 0 to self.ControlCount-1 do begin
     if self.Controls[i] is mBtn then begin
         mb := tBtn(self.Controls[i]);
         if not(Value) then begin
            if (mb.fAction <> nil) then begin
               mb.fAction.Free;
               mb.fAction := nil;
            end;
         end else begin
            if mb.fAction = nil then begin
               mb.fAction := TAction.Create(mb);
               mb.fAction.Visible := true;
               mb.fAction.Enabled := true;
               mb.fAction.ActionList := fActionList;
               mb.ShortCut := mb.fShortCut;
               mb.fAction.OnExecute := ShortCutClick;
               mb.fAction.Tag := mb.Tag;
               mb.fAction.Enabled := Value;
            end;
         end;
     end;
  end;
end;

 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Korištenje TAction

[ Pregleda: 1534 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.