CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - dostęp do metody obiektu dynamicznego

dostęp do metody obiektu dynamicznego

dział ogólny

dostęp do metody obiektu dynamicznego

Nowy postprzez lzommer » środa, 30 października 2013, 14:42

Tworzę dynamicznie StringGrid1:
KOD cpp:     UKRYJ  
        StringGrid1= new TStringGrid(Form6);
        StringGrid1->Parent= Form6;
        StringGrid1->FixedCols= 1;
        StringGrid1->FixedRows= 1;
        StringGrid1->Options << goEditing;
         ;

Chciałbym dostać się do metody
OnDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
i wypełnić ją ciałem, tak jak w statycznym przypadku:
KOD cpp:     UKRYJ  
void __fastcall Form::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
        if (State.Contains(gdFocused))
                Label1->Caption= "Cell(" + IntToStr((ACol)) + "," + IntToStr((ARow)) + ")"+ " has the focus.";

        if ((ACol >= 1 && ACol <= 2) && (ARow >= 1 && ARow <= 2))  //  if Fonts in color.
                StringGrid1->Canvas->Font->Color= clRed;

        StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);

}

Próbuję podpiąc funkcję funkcja: StringGrid1->OnDrawCell = funkcja,
a ciało funkcja zdefiniować jak wyżej, tzn.::
KOD cpp:     UKRYJ  
if (State.Contains(gdFocused))
                Label1->Caption= "Cell(" + IntToStr((ACol)) + "," + IntToStr((ARow)) + ")"+ " has the focus.";

        if ((ACol >= 1 && ACol <= 2) && (ARow >= 1 && ARow <= 2))  //  if Fonts in color.
                StringGrid1->Canvas->Font->Color= clRed;

        StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);


Ale ciągle coś nie tak, mimo roznych kombinacji.
Więc jak? Jest sposób?
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPChrome

Re: dostęp do metody obiektu dynamicznego

Nowy postprzez Mironas » środa, 30 października 2013, 15:33

Umieść na formie StringGrid-a i utwórz dla niego zdarzenie OnDrawCell i "wypełnij je ciałem" ;).
Następnie usuń StringGrid-a.
Prz dynamicznym tworzeniu StringGrid-a dodaj wiersz:
KOD cpp:     UKRYJ  
  StringGrid1->OnDrawCell = StringGrid1DrawCell;
 


[EDIT]
Sorki, ale dopiero jak już to napisałem to spróbowałem skompilować i faktycznie pojawił się błąd.
Trzeba jeszcze zmienić parametry funkcji StringGrid1DrawCell na:
KOD cpp:     UKRYJ  
TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State

Czyli dodać const przed TRect &Rect.
Pamiętaj, że trzeba to zrobić zarówno w pliku CPP i w nagłówkowym.

Za ten post autor Mironas otrzymał podziękowanie od:
lzommer
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: dostęp do metody obiektu dynamicznego

Nowy postprzez polymorphism » środa, 30 października 2013, 18:17

Umieść na formie StringGrid-a i utwórz dla niego zdarzenie OnDrawCell i "wypełnij je ciałem" ;). Następnie usuń StringGrid-a.

Może niech stworzy sobie po prostu metodę o odpowiednich parametrach i typie zwracanym. Po co te akcje ze StringGridem?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: dostęp do metody obiektu dynamicznego

Nowy postprzez Mironas » środa, 30 października 2013, 18:40

Bo szybciej jest wrzucić komponent na formę i zrobić dwuklik na wybranej metodzie niż wpisywać wszystko z palca. Zwłaszcza jeśli zdarzenie ma dużo skomplikowanych parametrów. No i unikamy ryzyka pomyłki w parametrach.

Za ten post autor Mironas otrzymał podziękowanie od:
lzommer
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: dostęp do metody obiektu dynamicznego

Nowy postprzez lzommer » środa, 30 października 2013, 19:02

Tak zrobilem i jednak:
[ILINK32 Error] Error: Unresolved external '__fastcall TForm3::StringGrid1DrawCell(System::TObject *, int, int, System::Types::TRect&, System::Set<Vcl::Grids::Vcl_Grids__3, 0, 5>)' referenced from D:\SG2\WIN32\DEBUG\DYN2.OBJ
[ILINK32 Error] Error: Unable to perform link
Failed
Moj kod h:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#ifndef dyn2H
#define dyn2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Grids.hpp>
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TLabel *Label1;
        void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
public:         // User declarations
        __fastcall TForm3(TComponent* Owner);
        void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow,  const TRect &Rect, TGridDrawState State);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif

a kod cpp:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
 #include <Vcl.Grids.hpp>
#include "dyn2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
TStringGrid *StringGrid1;

//---------------------------------------------------------------------------
void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State)
{
                if (State.Contains(gdFocused))
                Form3->Label1->Caption= "Cell(" + IntToStr((ACol)) + "," + IntToStr((ARow)) + ")"+ " has the focus.";

        if ((ACol >= 1 && ACol <= 2) && (ARow >= 1 && ARow <= 2))  //  if Fonts in color.
                StringGrid1->Canvas->Font->Color= clRed;

        StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);

}

//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{
        StringGrid1= new TStringGrid(Form3);
        StringGrid1->Parent= Form3;
        StringGrid1->FixedCols= 1;
        StringGrid1->FixedRows= 1;
        StringGrid1->Options << goEditing;
        StringGrid1->OnDrawCell= StringGrid1DrawCell;//(TObject*, int , int , const TRect &, TGridDrawState );


}

//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{

        for (int i= 0; i < StringGrid1->RowCount; i++) // jakies wypelnienie.
                for (int j= 0; j < StringGrid1->RowCount; j++)
                        if (j== 0 && i != 0)
                                StringGrid1->Cells[j][i]= IntToStr(i);
                        else
                                if (i== 0 && j > 0)
                                        StringGrid1->Cells[j][i]= IntToStr(j);
                                else
                                        if (i== 0 && j== 0)
                                        {;
                                        }
                                        else
                                                StringGrid1->Cells[j][i]= IntToStr(j) + IntToStr(i);
}
//---------------------------------------------------------------------------

lub tak:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
 #include <Vcl.Grids.hpp>
#include "dyn2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
TStringGrid *StringGrid1;


//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner){}
//---------------------------------------------------------------------------

void __fastcall StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State)
{
                if (State.Contains(gdFocused))
                Form3->Label1->Caption= "Cell(" + IntToStr((ACol)) + "," + IntToStr((ARow)) + ")"+ " has the focus.";

        if ((ACol >= 1 && ACol <= 2) && (ARow >= 1 && ARow <= 2))  //  if Fonts in color.
                StringGrid1->Canvas->Font->Color= clRed;

        StringGrid1->Canvas->TextOut(Rect.Left, Rect.Top, StringGrid1->Cells[ACol][ARow]);

}


//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{

        StringGrid1= new TStringGrid(Form3);
        StringGrid1->Parent= Form3;
        StringGrid1->FixedCols= 1;
        StringGrid1->FixedRows= 1;
        StringGrid1->Options << goEditing;
        StringGrid1->OnDrawCell= StringGrid1DrawCell;//(TObject*, int , int , const TRect &, TGridDrawState );

        for (int i= 0; i < StringGrid1->RowCount; i++) // jakies wypelnienie.
                for (int j= 0; j < StringGrid1->RowCount; j++)
                        if (j== 0 && i != 0)
                                StringGrid1->Cells[j][i]= IntToStr(i);
                        else
                                if (i== 0 && j > 0)
                                        StringGrid1->Cells[j][i]= IntToStr(j);
                                else
                                        if (i== 0 && j== 0)
                                        {;
                                        }
                                        else
                                                StringGrid1->Cells[j][i]= IntToStr(j) + IntToStr(i);
}
//---------------------------------------------------------------------------


Co wiec nie tak???
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Internet Explorer 9

Re: dostęp do metody obiektu dynamicznego

Nowy postprzez polymorphism » środa, 30 października 2013, 19:12

KOD cpp:     UKRYJ  
void __fastcall TForm3::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State)
{
        ...
}

Zapomniałeś o TForm3::.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
lzommer
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: dostęp do metody obiektu dynamicznego

Nowy postprzez lzommer » środa, 30 października 2013, 19:58

Rzeczywiście. Duże dzięki. :)
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Internet Explorer 9

Re: dostęp do metody obiektu dynamicznego

Nowy postprzez Mironas » środa, 30 października 2013, 20:31

polymorphism napisał(a):Zapomniałeś o TForm3::.

I właśnie dlatego lepiej wyklikać zdarzenie niż pisać je z palca :)
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: dostęp do metody obiektu dynamicznego

Nowy postprzez polymorphism » środa, 30 października 2013, 21:01

Znacznie lepiej nauczyć się po prostu języka, a wtedy jak zabiorą Ci "klikadła", jesteś w stanie napisać działający kod ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
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 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: dostęp do metody obiektu dynamicznego

Nowy postprzez Cyfrowy Baron » środa, 30 października 2013, 21:14

Dlaczego #include <Vcl.Grids.hpp> dałeś w pliku źródłowym *.CPP i nagłówkowym *.H? Dla przejrzystości kodu lepiej to dać do pliku nagłówkowego. Poza tym zdarzenie deklarujesz w sekcji public pliku nagłówkowego, więc tylko w tym pliku to być powinno.

StringGrid1 uczyniłeś obiektem globalnym, ale zdarzenie OnDrawCell jest publiczną funkcją formularza Form3. Jaki to ma sens? Inne formularze połączone z Form3 będą miały globalny dostęp do StringGrid1, ale już do jego zdarzenia OnDrawCell dostęp będzie możliwy tylko poprzez Form3.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
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
    WindowsChrome


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

cron