Форум: "Начинающим";
Текущий архив: 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