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

Вниз

динамическое создание/удаление компонент   Найти похожие ветки 

 
Alexandr Malygin ©   (2007-12-04 13:23) [0]

Здравствуйте! ситуация такая, создаю на 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?
Заранее благодарю за ответ!


 
Ega23 ©   (2007-12-04 13:27) [1]

procedure ClearTabSheet(ts : TTabSheet);
var
 i : Integer;
begin
 for i:=ts.ControlCount-1 downto 0 do
   ts.controls[i].Free;
end;


Ну и создавать:
ed:=TEdit.Create(PageControl1.Pages[0]);

(ed as TEdit) - это лишнее. просто ed.Name ....

Application.ProcessMessages; - это тоже лишнее.


 
Dennis I. Komarov ©   (2007-12-04 13:31) [2]

> [1] Ega23 ©   (04.12.07 13:27)

А если там кроме эдитов еще полно всего?

ИМХО лучше хранить число созданный, да и ссылки на созданные тоже можно хранить. Зачем убивать 5 и потом создавать 6?

Да,
>    ed:=TEdit.Create(Self);
>    (ed as TEdit).Name:="Edit"+IntToStr(i);
>    (ed as TEdit).Parent:=PageControl1.Pages[0];
>    (ed as TEdit).Enabled:=True;

Они у тебя друг на друге будут?


 
Ega23 ©   (2007-12-04 13:39) [3]


> А если там кроме эдитов еще полно всего?


Тогда так:
procedure ClearTabSheet(ts : TTabSheet; const : TagValue : Integer);
var
i : Integer;
begin
for i:=ts.ControlCount-1 downto 0 do
  if ts.controls[i].Tag=TagValue then
    ts.controls[i].Free;
end;


Ну и при создании прописывать нужный Tag


 
Alexandr Malygin ©   (2007-12-04 13:43) [4]

to Dennis I. Komarov >>> я убрал строчки которые координируют их

to Ega23 >>> вот не пойму что с процедурой этой делать... :) понял как работает, а вот куда ее впихнуть чтобы в run-time все сработало... чтобы отработало если я после 5-ки шестерку поставлю


 
Dennis I. Komarov ©   (2007-12-04 13:46) [5]

> [3] Ega23 ©   (04.12.07 13:39)

 Лучше так:
   if ts.controls[i] is TEdit then ts.controls[i].Free;
 Tag имеет право на сущществование и быть уже использующимся в др. целях


 
Dennis I. Komarov ©   (2007-12-04 13:47) [6]

> а вот куда ее впихнуть

Перед тем как создать новые шесть :)


 
Ega23 ©   (2007-12-04 13:47) [7]


> все сработало... чтобы отработало если я после 5-ки шестерку
> поставлю


Тольк сейчас заметил, что это у тебя на OnChange завязано. Ну как примитив - воткни в начало обработчика. Но вообще-то OnChange будет срабатывать чаще, чем тебе кажется. Например, ты вывалил окно со списком в комбике и его просто "скроллируешь", ещё толком ничего не выбрав. А OnChange уже будет идти.


 
Ega23 ©   (2007-12-04 13:48) [8]


> Лучше так:
>    if ts.controls[i] is TEdit then ts.controls[i].Free;
>  Tag имеет право на сущществование и быть уже использующимся
> в др. целях
>


Ты сам сказал, что "А если там кроме эдитов еще полно всего?". А если там есть эдиты кроме динамически-созданных?


 
Alexandr Malygin ©   (2007-12-04 13:54) [9]

тогда может быть лучше завязать непосредственно на OnSelect?


 
Dennis I. Komarov ©   (2007-12-04 13:57) [10]

> [8] Ega23 ©   (04.12.07 13:48)
>
> > Лучше так:
> >    if ts.controls[i] is TEdit then ts.controls[i].Free;
>
> >  Tag имеет право на сущществование и быть уже использующимся
>
> > в др. целях
> >
>
>
> Ты сам сказал, что "А если там кроме эдитов еще полно всего?
> ". А если там есть эдиты кроме динамически-созданных?

Тогда TMyEdit для динамических, а вообще я за то чтобы создать не 6 а всего одну и хранить список созданных с их ссылками.


 
Ega23 ©   (2007-12-04 14:02) [11]


> тогда может быть лучше завязать непосредственно на OnSelect?


Да, и проверять выбранное значение (может оказаться, что оно равно текущему, тогда нефиг ненужную работу делать).


> Тогда TMyEdit для динамических, а вообще я за то чтобы создать
> не 6 а всего одну и хранить список созданных с их ссылками.


