Problem ze zdarzeniem OnKeyPress.

dział ogólny

Problem ze zdarzeniem OnKeyPress.

Postprzez kurczez » wtorek, 19 stycznia 2010, 18:25

Widzę, że temat zszedł w inną stronę to może i ja dołożę coś nowego. Nie chce zaśmiecać forum nowym tematem:

Co oznacza błąd:

[C++ Error] Unit2.cpp(3715): E2034 Cannot convert 'void (_fastcall * (_closure )(TObject *))(TObject *)' to 'TKeyPressEvent'



Wyskakuje on przy próbuje zainicjowania procedury OnKeyPress komponentu:

Kod: Zaznacz cały
dnM[dnie]->OnKeyPress = OnKeyPress;


Parametry funkcji OnKeyPress:

Kod: Zaznacz cały
void __fastcall TForm2::OnKeyPress(TObject *Sender)
{
...
}


Dodam, że ten kod mi działał w zdarzeniu OnChange komponentu TMemo.

To wyraźnie wskazuje, że masz o sobie wysokie mniemanie i innych traktujesz z góry

... Inteligentny człowiek wyłapie ironię, jej intencję...


Baron chyba właśnie o tym pisze. Ja tej ironii nie wyłapałem i zrozumiałem to dokładnie tak jak on. Odbijając piłeczkę zakładając, że nie jestem inteligentny bo nie załapałem ironii to czy człowiek, który wyśmiewa się z kogoś inteligencji jest inteligentny? ;)
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem ze zdarzeniem OnKeyPress.

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 18:36

Nowe tematy nie zaśmiecają forum, a wątki tasiemce sprawiają, że forum staje się nieczytelne, dlatego zdecydowałem wydzielić Twój watek do nowego tematu.



Co się tyczy Twojego problemu, to co Ty właściwie próbujesz zrobić? Czy chcesz podpiąć funkcje pod zdarzenie OnKeyPress dynamicznie tworzonego obiekty, czy też chcesz odwołać się do zdarzenie OnKeyPress jednego obiektu w drugim?
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: Problem ze zdarzeniem OnKeyPress.

Postprzez kurczez » wtorek, 19 stycznia 2010, 18:45

To pierwsze.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem ze zdarzeniem OnKeyPress.

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 18:54

Więc deklarujesz funkcje w pliku nagłówkowym w sekcji private, ale nie nadawaj jej nazwy OnKeyPress, lecz inną, np. dnM1OnKeyPress, a potem definiujesz tą funkcję w pliku źródłowym, w ten sposób funkcja staje się zdarzeniem:

plik nagłówkowy np. Unit1.h
Kod: Zaznacz cały
private:
        void __fastcall dnM1OnKeyPress(TObject *Sender, char &Key);


plik źródłowy np. Unit1.cpp
Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
/* tutaj definicja obiektu dynamicznego */
dnM[dnie]->OnKeyPress = dnM1OnKeyPress;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::dnM1OnKeyPress(TObject *Sender, char &Key)
{
/* instrukcje wywoływane w zdarzeniu */
}
//---------------------------------------------------------------------------


Jedno zdarzenie można podpiąć pod wiele różnych obiektów o ile obiekt obsługuje to zdarzenie, czyli zależy to od typu obiektu.
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: Problem ze zdarzeniem OnKeyPress.

Postprzez kurczez » wtorek, 19 stycznia 2010, 19:15

Próbuję dynamicznie stworzyć obiekt typu TScintilla. Robię to tak:

dnM[dnie] = new TScintilla(Panel4);

Narazie nie mogę sprawdzić dokładnie, na której linijce się wywala, ale gdy staram się stworzyć obiekt i zainicjalizować go kilkoma właściwościami to wyskakuje błąd:


No class is assigned to StreamClass.

Assign a class derived from TSciStreamBase,

or use the TSciStreamDefault class in SciStreamDefault.Pas.



Czy można przypisać dynamicznie tworzonemu obiektowi typu TScintilla wszystkie właściwości obiektu tego samego pliku, który statycznie już sobie żywoci na formie? ;)
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem ze zdarzeniem OnKeyPress.

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 19:21

Czy można przypisać dynamicznie tworzonemu obiektowi typu TScintilla wszystkie właściwości obiektu tego samego pliku, który statycznie już sobie żywoci na formie? ;)


Nie wiem nigdy nie próbowałem. Można jednak utworzyć funkcję-zdarzenie i odwołać się w nim wykorzystując polimorfizm do istniejącego zdarzenia.

Co do Scintilly nie pomogę, nie mam, nie znam, jedyną styczność z tą klasą mam w programie Notepad++
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: Problem ze zdarzeniem OnKeyPress.

Postprzez kurczez » wtorek, 19 stycznia 2010, 19:35

Już sobie ze wszystkimi błędami poradziłem natomiast mam problem z ustawieniem parametrów wygenerowanej TScintilli tak aby była taka jak ta z formy [kolory, rozmiar czcionki, numeracja wierszy itp].
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem ze zdarzeniem OnKeyPress.

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 19:46

To wszystko musisz ustalić tworząc obiekt, czyli musisz odwołać się do właściwości tego obiektu definiując je.
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: Problem ze zdarzeniem OnKeyPress.

Postprzez kurczez » wtorek, 19 stycznia 2010, 20:30

Z właściwościami obiektu już prawie sobie poradziłem, ale jak to często w życiu bywa powstał nowy problem.
Chciałbym przypisać dynamicznemu obiektowi zdarzenie.
RobiÄ™ to analogicznie jak z OnKeyPress, czyli w pliku .h w private:

Kod: Zaznacz cały
   void __fastcall dnM1Modified(TObject *Sender, const int position,
     const int modificationType, PChar text, const int len,
     const int linesAdded, const int line, const int foldLevelNow,
     const int foldLevelPrev);


W pliku cpp:

Kod: Zaznacz cały
void __fastcall TForm2::dnM1Modified(TObject *Sender, const int position,
     const int modificationType, PChar text, const int len,
     const int linesAdded, const int line, const int foldLevelNow,
     const int foldLevelPrev)
{
...
}


A błąd wyskakuje podczas kompilacji przy tej linijce:

Kod: Zaznacz cały
dnM[dnie]->Modified = dnM1Modified;



[C++ Error] Unit2.cpp(3917): E2235 Member function must be called or its address taken

Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem ze zdarzeniem OnKeyPress.

Postprzez Witold » wtorek, 19 stycznia 2010, 20:45

kurczez napisał(a): mam problem z ustawieniem parametrów wygenerowanej TScintilli tak aby była taka jak ta z formy [kolory, rozmiar czcionki, numeracja wierszy itp].


możesz spróbować też z TStream::WriteComponent i TStream::ReadComponent, wygląda że dla TMemo działa:

Kod: Zaznacz cały
#include <memory>
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  std::auto_ptr<TMemoryStream> ap_ms(new TMemoryStream());
  ap_ms->WriteComponent(Memo1);
  AnsiString stara_nazwa = Memo1->Name;
  Memo1->Name += "_tymczasowa_nazwa";
  ap_ms->Position = 0;

  if (Memo2 = dynamic_cast<TMemo*>(ap_ms->ReadComponent(Memo2)))
    {
      Memo1->Name = stara_nazwa;
      Caption = int(Memo2);
      Memo2->Name = stara_nazwa + "_kopia";
      Memo2->Top = 100;
    }
  else throw Exception("dynamic_cast<TMemo*>(ap_ms->ReadComponent(Memo2) równy 0");
}
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
    Windows XPOpera

Re: Problem ze zdarzeniem OnKeyPress.

Postprzez Cyfrowy Baron » wtorek, 19 stycznia 2010, 20:53

A błąd wyskakuje podczas kompilacji przy tej linijce:
[...]


Nie sądzę, żeby dnM[dnie]->Modified = dnM1Modified; było zdarzeniem, to raczej funkcja zwracająca wartość typu bool informująca o zmianach w obiekcie. Zdarzenie będzie zaczynać się od On, czyli powinieneś szukać OnModified. Sprawdź w Object Inspector na zakładce Events dla niedynamicznej Scinlilly, jak nazywa się to zdarzenie.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
kurczez
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: Problem ze zdarzeniem OnKeyPress.

Postprzez kurczez » wtorek, 19 stycznia 2010, 20:55

Nie sądzę, żeby dnM[dnie]->Modified = dnM1Modified; było zdarzeniem


Faktycznie, przepraszam, jest dokładnie tak jak piszesz, dzięki chłopaki.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
PodziÄ™kowaÅ‚ : 4
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox


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