🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.pascal
6 messages
6 total messages Started by Terrmit Mon, 19 Apr 2010 22:41
[Lazarus] Klasa dziedzicząca po TCustomStringGrid
#92992
Author: Terrmit
Date: Mon, 19 Apr 2010 22:41
44 lines
2769 bytes
Witam,
Tym razem chciałbym zapytać o bardziej złożony problem
(a może jest on prosty, tylko ja mam za małą wiedzę).

W programie używam własny komponent StringGrid:
   TMyStringGrid = class(TCustomStringGrid)

Wprowadziłem w nim wiele "innowacji" :) bo standardowy
StringGrid nie za bardzo mi odpowiadał.

W mojej klasie pokrywam też kilka zdarzeń między innymi
procedure HeaderClick(IsColumn: Boolean; index: Integer); override;
procedure DrawCell(aCol,aRow: Integer; aRect: TRect; 
aState:TGridDrawState); override;
i kilka innych

Jednak nie mogę (albo nie wiem jak) pokryć zdarzenia OnEditButtonClicked
procedure EditButtonClicked(Sender: TObject);
http://lazarus-ccr.sourceforge.net/docs/lcl/grids/tcustomgrid.html

Jeśli do TStringGrid.Columns.Items[x].ButtonStyle przypiszemy
cbsButton albo cbsEllipsis, to w po wybraniu komórki z takiej kolumny
mamy dodatkowy przycisk. Po jego kliknięciu może nam się otworzyć
np. jakieś okno dialogowe. Właśnie zdarzenie OnEditButtonClicked
informuje, że kliknięto taki button.
Chciałbym aby moja klasa TMyStringGrid zawsze w takim momencie
sprawdzała jaka dana jest w komórce (tekst, czy liczba)
i w zależności od tego po kliknięciu na button komórki wyświetlała
inne okno dialogowe. Ponieważ w programie używam takich tabel
kilkadziesiąt, a niektóre będą też tworzone dynamicznie, to chciałbym
włączyć to do klasy, a nie oprogramowywać każdą jej instancję.
Niestety procedura EditButtonClicked w przeciwieństwie do
HeaderClick czy DrawCell nie jest oznaczona słowem virtual,
stąd problem.

Czy ktoś mógłby mi poradzić jak to zrobić (i czy w ogóle da
się to zrobić)?

Sławek

być może pomocne linki:
http://svn.freepascal.org/svn/lazarus/trunk/lcl/grids.pas
http://lazarus-ccr.sourceforge.net/docs/lcl/grids/tcustomstringgrid.html
http://wiki.lazarus.freepascal.org/Grids_Reference_Page
Re: [Lazarus] Klasa dziedzicząca po TCustomStringGrid
#92993
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 20 Apr 2010 06:47
28 lines
2087 bytes
On Tue, 20 Apr 2010 00:41:35 +0200, Terrmit wrote:
> Czy ktoś mógłby mi poradzić jak to zrobić (i czy w ogóle da
> się to zrobić)?
> 
> Sławek
> 
> być może pomocne linki:
> http://svn.freepascal.org/svn/lazarus/trunk/lcl/grids.pas
> http://lazarus-ccr.sourceforge.net/docs/lcl/grids/tcustomstringgrid.html
> http://wiki.lazarus.freepascal.org/Grids_Reference_Page

Można pokombinować w okolicach samego eventa
OnEditButtonClicked - ustawić mu z góry w ctorze 
własny event handler który w zależności od zawartości
wywoła OnIntEditButtonClicked/OnStringEditButtonClicked
które dopiszesz, czy też w zależności od tego czy 
*zawsze* potrzebujesz takie same edit dialogi, po prostu
pokaże odpowiednie modal formy.

Odcinasz sobie w ten sposób z oczywistych względów
możliwość użycia OnEditButtonClicked w innych celach.
Chyba w OOP nie ma multicast delegates.

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.pl/
ICQ: 148498663     GG: 2544385      AIM: malyzgora
GTalk: l3vi4than@gmail.com        ASTRA: L3viathan
Re: [Lazarus] Klasa dziedzicząca po TCustomStringGrid
#92994
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 20 Apr 2010 06:48
10 lines
1202 bytes
On Tue, 20 Apr 2010 08:47:56 +0200, Łukasz 'Maly' Ostrowski wrote:
> Chyba w OOP nie ma multicast delegates.

*OP* oczywiście, as in "object pascal". ;-)

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.      http://l3v.pl/
ICQ: 148498663     GG: 2544385      AIM: malyzgora
GTalk: l3vi4than@gmail.com        ASTRA: L3viathan
Re: [Lazarus] Klasa dziedzicząca po TCustomStringGrid
#92995
Author: Terrmit
Date: Tue, 20 Apr 2010 19:38
40 lines
2657 bytes
W dniu 20.04.2010 08:47, Łukasz 'Maly' Ostrowski pisze:
> On Tue, 20 Apr 2010 00:41:35 +0200, Terrmit wrote:
>> Czy ktoś mógłby mi poradzić jak to zrobić (i czy w ogóle da
>> się to zrobić)?
>>
>> Sławek
>>
>> być może pomocne linki:
>> http://svn.freepascal.org/svn/lazarus/trunk/lcl/grids.pas
>> http://lazarus-ccr.sourceforge.net/docs/lcl/grids/tcustomstringgrid.html
>> http://wiki.lazarus.freepascal.org/Grids_Reference_Page
>
> Można pokombinować w okolicach samego eventa
> OnEditButtonClicked - ustawić mu z góry w ctorze
> własny event handler który w zależności od zawartości
> wywoła OnIntEditButtonClicked/OnStringEditButtonClicked
> które dopiszesz, czy też w zależności od tego czy
> *zawsze* potrzebujesz takie same edit dialogi, po prostu
> pokaże odpowiednie modal formy.
>
> Odcinasz sobie w ten sposób z oczywistych względów
> możliwość użycia OnEditButtonClicked w innych celach.
> Chyba w OOP nie ma multicast delegates.
>
Prawdę mówiąc już myślałem o czymś takim. Spróbuję to zaimplementować.
Raczej nie będę potrzebował tego eventa poza klasą i oby nie
okazało się, że się mylę :)
Na razie jednak jego obsługa jest poza klasą, bo muszę mieć działający
program do końca kwietnia. Później będę sobie poprawiał co się da
jak sprawy nie będą już takie pilne.

Gdyby komuś miał jeszcze jakiś pomysł, do bardzo bym prosił
o podzielenie się nim :)
Zaznaczę jeszcze, że modyfikowanie oryginalnego grids.pas raczej
w grę nie wchodzi chyba, że taką modyfikację można by było
zaproponować do wdrożenia programistom Lazarusa.

Dzięki,

Sławek
Re: [Lazarus] Klasa dziedzicząca po TCustomStringGrid
#92996
Author: Terrmit
Date: Tue, 20 Apr 2010 19:41
6 lines
1152 bytes
> Gdyby komuś miał jeszcze jakiś pomysł

Oczywiście miało być:
"Gdyby ktoś miał jeszcze jakiś pomysł"

i tak dobrze, że nie napisałem komuch (!) ;/
Re: [Lazarus] Klasa dziedzicząca po TCustomStringGrid
#92997
Author: Terrmit
Date: Wed, 28 Apr 2010 14:00
68 lines
2884 bytes
W dniu 20.04.2010 21:41, Terrmit pisze:
>> Gdyby komuś miał jeszcze jakiś pomysł
>
> Oczywiście miało być:
> "Gdyby ktoś miał jeszcze jakiś pomysł"
>

To ja mam taki pomysł, u mnie działa :)
więc może u Ciebie też ;D

W swojej klasie, np. TMyStringGrid dopisz:

<code>

TMyStringGrid = class(TCustomStringGrid)
   private
     FOnEditButtonClick: TNotifyEvent;

   protected
     //procedura obsługi nowego zdarzenia OnEditButtonClick
     procedure EditButtonClicked(Sender: TObject);

   public
     //w public musi być konstruktor, bo będzie nam potrzebny
     constructor Create(AOwner: TComponent); override;

   published
     //w published nasze zdarzenie dla Inspektora obiektów
     property OnEditButtonClick: TNotifyEvent read FOnEditButtonClick
                                 write FOnEditButtonClick;
   end;

//A teraz nasze procedurki

procedure TMyStringGrid.EditButtonClicked(Sender: TObject);
begin
   //w EditButtonClicked dopisujemy
   if Assigned(OnEditButtonClick) then OnEditButtonClick(self);

   //a tu wpisujemy to co ma się stać po kliknięciu
   ShowMessage('Nastąpiła eksplozja!');
end;

//W konstruktorze, jeszcze przed inherited Create(AOwner)
//przypisujemy naszą procedurę do OnEditButtonClick rodzica

constructor TMyStringGrid.Create(AOwner: TComponent);
begin
   inherited OnEditButtonClick := @EditButtonClicked;
   inherited Create(AOwner);

   //tu dalszy kod konstruktora
end;

</code>

Nie wiem, czy powinienem ustawiać nil na OnEditButtonClick
w destruktorze. Może dla porządku należałoby.

Fajnie byłoby gdyby procedura EditButtonClicked mogła być
wreszcie virtual, aby można ją było już dalej dziedziczyć.
Na razie nie wiem jak to ugryźć.

Może ktoś ma jakieś uwagi/wskazówki do tego kodu?

Pozdrawiam,

Sławek
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads