![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
динамическое создание/удаление компонент [D7, XP]
Alexandr Malygin © (2007-12-04 13:23:00)Здравствуйте! ситуация такая, создаю на pagecontrol'е эдиты в количестве равном выбранному числу из комбобокса, код:
procedure TForm1.ComboBox1Change(Sender: TObject);
var i,n: integer;
ed: TEdit;
begin
try
n:=StrToInt(ComboBox1.Text);
except
ShowMessage('Ошибка в заданном числе');
exit;
end;
for i:=1 to n do
begin
ed:=TEdit.Create(Self);
(ed as TEdit).Name:='Edit'+IntToStr(i);
(ed as TEdit).Parent:=PageControl1.Pages[0];
(ed as TEdit).Enabled:=True;
Application.ProcessMessages;
end;
end;
к примеру из комбо я выбрал число 5, создалось 5 эдитов, но заметив что я ошибся, выбираю число 6 и тут выходит ошибка... вопрос: как правильно удалить старые 5 компонент, чтобы создались новые 6? и как сделать правильнее? добавить 1 компоненту к пяти существующим или удалить 5, чтобы создать новые 6?
Заранее благодарю за ответ!
KSergey (2007-12-04 16:18:00) [1]Как-то все подзабыли про TStringGrid
Или я что-то пропустил?
Dennis I. Komarov (2007-12-04 15:44:00) [2]+ Есть еще TSpinEdit. Имхо он сюда уместнее :)
Dennis I. Komarov (2007-12-04 15:43:00) [3]
> [18] Alexandr Malygin © (04.12.07 14:13)
> с удовольствием бы... да с VBA не знаком...
А вставлять его в Excel чем собрался?
Плохиш (2007-12-04 15:40:00) [4]
> Alexandr Malygin © (04.12.07 14:09) [15]
Почему бы не использовать TStringGrid?
MetalFan (2007-12-04 14:50:00) [5]
> Даже удивился на похожесь кода :)
телепатия однако)
{RASkov} (2007-12-04 14:46:00) [6]> А вот я пришёл в комбик табуляцией и тупо стрелочкой выбираю
> значение, не раскрывая выпадающего списка.
> ну тогда на OnExit например...
Лучше OnSelect имхо... при условии, что в Item'ах Комбика только цифры....
....и безопасно при ручном вводе....
ЗЫ Я хотел ответить почти точно так же как и в [14] ...чуть-чуть не успел :(
Даже удивился на похожесь кода :)
Ega23 (2007-12-04 14:17:00) [7]
> с удовольствием бы... да с VBA не знаком...
Дык и я не знаком, но, насколько я понимаю, там всё до тупого просто...
MetalFan (2007-12-04 14:16:00) [8]
> А вот я пришёл в комбик табуляцией и тупо стрелочкой выбираю
> значение
а вот про это я и забыл)
ну тогда на OnExit например...
Alexandr Malygin (2007-12-04 14:13:00) [9]с удовольствием бы... да с VBA не знаком...
в любом случае всем спасибо!
Ega23 (2007-12-04 14:11:00) [10]
> Alexandr Malygin © (04.12.07 14:09) [15]
А не проще ли в данной ситуации использовать VBA и не выпендриваться с Delphi? ИМХО, макросом в excel обойтись будет гораздо проще...
Ega23 (2007-12-04 14:09:00) [11]
> Пересоздание эдитов лучше имхо повесить на OnCloseUp комбика.
А вот я пришёл в комбик табуляцией и тупо стрелочкой выбираю значение, не раскрывая выпадающего списка.
Alexandr Malygin (2007-12-04 14:09:00) [12]Ega23 тогда посоветуй пожалуйста мне как по-другому спроектировать.
задача такая: человеку нужно создать ведомость в экселе для ежемесячного премирования сотрудников, сколько их будет заранее неизвестно, поэтому я создаю от 1 до 10 полей чтобы внести в них данные, чтобы потом их слить в эксель... в то же время для каждого сотрудника будет создаваться несколько полей в которые будет вноситься информация: фио, должность, и т.д. ... в общем если будет 10 человек для премирования, то мне придется создать как минимум 20 эдитов, что не есть хорошо...
подскажи пожалуйста, в каком направлении лучше двигаться.
MetalFan (2007-12-04 14:06:00) [13]Пересоздание эдитов лучше имхо повесить на OnCloseUp комбика.
и вести отдельно список эдитов.
как-то так:
...
FEditList : TObjectList;
...
FEditList := TEditList.Create;
...
procedure SetEditCount( ANewCount: integer );
begin
if FEditList.Count = ANewCount then exit;
if FEditList.Count > ANewCount then
begin
while FEditList.Count > ANewCount do
FEditList.Delete(pred(FEditList.Count));
end
else
while FEditList.Count < ANewCount do
begin
FEditList.Add(TEdit.Create(nil));
with TEdit(FEditList[pred(FEditList.Count)]) do
begin
Parent := SomeParentComp;
Left := 10;
Top := FEditList.Count * 15;
...
end;
end;
end;
както так... возможны ошибки - писалось в браузере)
Dennis I. Komarov (2007-12-04 14:03:00) [14]> Я бы вообще как-нибудь по-другому спроектировал.
На том и порешили :)
Anatoly Podgoretsky (2007-12-04 14:02:00) [15]Ситуация запутаная.
Ega23 (2007-12-04 14:02:00) [16]
> тогда может быть лучше завязать непосредственно на OnSelect?
Да, и проверять выбранное значение (может оказаться, что оно равно текущему, тогда нефиг ненужную работу делать).
> Тогда TMyEdit для динамических, а вообще я за то чтобы создать
> не 6 а всего одну и хранить список созданных с их ссылками.
Я с тобой согласен, просто из вопроса не совсем понятна ситуация. Я бы вообще как-нибудь по-другому спроектировал.
Dennis I. Komarov (2007-12-04 13:57:00) [17]> [8] Ega23 © (04.12.07 13:48)
>
> > Лучше так:
> > if ts.controls[i] is TEdit then ts.controls[i].Free;
>
> > Tag имеет право на сущществование и быть уже использующимся
>
> > в др. целях
> >
>
>
> Ты сам сказал, что "А если там кроме эдитов еще полно всего?
> ". А если там есть эдиты кроме динамически-созданных?
Тогда TMyEdit для динамических, а вообще я за то чтобы создать не 6 а всего одну и хранить список созданных с их ссылками.
Alexandr Malygin (2007-12-04 13:54:00) [18]тогда может быть лучше завязать непосредственно на OnSelect?
Ega23 (2007-12-04 13:48:00) [19]
> Лучше так:
> if ts.controls[i] is TEdit then ts.controls[i].Free;
> Tag имеет право на сущществование и быть уже использующимся
> в др. целях
>
Ты сам сказал, что "А если там кроме эдитов еще полно всего?". А если там есть эдиты кроме динамически-созданных?
Ega23 (2007-12-04 13:47:00) [20]
> все сработало... чтобы отработало если я после 5-ки шестерку
> поставлю
Тольк сейчас заметил, что это у тебя на OnChange завязано. Ну как примитив - воткни в начало обработчика. Но вообще-то OnChange будет срабатывать чаще, чем тебе кажется. Например, ты вывалил окно со списком в комбике и его просто "скроллируешь", ещё толком ничего не выбрав. А OnChange уже будет идти.