onexit FindNextControl setfocus

Oglądasz wersję archiwalną wątku "onexit FindNextControl setfocus" z forum pl.comp.lang.delphi



xyz - 10 Mar, 19:22
Witam

mam problem z "uciekajacym" focusem...

w kontrolce (dbedit) ktorej zawartosc moge (lub nie) zmieniac w zdarzeniu onexit mam taki kod (fragment):

if((Sender as TDBEdit) = DBEdit1) then begin

        b := dataset1.FieldByName('DATA').AsDateTime <0;
          for i := 2 to 15 do begin

            ctrl := Self.FindComponent('DBEdit' + IntToStr(i));
            if(Assigned(ctrl)) then
              (ctrl as TDBEdit).Enabled := b;

          end;
         end

czyli w metodzie wylaczam (lub nie) kontrolki ktore maja ustawione tabstop = true, i tutaj pojawia sie problem - kiedy wciskam tab  w kontrolce i nastepuje wylaczenie kolejnych kontrolek focus ginie - zadna kontrolka nie jest wskazana, dopiero kolejny tab ustawia focus na kolejnej kontrolce majacej ustawione enabled = true i tabstop = true, z tego co zauwazylem problemem jest ustawianie wlasciwosci tabstop (przez edycje wlasciwosci enabled kontrolek na disabled) w trakcie wykonywania sprawdzenia do ktorej kontolki teraz skoczyc (setfocus), czyli focus trafia do wylaczonej kontrolki.

czy ktos ma pomysl jak rozwiazac taki problem ?

w skrocie jesli zostawiam jakas kontrolke pusta to chce wylaczyc powiazane kontrolki i skoczyc do nastepnej kontrolki ktora moze przyjac focusa

dziekuje za pomoc




xyz - 10 Mar, 19:50
chyba jedynym sposobem jest umieszczenie sprawdzenia i wlaczenie/wylaczenie kontrolki w metodzie onenter "podrzednych" kontrolek z przeskokiem do kolejnej

begin

        if(Sender is TDBEdit) then begin

              b := dataset1.FieldByName('DATA').AsDateTime <0;
              if(b) then
                (Sender as TDBEdit).Color := clInfoBk
              else begin

                (Sender as TDBEdit).Color := clBtnFace;
                ctrl := FindNextControl(Sender as TWinControl, TRUE, TRUE, FALSE);
                (ctrl as TWinControl).SetFocus;

              end;

               (Sender as TDBEdit).Enabled := b;

            end;

end;



wloochacz - 11 Mar, 05:36

chyba jedynym sposobem jest umieszczenie sprawdzenia i wlaczenie/wylaczenie kontrolki w metodzie onenter "podrzednych" kontrolek z przeskokiem do kolejnej



Źle, źle, źle... ŹLE!
Po pierwsze zostaw w spokoju, kontrolki - to co próbujesz zrobić
powinieneś zrobić na zdarzeniach pól (Fields.OnValidate) i/lub na
zdarzeniach DataSource. To co robisz, można opisać jak próbę kierowania
samochodem przez modlenie się do opon...
A poza tym, wysłucha (ze zrozumieniem) wykładu z Code Rage III pod
tytułem: "Smarter Code with Databases and Data Aware Controls"
http://conferences.codegear.com/coderage08/dbsessions


xyz - 12 Mar, 04:47
[...]

Źle, źle, źle... ŹLE!



to bolało... ale się spodziewałem :P

Po pierwsze zostaw w spokoju, kontrolki - to co próbujesz zrobić
powinieneś zrobić na zdarzeniach pól (Fields.OnValidate) i/lub na
zdarzeniach DataSource. To co robisz, można opisać jak próbę kierowania
samochodem przez modlenie się do opon...
A poza tym, wysłucha (ze zrozumieniem) wykładu z Code Rage III pod
tytułem: "Smarter Code with Databases and Data Aware Controls"
http://conferences.codegear.com/coderage08/dbsessions

--
wloochacz



co racja to racja, a o tych "wykładach" to nie wiedziałem, co do zawartości w/w... bardzo fajne rzeczy tam są, a ja to wszystko kleiłem ręcznie... cepelia poprostu ;)

dzięki




wloochacz - 12 Mar, 05:35

/ciach/
co racja to racja, a o tych "wykładach" to nie wiedziałem, co do zawartości w/w... bardzo fajne rzeczy tam są, a ja to wszystko kleiłem ręcznie... cepelia poprostu ;)



O! ooooo!!
W końcu do kogoś dotarło!
Szacun!Zwłaszcza że nazwałeś to tak, jak sam bym siebie czytał ;-)


xyz - 13 Mar, 05:06
eh... trochę się tym pobawiłem i jednak nie działa to za dobrze - kontrolki się ładnie włączają/wyłączaja gdy ustawiam readonly pól, jednak ten nieszczęsny "tab" zawsze trafia w kontrolkę podpiętą do pola która w onvalidate została ustawiona na readonly = true:

mam sobie pola:

data
pole1
pole2
pole3

jesli data <'' to wlacz edycje pol1-3
jesli nie to wylacz edycje

kod:

procedure TForm1.dataValidate(Sender: TField);
var b : boolean;

  procedure Revalidate();
  begin

          if(Sender.Tag = 1) then begin // kilka pol z datami - selekcja ktory ma wylaczyc/wlaczyc ktore pola

            dataset1.FieldByName(pole1').ReadOnly := b;
            dataset1.FieldByName(pole2').ReadOnly := b;
            dataset1.FieldByName(pole3').ReadOnly := b;
            dataset1.FieldByName(pole4').ReadOnly := b;

            end
         else
        {}

  end;

begin

        if((Sender.AsString <'') AND ((Sender.AsDateTime < FDataZakresOd) OR (Sender.AsDateTime FDataZakresDo))) then begin

          Application.MessageBox(pchar('Data spoza zakresu.'), pchar(Application.Title), MB_OK + MB_ICONERROR);

          Sender.FocusControl;
          abort();

         end
        else
        if(Sender.AsString <'') AND ((Sender.AsDateTime = FDataZakresOd) AND (Sender.AsDateTime <= FDataZakresDo)) then begin

          b := FALSE;

          Revalidate;

         end
        else if(Sender.AsString = '') then begin

          b := TRUE;

          Revalidate;

        end;

end;

no... wiec niby ten komponent TCustomDataAwareControlController powinien mi ustawic tabstop pierwszej kontrolki

gdy startuje aplikacje pola sa wylaczone - kontrolki maja ustawione tabstop = false, kursor jest w kontrolce pola daty

teraz wprowadzam date (poprawna) w kontrolke - zgodnie z zalozeniem wszystkie pola1-3 powinny teraz byc edytowalne czyli powiniennem moc przeskoczyc do pierwszej kontrolki (pole1) jednak...
skacze do kontrolki ktora bylaby pierwsza kontrolka gdyby pola1-3 byly nadal wylaczone (czyli skacze np do kontrolki pole4)

wyglada to tak ze jesli nacisne tab w kontrolce to nie jest uaktualniania lista obiektow tabstop = true

a tego to nawet ten zmyslny komponent nie przeskoczy (w swoim pierwotnym kodzie)



Arivald - 18 Mar, 18:27

eh... trochę się tym pobawiłem i jednak nie działa to za dobrze - kontrolki się ładnie włączają/wyłączaja gdy ustawiam readonly pól, jednak ten nieszczęsny "tab" zawsze trafia w kontrolkę podpiętą do pola która w onvalidate została ustawiona na readonly = true:



Jeśli się nie mylę, to OnExit jest wołane już kiedy inna kontrolka
dostała focusa. I kiedy ona ma focusa, ty ją wyłączasz.
Spróbuj przed wyłączeniem sprawdzać czy kontrolka ma fokusa, i wtedy
spróbować go posłać dalej... nie wiem jak. Wysłać jej TAB'a?


karta kredytowa, pomoc
srednia ocen - dzieki
CZYM HANDLOWAĆ ZIMĄ
  • wokalistka sandra zdjecia
  • jak podzielic film
  • biura projektowe architektoniczne
  • era wymiana telefonu
  • lois murphy
  • druk przelewu pocztowego za opB3acenie wydania
  • zespol muzyczny kutno
  • 8720 takamizawa
  • 27przeciEAtne wynagrodzenie2222
  • Baza tematów z grup dyskusyjnych ## Start