Dynamiczne towrzenie formy - pytanie

0

tworze sobie dynamicznie forme na panelu
form1 := TForm1.Create(Self);
form.parent := panel1;
form.left := 0;
form.top := 0;

i teraz jak mam ją pokazac na tym panelu. jak zrobie form.showmodal to sie poajwi ale aplikacja nie reaguje na kliknięcia. form.show to nic sie nie dzieje. jak to zrobić. z góry dzieki.

0

:|

form1 := TForm1.Create(Self);
form.parent := panel1;
form.left := 0;
form.top := 0;

cos pokreciles...

procedure TForm1.Button1Click(Sender: TObject);
var F:TForm;
begin
f := TForm.Create(Self);
f.parent := panel1;
f.left := 0;
f.top := 0;
f.Show;
end;
0

miałem to w bloku try... fianlly form.free, jak usunołem ten blok to zadziałało
mam jeszcze jdneo pytanie, jak ja zamknąć ale klikając na krzyzyk tylko innym przyciskiem np button
co mu wpisac w zdarzeniu OnClick?
form.free?? wysypuje mi sie
form.close?? i tu tez

0

Przede wszystkim to tworzyłeś formę lokalnie, w pierwszym przypadku tworzyłeś formę i od razu ją likwidowałeś. W drugim tworzyłeś, i owszem, ale po wyjściu z procedury gubiłeś jej adres tzn. wskaźnik. Masz dwa wyjścia, albo utworzyć zmienną globalną F: TForm, albo zapisać gdzieś jej wskaźnik (też oczywiście w zmiennej globalnej, żeby w procedurze zamykającej mieć się do czego odwołać). Można też wykorzystać rzadko (a szkoda) nieużywane zasoby komponentów np.
W procedurze tworzącej formę na panelu ww właściwości Tag panelu zapisać wskaźnik do formy np.
var
F: TForm;
begin
F := TForm.Create(Self);
F.Parent := Panel1;
Panel1.Tag := Integer(F);
...

a w procedurze zamykającej np.
procedure TForm1.CloseBtnClick(Sender: TObject);
begin
TForm(Pointer(Panel1.Tag)).Free;
end;

Pozdrawiam.

0
skybit napisał(a)

Masz dwa wyjścia, albo utworzyć zmienną globalną F: TForm,

i wystarczy, że dwa razy utworzy tą formę i cały system do d**

albo zapisać gdzieś jej wskaźnik (też oczywiście w zmiennej globalnej, żeby w procedurze zamykającej mieć się do czego odwołać).

to też takie trochę na około

w OnClose formy wpisz
Action := caFree;
i już

0
Misiekd napisał(a)
skybit napisał(a)

Masz dwa wyjścia, albo utworzyć zmienną globalną F: TForm,

i wystarczy, że dwa razy utworzy tą formę i cały system do d**
</quote>
to jest akurat najmniej ważne, zmienna F zawsze przechowa ostatni wskaźnik, a zresztą mowa była o utworzeniu formy, a nie kilku ... itd.

albo zapisać gdzieś jej wskaźnik (też oczywiście w zmiennej globalnej, żeby w procedurze zamykającej mieć się do czego odwołać).

to też takie trochę na około

chciałem tylko nakreślić problem, najważniejsze przecież jest aby nie zgubić wskaźnika, a zarządzać nimi można na różne sposoby, listy, tablice itd. jak komu wygodniej ;)

w OnClose formy wpisz
Action := caFree;
i już

no właśnie, przecież nie chodzi o zwolnienie pamięci, ale w ogóle o zamknięcie formy "z zewnątrz", co człowiekowi z obsługi OnClose, kiedy nie jest w stanie wywołać Form.Close...</quote></quote>

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