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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2011, 09:13   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию EOSError 1400 "Недопустимый дескриптор окна"

Доброго времени суток.
После того как перенес некоторый код в поток при завершении программы стала вылетать ошибка EOSError 1400 "Недопустимый дескриптор окна". Код программно помещает на форму некоторое количество некоторых компонентов(таких как tlabel, timage, tbutton итп). Когда код был вне потока все было нормально, причина появления ошибки мне совершенно не ясна т.к. код выполняется до конца без ошибок и по идее поток должен при этом завершаться.
Вот этот код(пару компонентов TLabel я из него убрал т.к. иначе сообщение выходило слишком большое, но смысл остался тот же):

Код:
procedure TNewThread.Execute;
begin
reply_friends:=Form1.HTTPAction('index.php?action=friends&login='+Login+'&pass='+Password);
if Pos('<error>', reply_friends) = 0 then begin
friends_count:=StrToInt(Pars('<count>',reply_friends,'<>'));
  for element_i2 := 0 to friends_count-1 do
  begin
    friend:=element_i2+1;
    friend_str:=IntToStr(friend);
friend_id:=Pars('<start>'+friend_str+'<>',reply_friends,'<end>'+friend_str+'<>');
    element_i:=StrToInt(Pars('<id>',friend_id,'<>'));
    avatars[element_i] := TImage.Create(nil);
    avatars[element_i].Width := 60;
    avatars[element_i].Height := 60;
    avatars[element_i].Left := 8;
    if element_i2 = 0 then avatars[element_i].Top := 8;
    if element_i2 > 0 then avatars[element_i].Top := 8+(8+avatars[element_i].Height)*element_i2;
    MS:= TMemoryStream.Create;
    PNG := TPNGObject.Create;
    Form1.HTTPActionMS('avatars/'+Pars('<id>',Pars('<start>'+friend_str+'<>',reply_friends,'<end>'+friend_str+'<>'),'<>')+'.png', MS);
    MS.Position := 0;
    PNG.LoadFromStream(MS);
    avatars[element_i].Picture.Assign(PNG);
    MS.Free;
    PNG.Free;
    avatars[element_i].Parent := sScrollBox1;

    el_nick1[element_i] := TsLabel.Create(nil);
    el_nick1[element_i].Left := 72;
    el_nick1[element_i].Caption := 'Íèê:';
    if element_i2 = 0 then el_nick1[element_i].Top := 8;
    if element_i2 > 0 then el_nick1[element_i].Top := 8+(8+60)*element_i2;
    el_nick1[element_i].Parent := sScrollBox1;

    el_status2[element_i] := TsLabel.Create(nil);
    el_status2[element_i].Left := 120;
    st:=StrToInt(Pars('<status>',friend_id,'<>'));
    if st=0 then el_status2[element_i].Caption := 'Â èãðå';
    if st=1 then el_status2[element_i].Caption := 'Â ñåòè';
    if st=2 then el_status2[element_i].Caption := 'Îòøåë';
    if st=3 then el_status2[element_i].Caption := 'Çàíÿò';
    if st=4 then el_status2[element_i].Caption := 'Îòêëþ÷åí îò ñåòè';
    if element_i2 = 0 then el_status2[element_i].Top := 24;
    if element_i2 > 0 then el_status2[element_i].Top := 24+(8+60)*element_i2;
    el_status2[element_i].Parent := sScrollBox1;

    el_game2[element_i] := TsLabel.Create(nil);
    el_game2[element_i].Left := 120;
    el_game2[element_i].Caption := Pars('<game>',friend_id,'<>');
    if element_i2 = 0 then el_game2[element_i].Top := 40;
    if element_i2 > 0 then el_game2[element_i].Top := 40+(8+60)*element_i2;
    el_game2[element_i].Parent := sScrollBox1;

    el_server1[element_i] := TsLabel.Create(nil);
    el_server1[element_i].Left := 72;
    el_server1[element_i].Caption := 'Ñåðâåð:';
    if element_i2 = 0 then el_server1[element_i].Top := 56;
    if element_i2 > 0 then el_server1[element_i].Top := 56+(8+60)*element_i2;
    el_server1[element_i].Parent := sScrollBox1;

    el_server2[element_i] := TsLabel.Create(nil);
    el_server2[element_i].Left := 120;
    el_server2[element_i].Caption := Pars('<server>',friend_id,'<>');
    if element_i2 = 0 then el_server2[element_i].Top := 56;
    if element_i2 > 0 then el_server2[element_i].Top := 56+(8+60)*element_i2;
    el_server2[element_i].Parent := sScrollBox1;

    el_menu_btn[element_i] := TsButton.Create(form10);
    el_menu_btn[element_i].Left := 220;
    el_menu_btn[element_i].Caption := '^';
    el_menu_btn[element_i].Width := 17;
    el_menu_btn[element_i].Height := 17;
    el_menu_btn[element_i].Tag := StrToInt(Pars('<id>',friend_id,'<>'));
    el_menu_btn[element_i].OnClick:=Form10.onbtn;
    if element_i2 = 0 then el_menu_btn[element_i].Top := 8;
    if element_i2 > 0 then el_menu_btn[element_i].Top := 8+(8+60)*element_i2;
    el_menu_btn[element_i].Parent := sScrollBox1;

  //ID
    el_id[element_i] := StrToInt(Pars('<id>',friend_id,'<>'));

  end;

sLabel1.Caption:='';
end
else
begin
sLabel1.Caption:=Pars('<error>',reply_friends,'<>');
end;

end;
Подскажите пожалуйста что в этом коде может вызывать эту ошибку?
Заранее спасибо.
P.S. Мб мысль глупая но всеже - а не может это быть из за того что если динамически создавать объекты в потоке то поток не завершиться после выполнения и будет продолжать жить пока эти объекты существуют?
Crystallon вне форума Ответить с цитированием
Старый 21.06.2011, 09:48   #2
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Нашел то что вызывает ошибку, эта строчка:
el_menu_btn[element_i].Parent := sScrollBox1;
Но почему? У остальных компонентов родительским точно также является sScrollBox1...
Crystallon вне форума Ответить с цитированием
Старый 21.06.2011, 10:40   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. Когда выполняете TImage.Create(nil), то Free для компонента нужно программно делать
2. Создание визуальных компонент, адресовка их на форму - делать с использованием синхронизации
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.06.2011, 10:42   #4
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Уже итак заменял все на create(Form10)(че только не пробовал), все тоже самое, и к тому же ошибка все равно не в этом а в той строчке которую я указал... И плюс к тому этот код раньше стоял просто в onshow а не в потоке и работал нормально, я его просто от туда скопировал, изменилось лишь то что он оказался в потоке.
Crystallon вне форума Ответить с цитированием
Старый 21.06.2011, 10:47   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Crystallon Посмотреть сообщение
изменилось лишь то что он оказался в потоке.
см. пост 3 пункт 2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.06.2011, 11:41   #6
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Синхронизация действительно помогла) спасибо =)
Crystallon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с canvas "Неверный дескриптор" Алекс Ялта Gamedev - cоздание игр: Unity, OpenGL, DirectX 17 13.06.2011 22:32
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Восстановить файл "недопустимый формат" adonis Microsoft Office Excel 2 07.05.2009 08:59
Что такое "дескриптор" и с чем его едят? Snake_ua Win Api 3 30.10.2007 11:17