Sprawdzenie czy pole edycji zostało zmienione.

dział ogólny

Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Chlorek » sobota, 29 października 2011, 15:37

Witam. Piszę program, który wymaga sprawdzenia czy zawartość pola edit różni się od pierwotnej jego zawartości. Ogółem wydawałoby się wszystko proste - porównanie dwóch stringów - jeden z pierwotną wartością, a drugi z aktualną. Jednak w moim programie ten sposób nie zadziała z pewnych względów. W każdym razie czy istnieje jakakolwiek inna możliwość sprawdzenia czy pole zostało zmodyfikowane przez użytkownika (od razu mówię, że pole będzie zmieniane podczas działania programu nie tylko przez użytkownika ale i sam program).
Z góry dziękuję każdemu za wszelką pomoc.
Kevin Mitnick - łamacz ludzi, nie haseł.
Najlepszy sposób nauki c++... pisać, pisać, pisać, pisać i jeszcze raz pisać!
Avatar użytkownika
Chlorek
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): czwartek, 6 stycznia 2011, 20:20
Lokalizacja: Tu i tam
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Linux Macpup & Win XP Prof & Linux SlackWare & Linux Ubuntu
Kompilator: Dev-C++ v4.9.9.2 (mingw 3.4.2); Code::Blocks v10.05 (mingw najnowsze)
SKYPE: chlorekcl
    Windows XPFirefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Cyfrowy Baron » sobota, 29 października 2011, 15:41

Klasa TEdit nie posiada żadnej metody informującej o zmianie zawartości. Jedyny sposób na sprawdzenie czy zawartość Edit uległa zmianie to porównanie dwóch wartości sprzed modyfikacji i po modyfikacji. Najlepiej zrealizować to w zdarzeniu OnChange obiektu Edit.
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: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Chlorek » sobota, 29 października 2011, 15:51

Czyli nie ma żadnej metody na sprawdzenie bez porównania wartości. Skoro tak jest może spróbuję wykonać to sprawdzenie drogą porównania ale tu mam właśnie problemy:
1. Nie znam początkowo rozmiaru tablicy w której chcę trzymać dane, a musi ona być globalna więc definiowanie zmiennej wewnątrz funkcji w której dopiero to poznaje jej rozmiar, tak więc ten sposób odpada.
2. Porównywanie będzie się wykonywało bardzo wiele razy, a znaków do porównania będzie bardzo dużo co spowolni program.

Jakiś pomysł? Wiem, że pewnie istnieje jakiś łatwy sposób rozwiązania problemu #1 o którym prawdopodobnie jeszcze nie pomyślałem ale co do drugiego?
Kevin Mitnick - łamacz ludzi, nie haseł.
Najlepszy sposób nauki c++... pisać, pisać, pisać, pisać i jeszcze raz pisać!
Avatar użytkownika
Chlorek
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): czwartek, 6 stycznia 2011, 20:20
Lokalizacja: Tu i tam
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Linux Macpup & Win XP Prof & Linux SlackWare & Linux Ubuntu
Kompilator: Dev-C++ v4.9.9.2 (mingw 3.4.2); Code::Blocks v10.05 (mingw najnowsze)
SKYPE: chlorekcl
    Windows XPFirefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Cyfrowy Baron » sobota, 29 października 2011, 16:37

Przecież pole Edit przechowuje i zwraca wartość String, więc nie musisz znać rozmiaru tablicy, gdyż porównujesz dwa Stringi. Co do drugiego problemu: jakich znaków? Masz przecież porównać cały łańcuch znaków, chyba że o czymś nam tutaj nie mówisz...
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: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Chlorek » sobota, 29 października 2011, 16:41

Znaków w stringu zgadza się, jednak te stringi są delikatnie mówiąc bardzo duże - nie koniecznie ale czasem może się zdarzyć i tak na pewno będzie, że w stringu będzie bardzo dużo znaków a do tego częste porównywanie co równe będzie spowolnieniu programu na słabszych komputerach.
Kevin Mitnick - łamacz ludzi, nie haseł.
Najlepszy sposób nauki c++... pisać, pisać, pisać, pisać i jeszcze raz pisać!
Avatar użytkownika
Chlorek
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): czwartek, 6 stycznia 2011, 20:20
Lokalizacja: Tu i tam
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Linux Macpup & Win XP Prof & Linux SlackWare & Linux Ubuntu
Kompilator: Dev-C++ v4.9.9.2 (mingw 3.4.2); Code::Blocks v10.05 (mingw najnowsze)
SKYPE: chlorekcl
    Windows XPFirefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez wargo » sobota, 29 października 2011, 17:05

Użyj zdarzenia onchange
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    Windows 7Firefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Chlorek » sobota, 29 października 2011, 19:20

Jeśli mógłbym prosić o jakiś przykład użycia onChange byłbym wdzięczny. Jeszcze się uczę winapi i nie znam wszystkiego. Szukałem w google jednak ku mojemu zdziwieniu nie było wiele tematów co do użycia tego.
Kevin Mitnick - łamacz ludzi, nie haseł.
Najlepszy sposób nauki c++... pisać, pisać, pisać, pisać i jeszcze raz pisać!
Avatar użytkownika
Chlorek
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): czwartek, 6 stycznia 2011, 20:20
Lokalizacja: Tu i tam
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Linux Macpup & Win XP Prof & Linux SlackWare & Linux Ubuntu
Kompilator: Dev-C++ v4.9.9.2 (mingw 3.4.2); Code::Blocks v10.05 (mingw najnowsze)
SKYPE: chlorekcl
    Windows XPFirefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez wargo » sobota, 29 października 2011, 19:53

Jednak nie używasz BCB więc jednak to nie zadziała
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    Windows 7Firefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Cyfrowy Baron » sobota, 29 października 2011, 20:15

Problem w tym, że Ty używasz Dev-C++ i ja osobiście nie znam bibliotek z tego środowiska. W każdym bądź razie tutaj samo zdarzenie OnChange nie zda egzaminu, gdyż to zdarzenie reaguje na wszelkie zmiany w zawartości obiektu. Mógłbyś posłużyć się zdarzeniem OnLeave - opuszczenie obiektu, czyli gdy z Edit jest zdejmowany focus pobierasz wartość z Edit i porównujesz z zawartością zmiennej String, która przechowuje starą wartość. Po sprawdzeniu do zmiennej przepisujesz wartość Edit. Problem jednak stanowi zdarzenie OnLeave, którego w Twoim środowisku klasa TEdit nie obsługuje. Można takie zdarzenie oczywiście stworzyć, a przykład tworzenia tego zdarzenia znajdziesz w serwisie Cyfrowy Baron dział: porady -> różne -> Zmiana sposobu wyświetlania podpowiedzi w chmurkach (właściwość HINT).
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: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Chlorek » sobota, 29 października 2011, 20:36

Raczej niezbyt to dla mnie zrozumiałe. W każdym razie dziękuję za chęć pomocy.
Kevin Mitnick - łamacz ludzi, nie haseł.
Najlepszy sposób nauki c++... pisać, pisać, pisać, pisać i jeszcze raz pisać!
Avatar użytkownika
Chlorek
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): czwartek, 6 stycznia 2011, 20:20
Lokalizacja: Tu i tam
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Linux Macpup & Win XP Prof & Linux SlackWare & Linux Ubuntu
Kompilator: Dev-C++ v4.9.9.2 (mingw 3.4.2); Code::Blocks v10.05 (mingw najnowsze)
SKYPE: chlorekcl
    Windows XPFirefox

Re: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez polymorphism » sobota, 29 października 2011, 22:02

Jeśli mowa o WinAPI, to edit zgłasza zmianę stanu wysyłając do okna-rodzica notyfikację EN_CHANGE poprzez komunikat WM_COMMAND. Dokumentację czytać!

I tak na przyszłość, zawsze pisz jakiej biblioteki Twój problem dotyczy.
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: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Cyfrowy Baron » sobota, 29 października 2011, 22:22

polymorphism napisał(a):edit zgłasza zmianę stanu wysyłając do okna-rodzica notyfikację EN_CHANGE poprzez komunikat WM_COMMAND


Czyli wystarczy obsługa zdarzenia OnChange, ale to nie jest dobre wyjście, gdyż komunikat będzie wysyłany przy wpisywaniu każdej litery do Edit, czyli za często, dlatego zaproponowałem zdarzenie OnLeave. To kiedy program sprawdza zmiany w Edit zależy chyba od tego kiedy jest to potrzebne, ale Chlorek podał za mało informacji.
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: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez polymorphism » sobota, 29 października 2011, 22:30

W sumie podam jeszcze dwa makra, które będą bardziej pomocne - Edit_SetModify i Edit_GetModify.
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: Sprawdzenie czy pole edycji zostało zmienione.

Nowy postprzez Chlorek » sobota, 29 października 2011, 22:53

Ten pierwszy sposób polymorphism'a jest ok i działa dokładnie o to jak mi chodziło - a nie spowolni to też mojego programu, potrzebuję tylko sprawdzić czy zmieniono coś w pliku za pierwszym razem potem już niech się dzieje co chce tak więc problem uważam za rozwiązany i bardzo wszystkim dziękuję.
Kevin Mitnick - łamacz ludzi, nie haseł.
Najlepszy sposób nauki c++... pisać, pisać, pisać, pisać i jeszcze raz pisać!
Avatar użytkownika
Chlorek
Bladawiec
Bladawiec
 
Posty: 41
Dołączył(a): czwartek, 6 stycznia 2011, 20:20
Lokalizacja: Tu i tam
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Linux Macpup & Win XP Prof & Linux SlackWare & Linux Ubuntu
Kompilator: Dev-C++ v4.9.9.2 (mingw 3.4.2); Code::Blocks v10.05 (mingw najnowsze)
SKYPE: chlorekcl
    Windows XPFirefox


  • 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 31 gości

cron