Chciałbym utworzyć instancję klasy, ale mam tylko jej nazwę w ciągu znaków. Czy istnieje sposób?Czy istnieje sposób na utworzenie instancji klasy po nazwie w delphi?
Odpowiedz
to z pomocą Delphi (Delphi 2006, ale również dostępny z co najmniej Delphi 7):
Składnia getClass funkcyjne (const AClassName: String): TPersistentClass;
Opis Zadzwoń do GetClass, aby uzyskać klasę z nazwy klasy. Ta klasa może być używana jako parametr dla procedur wymagających klasy. Klasa musi zostać zarejestrowana, zanim GetClass ją znajdzie. Klasy formularzy i klasy komponentów, które są przywoływane w deklaracji formularza (zmienne instancji), są automatycznie rejestrowane po załadowaniu formularza. Inne klasy można zarejestrować, wywołując RegisterClass lub RegisterClasses.
Oto przykładowy kod. Działa jako taki tylko dlatego, że TButton jest TControl, a zatem typecast jest ważny.
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses([TButton, TForm]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CRef : TPersistentClass;
AControl : TControl;
begin
CRef := GetClass('TButton');
if CRef<>nil then
begin
AControl := TControl(TControlClass(CRef).Create(Self));
with AControl do
begin
Parent := Self;
Width := 50;
Height := 30;
end;
end;
end;
Kiedy potrzebowałem, aby to zrobić, ja zbudowałem mój własny zakład obiekt, który wykorzystuje specjalnie podklasy TStringList, obecnie używam Delphi 7 więc klasa lista ciąg obsługuje dołączyć tylko sprzeciw wobec String, potem dostałem podklasę TStringList, aby umożliwić obsługę typów klas, więc teraz mogę utworzyć obiekt, który przekazuje fabrykę swojej klasie. Działa w ten sposób:
Pierwszy - Załaduj fabrykę obiektów Singleton;
2st - Zarejestruj dowolny obiekt w fabryce, może znajdować się w sekcji inicjalizacji urządzenia;
Główne metody Fabryki to: isClassRegistered, registerClass, instantiateClass (ClassName: STring): TObject;
W ten sposób mogę utworzyć instancję dowolnego obiektu lub użyć wcześniej utworzonego obiektu lub nawet jego podzestawu.
Raczej używam typu wyliczeniowego zamiast ciągu znaków do identyfikacji klasy.
Uwagi: Jest to bardzo, bardzo zwięzły przykład, kod całkowicie funkcjonalny jest bardziej złożony, ale, uwierz mi, nie za dużo.
- 1. Czy istnieje sposób na utworzenie instancji typu z danymi testowymi?
- 2. Czy istnieje szybki sposób na utworzenie zestawu?
- 3. Czy istnieje sposób na uzyskanie nazwy klasy klasy pochodnej QObject bez tworzenia instancji tej klasy?
- 4. Android: Czy istnieje dobry sposób na utworzenie okna dialogowego Toast?
- 5. Czy zmienne instancji/klasy należy poprzedzać prefiksem w Delphi?
- 6. Czy istnieje sposób na utworzenie tła tła za pomocą CSS?
- 7. Czy NumberFormat.getInstance gwarantuje utworzenie nowej instancji?
- 8. Nadanie klasy wtyczek po ludzku czytelnej nazwie
- 9. Czy istnieje sposób na rozszerzenie pliku w nazwie pakietu?
- 10. Czy istnieje sposób ponownego użycia instancji zadania?
- 11. Czy istnieje sposób zmiany akcji usuwania na istniejącej instancji shared_ptr
- 12. Czy istnieje sposób rejestrowania każdego zdarzenia GUI w Delphi?
- 13. Czy istnieje sposób na zastąpienie klasy innym w Intellij Idea?
- 14. Jak uzyskać odwołanie do typu klasy po nazwie w Delphi XE?
- 15. Utworzenie szablonu klasy
- 16. Python: czy istnieje przypadek użycia do zmiany klasy instancji?
- 17. Ruby - :: w nazwie klasy
- 18. Czy istnieje sposób wyświetlania pionowych linii wcięć w Delphi?
- 19. Czy istnieje sposób na utworzenie przezroczystego niestandardowego paska przewijania w przeglądarkach Webkit?
- 20. Czy istnieje sposób zamknięcia instancji Hazelcast w JVM?
- 21. Czy istnieje sposób na oddzwanianie na żądanie po zmianie window.location.href?
- 22. Czy istnieje sposób, aby zabronić podklasy mojej klasy?
- 23. Czy istnieje sposób, aby posłuchać innej metody klasy?
- 24. Czy mogę zastąpić wiązania określone na poziomie klasy w instancji?
- 25. NSInvalidUnarchiveOperationException: Nie można utworzyć instancji klasy o nazwie NSLayoutConstraint
- 26. Czy istnieje sposób na zresetowanie wszystkich właściwości statycznych określonej klasy?
- 27. Czy istnieje sposób na utworzenie bezpośredniego obiektu ByteBuffer ze wskaźnika wyłącznie w języku Java?
- 28. Czy istnieje sposób na utworzenie jednego obrazu Gif z wielu obrazów w Javie?
- 29. Czy istnieje zastosowanie dla TheaderControl w Delphi
- 30. Czy metody klasy zwiększają wielkość instancji klasy?
Świetne rozwiązanie. Ale teraz natknąłem się na inny problem. Klasa, którą chciałbym utworzyć, jest klasą własną, która implementuje interfejs. A registerClass musi zostać wywołany z klasą trwałą. Dowolny pomysł? –
Czy można wywodzić swoją klasę lub jednego z jej przodków z TPersistent? –
Nie wierzę, ponieważ implementuje interfejs i musi pochodzić z TInterfaceObject –