Położenie formularza tworzonego dynamicznie

0

Mam problem z określeniem położenia formularza tworzonego dynamicznie:

  Form_Kop := TForm.Create(self);
   Form_Kop.Parent := self;
   Form_Kop.Caption:=('Zapisywanie pliku danych');
   Form_Kop.borderstyle := bsDialog;
   Form_Kop.FormStyle := fsNormal;
   Form_Kop.Anchors:=[akLeft, akTop];
   Form_Kop.Left:=539;
   Form_Kop.Top:=132;
   Form_Kop.visible := TRUE;

Ustawienia top i left dla labela w tym formularzu działają bez zarzutów nawet bez definiowania kotwiczenia, a dla formy zarówno z Anchors i bez zawsze pokazuje w lewym górnym rogu.

0

Nie mam zielonego pojęcia w ogóle co chcesz zrobić, zadaj normalnie pytanie to doczekasz się odpowiedzi nie tylko ode mnie;

Z racji tej, że nie wiem co chcesz osiągnąć, podaję kod tworzący formularz wraz z labelkiem; Obydwa komponenty tworzone dynamicznie po kliknięciu w przycisk btnCreateForm:

procedure TMainForm.btnCreateFormClick(Sender: TObject);
var
  frmNew: TForm;
  lblTitle: TLabel;
begin  
  frmNew := TForm.Create(MainForm);
  lblTitle := TLabel.Create(frmNew);

  try
    { FORM }
    with frmNew do
      begin
        Parent := MainForm;
        Left := 100;
        Top := 100;
        Width := 300;
        Height := 200;
        BorderStyle := bsDialog;
        Cursor := crArrow;
        Caption := 'Zapisywanie danych';
      end;

    { LABEL }
    with lblTitle do
      begin
        Parent := frmNew;
        Left := 32;
        Top := 32;
        AutoSize := True;
        Caption := 'Trwa zapisywanie danych...';
      end;

    frmNew.ShowModal();
  finally
    lblTitle.Free();
    frmNew.Free();
  end;
end;

Wszystko działa tak, jak to jest zaprogramowane; W załączniku masz aplikację realizującą ten algorytm;

0

Dlaczego w moim kodzie pomimo zdefiniowania Top i Left zawsze pokazuje w lewym górnym rogu ?
Formularz z Twojego gotowca także pokazuje w lewym górnym rogu.

0

Twój kod działa prawidłowo. Formatka ukazuje się zgodnie z wartościami Left i Top

0

To już 3 sytuacja gdy się okazuje że u kogoś innego mój kod działa prawidłowo a u mnie nie. Zmieniałem kompilator już kilka razy i nie wiem o co może chodzić.

0

Sprawdzałem na Delphi 7

0

No a mój to pies...?! Pokazuje się dokładnie tam, gdzie sobie tego życzę, czyli 100px od lewej krawędzi i 100px od górnej; Jeśli przestawię dowolnie te wartości to zawsze formularz pokaże się tam, gdzie jest zaprogramowane;

Nie rozumiem skąd u Ciebie taki problem;


Dodatkowo, jeśli użyję takich instrukcji:

Left := Screen.Width - Width;
Top := Screen.Height - Height - 30;

to formularz pokaże się zawsze w prawym dolnym rogu, gdzie dolna granica formularza jest dosunięta do paska startu (styl Luna w WinXP) bez względu na to, jakie ma rozmiary (pod warunkiem, że jego rozmiary zostaną zdefiniowane przed położeniem);


Poza tym tą linijkę:

Parent := frmNew;

trzeba usunąć, bo forma wywołująca tą nową ustawia sobie scrollbar'y zachowując się tak, jakby ta nowa była MDI;

0

Ja też tego nie rozumiem. Na początku myślałem, że może brakuje jeszcze jakiejś komendy by .top i .left zaczęły działać. Teraz myślę, że ten problem może powodować ustawienie moich ekranów. Mam fizycznie 2 monitory obok siebie z tym że główny jest 16:10 i ma 1680:1050 a ten na którym pracuje ma 1024:768. Dodatkowo winzgroza wykrywa mi 3 monitor, którego nie mam. Dziś spróbuje odpalić ten kod na laptopie i zobaczę czy się coś zmieni.

0

Właśnie sprawdziłem oba kody na laptopie. Dzieje się dokładnie to samo czyli zawsze lewy górny róg, niezależnie od ustawień.

0

Problem rozwiązany:
Zamiast deklarować Left i Top użyłem:

dla dynamicznego formularza:

Position:=poMainFormCenter; 

dla głównego formularza:

Position:=poMainFormCenter; 

Taka deklaracja rozwiązuje wszystkie problemy mogące powstać przy różnych monitorach.

1

Jak do tej pory pisałeś gdzie się pojawia formularz, a nie napisałeś gdzie chciałbyś żeby się pokazał;

Możesz zamiast tego:

Position := poMainFormCenter;

co znaczy, że formularz będzie pokazany na środku głownego okna aplikacji, użyć tego:

Left := 200;
Top := 200;

Position := poDesigned;

wtedy formularz powinien pokazać sie w miejscu o określonych współrzędnych;

Jeśli jednak chcesz ustawić położenie okna tworzonego dynamicznie na środku formularza-matki - wykorzystaj:

Position := poOwnerFormCenter;

co oznacza, że formularz zawsze pokaże się na środku okna, które jest jego rodzicem; Może zdarzyć się taka sytuacja, że forma zostanie stworzona dynamicznie nie przez głowny formularz, a także potomny i wystąpi problem; Nie koniecznie teraz, ale jak będziesz w przyszłości modyfikować program to o tym prawdopodobnie zapomnisz;

0

@ Furious: Ten wątek stworzyłem właśnie dlatego, że coś co powinno działać nie działa z przyczyn do tej pory niewyjaśnionych.

Właśnie wszystko się wyjaśniło. Aby zadziałała opcja definiowania pozycji trzeba ją wywołać i dopiero opisywać pozycję

Position := poDesigned;
Left := 200;
Top := 200; 

Widać moja wersja delphi tego wymaga zawsze albo z jakiś innych przyczyn dynamiczny formularz nie odziedziczył tej opcji po rodzicu.

0
Pegii napisał(a)

Widać moja wersja delphi tego wymaga

To nie o wersję Delphi chodzi, bo to nie wina kompilatora, tylko o język;

Pegii napisał(a)

dynamiczny formularz nie odziedziczył tej opcji po rodzicu

Bo dynamicznie tworzony formularz nie jest tworzony na bazie formy-rodzica; Czyli tworzysz obiekt tak:

{...}

var
  frmNew: TForm;
begin
  frmNew := TForm.Create(MainForm);

{...}

a nie z wykorzystaniem dziedziczenia po klasie okna rodzica, czyli tak:

{...}

var
  frmNew: TMainForm;
begin
  frmNew := TMainForm.Create(Self);

{...}

Poza tym po stworzeniu obiektu-formularza jego właściwość Position wskazuje domyślnie na poDesigned, a mimo wszystko trzeba przypisanie wywołać ponownie; Nie wiem dlaczego tak się dzieję, ale wychodzi na to, że po utworzeniu obiektu jeszcze pozycja nie jest ustalona;


Nie wiem też czemu chcesz ten formularz tworzyć dynamicznie zupełnie od podstaw, tzn. tworzyć go ręcznie i na nim znajdujące się kontrolki; Dołożysz sobie roboty, bo jeszcze trzeba będzie oprogramować zdarzenia itd.; Formularz zawsze możesz zrobić normalnie z wykorzystaniem technologii Drag&Drop, ale usuwając go z głównego pliku projektu (*.dpr); Wtedy formularz sam się nie utworzy i będziesz mógł ręcznie w dowolnym miejscu programu samemu to wykonać; No chyba, że chcesz w taki sposób to się nie mieszam;

0
Furious Programming napisał(a)

To nie o wersję Delphi chodzi, bo to nie wina kompilatora, tylko o język

Skoro nie chodzi o wersje kompilatore to czemu twój ustawia domyślnie pozycję na poDesigned, a mojemu trzeba to wpisać ?

Nie do końca zrozumiałem twoją wypowiedź o dziedziczeniu:

Furious Programming napisał(a)

Bo dynamicznie tworzony formularz nie jest tworzony na bazie formy-rodzica; Czyli tworzysz obiekt tak:

chyba że miałeś na myśli:
Bo dynamicznie tworzony formularz nie jest tworzony na bazie formy-rodzica; Czyli obiektu nie tworzysz tak:

Czy mógłbyś rozwinąć o co chodzi z :

Furious Programming napisał(a)

ale usuwając go z głównego pliku projektu (*.dpr);

Czy chodzi ci o usunięcie go z Application.CreateForm(TForm, Form); ?

0

