Położenie komponentu względem innego ...

0

Witam

Problem którego rozwiązania nie znalazłem i nie potrafię sam rozwiązać jest następujący:
Potrzebuje zmieniać położenie jednego komponentu względem innego: tzn mam 4 komponenty tworzące jakby jeden: button image edit i combobox -> chciałbym aby zmieniając położenie buttona położenie zmieniały również pozostałe elementy...
W IDE Lazarus dla ostawień Anchors było coś takiego, ustawianie elementu względem innego " anchor to top side to sibling" i w sibling wybierało się tak jakby rodzica...

user image

Niestety w Delphi tego nie ma bądź nie znalazłem tego, musiałem zrezygnować z Lazarusa za dużo błędów które mi przeszkadzały... przeniosłem projekt do Delphi i rozwiązałem to w ten sposób:

procedure TForm1.Button6MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MD then  // sprawdź, czy właściwość = TRUE
    begin
      { zmieniaj pozycje komponentu wg. pozycji kursora }
      Button6.Left := Button6.Left + (X - P.X);
      Button6.Top := Button6.Top + (Y - P.Y);
      Image9.Left := Image9.Left + (X - P.X);
      Image9.Top := Image9.Top + (Y - P.Y);
      Edit3.Left := Edit3.Left + (X - P.X);
      Edit3.Top := Edit3.Top + (Y - P.Y);
      Combobox3.Left := Combobox3.Left + (X - P.X);
      Combobox3.Top := Combobox3.Top + (Y - P.Y);
    end;
end;

Niestety nie jest to zbyt dobre rozwiązanie takich procedur musiałbym mieć z 200 bo tyle potrzebuje tych ruchomych Komponentów, postanowiłem wiec rozwiązać to poprzez dynamiczne tworzenie komponentów:

procedure TForm1.ButtonMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MD := True;  // zmień właściwość na TRUE
  P := Point(X, Y); // pobierz dotychczasową pozycję kursora
  przycisk:=(sender as Tbutton);
end;

procedure TForm1.ButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
 begin

  if MD then 
    begin
      przycisk.Left := przycisk.Left + (X - P.X);
      przycisk.Top := przycisk.Top + (Y - P.Y);
    end;
end;

Niestety nie wiem nadal jak zmieniać położenie pozostałych ...

PLEASE HELP ME :D

0

matematyka się kłania, najlepiej wszystko układaj względem 1 jak sobie nie radzisz...

0

tyle to jeszcze wiem ... nie znam dobrze Delphi nauczam sie od niedawna ... nie wiem skąd wziąć nazwy dla pozostałych komponentów żeby je pobierać podobnie jak do tego butona przycisk:=(sender as Tbutton); nie wiem jak sie do nich odwoływać ... być może mało precyzyjnie się wyraziłem wcześniej ....
K
omponenty tworze sobie w ten sposób:
gdzieś tam po drodze sobie zwiększam zmienna ' dodaj '

      
with TButton.Create(self) do begin
.
Caption:='Przycisk '+IntToStr(dodaj);
.

with TEdit.Create(self) do begin
.
Caption:='Editt '+IntToStr(dodaj);
.

czyli te 5 komponentów button image edit i combobox składających się na jeden mi potrzebny maja ten sam nr porządkowy ... ale nie wiem jak się do nich dobierać do tych nazw ....

0

Ja raczej pokusiłbym się o napisanie jakiegoś komponentu ale jak chcesz kombinować to możesz np.: nadać wszystkim kontrolkom (tym które mają zmieniać położenie) jednakowe nazwy np. Edit, Image itd. do kazdej z nazw dodaj jakaś cyfrę taką samą dla zależnych od siebie kontrolek (mającym zmieniać położenie)
czyli masz np. Button1, Edit1, Image1, ComboBox1 kolejne to samo tylko z 2 zamiast 1 wtedy wystarczy że w jakiejś zmiennej (w przykładzie ActualNo) będziesz miał numer kontrolki (tą liczbę na końcu nazwy) a reszta to coś takiego:

const
  controls: array [0..2] of string = ('Edit', 'Image', 'ComboBox');
var
  ctrl: TControl;
  i: Integer;
