Max1414 Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 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 More sharing options...
TSr Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 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. Ubuntu.pl user #10593 Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 1) Wkonstruktorze komponetu 2) Z tego co pamietam komponet posiada referencje do rodzica, tylko ze nie koniecznie musi byc umieszczony na formie moze byc. np na panelu ale wtedy wystarczy petelka i isc w glab az natrafi sie na forme. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
TSr Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 1) Wkonstruktorze komponetu Niebardzo bo komponent nie musi być tworzony zawsze razem z formą. Ubuntu.pl user #10593 Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 Jak nie? konstruktor jest wywolywany po utworzeniu formy. W koncu jakies pozadek musi byc, najpierw rodzic jest tworzony. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
TSr Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 Przecież komponent może być utworzony dynamicznie w programie Ubuntu.pl user #10593 Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 1. Jak zrobić jakieś zdarzenie dla komponentu, które wykona sie po stworzeniu formy na której jest komponent? Dalsza dyskusja jest bez sensowna. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 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 More sharing options...
KKKas Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 "zdebuguj" przez wstawienie ShowMessage(FNazwa + ' ' + FSciezka); zamiast: AddToAutostart(FNazwa, FSciezka); i zobacz czy na pewno w Create są od razu te zmienne ustawione prawidłowo (wątpię) ? ҉ Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 [delphi][/delphi] Nie jest jeszcze wszystko jak należy, ale to co nie działało już działa:P I w OnCreate formy dałem przypisywanie właściwości do komponentu. A da sie tak, żeby sam komponent pobrał ścieżke programu? Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 paramstr(0) ? www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
KKKas Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 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 More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 Dzieki! A co do tego Application.ExeName - to wiem, ale myslalem ze to nie dziala w komponentach 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 More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 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 More sharing options...
Toster Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 reintroduce albo override Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 z override już przed napisaniem próbowałem, a z tym drugim ten sam problem: KOD[Error] NiceBox.pas(13): Field definition not allowed after methods or properties Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 najpierw pola pozniej metody, ustaw w kolejnosci Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 [delphi][/delphi] Dałem to do private - żeby nie było już widoczne (bo to chce zrobić, jak pisałem we wcześniejszym poscie) - ten error, potem przeniosłem do published(gdzie jest tylko to) i też ten sam błąd, więc to chyba nie jest błąd w kolejności Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 próbowałem już tak i w tym problem, że nadal mam property Style w komponencie Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 a dales rebuilda, i od nowa zainstalowales komponent ? Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Czerwiec 21, 2007 Autor Zgłoś Share Napisano Czerwiec 21, 2007 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ę? nie da sie inaczej zrobić? Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
KKKas Napisano Czerwiec 21, 2007 Zgłoś Share Napisano Czerwiec 21, 2007 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 More sharing options...
Max1414 Napisano Czerwiec 22, 2007 Autor Zgłoś Share Napisano Czerwiec 22, 2007 No readonly mogłem zrobić, ale nie o to mi chodziło (dobrze wiedzieć, że nie da sie usunąć property:) ) Czyli dobrze to wykombinowałem EDIT: co wy po nocach nie spicie? Dzisiaj, 22 cze 2007 03:25 Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.