![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос относительно объектов [D7, XP]
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 - в печь.
:-)