begin
  for i:=0 to 2 do
  begin
    ctrl:= Form1.FindChildControl(controls[i] + IntToStr(ActualNo));
    if Assigned(ctrl) then
    begin
      ctrl.Left:= ctrl.Left + (Y - P.X);
      ctrl.Top:= ctrl.Top + (Y - P.Y);
    end;
  end;
end;
0

Piękne dzięki kAzek dokładnie o to mi chodziło ....

Nazwy z tymi samymi numerami miałem już zrobione, nie wiedziałem jak się do tych nazw dostać ...
znajdź dziecko to dokładnie to czego nie umiałem znaleźć...

Jeszcze raz wielkie dzięki !!! [browar]

0

cholernik nie do końca coś mnie to działa

przesuwam sobie w ten sposób 4 komponenty utworzone dynamicznie, Tbutton Tedit i Tcombobox działa cacy ale Timage nie chce się przesuwać stoi w miejscu ....

komponent Timage tworze tak:

      
with TImage.Create(TabSheet) do begin
        Width:=15;
        Height:=20;
        Left:=10;
        Top:=62;
        Name:='Image'+IntToStr(dodaj);
        Picture.LoadFromFile(sciezka + '\Image\obrazek.jpg');
        Parent:=TabSheet;
        Visible:=True;
        end;

samo przesuwanie wygląda tak jak zaproponował mi kAzek czyli :

const
  controls: array [0..3] of string = ('Button', 'Edit', 'Image', 'ComboBox');
var
 i: Integer;
begin
     Case PageControl1.ActivePageIndex of
      0: TabSheet:=TabSheet1;
      1: TabSheet:=TabSheet2;
      2: TabSheet:=TabSheet3;
      3: TabSheet:=TabSheet4;
      4: TabSheet:=TabSheet5;
      5: TabSheet:=TabSheet6;
      end;

  if MD then 
    begin
     for i:=0 to 3 do
      begin
        ctrl:=TabSheet.FindChildControl(controls[i] + IntToStr(ActualNo));
        if Assigned(ctrl) then
         begin
           ctrl.Left:= ctrl.Left + (X - P.X);
           ctrl.Top:= ctrl.Top + (Y - P.Y);
          end;
       end;
     end;
end;

dodam ze na danym TabSheet na którym dodaje owe komponenty znajduje sie jeszcze jeden komponent TImage jako ' tapeta ' danego TabSheet'a niestety nie stwierdziłem problemów związanych miedzy owymi komponentami nawet jak NIE MA tej ' tapety ' to i tak TImage który ma się przesuwać stoi w miejscu

każda propozycja naprawy mile widziana :D

0

No fakt pisałem z pamięci ale faktycznie FindChildControl nie znajdzie TImage ale przecież jest jeszcze FindComponent i musi działać. Znowu pisze z pamięci ale jakoś tak:

const
  controls: array [0..3] of string = ('Button', 'Edit', 'Image', 'ComboBox');
var
   i: Integer;
   ctrl: TComponent;
begin
     Case PageControl1.ActivePageIndex of
      0: TabSheet:=TabSheet1;
      1: TabSheet:=TabSheet2;
      2: TabSheet:=TabSheet3;
      3: TabSheet:=TabSheet4;
      4: TabSheet:=TabSheet5;
      5: TabSheet:=TabSheet6;
      end;

  if MD then
    begin
     for i:=0 to 3 do
      begin
        ctrl:=TabSheet.FindComponent(controls[i] + IntToStr(ActualNo));
        if Assigned(ctrl) then
         begin
           TControl(ctrl).Left:= TControl(ctrl).Left + (X - P.X);
           TControl(ctrl).Top:= TControl(ctrl).Top + (Y - P.Y);
          end;
       end;
     end;
end;
0

Ano pięknie dziękuje po raz drugi, działa to to dokładnie tak jak trzeba ....

Próbowałem wcześniej FindComponent tylko nie wiedziałem ze trzeba/można później zrobić tak:
TControl(ctrl).Left
a dla TComponent nie ma .Left i wszystko legło w gruzach ....

jeszcze raz podziękował ... [browar]

0

Jeżeli chcesz mieć dostęp do własności Left to chyba raczej rzutuj na TWinControl.

0

Dlaczego? TImage na TWinControl?

0

kAzek: sorry, w tym długim temacie już się trochę pogubiłem, więc wywnioskowałem, że
jak szajbuss85 chce ustawić Left to musi rzutować na TWinControl, bo taka klasa ma Left.

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