Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизДинамическре удаление компонентов... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c