CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Powiększanie formy splitterem

Powiększanie formy splitterem

dział ogólny

Powiększanie formy splitterem

Nowy postprzez GrassHoppeR » piątek, 22 lipca 2011, 01:08

witajcie.

chciałbym, aby za pomocą splittera można było powiększyć formę, a zmniejszając formę przesuwał się również splitter, w obu przypadkach zachowując minimalną wielkość dolnego panelu. wykorzystałem OnMoved splittera i OnResize formy i prawie działa. pomijając to, że samo rozwiązanie średnio mi się podoba (pewnie jest jakieś prostsze - jest?) to splitter powiększa formę tylko do momentu osiągnięcia limitu na formie z przed powiększenia. jak to obejść?

mój kod:
KOD cpp:     UKRYJ  
delta=Form1->Height-Panel1->Height-Panel2->Height;
//---------------------------------------------------------------------------
void __fastcall TForm1::Splitter1Moved(TObject *Sender)
{
if (Panel2->Height<100) Form1->Height=Splitter1->Top+delta+100;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
if (Panel2->Height<100) Panel1->Height=Form1->Height-delta-100;
}

exe: http://wyslijplik.pl/download.php?sid=NMthJLHM

używam Borland C++ Builder 6.

pozdrawiam
Ostatnio edytowano piątek, 22 lipca 2011, 10:30 przez polymorphism, łącznie edytowano 1 raz
Powód: Do kodu używaj znaczników CPP
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez Cyfrowy Baron » piątek, 22 lipca 2011, 18:24

GrassHoppeR napisał(a):momentu osiągnięcia limitu na formie


Jakiego limitu?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez GrassHoppeR » piątek, 22 lipca 2011, 18:58

a sprawdziłeś dołączony przeze mnie program?

limit = miejsce do którego można przesuwać splitter na formie...
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez Cyfrowy Baron » piątek, 22 lipca 2011, 20:02

A kiedy zmienna delta pobiera wartość, gdyż w Twoim kodzie jest to niewidoczne, a jest istotne?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez GrassHoppeR » piątek, 22 lipca 2011, 20:19

delta to tylko ilość pikseli jakie zabierają pasek tytułu, menu, status i ozdóbki i jest to wartość stała. w powyższy kod wstawiłem ją tylko żeby było widać co to jest.
oryginalnie pobierana jest w:
KOD cpp:     UKRYJ  
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
delta=Form1->Height-Panel1->Height-Panel2->Height;
}
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez Cyfrowy Baron » sobota, 23 lipca 2011, 14:35

Rozwiązanie jest więc banalnie proste, delta musi być wyliczana w zdarzeniu, które steruje rozmiarem formularza lub pozycją Splitter-a:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Splitter1Moved(TObject *Sender)
{
 int delta = this->Height - Panel1->Height - Panel2->Height;
 if( Panel2->Height < 100 ) this->Height = Splitter1->Top + delta + 100;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
 int delta = this->Height - Panel1->Height - Panel2->Height;
 if( Panel2->Height < 100 ) Panel1->Height = this->Height - delta - 100;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez GrassHoppeR » sobota, 23 lipca 2011, 15:04

gdyby to było banalnie proste to bym sobie sam poradził. problem jest jak piszę w tym, że splitter przesuwa się w dół jedynie do miejsca, do którego mógłby się przesunąć gdyby forma wcale nie była powiększana. nie wiem jak to można jaśniej napisać...

twój kod też nie działa, bo niezależnie gdzie obliczasz deltę wynosi ona zawsze tyle samo, jak już zresztą napisałem w poprzednim poście.
Ostatnio edytowano sobota, 23 lipca 2011, 15:11 przez GrassHoppeR, łącznie edytowano 1 raz
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez Cyfrowy Baron » sobota, 23 lipca 2011, 15:11

GrassHoppeR napisał(a):splitter przesuwa się w dół jedynie do miejsca, do którego mógłby się przesunąć gdyby forma wcale nie była powiększana. nie wiem jak to można jaśniej napisać...


No nie! Z podanym przeze mnie rozwiązaniem przesuwa się w dół w nieskończoność. Patrz załącznik.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez GrassHoppeR » sobota, 23 lipca 2011, 15:13

twój kod u mnie daje taki sam efekt i nie można go przesuwać dalej. musi chodzić o coś innego. spróbuj w swoim kodzie usunąć obliczanie delty w resize i splittermoved a obliczyć ją tylko raz na początku i powinno też działać.
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez Cyfrowy Baron » sobota, 23 lipca 2011, 15:24

Jak rozumiem, mój program działa u Ciebie prawidłowo?!



GrassHoppeR napisał(a): spróbuj w swoim kodzie usunąć obliczanie delty w resize i splittermoved a obliczyć ją tylko raz na początku i powinno też działać.


Tak! Działa tak samo.

U mnie Panel1->Align = alClient, a Panel2->Align = alBottom. Poza tym kod jest taki sam jak u Ciebie...

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
GrassHoppeR
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Powiększanie formy splitterem

Nowy postprzez GrassHoppeR » sobota, 23 lipca 2011, 16:06

no i działa.

miałem Panel1->Align = alTop, Splitter->Align = alTop i Panel2->Align = alClient.
teraz jest Panel1->Align = alClient, Splitter->Align = alBottom i Panel2->Align = alBottom

dziękuję i pozdrawiam.

Edit:
a jednak nie wszystko w porządku. przypomniałem sobie dlaczego Aligny miałem inaczej. w przypadku kiedy zmniejszamy formę najpierw ma zmniejszać się Panel2 aż do minimalnej wartości, dopiero potem ma się przesuwać splitter zmniejszając Panel1. a teraz (w tym drugim ustawieniu Alignów) nie zmniejsza się Panel2 tylko najpierw Panel1. gdy natomiast powiększamy formę powiększać ma się tylko Panel2, tak jakby wysuwać się. tymczasem teraz powiększa się Panel1 a Panel2 ma tę samą wysokość... no i przy okazji nadal występuje ten sam efekt tylko w przeciwną stronę (złap splittera, rozciągnij nim formę w dół i bez puszczania powróć do góry - splitter zatrzyma się na pewnej wysokości). także w zasadzie problem pozostaje. myślałem, że gdzieś można wyłączyć ograniczenie ruchów splittera, ale nie dotarłem do takich informacji. mam nadzieję, że nie będzie trzeba napisać własnego splittera tylko do tego celu...
Avatar użytkownika
GrassHoppeR
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): wtorek, 4 stycznia 2011, 01:17
Podziękował : 3
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 2491715
    Windows XPFirefox


  • 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ł: Brak zalogowanych użytkowników i 3 gości