CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - HWD to TWinControl

HWD to TWinControl

dział ogólny

HWD to TWinControl

Nowy postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 09:46

Mam problem z pobraniem i przechowaniem zawartości ActiveControl. Mam uchwyt do okna z aktywną kontrolką w HWND i teraz chciałbym sprawdzić, która kontrolka jest aktywna na tym oknie, próbowałem tak:

KOD cpp:     UKRYJ  
Caption = reinterpret_cast<TWinControl *>(hWnd)->Name; /* hWnd - uchwyt HWND do okna */


Ale to nie działa!
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
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez polymorphism » sobota, 29 czerwca 2013, 10:54

To oczywiste, że nie działa, przecież HWND to obiekt (uchwyt do niego) WinAPI a nie VCL! Użyj funkcji WinAPI do komunikacji z oknem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 13:03

Próbowałem już kilku sposobów, ale mi nie wychodzi. Możesz podać jakiś przykład?
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
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez polymorphism » sobota, 29 czerwca 2013, 14:13

Nie bardzo wiem, jak odnieść właściwość Name do okna WinAPI. Chodzi mi o to, co właściwie chcesz wyciągnąć. Według dokumentacji właściwość Name zawiera nazwę obiektu, dzięki której możesz dany obiekt zidentyfikować. W WinAPI czegoś takiego nie ma...

Co to za kontrolka?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 14:15

To Name to było tylko dla celów testowych i akurat to mógłbym wyciągnąć innym sposobem. Chodzi mi o pobranie do TWinControl kontrolki aktywnej na oknie przechowywanym w HWND.
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
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez polymorphism » sobota, 29 czerwca 2013, 14:29

Chcesz obce okno związać z obiektem TWinControl? W sumie nie wiem, czy to możliwe w VCL-u, ale według dokumentacji klasa TWinControl ma właściwość WindowHandle, do której możesz przypisać uchwyt.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 15:32

Nie obce okno, lecz okno własnego programu.
Jak mając uchwyt do okna HWND pobrać z niego zawartość TWinControl, czyli schematycznie wyglądałoby to tak:

TWinControl *winControl = (HWND) -> TWinControl
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
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez polymorphism » sobota, 29 czerwca 2013, 16:04

Pisząc obce miałem na myśli okno, które nie jest tworzone przez obiekt TWinControl (lub jego pochodne).

Nie wiem, czy dobrze rozumiem:
KOD cpp:     UKRYJ  
HWND hwnd = TWinControl_ptr->Handle;

TWinControl* ptr = some_magic_cast(hwnd); // gdzie TWinControl_ptr == ptr
 

o coś takiego Ci chodzi? Jeśli tak, to to nie przejdzie. Z uchwytu okna nie wyciągniesz wskaźnika do obiektu TWinControl (z resztą to bez sensu).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 16:40

polymorphism napisał(a): Z uchwytu okna nie wyciągniesz wskaźnika do obiektu TWinControl (z resztą to bez sensu).


O to właśnie mi chodzi. Ale dlaczego to bez sensu.
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
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez polymorphism » sobota, 29 czerwca 2013, 18:29

Ponieważ lepiej i bezpieczniej operować na obiektach niż na uchwytach, tym bardziej że dostęp do obiektu, który jest właścicielem uchwytu, jak rozumiem masz. Uchwyt jest identyfikatorem okna i nie jest związany z obiektami klasy TWinControl (można by rzec, że jest odwrotnie), zatem nie zawiera on informacji, które chciałbyś wyciągnąć.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez Cyfrowy Baron » sobota, 29 czerwca 2013, 19:16

Tak, już znalazłem na to inny sposób, chociaż nie tak prosty jak mi się wydawało, że będzie z uchwytem.
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
    Windows XPFirefox

Re: HWD to TWinControl

Nowy postprzez Przemyslav » wtorek, 5 lipca 2016, 14:34

Nie wiem czy właściwy temat, bo nie chciałem zakładać nowego, ale czy można w C++ Builder przy pomocy ActiveControl sprawdzić, który i czy kontrolka jest aktywna?

Przykład:

KOD cpp:     UKRYJ  
{
    if ((ActiveControl == Edit1) || (ActiveControl == Edit2))
    {
      // coś tam
    }  
}


Chodzi mi np. o to, że mam trzy pola Edit i jeden przycisk. Chciałbym, aby po wciśnięciu przycisku, tekst w polu Edit1 był czyszczony jeśli kursor był ustawiony w polu Edit1 lub Edit2, a jeśli w Edit3 to nie rób nic. Naraiaze kombinuje z polem Edit1 i Edit2.

Ten kod nie działa - kompiluje się, ale nie jest czyszczone Edit1:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((ActiveControl == Edit1) || (ActiveControl == Edit2))
        {
                Edit1->Text = "";
        }
}
Avatar użytkownika
Przemyslav
Bladawiec
Bladawiec
 
Posty: 42
Dołączył(a): niedziela, 25 maja 2014, 13:59
Podziękował : 22
Otrzymał podziękowań: 0
System operacyjny: Windows 10 x64
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsFirefox

Re: HWD to TWinControl

Nowy postprzez Mironas » wtorek, 5 lipca 2016, 15:05

Bo w momencie kiedy klikasz na Button1 to focus ucieka z Edit1/Edit2 na klikany przyckisk i w tym momencie właściwość ActiveControl wskazuje na Button1.

Możesz wywołać funkcję za pomocą skrótu klawiszowego (np przez TAction) albo zamiast TButton zastosuj TSpeedButton który nie zabiera focusa.

Za ten post autor Mironas otrzymał podziękowanie od:
Przemyslav
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: HWD to TWinControl

Nowy postprzez Przemyslav » wtorek, 5 lipca 2016, 16:52

Dałem przez TAction jak skrót i wszystko działa. Dziękuję za pomoc :)
Avatar użytkownika
Przemyslav
Bladawiec
Bladawiec
 
Posty: 42
Dołączył(a): niedziela, 25 maja 2014, 13:59
Podziękował : 22
Otrzymał podziękowań: 0
System operacyjny: Windows 10 x64
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsFirefox


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 27 gości

cron