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

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

динамическое создание/удаление компонент [D7, XP]


Страницы:   1 2

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 уже будет идти.


Страницы:   1 2

Наверх

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