Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
14-86549
R
2003-12-02 04:16
2003.12.26
Delphi 5 Standart


11-86327
Bartov
2003-04-03 01:53
2003.12.26
KOL+VCL


14-86506
SPeller
2003-12-04 11:28
2003.12.26
Internet Explorer 6 Service Pack 1


3-86246
Spaniel
2003-12-03 23:57
2003.12.26
Возня с SQL


1-86353
bober
2003-12-12 14:01
2003.12.26
создание функций в run_time





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский