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

Вниз

Динамическре удаление компонентов...   Найти похожие ветки 

 
AndreySoft ©   (2003-12-11 21:45) [0]

после динамического создания их же...
При событии FormShow пишу динамическое создание Edit"ов:
procedure TForm2.FormShow(Sender: TObject);
var Edits : array of TEdit;
x,z,i:integer;
begin
x:=StrToInt(seti);
z:=0;
SetLength(Edits, i);
for i:=1 to x do
begin
Edits[i]:=TEdit.Create(ScrollBox1);
with Edits[i] do
begin
Parent:=ScrollBox1;
Height:=21;
Width:=190;
Text:=IntToStr(i);
Left:=33;
z:=z+21;
Top:=z;
Ctl3D:=True;
TabOrder:=0;
end;


По нажатию на SpeedButton пытаюсь динамически удалить эти же Edit"ы:
procedure TForm2.SpeedButton1Click(Sender: TObject);
var Edits : array of TEdit;
i:integer;
begin
SetLength(Edits, i);
for i:=1 to StrToInt(seti) do
Edits[i].Free;
end;


Прога вроде бы очищает память, но не удаляет их, т.к. при повторном динамическом создании Edit"ов (не выходя из программы), вылетает исключительная ситуация...


 
Anatoly Podgoretsky ©   (2003-12-11 22:04) [1]

Вот если сумеешь ответить чему равны начальные значения i тогда и поймешь.


 
AndreySoft ©   (2003-12-11 22:15) [2]

Да какая разница чему они равны?
Ну вообще-то нулю как правило...
Только ничего от этого не меняется...


 
Вася Пупкин ©   (2003-12-11 22:18) [3]

i:integer;
begin
SetLength(Edits, i);
хммм....


 
хз ©   (2003-12-11 22:20) [4]

> Только ничего от этого не меняется...

Наивный...


 
Anatoly Podgoretsky ©   (2003-12-11 22:22) [5]

AndreySoft © (11.12.03 22:15) [2]
Ну допустим пусть 0, хотя это не так, тогда скажи что будет в результате SetLength(Edits, 0); и почему ты лезешь грязными руками в Edits с индексом более 0?


 
AndreySoft ©   (2003-12-11 22:28) [6]

А что туда надо лезть с индексом меньше нуля? :-)


 
sniknik ©   (2003-12-11 22:44) [7]

надо инициализировать переменные перед употреблением ;о)), иначе последствия непредсказуемы. (иногда даже работает(!!!!) :о))


 
AndreySoft ©   (2003-12-11 22:59) [8]

т.е. обнулять i?


 
Anatoly Podgoretsky ©   (2003-12-11 23:25) [9]

AndreySoft © (11.12.03 22:59) [8]
Нет увеличивать, иначе это не то что бессмыслица, это больше преступление против компьютера и его оперативной памяти.


 
sniknik ©   (2003-12-12 00:50) [10]

AndreySoft © (11.12.03 22:59) [8]
> т.е. обнулять i?
если нужно нулевое значение в переменной то да обнулять. в твоем случае (код AndreySoft © (11.12.03 21:45)) это не так (что будет значить SetLength(Edits, i) если i неопределено? т.е. может быть любым. как думаеш?).


 
Германн ©   (2003-12-12 03:33) [11]

Может я чо-то не понял, прошу извинить меня за тупость. Но как создав массив Эдитов, как локальную переменную метода FormShow потом удалить этот массив Эдитов, создав его как локальную переменную метода SpeedButton1Click?


 
KSergey ©   (2003-12-12 08:56) [12]

Автору:

Вы уж простите, но я не уверен что это поможет...
Но почитайте - а вдруг...

http://www.delphikingdom.com/helloworld/runtime_comp.htm

И любую простейшую книгу по дельфям - ябызательно.


 
Silver Alex ©   (2003-12-12 09:52) [13]

во первых надо сделать Edits глобальной, ну и кое что пофиксить :))

var Edits : array of TEdit;

procedure TForm2.FormShow(Sender: TObject);
var
x,z,i:integer;
begin
x:=StrToInt(seti);
z:=0;
SetLength(Edits, x);
for i:= Low(Edits) to High(Edits) do
begin
Edits[i]:=TEdit.Create(ScrollBox1);
with Edits[i] do
begin
Parent:=ScrollBox1;
Height:=21;
Width:=190;
Text:=IntToStr(i);
Left:=33;
z:=z+21;
Top:=z;
Ctl3D:=True;
TabOrder:=0;
end;
end;
end;

procedure TForm2.SpeedButton1Click(Sender: TObject);
var
i:integer;
begin
for i:=Low(Edits) to High(edits) do
FreeAndNil(Edits[i]);
end;


 
Плохиш_   (2003-12-12 10:27) [14]

>AndreySoft © (11.12.03 21:45)

Вот что дааааа...

Не пора ли основы поучить?

>Silver Alex © (12.12.03 09:52) [13]

> for i:=Low(Edits) to High(Edits) do

и чему здесь равны Low(Edits) и High(Edits)


 
Silver Alex ©   (2003-12-12 10:49) [15]


> и чему здесь равны Low(Edits) и High(Edits)

а ты как думаешь?Но скорее всего это будут нижнняя и верхняя границы массива.Не пора ли основы поучить?


 
TsvIlya   (2003-12-12 12:25) [16]

> Silver Alex © (12.12.03 10:49)
Если уж на то пошло, то Low(Edits) необязательно, динамические массиви всегда с 0 начинаются...


 
Sandman25 ©   (2003-12-12 12:30) [17]

[16] TsvIlya (12.12.03 12:25)

Если уж на то пошло, то обязательно. Вдруг в следующей версии Delphi сделают с 1. И что, все проекты перелопачивать? :)


 
KSergey ©   (2003-12-12 14:17) [18]

> [13] Silver Alex © (12.12.03 09:52)

А меня вот заинтересовало: а что есть seti и из чего предполагаем, что она - строковая? ;)


 
Silver Alex ©   (2003-12-12 14:25) [19]


> KSergey © (12.12.03 14:17) [18]

не известно, но судя по коду и по самому вопросу автор подставляет туда корректное значение.Иначе возникала бы ошибка и дальнейший код бы просто не выполнялся, так как обработчика ошибок мы не наблюдаем


 
AndreySoft ©   (2003-12-12 16:54) [20]


> А меня вот заинтересовало: а что есть seti и из чего предполагаем,
> что она - строковая? ;)


Вообще-то не так уж сложно было догадаться что это глобальная переменная...


 
Вася Пупкин ©   (2003-12-12 16:59) [21]

>AndreySoft © (12.12.03 16:54) [20]
>Вообще-то не так уж сложно было догадаться что это глобальная >переменная...

Вообще-то тут не в "угадайку" играют


 
Anatoly Podgoretsky ©   (2003-12-12 17:16) [22]

TsvIlya (12.12.03 12:25) [16]
Вообще то если есть желание в надежной работе программы, то надо пользоваться именно Low/High а не делать предположений, пускай даже документированых, тогда будет работать всегда, в не зависимости от того какие границы.

Silver Alex © (12.12.03 14:25) [19]
См. AndreySoft © (11.12.03 21:45)
" вылетает исключительная ситуация..."

Silver Alex © (12.12.03 09:52) [13]
Ты здорово почистил, потерял Edits := nil; в самом конце.


 
AndreySoft ©   (2003-12-12 17:16) [23]

да блин не в этом проблема заключается...
Пример Silver Alex © (12.12.03 09:52) [13] - не работает
Ну помогите кто-нибудь...


 
panov ©   (2003-12-12 17:31) [24]

Смысл твоей проблемы в том, что ты создаешь объекты и назначаешь им владельца(в данном случае - ScrollBox1).

Если желаешь уничтожать созданные объекты сам, то либо создавай так -
Edits[i]:=TEdit.Create(nil);
Edits[i].Paren := ScrollBox1;


либо изучай методы RemoveComponent,RemoveFreeNotification и иже с ними...


 
Silver Alex ©   (2003-12-12 17:37) [25]


> Anatoly Podgoretsky © (12.12.03 17:16) [22]


> Ты здорово почистил, потерял Edits := nil; в самом конце.


 
Silver Alex ©   (2003-12-12 17:40) [26]

сорри, не ту клавишу надавил

> Anatoly Podgoretsky © (12.12.03 17:16) [22]
> Silver Alex © (12.12.03 14:25) [19]
> См. AndreySoft © (11.12.03 21:45)
> "вылетает исключительная ситуация..."
Так где исключительная ситуация?При повторном создании

> Silver Alex © (12.12.03 09:52) [13]
> Ты здорово почистил, потерял Edits := nil; в самом конце.

Ну и ?Не понял если честно


 
Silver Alex ©   (2003-12-12 17:43) [27]


> AndreySoft © (12.12.03 17:16) [23]


как неработает? где?


 
Anatoly Podgoretsky ©   (2003-12-12 17:45) [28]

Silver Alex © (12.12.03 17:40) [26]
После удаления элементов из массива, надо обнулить сам массив.


 
Silver Alex ©   (2003-12-12 17:53) [29]


> Anatoly Podgoretsky © (12.12.03 17:45) [28]

понял


 
sniknik ©   (2003-12-12 19:09) [30]

AndreySoft © (12.12.03 17:16) [23]
> да блин не в этом проблема заключается...
а в чем?
> Пример Silver Alex © (12.12.03 09:52) [13] - не работает
а как?
> Ну помогите кто-нибудь...
без проблем. рабочий пример:


TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ClearControls;
public
end;

procedure TForm1.ClearControls;
var i: integer;
begin
for i:= ScrollBox1.ControlCount - 1 downto 0 do
ScrollBox1.RemoveControl(ScrollBox1.Controls[i]);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
Edit: TEdit;
begin
ClearControls;

for i:= 0 to StrToIntDef(Edit1.Text, 0) - 1 do begin
Edit:= TEdit.Create(nil);
Edit.Text:= IntToStr(i);
Edit.Left:= 5;
Edit.Top:= 5 + i*22;
ScrollBox1.InsertControl(Edit);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClearControls;
end;


(думаю бессмысленен для AndreySoft, так как счас вылезет куча доп. условий по которому это "не подходит" )


 
Stexen ©   (2003-12-12 19:35) [31]

SetLength(Edits, i);
for i:=1 to StrToInt(seti) do
Edits[i].Free;

по-моему устанавливать длинну массива надо после того как делаешь фри вообще странно что Edits[i].Free в это строчке не было ошибки обращения по не сущ. адресу!
пу сути они ведь даже не удалились!


 
Stexen ©   (2003-12-12 19:36) [32]

и вообще на самом деле глюка не было наверно по-тому что начальное значение на задано в честь чего переменная имеет наверняка значение какое нибудь бешанное типа 32000 и ты получаешь хороший такой массив!


 
AndreySoft ©   (2003-12-13 13:28) [33]


> sniknik © (12.12.03 19:09) [30]


Во! хорошая процедура...
Только мне не надо удалять всё со ScrollBox"а, а только то что я создал динамически...


 
AndreySoft ©   (2003-12-13 13:40) [34]

Сделал...
Всё спасибо не надо...


 
sniknik ©   (2003-12-13 14:39) [35]

AndreySoft © (13.12.03 13:28) [33]
ошибку не нашол? а ведь есть. ;о)) (неспециально, увидел уже когда положил, хотел поправится, но подумал, а пусть будет "домашним заданием" :о)))


 
AndreySoft ©   (2003-12-13 14:44) [36]

не знаю процедура работает нормально...
Только не понятно зачем ты написал procedure TForm1.Button1Click(Sender: TObject);
Достаточно TForm1.Button2Click(Sender: TObject);


 
AndreySoft ©   (2003-12-13 14:45) [37]

А как теперь насписать обработчики событий OnChange для этих динамичеки созданных Эдитов? Ведь их n количество...


 
JibSkeart ©   (2003-12-13 15:02) [38]

почти что ручками Ручками :)))
если он для них не единый (общий)


 
sniknik ©   (2003-12-13 15:13) [39]

> не знаю процедура работает нормально...
не нашол :(
обьекты не освобождаются только из списка выкидываются, лутше всетаки так

TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ClearControls;
procedure EditChange(Sender: TObject);
public
end;

procedure TForm1.ClearControls;
var i: integer;
begin
for i:= ScrollBox1.ControlCount - 1 downto 0 do
if ScrollBox1.Controls[i] is TEdit then ScrollBox1.Controls[i].Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
ClearControls;

for i:= 0 to StrToIntDef(Edit1.Text, 0) - 1 do
with TEdit.Create(ScrollBox1) do begin
Text:= IntToStr(i);
Left:= 5;
Top:= 5 + i*22;
OnChange:= EditChange;
Parent:= ScrollBox1;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ClearControls;
end;

procedure TForm1.EditChange(Sender: TObject);
begin
TEdit(Sender).Text:= "45";
end;


 
AndreySoft ©   (2003-12-13 16:54) [40]


> JibSkeart © (13.12.03 15:02) [38]
> почти что ручками Ручками :)))
> если он для них не единый (общий)


да, процедура будет для всех общая...
ну напишу я новую процедуру, а имя её какое будет и как её отнести ко всем Эдитам?



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

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

Наверх




Память: 0.56 MB
Время: 0.017 c
6-86484
AlexV
2003-10-29 08:39
2003.12.26
Нужна помощь по сокетам (открытие, закрытие, отправка сообщений)


1-86376
Александр из Минска
2003-12-15 15:26
2003.12.26
Строки


3-86267
Andriy Tysh
2003-12-03 10:29
2003.12.26
Master-Detail


14-86561
Rouse_
2003-11-27 00:53
2003.12.26
Очепятки...


14-86522
DK
2003-12-03 20:20
2003.12.26
Как вы боритесь с ленью?