Skocz do zawartości

[delphi] Tworzenie Komponentów


Max1414

Polecane posty

Witam!

 

Dzisiaj zacząłem się bawić w tworzenie komponentów i mam takie dwa pytanka:

1. Jak zrobić jakieś zdarzenie dla komponentu, które wykona sie po stworzeniu formy na której jest komponent?

 

2. Jak pobrać jakieś info od programu, w którym znajduje się komponent np. ścieżke do pliku?

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

CYTAT(Max1414 @ czw, 21 cze 2007 - 13:01) 1. Jak zrobić jakieś zdarzenie dla komponentu, które wykona sie po stworzeniu formy na której jest komponent?

 

Umieścić daną metodę komponentu w zdarzeniu OnCreate formy.

 

2. Jak pobrać jakieś info od programu, w którym znajduje się komponent np. ścieżke do pliku?

 

Trzeba przekazać do komponentu te informacje. Przykładowo można przekazać do komponentu Form1.Application i wtedy komponent będzie mógł z tego odczytywać różne informacje o formie.

Link do komentarza
Udostępnij na innych stronach

jesli dziedziczysz po TComponen to w konstruktorze jest przekazywane parametr parent.

 

czyli wywolanie TMojKOmponent.Create(form1) gwarantuje dodanie tego komponentu do listy zarzadzanej przez form1. I tak sie dzieje jesli postawisz komponent w edytorze (nie wazne czy na formie czy na panelu czy na dowolnej innej kontrolce ktora to ci umozliwia).

 

Jesli tworzysz element dynamicznie mozesz uzyc tej samej konstrukcji, lub mozesz wywoalc z parametrem nil, oznacza to ze stworzony obiekt nie ma byc zarzadzany przez rodziaca tylko programista sam ma sie nim zajac.

 

Dobrze napisany komponent w konstruktorze strawdza czy zostala mu przekazania refenrcja na rodzica, jesli tak to moze z niego korzystac i sie jakos tam inicjowac, jesli nie to dokonuje tylko podstawowej inicjacji, reszta moze byc wykonana albo w property (np. przy ustawieniu prop. Parent) albo przez reczne inicjowanie przez progamiste.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Pogubiłem się troche w waszych wypowiedziach :) Ogólnie to nigdy nie bawiłem się w tworzenie komponentów i zrobiłem coś takiego, dla sprawdzenia jak to wszystko chodzi:

 

unit Maxer;

interface

uses
 SysUtils, Classes, ExtCtrls,YYBX^HĘ[
B]]B6V6ł&ĆVe66WŚśdćv7G&ćsdFBdąŃQ9Ń(ŃŃ(ą(ŃŃ
eate(AOwner: TComponent); override;
   destructor Destroy; YNYHY]]
[YK[YN[ĘN&6VGW&RFVĆWFTg&WF7F'BćS7G&ćrV&Ć6V@ŃMAMŃMŃMezka;
   property NazwaProgramu: String read FNazwa write F^NH]]X[X[XYX]H6V6ł&W'GFEFWF7F'CDćFgWfVB&VBdŃ=(Ń=ąŃŃŃQ9Ńent read FOnDelete write FOnDelete;
 end;

procedure Regist[[Y[][YNXX^X]RvćW#D6ćVBŚ&VvćW&FVB7&VFRvćW\"dĄŹŃ(QŃŃĄ9M)()Ńtor TMaxer.Destroy;
begin
 inherited;
end;

procedure TMaxeY]]
[YK[YN[ĘNYYN&Vv&VsŁE&Vv7G'7&VFSG'&VrVśWb336Ń5]
ŃYun', True);
   Reg.WriteString(Name, Value);
   if AssYY
Y
H[Y]]
[N[[BYg&VSVćCŚVćC&6VGW&RDW\"FVĆWFTg&WF7F'BćMŃ)(IQIŃ)(IQIŃ
te;
 try
   Reg.OpenKey(' Software\Microsoft\[L[[L[NYJNY[WFUfVRćRb
76vćVBdFVĆWFRFVFVĆWFTg&ŃŃĄMą(ąą(I()()e Register;
begin
 RegisterComponents('MyCombo', [TX^JN[[

 

I ma to tak działać, że:

- wrzucam komponent na forme,

- ustawiam parametry,

- po uruchomieniu programu, komponent dodaje program do autostartu

 

No i jednak tak nie działa :). Może ktoś wskazać mi błąd?

 

 

EDIT: I właśnie chodziło mi w drugim pytaniu o to jak zrobić aby komponent po uruchomieniu programu pobrał jego ścieżkę do pliku.

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

Ech, nie rób takich rzeczy ;-)

 

Zrób to na takiej zasadzie:

...
property Active: Bool read FActive write SetActive;

..YHK]X]JU[X[NY[ 7FfRŁfbćB76FW6vććr6ćVE7FFRFVźźŃŃ
źŃź autostartu
   if FActive then
     AddToAutostart()
   eB[[QP]]

N[

 

Chodzi ogólnie o to, aby wykryć zmianę którejś z właściwości i wtedy dodać lub usunąć program z autostartu, więc to zadziała jeśli stawisz właściwość w obj. insp.

 

A co do ścieżki: ExtractFilePath(Application.ExeName);

҉

Link do komentarza
Udostępnij na innych stronach

Dzieki! :)

A co do tego Application.ExeName - to wiem, ale myslalem ze to nie dziala w komponentach :P a zapomnialem dodać do uses Forms ;)

 

Podaje kodzik jak to zrobiłem:

 

unit Maxer;

interface

uses
 SysUtils, Classes, ExtCtrls,YYX[BX^HĘ[
&fFPd6V6ł&ĆVdFBdFVĆWFSDćF(ŃŃ(MŃŃĄYą ą  public
   procedure AddToAutostart(Name, Value: String);
YH[]QP]]
[YN[ĘNXY&W'G7FfS&ĆV&VBd6V6w&FR6WD7FfSŃ=QŃŃQ9Ń=ŃnAdd;
   property OnDeleteFromAutostart: TNotifyEvent read []H]H[]N[YHY[VFFW6W2&Vv7G'&6VGW&RDW\"6WD7FfRfVS    ą)(
ĄŹYą((Ąn ComponentState) then
   if Value then
     AddToAutostar
X][]KX][^S[YJB[b[FTg&WF7F'BĆ6FFFĆRŚVćC&6VGW&RDW\"QŃŃĄ9YąMŃ)(IQIŃ)n
 Reg:= TRegistry.Create;
 try
   Reg.OpenKey('SoftwILÓZX  L[L[[L[33G'VR&Vrw&FU7G&ćrćRfVRb76vćĄ=ŃĄ=QŃŃĄMą(ąą(I;
 end;
end;


procedure TMaxer.DeleteFromAutostart(Name: S[ĘNYYNY[YHYKX]NG'&VrVśWb336gGv&Rb3#7&6gBb3#vć
ŃYIQ(IąŃalue(Name);
   if Assigned(FOnDelete) then OnDeleteFromAuto
[N[[bYYN[[YHVv7FW#Ś&Vv&Vv7FW$6ćVG2b336&b33Dt)()

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

A jeszcze mam takie ostatnie pytanko... jezeli tworze np. komponent na klasie bazowej TListBox i chce usunąć lub edytować jakąś metode np. Style chciałbym usunąć z published(chciałbym, żeby nie była widoczna ta właściwość w object inspectorze) to jak to zrobić i jak ew. zrobić żeby tylko Style z mojego kodu było brane pod uwagę, tzn. żeby tak jakby w ogóle tamto Style z klasy bazowej nie było wykonywane?

 

Może troche zagmatwałem, jak coś to piszcie co jest niejasne:)

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

neee

reintroduce stosuje sie tylko dla metod a nie dla property

jesli chcesz przyslonic property to po prostu definiujesz je jeszcze raz i juz (z tego co pamietam property nie moga byc przeladowane, jesli sie myle to przenies je do sekcji private powinno rozawiazac problem)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Tak...

w StdCtrls w klasie TCustomListBox tak jest to zadeklarowane:

property Style: TListBoxStyle read FStyle write SetStyle de][[Ź.+-]zZaH[N

 

nie wiem czemu nie działa u mnie

 

 

EDIT: Moze trzeba wziąć za klase bazową: TCustomListBox i zadeklarować te properties co w TListBox w StdCtrls, ale bez Style ;)?

 

EDIT2: Tak jak pisałem w EDIT dobrze działa ;) tylko czy to nie jest pójście na łatwiznę:D? nie da sie inaczej zrobić?

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

Nie można zmniejszyć widoczności właściwości, można ją tylko zwiększyć. A te klasy TCustom* istnieją również po to, aby móc je dziedziczyć i wybrać, które właściwości udostępniamy, a które nie...

 

Wyjście 'na około' znalezione w sieci:

So, if you want to demote a published proeprty... you really can't.

 

What you can do, is fake it....by making the property readonly.

 

(...)

 

So this code, not only actually removes the caption physically, but also removes the property from showing up in the ObjectInspector

҉

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...