tworzenie formy = procedura z parametrem.

0

Jak można napisać procedurę z parametrem, która tworzy formę o nazwię podanej w parametrze (forma oczywiście jest już zriobiona w projekcie, trzeba ją tylko utworzyć). Ja napisałem coś takiego:

procedure TForm1.createform(s: string); 
begin
  (s as TForm):= (s as TForm).Create(Self);
  (s as TForm).ShowModal;
  (s as TForm).Free;
end;

I oczywiście nie działa.

<font color="red">[Error] Unit1_main.pas(389): Operator not applicable to this operand type</span>

Jak ją przerobić ? Ewentualnie co jest źle.

0
(s as TForm)

To nie ma prawa działać - kazałeś Delphi potraktować STRING jako FORMĘ. Konwersja jest niemozliwa, to sa kompletnie niezgodne typy - co inengo kiedy masz kontrolke (ogólnie) i trakujesz ja jako Forme bo wiesz ze to na 100% jest forma, albo kiedy bajta traktujesz jako liczbe calkowita.
Rozwiazanie zalezy od tego, czy zawsze tworzysz identyczna forme, a roznia sie tlyko nazwa, czy chcesz npo. jako string podac "Form1" albo "Form2" i liczyc ze program sam wybeirze wlasciwa forme z tych juz gotowych...

0

Cos w tym stylu zdaje sie:

procedure TForm1.createform(s: string); 
var
 F: TForm;
begin
 F := TForm.Create(Self);
 F.Name := s;
 {...}
end;
0

poprawnestworzenie formy:

var
F: TForm;
begin
F := TForm.Create(Self);
F.name   := 'opek';
f.width  := 320;
f.height := 240;
f.left := (screen.width  div 2) - (f.width  div 2);
f.top  := (screen.height div 2) - (f.height div 2);
f.Show;
end;

//a teraz procka

procedure createform(s : string);
var
F: TForm;
begin
F := TForm.Create(nil);
F.name   := s;
f.width  := 320;
f.height := 240;
f.left := (screen.width  div 2) - (f.width  div 2);
f.top  := (screen.height div 2) - (f.height div 2);
f.Show;
end;
0

hmm, chyba wiem o co DETOXowi chodzi.

odwołuj się do danego typu formularza. uniwersalki tak prosto nie zrobisz.

0

Zmienna S wg mnie musi być albo typu TForm albo TObject

0

Hmm Ziomber może się źle wyraziłem.. nie chodzi o zwykłe tworzenie dynamiczne formy, już tłumacze:

W programie mam dość dużą ilość form, co powoduje, że tworzenie ich wszystkich na starcie programu zajmuje niestety długąąąą "chwile". Zależy mi akurat na prędkość startu programu, dlatego chcę gotowe formy już tworzyć (OnCreate) jak będą potrzebne (w momencie wywołania). Co najlepiej mi radzicie zrobić?

0

To będzie zwykłe tworzenie dynamiczne, bo nie możesz zrobić 1 procedury do kazdego rodzaju formy, neistety. Przynajmniej ja nie znam sposobu, zeby na podstawie przekazanego stringa program miał odczytać KLASĘ okna i zbudować okno odpowiedniego TYPU, bo typ musi być z góry określony. Dlatego musisz dla kazdego okna zrobic zwykla procedurke dynamicznego tworzenia (nawet taka niedawno gdzies tu podawalem), pod konkretną klase okna.

0

No okej , to dałem:

procedure Tnotatnik.f_aboutExecute(Sender: TObject);
var
x : TForm;
begin
x := frmAbout.Create(self);
x.ShowModal;
x.Free;
end;  

<font color="red">Acces Violation., </span>forma juz jest gotowa, kwestia wywołania

0

nie powinno być czasem:

procedure Tnotatnik.f_aboutExecute(Sender: TObject);
var
x : TFrmAbout; // <--- nie standardowe TForm ale konkretna klasa okna!
begin
x := TfrmAbout.Create(self);
x.ShowModal;
x.Free;
end; 

??

0

<font color="red">Acces Violation</span>

0

Utwórz wszystko tak, jakby to miało się normalnie ładować. Przejdź do źródła projektu (dpr) i zakomentarzuj z tamtąd te formy, których nie chcesz tworzyć na starcie.
W kodzie kiedy będziesz chciał utworzyć wpisz:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2); //Lub inne, które tam zakomentarzowałeś
  Form2.Show;
end;
0

Oooo właśnie o to chodziło.. teraz działa - dzięki Dryobates [browar]

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