Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неожиданные кракозябры 
:(
    Опции темы
M1ndAction
Дата 29.11.2010, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 19.1.2008

Репутация: нет
Всего: нет



Добрый день!

Проблема в следующем: после запуска программы, некоторые надписи начинают отображаться кракозябрами. Притом некоторое время это может не проявляться, а затем происходит стабильно. Значения этих TLabel задается во время разработки и в процессе работы программы не изменяются. Но заметил, что, если "проблемным" TLabel переназначить их значения вручную, например, при возникновении события OnShow, то после этого они нормально отображаются. И, что самое интересно, не важно, что в этой надписи: кириллица или латиница. Если какая-то надпись начинала "сбоить", то я вручную записывал в нее значение, после этого с ней было все нормально, но начинались проблемы с другой надписью. Сначала проблемы были только в одной форме, а затем начались и в другой, у надписи, значение которой присваивается динамически (на этапе разработки она пустая - без текста), правда у себя этого пока не обнаружил, но на другой машине проявляется практически стабильно. Разрабатываю на Delphi 2009, WinXP SP3. На другой машине, на которой это точно проявляется, также установлена WinXP. Программа работает с потоками - как с файловыми, так и с TThread. Насколько мог заметить, проблема обычно проявляется после работы с одним из потоков, но не всегда - одна надпись сразу стабильно отображается неверно, если ее значение не переписать. Ее скриншот привожу ниже, на ней должно было быть написано: "Этап 3: Завершение регистрации" (без кавычек).
user posted image

В чем может быть дело?
PM MAIL   Вверх
imageman
Дата 29.11.2010, 10:40 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.9.2004

Репутация: 1
Всего: 1



из потока никогда нельзя менять визуальные компоненты на форме (в том числе и вызывать процедуры, которые это делают). только через Synchronize

Так же возможно у тебя разрушение памяти (пишешь за пределами массива, например).
PM MAIL   Вверх
M1ndAction
Дата 29.11.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 19.1.2008

Репутация: нет
Всего: нет



Цитата(imageman @  29.11.2010,  10:40 Найти цитируемый пост)
из потока никогда нельзя менять визуальные компоненты на форме (в том числе и вызывать процедуры, которые это делают). только через Synchronize

Это-то понятно smile Естественно, я такого не допускаю. О чем и речь, что все эти надписи я вообще в программе не трогаю, а задаю им текст на этапе разработки.

Цитата(imageman @  29.11.2010,  10:40 Найти цитируемый пост)
Так же возможно у тебя разрушение памяти (пишешь за пределами массива, например).

Здесь согласен, у меня тоже мысли крутятся вокруг чего-то подобного. Так как, если посмотреть на то, как изменяется текст, похоже, будто какой-то сбой в памяти происходит. Однако, некоторые надписи уже сразу после запуска программы с такими ошибками. То есть я еще не успеваю ничего создать и, соответственно, за пределы массива выйти не могу. При этом, использую достаточно много динамических массивов, в том числе и со сложными элементами (фреймы), может в эту сторону смотреть?
PM MAIL   Вверх
imageman
Дата 29.11.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.9.2004

Репутация: 1
Всего: 1



Если я правильно понимаю, то читать из визуальных компонентов можно из потоков без всяких ухищрений (напрямую)?

Может тогда попробовать временно упростить задачу и сделать всего один дополнительный поток.
Затем в конце всех процедур и вообще в любых подозрительных местах ставить

assert(label1.caption='Этап 3: Завершение регистрации');

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

Не исключено, что ошибка будет выскакивать в разных процедурах - значит или у тебя несколько ошибок или  другие потоки виноваты.
PM MAIL   Вверх
M1ndAction
Дата 29.11.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 19.1.2008

Репутация: нет
Всего: нет



В том-то и дело, что некоторые надписи отображаются неверно еще до запуска всевозможных потоков (а некоторые - после, то есть различные надписи ведут себя по разному). Так что потоки здесь, возможно, лишь косвенную роль играют. Но за Assert спасибо, не знал про такое, попробую отловить момент ошибки smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.