Nie lepiej będzie jak napiszecie jakie macie wersje delphi i udostępnicie CAŁY projekt aby można było sobie sprawdzić "u siebie"?

0
Pegii napisał(a)

Skoro nie chodzi o wersje kompilatore to czemu twój ustawia domyślnie pozycję na poDesigned, a mojemu trzeba to wpisać ?

A sprawdzałeś jaka jest wartość domyślna dla właściwości Position np. takim kodem? :

var
  frmNew: TForm;
begin
  frmNew := TForm.Create(Self);

  try
    if frmNew.Position = poDesigned then
      Application.MessageBox('Designed!', 'Position', MB_ICONINFORMATION);
  finally
    frmNew.Free();
  end;

bo u mnie MessageBox się wyświetla zawsze; Stąd można wywnioskować, że domyślną wartością właściwości jest właśnie ta wyżej wymieniona;

Pegii napisał(a)

Nie do końca zrozumiałem twoją wypowiedź o dziedziczeniu:

Dobrze napisałem, Ty tworzysz formularz bazując na klasie TForm, a nie na TMainForm, stąd dziedziczysz wszystkio co jest w klasie TForm, a nie w TMainForm;

Pegii napisał(a)

Czy chodzi ci o usunięcie go z Application.CreateForm(TForm, Form);?

Dokładnie tak; Jeśli chcesz ręcznie tworzyć formularz podczas działania aplikacji, a nie automatycznie podczas jej startu to nie może być instrukcji tworzącej w pliku *.dpr:

Application.CreateForm(TForm1, Form1);

gdzie Form1 to okienko, które chcesz tworzyć dynamicznie; Możesz je usunąć z listy w opcjach projektu (zakładka Forms i lista Auto-create forms);


Poza tym dobrze pisze @adf88 - moja wersja Delphi to BD7, a w załączniku masz działający kod programu (testowany na kilku komputerach z różnymi systemami);

0

Mam Borland Delphi 7 Enterprise i RAD Delphi 2010 Architect.
Obecnie pracuje na 2010 bo program skompilowany pod D7 nie działa na maszynach bez D7. (Przyczyna nieodkryta)
W obu kompilatorach programik testowy wyświetlił MessageBox (2010 wymagał jeszcze dopisania frmnew.show)

Dzięki za cierpliwość oraz dokładne i łopatologiczne tłumaczenie.

0

Tak mnie zastanawia, skoro masz problem z niedziałaniem projektów z D7 na komputerze bez Delphi, a wersja 2010 działa bez problemów. To na pewno musi Tobie "olewać" mimo zaznaczenia opcję build with runtime packages albo coś jak wspominałeś z bplami jakieś dziwne błedy. Delphi 7 używam od dość dawna, także na komputerze z Windows 7 i nie mam problemów. Moje programy bez problemów idzie uruchamiać na systemach bez Delphi. A i nie wiem jakiegos systemu używasz, ale może przypadkiem "winne" zamieszaniu jest właczone UAC albo nie odpalanie Delphi na prawach Administratora. Ja upierdliwe UAC mam wyłaczone dzięki czemu jak wspomniałem nie mam problemów. Nie googlowałem w tej sprawie bo cięzko precyzyjnie mi zapytać google, ale chyba przynajmniej tutaj jeśli dobrze pamiętam nikt chyba wcześniej nie pisał, że ma taki problem z Delphi 7 żeby powiedzmy nawet domyślnie pusta formatka skompilowana do exe nie chciała działać na innych komputerach. Jeżeli rozmiar exeka po kompilacji jest większy niż 200 kb bez UPXowania i pod Delphi 7 oczywiście, to wedle mnie powinien on działać na komputerach bez zainstalowanego Delphi. Jednak ekspertem nie jestem, tylko widzę że Ty masz ciągle jakieś dziwne problemy z IDE.

0

Mam Win 7 Profesional x64
Obie wersje Delphi instalowane dla all users i zawsze odpalane jako administrator.Nie grzebałem w UAC
Z pierwszym legalnym Delphi 7 miałem taki problem, że jeśli nie zaznaczyłem uruchamiania w trybie zgodności z XP SP3 to w ogóle się nie włączał. Pomogła zmiana wersji na jakąś torrentową.
I jak zauważył Olesio moje problemy są dziwne. I jedyne co mam na swoje usprawiedliwienie to to, że zanim zacznę zawracać Wam głowę to zawsze próbuje pogooglać ;]

Olesio spotkałeś się kiedyś z przypadkiem takiego "olewania" build with runtime packages ?

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