CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - TListView - brak zdarzenia 'OnCancelEdit'

TListView - brak zdarzenia 'OnCancelEdit'

problemy z funkcjonowaniem bibliotek, komponentów itp.

TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez Mironas » środa, 21 lipca 2021, 11:45

Komponent TListView nie ma zdarzenia OnCancelEdit (analogicznego do takiego zdarzenia np. w 'TTreeView') które byłoby wywoływane jeśli wyjdziemy z edycji tekstu Item-u bez zmiany tego tekstu. Zdarzenie OnEdited jest wywoływane wyłącznie jeśli zmienimy i zatwierdzimy zmiany.

Czy da się jakoś przechwycić anulowanie zmian tekstu w TListView lub przynajmniej przechwycić każde wyjście z edycji - niezależnie czy ze zmianami czy bez?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 503
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 25
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez polymorphism » czwartek, 22 lipca 2021, 11:02

Kontrolka ListView wysyła WM_NOTIFY -> LVN_ENDLABELEDIT. Wystarczy przechwycić ten komunikat.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2280
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez Mironas » czwartek, 22 lipca 2021, 14:27

W ogóle nie przechwytuje mi komunikatu WM_NOTIFY kiedy wychodzę z edycji Itemu w TListWiew (ani przy innej okazji).
No chyba, że coś źle robię:

Unit1.h
KOD cpp:     UKRYJ  

public:
  void __fastcall OnNotify(TMessage &Message);
  BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_NOTIFY, TMessage, OnNotify)
  END_MESSAGE_MAP(TForm)
 

Unit1.cpp
KOD cpp:     UKRYJ  
void __fastcall TForm1::OnNotify(TMessage &Message)
{
  Beep();   // To się nie wykonuje
}
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 503
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 25
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez polymorphism » czwartek, 22 lipca 2021, 20:09

Spróbuj z TForm::WndProc.

Jeśli to nic nie da, zsubclasuj kontrolkę.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2280
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez Mironas » piątek, 23 lipca 2021, 10:10

polymorphism napisał(a):Spróbuj z TForm::WndProc.

Nie odbiera komunikatu WM_NOTIFY.
Wcześniej próbowałem też z WindowProc oraz z komponentem TApplicationEvents (zdarzenie 'OnMessage').

polymorphism napisał(a):Jeśli to nic nie da, zsubclasuj kontrolkę.

A jak w tej nadpisanej kontrolce przechwycić wyjście z edycji tekstu Item-u?

Obawiam się, że windowsowa kontrolka ListView nie wysyła komunikatu WM_NOTIFY. Dlatego TListView nie ma takiego zdarzenia (bo nie ma jak go wywołać).
Mam też komponent TAdvListView (z pakietu TMS) i chociaż ma kilka zdarzeń więcej to OnCancelEdit ani podobnego - nie ma.

Na pewno chodzi o komunikat WM_NOTIFY?
Bo wyjście z edycji tekstu Noda TTreeView też nie wysyła tego komunikatu, a ten komponent ma 'OnCancelEdit'.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 503
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 25
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez polymorphism » piątek, 23 lipca 2021, 13:19

Obawiam się, że windowsowa kontrolka ListView nie wysyła komunikatu WM_NOTIFY.

Dlaczego zatem w dokumentacji jest LVN_ENDLABELEDIT? A jakiś WM_NOTIFY na bank wysyła, bo tak kontrolki w Windowsie sygnalizują zdarzenia.

Na pewno chodzi o komunikat WM_NOTIFY?

Tak. Zajrzyj do opisu LVN_ENDLABELEDIT:
Windows napisał(a):Notifies a list-view control's parent window about the end of label editing for an item. This notification code is sent in the form of a WM_NOTIFY message.


A jak w tej nadpisanej kontrolce przechwycić wyjście z edycji tekstu Item-u?

Coś w ten deseń:
KOD cpp:     UKRYJ  
LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch (msg)
    {
    case WM_NOTIFY:
        switch (static_cast<LPNMHDR>(lParam)->code)
        {
        case LVN_ENDLABELEDIT:
                LPNMLVDISPINFO pdi = static_cast<LPNMLVDISPINFO>(lParam);
                /* ... */
               
                return TRUE;

        /* ... */
        }
    }
    return FALSE;
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2280
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez Mironas » piątek, 23 lipca 2021, 13:39

