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

Odpowiedz Nowy wątek
2015-02-23 11:31
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.

edytowany 2x, ostatnio: Integers, 2015-02-23 11:32

Pozostało 580 znaków

2015-02-23 12:25
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/ques[...]-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).


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2015-02-23 12:35
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 :]

edytowany 1x, ostatnio: Integers, 2015-02-23 12:35

Pozostało 580 znaków

2015-02-23 12:41
0

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


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2015-02-23 13:11
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.

edytowany 4x, ostatnio: Integers, 2015-02-23 21:06

Pozostało 580 znaków

2015-02-27 20:04
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?

Pozostało 580 znaków

2015-02-27 22:10
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.

edytowany 1x, ostatnio: Integers, 2015-02-27 22:11

Pozostało 580 znaków

2015-02-27 23:15
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 ;-)

Pozostało 580 znaków

2015-02-28 00:27
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.

edytowany 3x, ostatnio: Integers, 2015-02-28 00:37

Pozostało 580 znaków

2015-02-28 01:27
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/ques[...]733/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 ;-)

Pozostało 580 znaków

2015-02-28 10:10
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ę..

edytowany 2x, ostatnio: Integers, 2015-02-28 10:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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