Komponent w komponencie

0

Witam wszystkich,
podczas tworzenia komponentu napotkałem na mały problem, mianowicie potrzebuję w mój nowy komponent powiązać z innym komponentem z innej klasy;

Wyjaśniając chciałbym zrobić taki efekt jak jest np. z formularzem - posiada on właściwość PopupMenu;

Ja tworzę komponent na klasie bazowej TListBox i w nim chciałbym mieć właściwość 'FilesList', która jest też klasy TListBox; Jak się nie wybierze listy to jest pusta, ale jezeli się wybierze to chciałbym mieć dostęp z poziomu kodu głównego formularza tak, bym mógł zmieniać właściwości tego drugiego;

Nie interesuje mnie tworzenie drugiego komponentu w konstruktorze pierwszego, chodzi mi o to, bym mógł wybrać dany komponent spośród tych, które są obecnie na formularzu; Niestety nie wiem jak się mam za to zabrać, czy tworzyć wskaźnik na inny komponent czy jakoś inaczej;

Wie ktoś jak to zrobić? Proszę o wskazówkę;
Pozdrawiam;

0
[...]
  MojKomponent1 := TMojKomponent.Create(ListBox1);
  with MojKomponent1 do
    begin
      Parent := ListBox1;
      // Inne paramtery jak Top, Left, Width, Height etc.
    end;
[...]
0

Nie chodzi mi o Parent bo nie tworzę komponentu dynamicznie, sprawa jest bardziej skomplikowana;

Potrzebuję zrobić właściwość w moim komponencie, która będzie wskazywała na inny komponent z klasy TListBox; Postaram się poniżej opisać jak najbardziej szczegółowo sytuację;

Tworzę klasę komponentu, np. TMyListBox; W tej klasie tworzę metodę MouseDown, którą odpowiednio do swoich potrzeb oprogramowuję, później przypisuję ją do zdarzenia OnMouseDown; Wszystko dzieje się w kodzie komponentu, nie programu; Komponent kompiluję, instaluję itd, przechodzę do programu; Włączam projekt i kładę komponent na formie; Jeżeli teraz w kodzie programu będę chciał znów zaprogramować zdarzenie OnMouseDown, cały napisany kod w module komponentu będzie nieważny, a wykonywać się będzie kod, który napisałem w programie; Niestety nie może tak być, bo w module komponentu w procedurze MouseDown zawarte są operacje na prywatnych polach klasy, do których nie mam dostępu poza modułem komponentu (są one w sekcji private); Czyli jeżeli napiszę nową procedurę OnMouseDown część funkcji komponentu przestanie działać bo nie będą odpowiednio oprogramowane;

Rozwiązaniem jest dodanie do listy właściwości czegoś takiego jak jest w TForm.PopupMenu czy TForm.MainMenu po to bym mógł w module komponentu odpowiednio sterować komponentem, który nie jest standardowo częścią klasy; Jeżeli właściwość ta będzie stworzona, będę mógł w module komponentu w procedurze MouseDown odpowiednio sterować inną kontrolką i nie stracę starego kodu odpowiedzialnego za modyfikację prywatnych pól klasy;

Reasumując potrzebuję zrobić właściwość, która będzie wskazywała na inny komponent, bym mógł nim sterować w kodzie komponentu;

1

poczytaj podstawy tworzenia komponentów w delphi

0

Podstawy już znam i to dość dobrze; To czego oczekuję jest bardziej skomplikowane i nie należy do podstaw; Gdyby tak było - znalazłbym to już dawno temu i zapewne przeczytał, bo już wiele artykułów na ten temat czytałem i nie znalazłem interesującej mnie treści;

Nie o takie wskazówki mi chodziło; Ale dzięki za odpowiedź;

0

jesli masz "w reku" komponent ktory ma to czego teraz szukasz, to czemu nie zajrzysz do jego zrodla?

0

@cimak, nie szukam właściwości która już istnieje, tylko chcę stworzyć nową;

Właściwość będzie wskazywać na inny komponent, który wybiorę z tych, które są na formularzu; Nie chodzi mi o tworzenie drugiego komponentu podczas tworzenia pierwszego, tylko o wybranie (lub też nie) istniejącego na formie komponentu;

Nigdzie nie znalazłem odpowiedzi na to w jaki sposób zrobić taką właściwość, a przy formułowaniu zapytań w google ręce opadają bo już sam nie wiem, o co mam go pytać... :P

Po prostu potrzebuję zrobić coś jak wskaźnik na inny komponent, tyle że właściwość komponentu nie może być wskaźnikiem (o to kompilator krzyczy);

Więc chciałbym się dowiedzieć w jaki sposób można to zrobić; Jeżeli nie rozumiecie o co pytam - postaram się dokładniej opisać problem;

0

wiem o co pytasz i juz Ci na to odpowiedziałem tylko nie zrozumiales mnie.
skoro jakis gotowy komponent posiada taka wlasciwosc, ze w object inspectorze mozesz wybrac inny komponent z formy, to zajrzyj do zrodel tego komponentu i zobacz jak ta wlasciwosc wyglada w kodzie i zrob to analogicznie u siebie.

0

Gdzie mogę obejrzeć kod klasy TForm lub innych standardowych komponentów z zakładki Standard?

0

Wcale nie musi to być aż TForm. Wystarczy TButton, TLabel, czy TEdit z modułu "StdCtrls.pas" i jego właściwość PopupMenu

 TButton = class(TButtonControl)
  published
    property PopupMenu;
2
Furious Programming napisał(a)

Podstawy już znam i to dość dobrze;

to jeśli znasz dobrze podstawy delphi to teraz pora poznać podstawy googla i angielskiego

To czego oczekuję jest bardziej skomplikowane i nie należy do podstaw; Gdyby tak było - znalazłbym to już dawno temu i zapewne przeczytał, bo już wiele artykułów na ten temat czytałem i nie znalazłem interesującej mnie treści;

ta bardziej skomplikowana rzecz to całe TRZY linijki kodu (nie licząc kodu generowanego automatycznie) i jest opisane w każdym dobrym kursie tworzenia własnych komponentów, np. tutaj http://delphi.about.com/library/bluc/text/uc083101a.htm

0

Trzy linijki chyba deklaracji, bo one same nie wystarczą; Tego kursu przyznaję nie czytałem; Dziękuję za podpowiedź; Pozdrawiam;

1 użytkowników online, w tym zalogowanych: 0, gości: 1