Przesuwanie/sortowanie komponentów na formie

0

Witam :)

Najlepiej pokaże cały problem na przykładzie dołączonego kodu źródłowego. Jak widzimy, wszystko jest ok, ale niestety gdy zmienimy szerokość każdego paintboxa na inną (ale tak, by odstępy między nimi były takie same) , to sortowanie zaczyna wariować (ponieważ z góry już ustalam left komponentu, na który ma się ustawiać). Męczę się z tym problemem już jakiś czas i postanowiłem się do Was z tym zwrócić. Ma ktoś jakiś pomysł, jak by to naprawić?

Z góry dziękuję za każdą odp.
Pozdrawiam.

0

Nie analizowałem dokładnie kodu, ale dałem na próbę wszystkim PaintBoxom szerokość 120 pikseli tak, że nie było przerw między nimi i ich przesuwanie według mnie działa u mnie pod Delphi 7 Personal - ok. O ile w ogóle wersja Delphi może mieć tutaj jakieś znaczenie, a sądzę że nie ma. Może czegoś niedopatrzyłem albo źle zrozumiałem Twój problem, także wedlug mnie jest ok. Jednak może ktoś inny, bardziej doświadczony - coś więcej Tobie tutaj doradzi.

0

Co stoi na przeszkodzie wyliczenia tego Left'a z aktualnych szerokości (w programie) ?

0

olesio problem pojawia się gdy zmienię szerokość np pierwszego paintboxa na 100, drugiego na 200 trzeciego np na 150 a czwartego na 400.

0
if  (((Sender as TPaintbox).Left + (Sender as TPaintbox).Width > (Form1.Controls[i] as TPaintbox).Left + ((Form1.Controls[i] as TPaintbox).Width div 2))
          and ((Sender as TPaintbox).Left + (Sender as TPaintbox).Width < (Form1.Controls[i] as TPaintbox).Left + (Form1.Controls[i] as TPaintbox).Width ))

           or

           (((Sender as TPaintbox).Left < (Form1.Controls[i] as TPaintbox).Left + ((Form1.Controls[i] as TPaintbox).Width div 2))
            and ((Sender as TPaintbox).Left > (Form1.Controls[i] as TPaintbox).left) )

Ja bym najpierw uprościł ten warunek. Bo póki co to chyba nikomu nie chce się analizować o co w tym chodzi.

1

Ja bym najpierw uprościł ten warunek.

function MagicznyWarunek(pbs,pbi:TPaintBox):boolean;
var pbs_Right,
    pbi_Right,
    pbi_MidX:integer;
begin
  pbs_Right := pbs.Left + pbs.Width;
  pbi_Right := pbi.Left+pbi.Width;
  pbi_MidX := pbi.Left+(pbi.Width div 2);
  result:= ((pbs_Right > pbi_MidX) and (pbs_Right < pbi_Right)) or
           ((pbs.Left < pbi_MidX) and (pbs.Left>pbi.left));
end;


...

if MagicznyWarunek(Sender as TPaintBox, Form1.Controls[i] as TPaintbox) then
0

Hehe, wielkie dzięki Azarien :)

Ale i tak będę musiał rozbić ten kod, by wykrywało, czy sender najeżdża z lewej czy z prawej strony ( o ile nie było tego trzeba robić przy tych samych szerokościach, to przy różnych raczej jest już to wymagane)

_13th_Dragon No właśnie wiem, że tak należy to zrobić, tylko problem tkwi w tym, że niestety jakoś nieudaje mi się tego poprawnie zaimplementować i dlatego zwracam się z tym do znawców na forum.

Dziękuję za wszystkie odpowiedzi, idę dalej próbować swoich sił ;)

1

W pętle zliczasz sumę szerokości.
Od szerokości formatki odejmujesz tą sumę.
Różnicę dzielisz na ilość obrazków.
Pierwszy Left = polowa ilorazu.
Kolejny Left obliczasz dodając do poprzedniego iloraz oraz szerokość obrazka.

0

W załączniku załączam to, co udało mi się uzyskać jeszcze przed postami Azarien'a oraz _13th_Dragon'a
Niby wszystko jest wporządku ok, działa tak jak powinno, ale problem pojawia się gdy zaczynam poruszać Paintboxem numer 3. Najprawdopodobniej jest to związane z jego mniejszą szerokością i tym magicznym warunkiem (rozczłonkowałem go na dwa mniejsze)

Jeszcze popróbuje z propozycją _13th_Dragon'a i zobaczę co uda mi się uzyskać :)

Edit: hehe, wydaje mi się, że udało mi się to zrobić tą moją metodą. Dziękuję za wszystkie podpowiedzi i wskazówki. Pozdrawiam :)

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