Jak pobrać z programu listę modułów, klas.. innych danych przy okazji

0

Witam.

Szukam jakiegoś punktu zaczepienia bo Google na temat "delphi jak pobrać listę modułów programu" (również w wersji angielskiej) daje mi listę jak się deklaruje i obsługuje..
Zna ktoś sposób jak z bieżącego programu wyciągnąć listę modułów, klas, samotnych procedur, typów, stałych, danych? Najważniejsze moduły i klasy. Zależy mi na tym aby program w swoim kodzie przeszukiwał.. jak ktoś zna sposób na wyszukiwanie w innym działającym lub nie działającym programie to też można ale to już poza konkursem.
Skoro jest Application.Components[i] i Application.FindComponent to może gdzieś jest FindUnit.
W obrębie komponentu i klasy można sobie z grubsza przejrzeć po nazwie i po Pointerze ale jak z lista klas i co z pozostałymi? Własna lista TList lub array of TObject?
Wszelkie wskazówki mile widziane.

0

Jak podaje Google w nowszych wersjach Delphi od 2010 można skorzystać z RTTI, które jest znacznie bardziej rozbudowane niż w starszych wersjach ale skoro Ci Google nie działają to masz linka http://stackoverflow.com/questions/9002612/getting-the-whole-list-of-classes-and-objects-defined-in-a-unit-using-rtti masz przykład znajdywania wszystkich typów (aby dany typ był widoczny nie wystarczy go zadeklarować musi być gdzieś użyty).

0

Hm.. ja mam Delphi 2007 i nie zanosi się na uaktualnienie. A może coś w stylu wskaźników czy pobieranie adresów po nazwie, żeby zrobić sobie samemu taką listę. Tylko brakuje powiązania z modułami i innymi deklaracjami .. tylko i aż.
Podejrzenie modułu Rtti chyba nie ma większego sensu chyba zbyt duża przepaść między wersjami modułów :]

0

Ale w ogóle po co Ci taka lista. Możesz w pseudo kodzie nakreślić co chcesz osiągnąć?

0

Najprościej mówiąc chodzi o wygodę dostępu i odwołania.. ale nie twierdze ze dobrze kombinuję.. porostu szukam ułatwienia. Podglądając zasadę działania główniejszych klas używanych w Delphi i list podpiętych do nich myślę, że najprościej będzie utworzyć klasy dziedziczące po TComponent i dzięki temu będzie je można znaleźć przez FindComponent('Nazwa') a potem zobaczymy co się uda zrobić z pozostałymi danymi.

0

Nie wiem czy zdajesz sobie z tego sprawę, ale zadałeś bardzo trudne pytanie. A na trudne pytania nie ma prostej odpowiedzi, te proste są zazwyczaj głupie :)
Zatem wysil się i opisz dokładnie co chcesz uzyskać, pomogę Ci zadając dodatkowe pytania.

Integers napisał(a):

Najprościej mówiąc chodzi o wygodę dostępu i odwołania..

O wygodę dostępu i odwołania do czego?
Podam Ci kod z mojego projektu, który pozwala na odwołanie się do konkretnego zestawu danych z jednego okna, przez inny obiekt, który jest dynamicznie wstrzykiwany do tego okna.
Klasa 'TTppStructureLogic' zawiera dodatkową logikę, której nie ma na oknie, a która czasem jest tam potrzebna; to czasem zależy od konfiguracji oprogramowania, przez co można dynamicznie zmieniać jego (czyli "okna") logikę przez rejestrowanie odpowiedniej klasy, która tę logikę implementuje.

procedure TTppStructureLogic.diEntityAfterCreate(const AParent: TObject = nil; const AInitData: IInterface = nil);
var
  lIoCEntity  : IdiEntity;
begin
  inherited;

  // jeśli istniej kontener ioC i jest w nim zarejestrowana usługa DSController to pobierz z niego DataSety...
  if Assigned(AParent) then
  begin
    if Supports(AParent, IdiEntity, lIoCEntity) and lIoCEntity.diContainer.ServiceAvailable<TdDSController> then
      FDSController := lIoCEntity.diContainer.GetService<TdDSController>;
  end;

  if Assigned(FDSController) then
  begin
    // dodaj metodę do obsługi zdarzenia DSControllera
    FDSController.OnBeforeAction.Add(DSControllerBeforeAction);
    // pobierz referencję na DataSet struktury materiałowej
    FTppTechStructure := FDSController.AsBusinessObject<TboTppTechStructure>;
    // dodaj metodę obsługi zdarzenia przed usunięciem rekordu z DataSetu struktury materiałowej
    if Assigned(FTppTechStructure) then
      FTppTechStructure.BeforeDeleteDelegate.Add(TppTechStructureBeforeDelete);
  end;
end;

Mogę odwołać się do do dowolnego obiektu w dowolnym momencie - o to chodzi?

ale nie twierdze ze dobrze kombinuję.. porostu szukam ułatwienia. Podglądając zasadę działania główniejszych klas używanych w Delphi i list podpiętych do nich myślę, że najprościej będzie utworzyć klasy dziedziczące po TComponent i dzięki temu będzie je można znaleźć przez FindComponent('Nazwa') a potem zobaczymy co się uda zrobić z pozostałymi danymi.

To nie jest dobry pomysł z tym FindComponent...
Jak chcesz coś odszukać, to najpierw musisz to gdzieś zarejestrować.
A więc jaki konkretnie efekt cię interesuje?

0

Od jakiegoś czasu zauważyłem, że moje pytania mieszają się z nie wiedzą na poziomie początkującego i chęcią o sięgnięcia efektu na poziomie zaawansowanego programisty. Słowem coś tam wiem ale tu i ówdzie mam braki... a może to jest tak że im dalej w las tym więcej drzew :)

Mogę odwołać się do do dowolnego obiektu w dowolnym momencie - o to chodzi?

Nie ukrywam, że 3 razy czytałem ten fragment ale jak się nie wie wszystkiego to się nie rozumie za dużo z "obcego" kodu. nie mniej jednak właśnie chodzi o taka właśnie sprawę że w wybranych miejscach chciałbym w miarę prosty sposób manewrować danymi.

Trochę naświetliłem na koniec tematu
Jak zamienić Pointer procedury na TNotifyEvent

W efekcie finalnym chciałbym mieć dostęp do .. bagatela przeglądu wszystkich danych. Spodobał mi się sposób że mając nazwę jako string procedury można ją wywołać.. więc teraz mając dostęp do tego jakie są w programie moduły, klasy, procedury w klasach i samotne, zmienne, np. podmieniać dane w rekordzie o nazwie..
Ale lista procedur w modułach i klasach była by najważniejsza.. wiem, że można sztucznie na piechotę tworzyć listy procedur ale to nie to samo. Bo to dodatkowy kod i praca.

A ja chciałem np. przeszukać wszystkie typy w programie (po stringu) i mieć możliwość podmiany wartości ich wartości albo wybrania typu wg jakiegoś kryterium. Na pierwszy rzut oka pomysł wydaje się futurologiczny bo nie mówię o konkretnych przypadkach ale to właśnie zależy do czego się zastosuje.

Na początek ten swobodny dostęp do procedur klasy ..

FindComponent był tylko przykładem, że to samo chciałbym odnieść do innych struktur i składowych.

1
Integers napisał(a):

Od jakiegoś czasu zauważyłem, że moje pytania mieszają się z nie wiedzą na poziomie początkującego i chęcią o sięgnięcia efektu na poziomie zaawansowanego programisty. Słowem coś tam wiem ale tu i ówdzie mam braki... a może to jest tak że im dalej w las tym więcej drzew :)

Znasz teorię? Ale tak dobrze (a nie słyszałem), OOP i wzorce projektowe? Wiesz jak z nich korzystać i dlaczego nie korzystać w niektórych przypadkach?
Jeśli nie znasz, to nie zrozumiesz nic z tego co napisałem.

Mogę odwołać się do do dowolnego obiektu w dowolnym momencie - o to chodzi?

Nie ukrywam, że 3 razy czytałem ten fragment ale jak się nie wie wszystkiego to się nie rozumie za dużo z "obcego" kodu. nie mniej jednak właśnie chodzi o taka właśnie sprawę że w wybranych miejscach chciałbym w miarę prosty sposób manewrować danymi.

A co tam jest takiego trudnego? Pobieram instancję na kontener IoC, z kontenera wyciągam usługę, a z usługi zestaw danych (DataSet).
Potem do DataSetu dodaje metodę obsługi zdarzenia, ale nie jest to zwykły TNotifyEvent tylko delegat (powiedzmy - taki obserwator). A więc mogę do jednego zdarzenia podpiąc wiele metod, które będą na to reagowały.
Tylko, żeby to zrobić musiałem napisać cały podsystem który tym zarządza. Musiałem też napisać własne wersje komponentów DataSet, które obsługują zdarzenia w oparciu o delegaty.
Ale Ty nie musisz - Ty możesz wykorzystać Spring4Delphi albo i nawet LKSL. Jeśli nie wiesz o czym pisze, poszukaj ...
Ale najpierw musisz migrować do nowego Delphi - co najmniej wersja XE2. Co najmniej.

Trochę naświetliłem na koniec tematu
Jak zamienić Pointer procedury na TNotifyEvent

Czytałem to, ale zmilczałem.
To jest wyjątkowo badziewny kod, związany drutem i jak na to patrzę to dostaję torsji.
Programowanie w ten sposób, to prosta droga do pięknej katastrofy zwanej w branży jako "spaghetti code" i "big ball of mud"; z tego wniskuję, że ze wzrocami u Ciebie jeszcze słabo, natomiast antywzorce sobie przyswajasz ekspresowo :)
http://pl.wikipedia.org/wiki/Antywzorzec_projektowy

W efekcie finalnym chciałbym mieć dostęp do .. bagatela przeglądu wszystkich danych. Spodobał mi się sposób że mając nazwę jako string procedury można ją wywołać.. więc teraz mając dostęp do tego jakie są w programie moduły, klasy, procedury w klasach i samotne, zmienne, np. podmieniać dane w rekordzie o nazwie..
Ale lista procedur w modułach i klasach była by najważniejsza.. wiem, że można sztucznie na piechotę tworzyć listy procedur ale to nie to samo. Bo to dodatkowy kod i praca.

Chcesz to zrobić dobrze? To najpierw to zaprojektuj - dobrze. Przemyśl.
Bo w tej chwili to... szkoda gadać; powiem tak - dostęp do "wszystkiego" jest po pierwsze błędem, po drugie jest niebezpieczny, a po trzecie i najważniejsze - nie, wcale nie potrzebujesz dostępu do wszystkiego ze wszystkiego.

A ja chciałem np. przeszukać wszystkie typy w programie (po stringu) i mieć możliwość podmiany wartości ich wartości albo wybrania typu wg jakiegoś kryterium.

Już Ci o tym pisano; to się da zrobić za pomocą RTTI, ale będzie to wymagało Delphi w wersji XE lub XE2 - co najmniej.
Da się i zrobić i w starym Delphi, ale nie tak na łapu capu - to wymaga tony kodu a przede wszystkim projektu.

Aaa... przypomniało mi sie coś; można tak na chama zrobić i w starym Delphi. Zobacz:
https://code.google.com/p/delphi-detours-library/

Na pierwszy rzut oka pomysł wydaje się futurologiczny bo nie mówię o konkretnych przypadkach ale to właśnie zależy do czego się zastosuje.

Na początek ten swobodny dostęp do procedur klasy ..

FindComponent był tylko przykładem, że to samo chciałbym odnieść do innych struktur i składowych.

Poprosiłem Cie o KONKRET.
To jest wg Ciebie opis konkretnego przypadku?
Skoro tak, to dostałeś odpowiedź; Twój kod jest do bani bo przypomina wielką kulę błota.
Musisz zaprojektować interfejsy i zastosować wzorce projektowe - może nie wprost, ale warto je znać.
Czyli - jakie pytanie, taka rada. Ogólna i nic z niej konkretnego nie wynika, czyli dokładnie tak samo jak Twoje pytanie ;-)

0

A żeś teraz pojechał po skarpetkach :)

Zastanawiam się nad szyfrowaniem danych. Jeszcze nie szukałem na ten temat ale będzie mi potrzebne więc napiszę.
Jak byś miał chwilę to polecam się: Jak szyfrować dane żeby zachowały kolejność na liście sortowanej?

Programuje bardziej hobbistycznie niż zawodowo więc nie ma co oczekiwać wielkiego wow ale jak do tej pory kule jakoś przetrwały i nikt się nie skarżył. Poza paroma przypadkami ale to klient zmienił założenia :)

Ten konkretny kod to wersja robocza testuję co by tu jakby tu..
Co do wzorców.. dopasowuje kod do potrzeb i ma działać nigdy się nie zastanawiałem nad czego jest za dużo a czego za mało, nawet jakbym o tym wiedział to nie mam na to czasu.

Co do konkretów to teraz przeszedłem do kodu z którym daję radę, jak będę czegoś potrzebował to napiszę.
I nie pisałem że w jednej chwili dostęp do wszystkiego ale że dostęp do wszystkiego jest mi potrzebny i stosowany w zależności od sytuacji - w tym sensie.

XE na razie jest w sferze marzeń.
Ale po to człowiek szuka i pyta żeby się dowiedzieć czego nie umie :]. Ogólnie nie mam z byt dużo czasu i nie nadążam za nowościami co ma odzwierciedlenie tu i ówdzie. Więc jest jak jest ale i na Windowsa narzekają więc tragedii nie ma.. czasami dramat w jednym akcie :]

Ponieważ Twój kod jest zbyt skomplikowany i korzysta z wersji, która jest poza moim zasięgiem, to może wróć jakiś schemat albo hasła które wpłyną na poprawę logiki programowania. Obrazki szybko się przegląda i widać od razu co jest grane.

edit.
Jutro doczytam dokładnie to co mi podesłałeś ale jeśli to działa tak jak myślę to był by strzał w 10. Tylko nie mogę znaleźć download. Może to przez późna porę.

Pozdrawiam.

1
Integers napisał(a):

A żeś teraz pojechał po skarpetkach :)

Zastanawiam się nad szyfrowaniem danych. Jeszcze nie szukałem na ten temat ale będzie mi potrzebne więc napiszę.
Jak byś miał chwilę to polecam się: Jak szyfrować dane żeby zachowały kolejność na liście sortowanej?

Szyfrowanie:
http://www.cityinthesky.co.uk/opensource/dcpcrypt/

A co do sortowania - z założenia jest to... Bo każda operacja porównująca/sortująca elementu na liście, będzie wymagała deszyfracji. Jeśli tych elementów jest mało, da radę. Jeśli będzie ich więcej i często będziesz chciał to sortować - to sam sobie odpowiedz.
Natomiast sama implementacja jest do napisania w dwie minuty:
http://stackoverflow.com/questions/41733/best-way-to-sort-an-array
Masz tam implementację dla nowych Delphi (za pomocą TArray<T> i TDelegatedComparer) i dla starych. Brać, wybierać...

Programuje bardziej hobbistycznie niż zawodowo więc nie ma co oczekiwać wielkiego wow ale jak do tej pory kule jakoś przetrwały i nikt się nie skarżył. Poza paroma przypadkami ale to klient zmienił założenia :)

No więc właśnie w takich przypadkach można się obryzgać g....m z tej kuli, co to się nikt nie skarżył.
A to, że klient zmieni założenia jest pewne jak amen w pacierzu.

Ten konkretny kod to wersja robocza testuję co by tu jakby tu..

Czyli konkretnie co?

Co do wzorców.. dopasowuje kod do potrzeb i ma działać nigdy się nie zastanawiałem nad czego jest za dużo a czego za mało, nawet jakbym o tym wiedział to nie mam na to czasu.

No to nie pogadamy. Ty nie chcesz pisać dobrze, tylko tak aby działało. Ale nie martw się, Delphi idealnie się do tego nadaje - coś tu się poklika, gdzieś tam się wklepie kilka linii kodu i jakoś działa.
Problemy zaczną się wtedy, kiedy klient zmieni założenia albo trafi się inny, który chce to samo, ale ciut inaczej.
Zrozum - ja mam gdzieś jak to piszesz, a skoro wychodzisz z założenia "[...] nigdy się nie zastanawiałem" to cóż mogę powiedzieć?

Co do konkretów to teraz przeszedłem do kodu z którym daję radę, jak będę czegoś potrzebował to napiszę.

O, dzięki łaskawco! :)
Na pewno będę czekał z utęsknieniem :):)

I nie pisałem że w jednej chwili dostęp do wszystkiego ale że dostęp do wszystkiego jest mi potrzebny i stosowany w zależności od sytuacji - w tym sensie.

A co to za różnica, poza semantyką? Jak dla mnie to jedno i to samo - de-facto.

XE na razie jest w sferze marzeń.
Ale po to człowiek szuka i pyta żeby się dowiedzieć czego nie umie :]. Ogólnie nie mam z byt dużo czasu i nie nadążam za nowościami co ma odzwierciedlenie tu i ówdzie. Więc jest jak jest ale i na Windowsa narzekają więc tragedii nie ma.. czasami dramat w jednym akcie :]

Ponieważ Twój kod jest zbyt skomplikowany i korzysta z wersji, która jest poza moim zasięgiem, to może wróć jakiś schemat albo hasła które wpłyną na poprawę logiki programowania. Obrazki szybko się przegląda i widać od razu co jest grane.

Że tak powiem - bzdura. Chcesz programować za pomocą obrazków? No to może to: http://scratch.mit.edu
To co chesz zrobić, nie da się "ogarnąć" jakimś tam obrazkiem. Ani nawet dwudziestoma...
Chcesz poprawić logikę? Poczytaj o IoC.
http://pl.wikipedia.org/wiki/Odwr%C3%B3cenie_sterowania

edit.
Jutro doczytam dokładnie to co mi podesłałeś ale jeśli to działa tak jak myślę to był by strzał w 10. Tylko nie mogę znaleźć download. Może to przez późna porę.

Pozdrawiam.

Bo go tam nie ma wprost; trzeba kod zassać z SVNa, ale to nie jest skomplikowane ;-)

0

Hahaha zjadliwy do potęgi :)
Ok. potrzebuję czasu żeby to przyswoić :] Nie z wszystkim się zgadzam ale też nie wszystko wiem więc biorę pod to poprawkę. Cierpliwości i dyplomacji życzę..

0
Integers napisał(a):

Hahaha zjadliwy do potęgi :)
Ok. potrzebuję czasu żeby to przyswoić :] Nie z wszystkim się zgadzam ale też nie wszystko wiem więc biorę pod to poprawkę. Cierpliwości i dyplomacji życzę..

Dyplomacji? W tym kontekście? A po co? Nie jesteś moim klientem ani konkurencją. Tak naprawdę, to Ty masz potrzebę w stosunku do mnie, a nie odwrotnie.
To raz.
Dwa; to nie jest zjadliwość, tylko suche fakty. Moje postrzeganie faktów różni się od Twojego, bo pewnie różnimy się doświadczeniem i podejściem do rozwiązywania problemów. Mi się Twoje podejście nie podoba (eufemistycznie rzecz ujmując), ale nie napisałeś, że gdzieś mylę albo z czym konkretnie się nie zgadzasz.
Piszesz tylko o ogólnikach - nie potrafisz podać konkretnego przykładu po co Ci takie rozwiązanie (pytałem 3 razy). Nie potrafisz też sobie wyobrazić jak miałby to działać; piszesz "tak jakoś, żeby było, bo mi czasem potrzebne to a czasem wszystko" - to ma być definicja potrzeb w stosunku do programu?

A teraz ogólnikowo piszesz "nie zgadzam się". Rozumiem, że poczułeś się urażony, bo ktoś Twoje cudo skrytykował? Może ma jednak trochę racji i krytyka nie była bezzasadna? A jeśli nie mam racji - to powiedz gdzie jej nie mam, podyskutujemy.

Dam Ci radę, zrób z tym co zechcesz. Jak piszesz program to nie rozpatruj rozwiązań tylko pod katem "żeby jakoś działało". Zastanów się, jak ten kod będzie utrzymywany. Czy łatwo będzie go rozwijać i dostosowywać na zmienne potrzeby? Czy za kilka lat, będziesz w stanie cokolwiek zrozumieć z tego, co sam napisałeś?
W ogóle potrzebne Ci takie założenia?

0

Nie czuję się urażony, staram się uczyć na błędach. Może to jest ten moment żebym zmienił podejście. Nie piszę, że się mylisz bo się z tym zgadzam. Ale potrzebuję czasu żeby tę wiedzę ogarnąć, wypróbować w praktyce.

O dyplomacji wspomniałem bo ktoś z boku czytający mógłby odnieść wrażenie, że się nie szanujemy a to tylko specyficzny humor programistów.. mimo że suche fakty. Poza tym pokazanie błędów jest jak najbardziej ok.

Co do poziomu to nie ma porównania. Nie piszę dużych programów i np. nie używałem do tej pory SVN. No właśnie hobbista samouk po godzinach, co mnie nie usprawiedliwia i jak tylko mam chwilę to nadrabiam zaległości poprzez takie właśnie rozmowy.
Teraz jest dobry moment żebym pozbył się złych nawyków, bo jak to inaczej nazwać. Np cały projekt programu mam wypunktowany w głowie co nie jest dobre bo potem jest zdziwienie montera, że trzeba coś przerobić bo czegoś brakuje :]

Więc chyba zacznę od projektowania struktury programu. Jak sądzisz, jakie narzędzia używać i na co zwracać uwagę.

PS. Rozmowa jest ciekawa i niesie ze sobą wiele konkretów tak więc wolnymi chwilami chętnie się czegoś od Ciebie nauczę.. a tu potrzebna Ci będzie cierpliwość i dla tego o niej wspomniałem.
Dzięki i Pozdrawiam

1
Integers napisał(a):

Nie czuję się urażony, staram się uczyć na błędach. Może to jest ten moment żebym zmienił podejście. Nie piszę, że się mylisz bo się z tym zgadzam. Ale potrzebuję czasu żeby tę wiedzę ogarnąć, wypróbować w praktyce.

O dyplomacji wspomniałem bo ktoś z boku czytający mógłby odnieść wrażenie, że się nie szanujemy a to tylko specyficzny humor programistów.. mimo że suche fakty. Poza tym pokazanie błędów jest jak najbardziej ok.

OK, to mamy jasność. Nikt do nikogo nic nie ma i tego będziemy się trzymać :)

Co do poziomu to nie ma porównania. Nie piszę dużych programów i np. nie używałem do tej pory SVN. No właśnie hobbista samouk po godzinach, co mnie nie usprawiedliwia i jak tylko mam chwilę to nadrabiam zaległości poprzez takie właśnie rozmowy.

Zacznij używać SVNa, albo GITa czy czego tam chcesz. Możesz postawić sobie własne prywatne (a więc może mieć zamknięte źródła) repozytorium na https://bitbucket.org/ i działać. To naprawdę pomaga a krzywa wejścia jest minimalna.

Teraz jest dobry moment żebym pozbył się złych nawyków, bo jak to inaczej nazwać. Np cały projekt programu mam wypunktowany w głowie co nie jest dobre bo potem jest zdziwienie montera, że trzeba coś przerobić bo czegoś brakuje :]

Więc chyba zacznę od projektowania struktury programu. Jak sądzisz, jakie narzędzia używać i na co zwracać uwagę.

Na początek? Kartki papieru i głowy - spokojnie wystarczy :)
Potem może być np. Model Maker, a do pisania kodu nie wyobrażam sobie pracy bez Model Maker Code Explorer.

PS. Rozmowa jest ciekawa i niesie ze sobą wiele konkretów tak więc wolnymi chwilami chętnie się czegoś od Ciebie nauczę.. a tu potrzebna Ci będzie cierpliwość i dla tego o niej wspomniałem.
Dzięki i Pozdrawiam

I tu jest problem - czas to jest zasób, którego mam permanentnym za mało.

0

I tak zrobię przyswoję narzędzia i pójdę za ciosem. Czas uporządkować ten bałagan :) dzięki i pozdrawiam

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