Dostęp do kontrolki na kilku formach, z jednej procedury.

0

Jak odwoływać się do kontrolek o tej samej nazwie, umieszczonych na kilku formach, z jednej wspólnej procedury ?

Np. istnieje kontrolka Edit1, na kilku formach.
Chciałbym, aby dostęp do Edit1 na każdej z tych form był realizowany przy pomocy jednej procedury.

Przykładowa procedura wspólna, niestety generuje wyjątek undeclared identifier:

procedure GetText(Forma: TForm);
var s: string;
begin
  s := Forma.Edit1.Text;//undeclared identifier Edit1
end;

Form jest kilkanaście, a na każdej kilkadziesiąt kontrolek, więc aż się prosi, aby napisać jedna procedurę wspólną.

Z góry dziękuje za pomoc.

dodanie znacznika <code class="delphi"> - fp

0

Wstaw ten Edit1 na Frame.
Powstawiaj tego frame na formatki.
Przekazuj do funkcji Frame (można też zrobić to metodą tego frame).

0

Niestety nie skorzystam...
Frames nie wchodzą w grę - w D4 Frames nie istnieją.
Dzięki

0

A czemu nie D1 ? Wszak jeszcze starsza ...

1

@rycho_57: tak się nie da jak kobminujesz, ponieważ TForm jest klasą bazową i nie istnieje na niej żadne Edit1. Musiał byś to zrobić najwyżej przez rzutowanie TEdit na JakasFormatka.FindComponent('nazwa') i tym podobne "tricki". Natomiast porzuć D4, to z tego co czytałem największy gniot z bugami ze starszych wersji Delphi. Jeszcze jakbyś siedział pod D7 to rozumiem, ale tak się cofać do prehistorii nie ma co.

Sam trzymam D3 na dysku, ale to tylko po to żeby czasem prosty dfm przekonwertować na dialog *.rc, bo konwerter, który mam nie odczyta nowszych formatek. Jednak staram się klepać pod D7 ze względu na mniejsze rozmiary. A żeby nie być całkiem przedopotopowym, używam też z rzadka 64 bitowego Lazarusa.

1

A takie coś, to chyba zadziała:

 
  for i := 0 to Screen.FormCount-1 do
    TEdit(Screen.Forms[i].FindComponent('Edit1')).Text := 'Tekst';
0

@rycho_57 - napisz dokładniej do czego ma służyć ta procedura i co ma robić, bo nic nie tłumaczą słowa "dostęp do Edit1";

Jeśli ma to być procedura uniwersalna, która w parametrze ma otrzymać referencję do instancji klasy formularza, to możesz wykorzystać jej właściwość FindComponent:

procedure FindEditAndModify(AForm: TForm);
begin
  TEdit(AForm.FindComponent('Edit1')).Text := 'foo';
end;

i jej wynik zrzutować na klasę TEdit, aby mieć dostęp do jej pól czy metod; Innego rozwiązania raczej nie ma; Chyba, że interesuje Cię dodanie w każdym module w sekcji uses nazw pozostałych modułów (jeśli uda Ci się pokonać błędy circular reference) i odwoływanie się do istniejących komponentów, bez ich wcześniejszego wyszukiwania;

A jeśli potrzebujesz hurtem zmodyfikować wszystkie komponenty o tej nazwie na wszystkich komponentach, to sprawdź rozwiązanie @marogo, w którym w pętli modyfikowane są komponenty we wszystkich formularzach.

0

Przez 'dostęp do Edit1' rozumiem możliwość ustawiania i odczytywania właściwości kontrolki Edit1.

Rozwiązanie podane przez kolegę Furious Programming rozwiązało mój problem - o to właśnie chodziło.
Kolega marogo podał również właściwe rozwiązanie, które dodatkowo hurtowo obsłuży wszystkie formy - super.

Bardzo Wam Koledzy dziękuję i pozdrawiam.

0

Jeżeli o to ci chodziło to masz błąd w założeniach projektu.

0

Nie rozumiem - jaki błąd w założeniach ?
Chętnie dowiem się o co chodzi, dzięki temu być może na przyszłość uniknę tego rodzaju błędu.

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