Przenieś do następnej kontrolki po naciśnięciu ENTER

dział ogólny

Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Ho88it » czwartek, 18 grudnia 2008, 01:16

No właśnie...
Jest coś takiego co pozwala po naciśnięciu Tabulatora poruszać się po formularzu według kolejnych liczb we właściwości TabOrder
Ma ktoś pomysł jak to zrobić po naciśnięciu ENTER będąc w jakimś aktualnym obiekcie?
Internet Explorer to program, który służy do przeglądania internetu z twojego komputera i na odwrót.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Corvis » czwartek, 18 grudnia 2008, 01:30

Poczytaj w helpie o metodzie SetFocus()
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Ho88it » czwartek, 18 grudnia 2008, 12:15

SetFocus() to funkcja dla obiektu o konkretnej nazwie... A mi chodzi o przeskakiwanie po obiektach według TabOrder bez konkretnej nazwy. Jak bym zrobił to po nazwach, to przy zmianie kolejności musiał bym wszystkie przejrzeć ręcznie i klepać kupę kodu, a tak wystarczy zmiana numeru TabOrder nawet w głupiej pętli.
Internet Explorer to program, który służy do przeglądania internetu z twojego komputera i na odwrót.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Cyfrowy Baron » czwartek, 18 grudnia 2008, 13:11

Ustaw właściwość KeyPreview formularza na którym znajdują się komponenty na true, a następnie utwórz dla tegoż formularza zdarzenie OnKeyUp:

Kod: Zaznacz cały
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
static int tabOrder = 1; // poczÄ…tek TabOrder
if(Key == 13) // przycisk ENTER
{
  lab_1: // etykieta powrotu
  TComponent *Temp;
  for(int i = this->ComponentCount - 1; i >= 0; i--)
  {
   Temp = this->Components[i];
   if(reinterpret_cast<TForm *>(Temp)->TabOrder == tabOrder)
   {
   reinterpret_cast<TForm *>(Temp)->SetFocus();
   tabOrder++;
   return;
   }
  }
  tabOrder = 0;
  goto lab_1;// powrót do poczÄ…tku kodu po wyszukaniu ostatniego komponentu
}
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Ho88it » czwartek, 18 grudnia 2008, 15:14

A mnie w wojsku uczyli nie używać goto :D
Internet Explorer to program, który służy do przeglądania internetu z twojego komputera i na odwrót.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
PodziÄ™kowaÅ‚ : 2
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Witold » piÄ…tek, 19 grudnia 2008, 01:20

Cyfrowy Baron napisał(a):Ustaw właściwość KeyPreview formularza na którym znajdują się komponenty na true, a następnie utwórz dla tegoż formularza zdarzenie OnKeyUp:

Kod: Zaznacz cały
//...
   if(reinterpret_cast<TForm *>(Temp)->TabOrder == tabOrder)
//...



To rozwiązanie wywali błąd (Access violation at address ....) jeżeli umieści się na formie niektóre z komponentów które nie są win-kontrolkami np.: TOpenDialog lub TTimer (sprawdzałem Turbo C++ i BCB). Ciekawe czemu tylko na niektórych ??? Np. po rzutowaniu reinterpret_cast<TForm *>(Temp) dla kontrolki typu TApplicationEvents która przecież nie ma właściwości TabOrder jest spokój.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Cyfrowy Baron » piÄ…tek, 19 grudnia 2008, 17:36

Co za problem! RozwiÄ…zanie jest banalnie proste:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
static int tabOrder = 1; // poczÄ…tek TabOrder
if(Key == 13)
{
  lab_1:
  TComponent *Temp;
  for(int i = this->ComponentCount - 1; i >= 0; i--)
  {
   Temp = this->Components[i];
   try{
   if(reinterpret_cast<TForm *>(Temp)->TabOrder == tabOrder)
   {
   reinterpret_cast<TForm *>(Temp)->SetFocus();
   tabOrder++;
   return;
   }
   }catch(...){;}
  }
  tabOrder = 0;
  goto lab_1;
}
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Witold » sobota, 20 grudnia 2008, 01:10

Cyfrowy Baron napisał(a):Co za problem! Rozwiązanie jest banalnie proste:


Proste jest, ale dalej można odwołać się do właściwości TabOrder dla obiektu klasy, która jej nie ma, tyle że teraz "wyłapujesz" protesty systemu z tym związane.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Przenieś do następnej kontrolki po naciśnięciu ENTER

Nowy postprzez Cyfrowy Baron » niedziela, 21 grudnia 2008, 11:58

No cóż! Cudów nie ma. Można by się pokusić o funkcję sprawdzającą, czy wskazana klasa pochodzi od TWinControl, ale to by tylko niepotrzebnie skomplikowało kod, a wystarcza samo przechwytywanie komunikatów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 11 gości