Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.008 c
15-1196276512
NeiL
2007-11-28 22:01
2007.12.30
Cut_Image


2-1196767210
Егоров А.Н.
2007-12-04 14:20
2007.12.30
получить локальный IP-адрес компьютера


2-1196763788
Alexandr Malygin
2007-12-04 13:23
2007.12.30
динамическое создание/удаление компонент


6-1170770912
Aks13
2007-02-06 17:08
2007.12.30
Twebbrouser координаты ссылки на странице.


15-1196178141
All More system
2007-11-27 18:42
2007.12.30
Сокеты и трафик, оптимизация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский