Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2014, 16:09   #1
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
Злость Ошибка при работе с массивом кнопок Delphi

Всем привет есть (пере-)создаваемый массив кнопок и такой вот код
Код:
procedure TForm1.UndoVBClick(Sender: TObject);
var
SText, VR, ID, SName: String;
i, j: Integer;
begin
SName:=TComponent(Sender).Name;// не уверен в правильности использования
j:=StrToInt(Copy(SName, pos('AI', SName)+2, Length(SName)));
for i:=0 to Length(VoteUsersB)-1 do VoteUsersB[i].Free;

ID:=Copy(VoteUsers[j], 1, pos(':', VoteUsers[j])-1);
if pos('"Par1"', VoteUsers[j])<>0 then VR:='-'
else if pos('"Par2"', VoteUsers[j])<>0 then VR:='+';
SText:='#com1#com2#com3' + VR + '|' + ID;

RegWork(ID, VarToStr(j), 4);
sleep(5);
Synch.Socket.SendText(SText);
end;
При его исполнении возникает ошибка(при том иногда двух видов и всегда после завершения процедуры (проверено F7)) см. скрины. Но при том программа продолжает работу выполняя все функции исправно!!! Иногда при "холодном старте"(т.е. когда прогрмма только запущена и кнопки уже существуют, а существуют они не всегда а только при определенных условиях) эта ошибка не возникает.
Так вот как её решить?!
Изображения
Тип файла: jpg error.jpg (50.9 Кб, 53 просмотров)
Тип файла: jpg error2.jpg (57.3 Кб, 52 просмотров)
Xaker_Two вне форума Ответить с цитированием
Старый 25.04.2014, 06:35   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Код:
RegWork(ID, IntToStr(j), 4);
Может ?
Для всего остального очень мало информации.
Чисто интуитивно
Код:
Synch.Socket.SendText(SText);
Может являться причиной ошибки, если Вы неправильно пытаетесь послать данные, советую закомментировать эту строку и погонять.
phomm вне форума Ответить с цитированием
Старый 25.04.2014, 11:08   #3
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

да нет думаю не в этом ошибка...
как всегда все доходит в одном волшебном месте
ошибка скорей всего из-за
Код:
for i:=0 to Length(VoteUsersB)-1 do VoteUsersB[i].Free;
(допустим кнопок 5(0..4))смотрим удаляем первый(0) элемент остается 4(0..3) удаляем второй элемент(1) остается 3(0..2) удаляем третий элемент(2) остается 2(0..1) удаляем 4(3) элемент и тут на нах(подругому не выразиться) его уже нет! это свойство for to do запоминать максимум как константу. Поэтому либо
Код:
while Length(VoteUsersB)>0 do VoteUsersB[0].Free;
либо for downto do
но за мнение спасибо(до этого все было через ComboBox и работало а я просто "массивный" элемент заменил на массив)

#11:13
то что вы посоветовали ничего не изменило дело не в нем было!

#11:15
и да я понял в чем прикол помимо for to do - я пытаюсь удалить элемент который в текущий момент используется!

Последний раз редактировалось Xaker_Two; 25.04.2014 в 11:17.
Xaker_Two вне форума Ответить с цитированием
Старый 25.04.2014, 11:17   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Free ни как не влияет на размерность массива VoteUsersB
Правильней было бы
Код:
for i:=Low(VoteUsersB) to High(VoteUsersB) do VoteUsersB[i].Free;
Но если индекс массива с нуля, то и следующее тоже норм
Код:
for i:=0 to Length(VoteUsersB)-1 do VoteUsersB[i].Free;
Другое дело, что в массиве может есть не созданные кнопки. Писать в лог подробненько и в случае ошибки заглянуть в него, думаю много прояснится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.04.2014 в 11:24.
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 11:24   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Free ни как не влияет на размерность массива VoteUsersB
Категорически согласен!!

[i].Free очищает объект (кнопку, судя по названию темы), но элемент в массиве остаётся, он никуда не девается! Просто он будет хранить указатель на несуществующий объект.
Я бы вообще вот так очищал:
Код:
  for i:=Low(VoteUsersB) to High(VoteUsersB) do FreeAndNil(VoteUsersB[i]);


кстати, то, что Free не влияет на размерность массива приведет к тому, что в случае кода:
Цитата:
Код:
while Length(VoteUsersB)>0 do VoteUsersB[0].Free;
получите бесконечный цикл!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.04.2014, 11:25   #6
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию


Следующий прикол: Теперь использую код
Код:
for i:=Length(VoteUsersB)-1 downto 0 do FreeAndNil(VoteUsersB[i]);
непосредственно перед создание их поновой так он мне теперь такую бяку выдает при попытке пересоздать кнопки и прибавить к ним ещё одну
Ну и как это понимать почему имя занято если я только что уничтожил весь массив кнопок(или нет??!!)
Изображения
Тип файла: jpg error3.jpg (53.7 Кб, 43 просмотров)

Последний раз редактировалось Xaker_Two; 25.04.2014 в 11:32.
Xaker_Two вне форума Ответить с цитированием
Старый 25.04.2014, 11:30   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем вообще играться с именами динамически создаваемых компонент? Тем более, что из имени и нужен какой-то номер. В tag при создании пишите его и используйте при необходимости. И лог с подробной фиксацией всего
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 11:37   #8
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
Лампочка

при помощи
Код:
SName:=TComponent(Sender).Name;
этого я никак не вытащу tag который будет хранить индекс этой кнопки в массиве
поэтому и пихаю в Name
Хотя если вы подскажите способ из Sender вытащить какую либо юзабительную инфу о том кто вызвал кнопку я буду рад это использовать

#11:40
все раздуплился с тормозов я немного тупанул и писал вот как
Код:
SetLength(VoteUsersB, VoteUsers.Count); //где VoteUsers(TStringList) меняется каждый раз при вызове функции где он прописан!

for j:=Length(VoteUsersB)-1 downto 0 do FreeAndNil(VoteUsersB[j]); //ну а здесь я пытаюсь уже массив нового размера удалить в надежде на то что он в старом состоянии

for i:=0 to VoteUsers.Count-1 do...
а надо было писать так
Код:
for j:=Length(VoteUsersB)-1 downto 0 do FreeAndNil(VoteUsersB[j]);

SetLength(VoteUsersB, VoteUsers.Count);
for i:=0 to VoteUsers.Count-1 do...
ваш КЭП

Последний раз редактировалось Xaker_Two; 25.04.2014 в 11:44.
Xaker_Two вне форума Ответить с цитированием
Старый 25.04.2014, 11:53   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

TComponent(Sender).Tag
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.04.2014, 12:12   #10
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

в 7-рке такого свойства нет
а все понял от типа зависит которому присваиваем(туплю как обычно)
Переделал и избавился от одной лишней переменной и лишнего действа спс
Изображения
Тип файла: jpg options.jpg (55.0 Кб, 120 просмотров)

Последний раз редактировалось Xaker_Two; 25.04.2014 в 12:19.
Xaker_Two вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с классами (Delphi) formig Помощь студентам 4 01.03.2013 13:43
Ошибка при работе с Delphi 7 и SQL 2005 DimaP2010 БД в Delphi 1 28.12.2010 19:35
Проблема при работе с массивом Shouldercannon Общие вопросы Delphi 0 28.05.2010 12:57
Ошибка при работе с формами (Delphi) MaGiS Помощь студентам 3 16.03.2010 17:53
Ошибка при работе с MySQL 3.51 в Delphi 2009 rainbow БД в Delphi 0 27.03.2009 06:47