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
Author: Terrmit
Date: Mon, 19 Apr 2010 22:41
Date: Mon, 19 Apr 2010 22:41
44 lines
2769 bytes
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
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 20 Apr 2010 06:47
Date: Tue, 20 Apr 2010 06:47
28 lines
2087 bytes
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
Author: Łukasz 'Maly' Ostrowski
Date: Tue, 20 Apr 2010 06:48
Date: Tue, 20 Apr 2010 06:48
10 lines
1202 bytes
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
Author: Terrmit
Date: Tue, 20 Apr 2010 19:38
Date: Tue, 20 Apr 2010 19:38
40 lines
2657 bytes
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
Author: Terrmit
Date: Tue, 20 Apr 2010 19:41
Date: Tue, 20 Apr 2010 19:41
6 lines
1152 bytes
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
Author: Terrmit
Date: Wed, 28 Apr 2010 14:00
Date: Wed, 28 Apr 2010 14:00
68 lines
2884 bytes
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