Я с тобой согласен, просто из вопроса не совсем понятна ситуация. Я бы вообще как-нибудь по-другому спроектировал.


 
Anatoly Podgoretsky ©   (2007-12-04 14:02) [12]

Ситуация запутаная.


 
Dennis I. Komarov ©   (2007-12-04 14:03) [13]

> Я бы вообще как-нибудь по-другому спроектировал.

На том и порешили :)


 
MetalFan ©   (2007-12-04 14:06) [14]

Пересоздание эдитов лучше имхо повесить на 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;

както так... возможны ошибки - писалось в браузере)


 
Alexandr Malygin ©   (2007-12-04 14:09) [15]

Ega23 тогда посоветуй пожалуйста мне как по-другому спроектировать.
задача такая: человеку нужно создать ведомость в экселе для ежемесячного премирования сотрудников, сколько их будет заранее неизвестно, поэтому я создаю от 1 до 10 полей чтобы внести в них данные, чтобы потом их слить в эксель... в то же время для каждого сотрудника будет создаваться несколько полей в которые будет вноситься информация: фио, должность, и т.д. ... в общем если будет 10 человек для премирования, то мне придется создать как минимум 20 эдитов, что не есть хорошо...
подскажи пожалуйста, в каком направлении лучше двигаться.


 
Ega23 ©   (2007-12-04 14:09) [16]


> Пересоздание эдитов лучше имхо повесить на OnCloseUp комбика.


А вот я пришёл в комбик табуляцией и тупо стрелочкой выбираю значение, не раскрывая выпадающего списка.


 
Ega23 ©   (2007-12-04 14:11) [17]


> Alexandr Malygin ©   (04.12.07 14:09) [15]


А не проще ли в данной ситуации использовать VBA и не выпендриваться с Delphi? ИМХО, макросом в excel обойтись будет гораздо проще...


 
Alexandr Malygin ©   (2007-12-04 14:13) [18]

с удовольствием бы... да с VBA не знаком...
в любом случае всем спасибо!


 
MetalFan ©   (2007-12-04 14:16) [19]


> А вот я пришёл в комбик табуляцией и тупо стрелочкой выбираю
> значение

а вот про это я и забыл)
ну тогда на OnExit например...


 
Ega23 ©   (2007-12-04 14:17) [20]


> с удовольствием бы... да с VBA не знаком...


Дык и я не знаком, но, насколько я понимаю, там всё до тупого просто...


 
{RASkov} ©   (2007-12-04 14:46) [21]

> А вот я пришёл в комбик табуляцией и тупо стрелочкой выбираю
> значение, не раскрывая выпадающего списка.


> ну тогда на OnExit например...

Лучше OnSelect имхо... при условии, что в Item"ах Комбика только цифры....
....и безопасно при ручном вводе....

ЗЫ Я хотел ответить почти точно так же как и в [14] ...чуть-чуть не успел :(
  Даже удивился на похожесь кода :)


 
MetalFan ©   (2007-12-04 14:50) [22]


>   Даже удивился на похожесь кода :)

телепатия однако)


 
Плохиш ©   (2007-12-04 15:40) [23]


> Alexandr Malygin ©   (04.12.07 14:09) [15]

Почему бы не использовать TStringGrid?


 
Dennis I. Komarov ©   (2007-12-04 15:43) [24]


> [18] Alexandr Malygin ©   (04.12.07 14:13)
> с удовольствием бы... да с VBA не знаком...

А вставлять его в Excel чем собрался?


 
Dennis I. Komarov ©   (2007-12-04 15:44) [25]

+ Есть еще TSpinEdit. Имхо он сюда уместнее :)


 
KSergey ©   (2007-12-04 16:18) [26]

Как-то все подзабыли про TStringGrid
Или я что-то пропустил?



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

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

Наверх




Память: 0.53 MB
Время: 0.018 c
4-1181375147
cvv
2007-06-09 11:45
2007.12.30
Как убрать сообщение?


2-1196895020
Malik
2007-12-06 01:50
2007.12.30
IncludeTrailingBackslash


15-1196196390
gotik
2007-11-27 23:46
2007.12.30
Кто был в Тайланде?


6-1177047641
tytus
2007-04-20 09:40
2007.12.30
Indy 10 - Как узнать, что клиент отключился? (клиент - в dll)


2-1197020808
Кевларвестов Семен
2007-12-07 12:46
2007.12.30
Передача между variant ами значения 0000 как строки