Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

Вопрос относительно объектов   Найти похожие ветки 

 
Drone ©   (2008-08-23 16:41) [0]

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

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


 
Германн ©   (2008-08-23 16:52) [1]

for i:=0 to ControlCount-1 do
 if Controls[i] is TEdit then ...


 
Vayrus   (2008-08-23 16:55) [2]

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;


 
Drone ©   (2008-08-23 16:56) [3]

Спасибо большое Германн!!!. Это то что мне нужно!


 
Leonid Troyanovsky ©   (2008-08-23 16:57) [4]


> Drone ©   (23.08.08 16:41)  

> Мне хотелось бы чтоб при нажатии на кнопку все обекты Edit,

А использовать TStringGrid в голову не приходило?

--
Regards, LVT.


 
Drone ©   (2008-08-23 16:57) [5]

Спасибо и Вам Vayrus за более полный ответ!!!


 
Leonid Troyanovsky ©   (2008-08-23 17:02) [6]


> Vayrus   (23.08.08 16:55) [2]

> procedure TForm1.Button1Click(Sender: TObject);

>  for I := 0 to Form1.ComponentCount - 1 do

Form1 - в печь.

--
Regards, LVT.


 
Drone ©   (2008-08-23 17:03) [7]

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

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

Заранее благодарен


 
DVM ©   (2008-08-23 17:06) [8]


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

не все что компонент - это контрол

TControl = class(TComponent)


 
Германн ©   (2008-08-23 17:06) [9]


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

Каждый control есть component, но не каждый component есть control. Это если коротко.


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

Leonid Troyanovsky
> Form1 - в печь.


:-)


 
Leonid Troyanovsky ©   (2008-08-23 17:10) [11]


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

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

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


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

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

--
Regards, LVT.


 
Drone ©   (2008-08-23 17:15) [12]

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

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

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


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


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

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

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

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-08-23 17:27) [14]

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

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


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

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

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


 
Ega23 ©   (2008-08-23 17:55) [16]

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])


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


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

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

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


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

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

Controls[]


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

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) [20]

Да я посмотрел свойства/методы 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 незвестен. Что делать?


 
Тын-Дын ©   (2008-08-23 18:47) [21]


> убрал пару скобок и ненужный 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;


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


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

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


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

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

Спасибо


 
{RASkov} ©   (2008-08-23 19:01) [24]

> [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 19:03) [25]

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


 
{RASkov} ©   (2008-08-23 19:08) [26]

>    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;
.......
Но это именно в этом и подобных случаях.... где свойства, к которым обращаемся, "общие" т.е. в предке...


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


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

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


 
{RASkov} ©   (2008-08-23 22:09) [28]

> [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);

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


 
Drone ©   (2008-08-24 18:26) [29]

{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 в основном модуле посредством этого вспомогательного модуля.

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



Страницы: 1 вся ветка

Текущий архив: 2008.10.05;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.016 c
15-1218831455
_koha
2008-08-16 00:17
2008.10.05
Народ как достать RAD STUDIO


15-1218679559
Slider007
2008-08-14 06:05
2008.10.05
С днем рождения ! 14 августа 2008 четверг


11-1194440952
=BuckLr=
2007-11-07 16:09
2008.10.05
Портированный DCPCrypt


15-1219030948
Slider007
2008-08-18 07:42
2008.10.05
С днем рождения ! 17 августа 2008 воскресенье


2-1219725859
пользователь1
2008-08-26 08:44
2008.10.05
Задать цвет ячейки в Excel