Odwołania do dynamicznych komponentów

0

Witam!
Mam następujący problem, na formie aplikacji tworzone są dynamiczne obiekty, nie są one zdeklarowane w źródle aplikacji bo tworzy je zewnętrzna biblioteka dll (na podstawie zwróconego do niej uchwytu formy). Zabawa polega na tym że chce sie odwołać do tych dynamicznych obiektów w kodzie samej aplikacji ale kompilator nie pozwala skompilować zwykłego odwołania do tego komponentu przez kropke (form.komponent) bo nie jest on zdefiniowany a np. form.ComponentCount lub ControlCount zwraca wartość błędną (podaje tylko te komponenty, które są zdeklarowane w kodzie programu). Czy ma ktoś jakiś pomysł jak sie odwołać do tych dynamicznych komponentów i jak czytać ich ilość, indexy itd? Będe bardzo wdzięczny za wszelkie podpowiedzi!

0

Kurcze takie pytanie jest faktycznie teraz z dwa razy na tydzień jeśli nie więcej. Cyżby Tobie zablokowano
w jakiś sposób dostęp do wyszukiwarki? Jak nadasz komponentom sensowne i unikalne nazwy to myślę,
że nawet jak są one tworzone przez dllkę odwołasz się do nich przez funkcję FindCOmponent - poczytaj
o niej. Jeżeli się jednak nie da to nie bardzo wiem jak inaczej się odwołać. Póki co sam próbowalem zrobić
prostą dllkę, która ma tworzyć na formatce komponent TEdit, ale nic nie tworzy. Pokaz jak Ty to zrobiłeś?
Bo z moich testów wynika że można bez problemu tworzyć formatkę i na niej dynamicznie komponenty
z biblioteki, ale nie wiem właśnie jak utworzyć (o ile się da) komponent dynamicznie na istniejącej formatce.

0

Dzięki za rade! Nie miałem pojęcia że pytanie padło, najwidoczniej nie szukałem wszędzie gdzie sie da. Sorry.

Co do tworzenia komponentów na gotowej formie to pokaż jak to zrobiłeś (ja nie moge z racji tego że kod z którym pracuje jest b. duży i zagmatwany, nawet ta część, o której mówimy a poza tym nie wiem czy w ogóle mi wolno). U mnie jest to tak że do biblioteki podawany jest komponent rodzic i jego uchwyt i wygląda to mniej więcej tak:

procedure (komponent_rodzic : TForm; handle : hwnd);
begin
with komponent_rodzic do
begin
GroupBox1 := TGroupBox.Create(nil);
GroupBox1.ParentWindow := handle;
end;
end;

Dzięki temu wykonujemy wszelkie operacje na tym konkretnym oknie a nie na jakimś innym. Ta procedura jest oczywiście procedurą z wnętrza dll.

Mam nadzieje że coś to dało a póki co jeszcze raz dzięki za pomoc!

0

No coż, dla GroupBoxa to działa. Dla pola edycyjnego, jednak nie. Nic się nie pokazuje. Natomiast
co do funkcji FindComponent to aby można było jej użyć należy stworzyć ten GroupBox - np. tak:

procedure TworzGroupBox(Komponent_Rodzic: TForm; Handle: HWND);
var
  GroupBox1 : TGroupBox;
begin
  with Komponent_Rodzic do
  begin
    GroupBox1 := TGroupBox.Create(Komponent_Rodzic);
    GroupBox1.ParentWindow := Handle;
    GroupBox1.Color := clBtnFace;
    GroupBox1.Name := 'Grp';
    GroupBox1.Caption := 'Test';
  end;
end;
0

Dzięki, tak właśnie mam (a przynajmniej podobnie). Co do tego że nie pojawiają Ci sie komponenty być może są jakieś dodatkowe wartości, które trzeba ustawić (szer, wys, visible itd). Możesz też spróbować tworzyć te komponenty w ramach jakiegoś innego komponentu który nie stwarza takich problemów (np. właśnie GroupBox).

0

Już ok, przetestowałem i pole edycyjne też się pojawia. Co ciekawe działa to tylko poprawnie Twoją metodą
czyli musimy użyć bloku with ... do begin ... end; Gdyż z tego co testowałem ustawienie Parenta na formę
jako własności komponentu powouje błędy w stylu cannon assign TFont to TFont i z takim błędami, spotykali
się ludzie, których opisy problemu znajdywałem w googlach. W każdym razie dzięki Tobie nauczyłem
się czegoś nowego, że blok with ... do nie służy tylko do tego aby nie odwolywać się co chwila do jakiegoś
komponentu, ale pomaga także tworzyć dynamicznie komponenty na formie przy wykorzystaniu bibliotek dll.

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