Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос относительно объектов [D7, XP]


Страницы:   1 2

Drone ©   (2008-08-23 16:41:00) 

Мне хотелось бы чтоб при нажатии на кнопку все обекты Edit, находящиеся на форме сдвинулись на 10 позиций влево и на 10 позиций вниз. То есть если я бы добавил еще Edit-ов на форму то мне не пришлось бы менять код. Как-бы процедура которая определяет если объект есть Edit то его нужно сдвинуть.

Спасибо большое
Drone


Drone   (2008-08-24 18:26:00) [1]

{RASkov}Спасибо огромное. Это сработало отлично!!!

unit Unit2;

interface
uses Controls, StdCtrls;
procedure ShiftControls(CtrlParent:TWinControl; X:Integer); overload;

implementation

procedure ShiftControls(CtrlParent:TWinControl; X:Integer);
var i:Integer;
begin
with CtrlParent do
for i:=0 to ControlCount-1 do
if Controls[i] is Tedit then
Controls[i].Left:=Controls[i].Left+X end; end.


Таким образом вызывая процедуру ShiftControls с соответствующими ей параметрами например ShiftControls(Self,15) эдиты будут сдвигаться влево на 15 в основном модуле посредством этого вспомогательного модуля.

Я немного упростил код, но он работает превосходно и без ошибок. Спасибо еще раз.


{RASkov}   (2008-08-23 22:09:00) [2]

> [27] Германн ©   (23.08.08 19:33)

Точно. Моя вина... Тогда так:
unit Unit2;
interface
uses Controls;

procedure ShiftControls(CtrlParent: TWinControl; X, Y: Integer); overload;
procedure ShiftControls(CtrlParent: TWinControl; ShftCtrls: TControlClass; X, Y: Integer); overload;

implementation

procedure ShiftControls(CtrlParent: TWinControl; X, Y: Integer);
var i: Integer;
begin
with CtrlParent do
 for i:=0 to ControlCount-1 do begin
  Controls[i].Left:=Controls[i].Left+X;
  Controls[i].Top:=Controls[i].Top+Y;
 end;
end;

procedure ShiftControls(CtrlParent: TWinControl; ShftCtrls: TControlClass; X, Y: Integer);
var i: Integer;
begin
with CtrlParent do
 for i:=0 to ControlCount-1 do
  if Controls[i] is ShftCtrls then begin
   Controls[i].Left:=Controls[i].Left+X;
   Controls[i].Top:=Controls[i].Top+Y;
  end;
end;

end.


Вызовы из метода формы, например:
ShiftControls(Self, 15, -15);
ShiftControls(Self, TEdit, -15, 15);

Теперь должно "прокатить" ...компоненты :)


Германн   (2008-08-23 19:33:00) [3]


> {RASkov} ©   (23.08.08 19:01) [24]

