Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

dział ogólny

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez Mironas » wtorek, 16 lutego 2021, 13:37

pXtrack napisał(a):Po starcie programu niektóre obiekty nie mieszczą się na ekranie, więc user przewija na dół ...

Na ekranie czy na Formie?

pXtrack napisał(a):Najważniejsze strefy to: Stol i Reka. To są u mnie obiekty typu RichEdit
[...]
Istotnym elementem programu są karty, jako obiekty typu Image. Są one tworzone dynamicznie i umieszczane w grze (w Reka)

Obiekty Image umieszczasz na RichEdit?


Nie ma potrzeby abyś wyjaśniał mi co robi program, napisz tylko z czy masz problem. Np, że umieszczasz wiele TImage na formie, jedna pod drugą (Align=alTop) i w pewnym momencie ostatni dodany TImage jest już niedostępny (poza widoczną formą).
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez pXtrack » wtorek, 16 lutego 2021, 14:16

Mironas napisał(a):
pXtrack napisał(a):Po starcie programu niektóre obiekty nie mieszczą się na ekranie, więc user przewija na dół ...

Na ekranie czy na Formie?
Na Ekranie.

Mironas napisał(a):Obiekty Image umieszczasz na RichEdit?
Nie nie, Image są na Form1. W RichEdit przechowuję tylko numery kart.

Mironas napisał(a):Nie ma potrzeby abyś wyjaśniał mi co robi program, napisz tylko z czy masz problem. Np, że umieszczasz wiele TImage na formie, jedna pod drugą (Align=alTop) i w pewnym momencie ostatni dodany TImage jest już niedostępny (poza widoczną formą).
Wyświetlam obrazki w poziomych rzędach (karty leżą obok siebie) i one są widoczne na formie, ale przesuwają się na dół z każdą aktualizacją (onChange Stol i Reka). Patrząc od góry formy, najpierw wyświetla się Stol, a pod nim Reka:
Stol
Reka
Avatar użytkownika
pXtrack
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): poniedziałek, 25 stycznia 2021, 14:35
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez Mironas » wtorek, 16 lutego 2021, 14:33

pXtrack napisał(a):Na Ekranie.

Jak "na ekranie"? Umieszczasz komponenty bezpośrednio na EKRANIE z pominięciem Form-y? Jakim cudem?

pXtrack napisał(a):przesuwają się na dół z każdą aktualizacją

Dlaczego się przesuwają? Zmieniasz ich właściwość Top?
Nie napisałeś w czym problem. W tym że się przesuwają?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez pXtrack » wtorek, 16 lutego 2021, 14:53

Mironas napisał(a):
pXtrack napisał(a):Na Ekranie.

Jak "na ekranie"? Umieszczasz komponenty bezpośrednio na EKRANIE z pominięciem Form-y? Jakim cudem?

Są na formie, ale poza obszarem widoczności usera, więc musi on przesunąć widok scrollbarem i dobrać się do kart :)

Mironas napisał(a):
pXtrack napisał(a):przesuwają się na dół z każdą aktualizacją

Dlaczego się przesuwają? Zmieniasz ich właściwość Top?
Nie napisałeś w czym problem. W tym że się przesuwają?
Tak, zmieniam Top. Obszar Stol na formie ma top=900, a obszar Reka ma top=1200. Gdy karta z reki trafia na stol to zmieniam jej top na 900 bo przechodzi rząd wyżej. I tutaj zaczynają się problemy, bo program zachowuje się tak, jakby mu się przestawił punkt odniesienia.
Avatar użytkownika
pXtrack
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): poniedziałek, 25 stycznia 2021, 14:35
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez Mironas » wtorek, 16 lutego 2021, 15:00

pXtrack napisał(a):Tak, zmieniam Top. Obszar Stol na formie ma top=900, a obszar Reka ma top=1200. Gdy karta z reki trafia na stol to zmieniam jej top na 900 bo przechodzi rząd wyżej. I tutaj zaczynają się problemy, bo program zachowuje się tak, jakby mu się przestawił punkt odniesienia.

Czym są te obszary - obiektami TPanel czy czym?
Dla przykładu, jeśli chcesz Image1 przenieść z Panel1 na Panel2, to nie zmieniasz Image1->Top tylko:
Image1->Parent = Panel2;

Właściwość Top określa położenie obiektu na swoim aktualnym rodzicu.

Za ten post autor Mironas otrzymał podziękowanie od:
pXtrack
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez pXtrack » wtorek, 16 lutego 2021, 19:53

Zainspirowałeś mnie powyższym i muszę przejrzeć kod. Coś czuję że mam gdzieś posiany błąd.
Avatar użytkownika
pXtrack
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): poniedziałek, 25 stycznia 2021, 14:35
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez pXtrack » środa, 24 lutego 2021, 10:03

Tymczasem pojawiła się zagadka dla mnie. Tworzę dynamicznie formularz, wyświetlam go poprzez ShowModal() i chciałbym żeby user musiał coś zatwierdzić w tym formularzu. Po prostu żeby nie szło go zamknąć. Wiem że można to zrobić poprzez umieszczenie w zdarzeniu FormClose wyrażenia Action=caNone, ale nie wiem jak to zaimplementować i w którym momencie? Formularz jest tworzony po kliknięciu przycisku:
Kod: Zaznacz cały
poOdkryciu1 = new TForm(this);
  poOdkryciu1->Width = 300;
  poOdkryciu1->Height = 180;
  poOdkryciu1->Position = poDesktopCenter;
//kod nieistotny dla problemu
zatwierdz1 = new TButton(this);
    zatwierdz1->Parent = poOdkryciu1;
    zatwierdz1->Left = 50;
    zatwierdz1->Top = 90;
    zatwierdz1->Caption = "OK";
    zatwierdz1->OnClick = zatwierdz1Click;
  poOdkryciu1->ShowModal();
Avatar użytkownika
pXtrack
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): poniedziałek, 25 stycznia 2021, 14:35
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez Mironas » środa, 24 lutego 2021, 10:37

pXtrack napisał(a):chciałbym żeby user musiał coś zatwierdzić w tym formularzu. Po prostu żeby nie szło go zamknąć.

Najprościej w zdarzeniu FormCloseQuery ustawić CanClose na false.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez pXtrack » środa, 24 lutego 2021, 12:00

A dokładniej? Bo nie wiem jak to wpiąć do programu. Przy tworzeniu formy poOdkryciu1->OnCloseQuery = ?
a dalej obsługa zdarzenia w postaci void __fastcall poOdkryciu1CloseQuery(TObject *Sender)?
Avatar użytkownika
pXtrack
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): poniedziałek, 25 stycznia 2021, 14:35
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez Mironas » środa, 24 lutego 2021, 13:08

Nie wiem jak dokładniej to wytłumaczyć. Formularz (klasa TForm) ma swoje zdarzenia, np OnShow, OnClose no i też OnCloseQuery.
W powyższym przykładzie podpinasz do TButton zdarzenie zatwierdz1Click. To tak samo do utworzonego TForm podepnij OnCloseQuery.

Przy okazji - nie wiem jak to zrobiłeś, że w dynamicznie utworzonym oknie podpinasz zdarzenie do przycisku. Gdzie jest kod tego zdarzenia, w innym pliku? To jak zrobiłeś, aby nowe okno widziało ten plik?

Wg mnie dynamiczne tworzenie okna od TForm jest trochę bez sensu. Dużo męczącej roboty, a przecież można takie okno utworzyć normalnie w IDE.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez pXtrack » wtorek, 2 marca 2021, 10:27

Mironas napisał(a):Wg mnie dynamiczne tworzenie okna od TForm jest trochę bez sensu. Dużo męczącej roboty, a przecież można takie okno utworzyć normalnie w IDE.
Faktycznie, to było bez sensu i utworzyłem sobie nową formę że tak powiem "statycznie". Dużo mniej pracy, ale pojawił się inny problem. Po kliknięciu w kartę (Image) na Form1 chcę modyfikować obiekty umieszczone na Form2 i to działa bez zająknięcia. Natomiast gdy zamknę Form2 i ponownie ją otworzę, w pamięci pozostają wcześniejsze wartości obiektów Form2. Czego należy użyć w zdarzeniu Form2::FormClose, aby zawartość Form2 się "wyczyściła", a jednocześnie żeby Form2 było w gotowości. Gdy użyłem wyrażenia Action = caFree; Przy kolejnej próbie kliknięcia w kartę (i wywołania Form2) program się wywala bo chyba nie może znaleźć tej formy.
Avatar użytkownika
pXtrack
Bladawiec
Bladawiec
 
Posty: 17
Dołączył(a): poniedziałek, 25 stycznia 2021, 14:35
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    WindowsChrome

Re: Dynamiczne tworzenie komponentów na dynamicznie utworzonym..

Nowy postprzez Mironas » poniedziałek, 15 marca 2021, 13:03

pXtrack napisał(a):Natomiast gdy zamknę Form2 i ponownie ją otworzę, w pamięci pozostają wcześniejsze wartości obiektów Form2. Czego należy użyć w zdarzeniu Form2::FormClose, aby zawartość Form2 się "wyczyściła", a jednocześnie żeby Form2 było w gotowości. Gdy użyłem wyrażenia Action = caFree; Przy kolejnej próbie kliknięcia w kartę (i wywołania Form2) program się wywala bo chyba nie może znaleźć tej formy.


Dwa rozwiązania:

1. Za każdym razem tworzysz drugą formę na nowo (Form2 = new TForm2) i przy zamknięciu kasujesz to okno. W tym rozwiązaniu możesz w opcjach projektu (zakładka 'Forms') przesunąć to okno z Auto-create forms do Available forms.

2. Masz jedno, utworzone 'statycznie' okno, i przy każdym otwarciu (w OnShow) ustawiasz parametry na startowe/domyślne. W tym rozwiązaniu, przy zamknięciu okna nie usuwasz go z pamięci.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 493
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 23
Otrzymał podziękowań: 71
System operacyjny: Windows 10
Kompilator: C++Builder 10.2 Tokyo
TMS Components Pack
Gadu Gadu: 0
    WindowsChrome

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 4 gości

cron