Текущий архив: 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.52 MB
Время: 0.006 c