Все равно будет ошибка :(


{RASkov}   (2008-08-23 19:08:00) [4]

>    if Controls[I] is TEdit then
>    begin
>      TEdit(Controls[I]).Left := TEdit(Controls[I]).Left-10;
>      TEdit(Controls[I]).Top:= TEdit(Controls[I]).Top+10;

Кстати, приведение тоже не обязательно, достаточно только проверки....
Т.е.
   if Controls[I] is TEdit then begin
     Controls[I].Left:=Controls[I].Left-10;
     Controls[I].Top:=Controls[I].Top+10;
.......
Но это именно в этом и подобных случаях.... где свойства, к которым обращаемся, "общие" т.е. в предке...


Drone   (2008-08-23 19:03:00) [5]

Спасибо большое!


{RASkov}   (2008-08-23 19:01:00) [6]

> [20] Drone ©   (23.08.08 18:32)
> У меня возник еще вопрос. Когда я использовал ControlCount
> в Unit (хотел создать модуль) выдает ошибку что ControlCount
> незвестен. Что делать?

Например передавай в процедуру, где будешь использовать ControlCount объект, чьи контролы будешь перебирать....
Пример:

procedure ShiftAllControls(CtrlParent: TControl; X, Y: Integer);
var i: Integer;
begin
 for i:=0 to CtrlParent.ControlCount-1 do begin
  Controls[i].Left:=Controls[i].Left+X;
  Controls[i].Top:=Controls[i].Top+Y;
 end;
end;

Можно переделать и для конкретнного типа контролов, т.е. не все контролы сдвигать, а например Эдиты.... переделать не сложно...


Drone   (2008-08-23 18:56:00) [7]

Ну к примеру я хочу чтобы была готовая процедура  по премещению эдитов.
Тоесть создать модуль с готовой процедурой. Подключая этот модуль к другим приложениям не пришлось бы писать снова есь код а просто вызвать эту процедуру из модуля. Это не сколько для определенной цели сколько для практики. Я хочу научиться как работать с модулями, процедурами, компонентами и т.д.

Спасибо


Германн   (2008-08-23 18:52:00) [8]


> У меня возник еще вопрос. Когда я использовал ControlCount
> в Unit (хотел создать модуль) выдает ошибку что ControlCount
> незвестен.

А чьё свойство ControlCount? Это ты прочитал в справке?


Тын-Дын   (2008-08-23 18:47:00) [9]


> убрал пару скобок и ненужный begin с end-ом после оператора
> for do.


В результате превратил код в нечитабельный.

procedure TForm1.Button1Click(Sender:TObject);
var
 i: Integer;
begin
  for i:=0 to ControlCount-1 do
  begin
    if Controls[I] is TEdit then
    begin
      TEdit(Controls[I]).Left := TEdit(Controls[I]).Left-10;
      TEdit(Controls[I]).Top:= TEdit(Controls[I]).Top+10 ;
    end;
  end ;
end;


Drone   (2008-08-23 18:32:00) [10]

Да я посмотрел свойства/методы components и controls различаются. Спасибо всем огромное за ваши ответы. Просто замечательные люди!

Окончательно я получил вот такой код:

procedure TForm1.Button1Click(Sender:TObject);
var i:Integer;
begin
for i:=0 to ControlCount-1 do
if Controls[I] is TEdit then
begin
TEdit(Controls[I]).Left:= TEdit(Controls[I]).Left-10;
TEdit(Controls[I]).Top:= TEdit(Controls[I]).Top+10 end end;


убрал пару скобок и ненужный begin с end-ом после оператора for do.

У меня возник еще вопрос. Когда я использовал ControlCount в Unit (хотел создать модуль) выдает ошибку что ControlCount незвестен. Что делать?


Vayrus   (2008-08-23 18:24:00) [11]

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ControlCount - 1 do
begin
 if (Controls[I] is TEdit) then
 begin
   TEdit(Controls[I]).Left := TEdit(Controls[I]).Left - 10;
   TEdit(Controls[I]).Top := TEdit(Controls[I]).Top + 10;
 end
end;
end;


Anatoly Podgoretsky   (2008-08-23 18:18:00) [12]

> Ega23  (23.08.2008 17:55:16)  [16]

Controls[]


Германн   (2008-08-23 18:05:00) [13]


> Ega23 ©   (23.08.08 17:55) [16]

В связи с
> То есть если я бы добавил еще Edit-ов на форму
стоит обратить внимание на дополнение

> Leonid Troyanovsky ©   (23.08.08 17:15) [13]


Ega23   (2008-08-23 17:55:00) [14]

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to Form1.ComponentCount - 1 do
begin
  if (Form1.Components[I] is TEdit) then
  begin
    (Form1.Components[I] as TEdit).Left := (Form1.Components[I] as TEdit).Left - 10;
    (Form1.Components[I] as TEdit).Top := (Form1.Components[I] as TEdit).Top + 10;
  end
end;
end;


Ну про Form1 фтопку - уже сказали.
Ещё не мешает as убрать, достаточно TEdit(Components[I])


Anatoly Podgoretsky   (2008-08-23 17:29:00) [15]

> DVM  (23.08.2008 17:06:08)  [8]

Не все что находится в контейнере Components находится в контейнере Controls и vice versa


Anatoly Podgoretsky   (2008-08-23 17:27:00) [16]

> Drone  (23.08.2008 16:57:05)  [5]

и неверный ответ.


Leonid Troyanovsky   (2008-08-23 17:15:00) [17]


> Германн ©   (23.08.08 17:06) [9]

> Это если коротко.

Я б добавил, что в x.Controls те, кому назначен Parent = x,
а в x.Components - у кого Owner = x;

--
Regards, LVT.


Drone   (2008-08-23 17:15:00) [18]

@ DVM, Германн спасибо большое теперь я понял.

@ Leonid Troyanovsky мне скорее нужен был общий случай для управления объектами. Edit скорее был как пример, но спасибо за совет я запомню на будущее.

В help честно говоря не очень было понятно


Leonid Troyanovsky   (2008-08-23 17:10:00) [19]


> Drone ©   (23.08.08 17:03) [7]

> ^^ А зачем мне StringGrid?!

Например, для показа и редактирования текстовых данных.
Один контрол удобней десяти.


> И пожалуйста если можно разъясните разницу между controls
> и components

А что в хелпе непонятно?

--
Regards, LVT.


Vayrus   (2008-08-23 17:07:00) [20]

Leonid Troyanovsky
> Form1 - в печь.


:-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо