С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
1

Одновременное использование (прокрутка) ScrollBox'a и динамическое размещение на нём компонентов

28.11.2012, 22:29. Показов 1355. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На ScrollBox'e динамически создаю большое количество CppWebBrowser'ов, соответственно хочется, что бы пока они создаются пользователь уже мог прокручивать и смотреть те компоненты, которые уже загрузились.

В основном модуле я создаю компоненты, а для загрузки в них информации использую отдельный поток.
И всё, вроде, замечательно, но получается такая штука: в тот момент, когда я прокручиваю ScrollBox, то, создаваемый в этот момент компонент оказывается сдвинут на прокрученную мной величину.
Как этого избежать не пойму...

Вот основной модуль (Unit1.cpp):
C++
1
2
3
4
5
6
7
8
9
10
// глобальные переменные:
PrintTh *MyPrint;
TCppWebBrowser *WBRow[MAXROWS];
 
// а этот код создает компоненты и запускает поток их загрузки
        for (int i=0; i<MAXROWS; i++)     {
                WBRow[i] = new TCppWebBrowser (Form1);
                WBRow[i]->TOleControl::Parent = Form1->ScrollBox1;
        }
    MyPrint = new PrintTh (false);
В unit1.h
C++
1
#define MAXROWS 100 //количество создаваемых компонентов
Вот загружающий информацию поток (unit2.cpp):
C++
1
2
3
4
5
6
7
8
9
10
11
12
extern TCppWebBrowser *WBRow[MAXROWS];
 
 
void __fastcall PrintTh::Execute()
{
        int SumH = 0;
        for (int i=0; i<MAXROWS; i++)     {
                WBRow[i]->Width = Form1->ScrollBox1->Width - 20;
                WBRow[i]->Top = SumH+10;
                SumH += WBRow[i]->Height+10;
        }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2012, 22:29
Ответы с готовыми решениями:

Динамическое использование компонентов
Здравствуйте! Реализую edit'ы в таком виде. procedure TForm1.Button1Click(Sender: TObject); var...

Запрещено одновременное размещение
Письмо пришло: Добрый день, Нашими правилами запрещено одновременное размещение на одной...

Одновременное размещение Директ и Бегун
Вот, что было : Смотрим документ &quot;Подробные условия участия в Рекламной сети Яндекса ...

Разработка приложений с использованием стандартных и дополнительных компонентов. Динамическое создание компонентов.
Здравствуйте! Помогите мне, пожалуйста. Условие задачи состоит в следующем: из списка выбираю...

7
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
28.11.2012, 22:51 2
Работа в потоке идет исключительно с объектами VCL - без использования Synchronize() это бомба замедленного действия, с использованием же поток совершенно бесполезен, так как все будет выполняться в контексте главного потока.
А чтобы избежать смещений, попробуй для задания Top очередного контрола брать напрямую Top + Height предыдущего контрола.
1
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
29.11.2012, 21:05  [ТС] 3
"Бомба замедленного действия", я так понимаю из-за того, что поток может быть остановлен в какой-то неудачный момент. Так?
А если я заведомо его останавливать не собираюсь, то проблем никаких не будет?

Top + Height - не помогло. Всё точно так же как и было.((
0
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305
29.11.2012, 21:35 4
Цитата Сообщение от prosto_lynx Посмотреть сообщение
"Бомба замедленного действия", я так понимаю из-за того, что поток может быть остановлен в какой-то неудачный момент. Так?
А если я заведомо его останавливать не собираюсь, то проблем никаких не будет?
Я так тоже когда то думал, пока весь мой проект не разросся до внушительных величин, и когда я стал ловить непонятные вылеты. Потом все с синхронизацией переписывал Лучше сразу
1
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
30.11.2012, 00:41 5
Опасно, потому что VCL рассчитана на работу в основном потоке и только. Без синхронизации в любой момент может возникнуть конфликт доступа между основным и побочными потоками, что приведет к зависанию или вылету - совершенно ненужный риск.
1
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305
30.11.2012, 00:45 6
Цитата Сообщение от BRcr Посмотреть сообщение
VCL
Да не только VCL, вон в той же Visual Studio C# тебе из неглавного потока к форме вообще компилятор прикоснуться не даст. Сообщая, что "Нельзя изменять форму потоком, который её не создал".
0
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
01.12.2012, 22:19  [ТС] 7
Кстати, при использовании Synchronize листание ScrollBox'a вообще стало недоступно, пока не выполнится задание потока полностью! Т.е. смысл самого потока вообще пропадает.(((

Добавлено через 3 минуты
p.s. пробовал в цикле второго потока ставить Sleep(100) - не помогает. Все-равно время для работы первого потока не выделяется!

И ошибиться то, вроде, негде:
C++
1
2
3
4
5
6
7
8
9
void __fastcall PrintTh::Execute()
{
        Synchronize(FCreate);
}
//---------------------------------------------------------------------------
void __fastcall PrintTh::FCreate()
{
        int SumH = 0;         for (int i=0; i<MAXROWS; i++)     {                 WBRow[i]->Width = Form1->ScrollBox1->Width - 20;                 WBRow[i]->Top = SumH+10;                 SumH += WBRow[i]->Height+10;         }
}
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.12.2012, 22:38 8
Ну, вот зачем поток? Говорят же тебе - бесполезен он при работе исключительно с VCL. И точка.
Используй таймер - за один такт добавляй по одному элементу в scrollbox. И овцы сыты, и волки целы.
1
01.12.2012, 22:38
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2012, 22:38
Помогаю со студенческими работами здесь

Размещение компонентов на LinearLayaut
подскажите если на LinearLayaut нужно разместить ну например кнопку и textview где то в середине...

Размещение компонентов с разным приоритетом
как менять местами компоненты в дельфи? надо что бы Image был над memo

Размещение компонентов на форме (панели)
Подскажите, пожалуйста, как сделать, чтобы на панель выводились компоненты каждая в новой...

Установка размеров компонентов и их размещение
привет друзья помогите задать размеры компонент используюsetLayout(new GridLayout(2, 3));но...

размещение компонентов Label на PictureBox
Собственно, сабж. Есть форма, на ней pictureBox и два comboBox. в первом comboBox выбираем...

одновременное использование
я одновременно использую resizable и draggable мне необходимо чтоб блок, который я перемещаю и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru