Главная страница
    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]
> почти что ручками Ручками :)))
> если он для них не единый (общий)


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


 
AndreySoft   (2003-12-13 21:10) [41]

почему после того как я динамичеки создал Эдиты, присвоил каждому какое-то числовое значение в свойство Text, по нажатию на кнопку пишу такой код:
procedure TForm2.SpeedButton2Click(Sender: TObject);
var Edits : array of TEdit;
i,z:integer;
begin
SetLength(Edits, i);
for i:=1 to StrToInt(seti) do
Edits[i].Text:=IntToStr(i);
end;

...но всё равно ничего в Эдиты не заносится...


 
KSergey   (2003-12-13 21:12) [42]

> AndreySoft © (13.12.03 14:45) [37]
> А как теперь насписать обработчики событий OnChange для
> этих динамичеки созданных Эдитов?

А почитать ссылку, данную уже давно (см. KSergey © (12.12.03 08:56) [12] ) - не судьба? Или "чукча не читатель, чукча писатель"?


 
sniknik   (2003-12-13 22:09) [43]

AndreySoft © (13.12.03 21:10) [41]
ты чего так ничего и не понял? советую перечитать ветку заново, только внимательно. начиная с
Anatoly Podgoretsky © (11.12.03 22:04) [1]
> Вот если сумеешь ответить чему равны начальные значения i тогда и поймешь.
а так же что у тебя в Edits, локальной надо сказать переменной (не знаеш разницы?).


 
AndreySoft   (2003-12-14 12:01) [44]

Начальное значение i у меня равно 1!
И что мне это сказало?

> а так же что у тебя в Edits, локальной надо сказать переменной
> (не знаеш разницы?).

мне без разницы локальная она переменная или ещё какая-нибудь...

Я не могу понять почему когда я пытаюсь получить содержимое любого Edit"а свойства Text, он мне возвращает что оно nill...


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

>AndreySoft © (14.12.03 12:01) [44]

> мне без разницы локальная она переменная или ещё какая-нибудь...

Я думаю после этого ветку можно со спокойной душой в потрепаться или закрыть


 
AndreySoft   (2003-12-14 12:46) [46]

Какой "ЗАКРЫТЬ"?
Мне ж хана, если я не смогу получить данные из Edits[i].Text...
Ну помогите кто-нибудь!
хнык-хнык...


 
Palladin   (2003-12-14 12:47) [47]


> AndreySoft © (14.12.03 12:01) [44]

в школу нафиг...


 
KSergey   (2003-12-14 13:01) [48]

> AndreySoft © (14.12.03 12:01) [44]
> мне без разницы локальная она переменная или ещё какая-нибудь...

8)))))

Клево! Зомечательный перл! Такого давно не было! ;)))))

PS
Теперь помедитируйте над компилятором - и, возможно, он с вами согласится, и тогда прибудет вам великая сила!!!


 
AndreySoft   (2003-12-14 13:05) [49]

Ладно, не хотите помогать...
Спасибо хоть за это!


 
Плохиш_   (2003-12-14 13:06) [50]

>Плохиш_ (14.12.03 12:33) [45]
Кстати про орешник совсем забыл ;-)


 
Palladin   (2003-12-14 13:10) [51]


> AndreySoft © (14.12.03 13:05) [49]

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

Локальная переменная создается в стеке и про нее можно забыть когда осущетсвляется выход из процедуры содержащей эту переменную. Теперь ты понимаешь, что Edits в первой процедуре и Edits во второй процедуре обасолютно разные вещи. Возьми учебник Паскаля и решай все задачи, читай теорию, что где и как.

PS И я бы постыдился свой сайт открывать на эту тематику будь у меня подобный уровень.


 
AndreySoft   (2003-12-14 13:14) [52]

Ладно высмеивать людей ты умеешь - не спорю!
А как на счёт - помочь?


 
Palladin   (2003-12-14 13:14) [53]

А то млин понимаешь "Программа открытия и закрытия CDROM"а" :))... едиственная, млин, в своем роде...
И уж совсем нонсес "Программа для тестирования изучаюих информатику"... интересно что там...


 
AndreySoft   (2003-12-14 13:19) [54]

Блин, я всё понял!
Стормозил малец...ссори, сам виноват...
Всем спасибо!


 
Германн   (2003-12-15 03:43) [55]

2 AndreySoft © (14.12.03 13:19) [54]
Ты многое сможешь, если поймешь, что ты не "Стормозил малец...ссори, сам виноват...", а плохо понимаешь основы Pascal!

Ну очень стоит "почитать книжки", "посмотреть примеры" и просто "потренироваться"!



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

Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.013 c
3-86261
Term
2003-12-03 16:37
2003.12.26
Теоретический вопрос безопасности в IB, FB


3-86242
Слэш
2003-12-04 11:48
2003.12.26
Как составить такой SQL запрос ?


6-86482
dD@N
2003-10-26 13:02
2003.12.26
Проблема с WinInet


4-86593
karburator
2003-10-29 11:23
2003.12.26
не работает oemtochar()


14-86525
SergP
2003-12-01 22:46
2003.12.26
Помогите написать Select





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