polymorphism napisał(a):A jakiś WM_NOTIFY na bank wysyła, bo tak kontrolki w Windowsie sygnalizują zdarzenia.

W takim razie coś źle robię, bo nie przechwytuję żadnego WM_NOTIFY z aplikacji. A próbowałem na różne sposoby.
Np tak:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
// Unit1.h
//---------------------------------------------------------------------------
private:
  void __fastcall WndProc(TMessage &Msg);

//---------------------------------------------------------------------------
// Unit1.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::WndProc(TMessage &Msg)
{
  if ( Msg.Msg == WM_NOTIFY )
  {
    Beep();
  }
  TForm::WndProc(Msg);
}
//---------------------------------------------------------------------------
 
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 503
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 25
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez polymorphism » piątek, 23 lipca 2021, 13:47

Bierz poprawkę na to, że komunikat ten może być (i zapewne jest) przetwarzany przez kod implementujący TForm, więc może po prostu nie dochodzić do tej metody. Być może jestr to tak zaimplementowane, że do TForm1::WndProc dochodzą tylko komunikaty nieobsłużone. Ciężko powiedzieć...
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Mironas
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2280
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez Mironas » piątek, 23 lipca 2021, 14:35

Ok, mamy to.
Problem polegał na tym, że kontrolka wysyła WM_NOTIFY niekoniecznie na Formę, a na swojego rodzica. Np na TPanel lub TGroupBox na którym leży.
Rozwiązanie wygląda następująco:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------
// Unit1.h
//---------------------------------------------------------------------------
private:
  TWndMethod GB1WP;           // Oryginalny 'GroupBox1.WindowProc'
  void __fastcall GroupBox1WindowProc(TMessage &Msg);

//---------------------------------------------------------------------------
// Unit1.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  GB1WP = GroupBox1->WindowProc;
  GroupBox1->WindowProc = GroupBox1WindowProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GroupBox1WindowProc(TMessage &Msg)
{
  if ( Msg.Msg == WM_NOTIFY )
  {
    NM_LISTVIEW* Info = (NM_LISTVIEW*)Msg.LParam;
    if ( Info->hdr.code == LVN_ENDLABELEDIT )
      Beep();
  }
  GB1WP(Msg);
}
//---------------------------------------------------------------------------
 

polymorphism dzięki za wskazówki.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 503
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 25
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez polymorphism » piątek, 23 lipca 2021, 20:44

Problem polegał na tym, że kontrolka wysyła WM_NOTIFY niekoniecznie na Formę, a na swojego rodzica.

Ja od początku zakładałem, że ListView leży na formie, tym bardziej, że sam dałeś przykład z mapą komunikatów w TForm1.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2280
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez Mironas » poniedziałek, 26 lipca 2021, 09:31

polymorphism napisał(a):sam dałeś przykład z mapą komunikatów w TForm1.

No właśnie nie wiedziałem, że to może zadziałać, tylko jeśli komponent wysyłający jest na TForm. Zawsze wydawało mi się, że wszystkie komunikaty docierają do formy.. Jakoś tak wcześniej, nie miałem takiej sytuacji, że potrzebowałem łapać komunikaty z komponentów umieszczonych na innych komponentach.

A jak w takim przypadku (TListView np na TPanel) powinno wyglądać przechwytywanie komunikatu za pomocą MESSAGE_MAP?
Zrobić własną klasę/Komponent TMyPanel dziedziczącą po TPanel i w niej zrobić przechwytywanie komunikatów?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 503
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 25
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: TListView - brak zdarzenia 'OnCancelEdit'

Nowy postprzez polymorphism » poniedziałek, 26 lipca 2021, 10:56

Zawsze wydawało mi się, że wszystkie komunikaty docierają do formy..

W przypadku WM_NOTIFY to tak nie działa. Jeśli mnie pamięć nie myli, komunikaty WM_COMMAND "spływają" w dół hierarchii.

Zrobić własną klasę/Komponent TMyPanel dziedziczącą po TPanel i w niej zrobić przechwytywanie komunikatów?

Tak. Makra BEGIN_MESSAGE_MAP, MESSAGE_HANDLER i END_MESSAGE_MAP w rzeczywistości implementują metodę TObject::Dispatch, dodają switcha z odpowiednim "kejsem" dla podanego komunikatu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Mironas
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2280
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 213
System operacyjny: Windows 8.1
Windows 10
Linux Mint 20
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

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

cron