Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
1

Поместить картинку в DrawGrid из указанного пути

26.05.2015, 15:04. Показов 5480. Ответов 89
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня. Имеется папка с картинками (50х50). Каждой картинке соответствует свой номер (наверное сделаю с помощью if). В простом гриде есть один столбец и в нем в строках (колличество строк>i>=0)занесены номера картинок. И есть аналогичный DrawGrid. Подскажите, как поместить картинки в строки (колличество строк>i>=0) DrawGrid из указанного пути (из папки на компе) и какие форматы возможны? Или таже задача с одной картинкой.
Может быть есть возможность не использовать DrawGrid, а просто создавать объект Image и помещать его на форму из указанного пути?
Спасибо.

Добавлено через 1 час 24 минуты
Вроде разобрался. По кнопке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TImage* Image[1000];
    int f = 1; int h = 20;
    for( int y = StringGrid1->FixedRows ; y < StringGrid1->RowCount; y++)
    {
       for(int z = 0; z<100; z++)
          {
             if (StringGrid1->Cells[0][y].Pos(z))
             {
 
               Image[f]=new TImage(Form1);
                Image[f]->Parent=Form1;
                Image[f]->Picture->Bitmap->LoadFromFile("12_50x50.bmp"); // из файла
                 Image[f]->Stretch=true;
                Image[f]->Left = 10;
                Image[f]->Top = h;
                Image[f]->Width = 50;
                Image[f]->Height = 50;
                    f++; h = h+60;
             }
        }
    }
Но появился еще вопрос. У меня имена файлов начинаются на тот или иной z
Можно както это использовать, задавать не полностью имя в пути к файлу, а только его часть, а именно первые два символа(этот z) ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2015, 15:04
Ответы с готовыми решениями:

Вставить картинку в поле DrawGrid
Всем привет. Подскажите плиз, а то гуглил гуглил, так и не получиось. Как вставить картинку в...

Обработка файла указанного в пути
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include &quot;clanfun.h&quot; void main(int...

Открытие Word файла из указанного пути
Подскажите, может кто то уже делал открытие Word файла из указанного пути. Добавлено через 2...

Как получить родительский каталог относительно указанного пути
Как организовать обратный переход по папкам в С#? Например: 2 папка лежит в первой, мне необходимо...

89
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
01.06.2015, 21:16 41
Author24 — интернет-сервис помощи студентам
BitBlt еще никто не отменял. Вот так, скажем:
C++
1
2
3
4
5
    std::auto_ptr<Graphics::TBitmap>bmp(new Graphics::TBitmap);
    bmp->SetSize(StringGrid2->Width, StringGrid2->Height);
    ::BitBlt(bmp->Canvas->Handle, 0, 0, StringGrid2->Width, StringGrid2->Height,
        ::GetDC(StringGrid2->Handle), 0, 0, SRCCOPY);
    bmp->SaveToFile("d:\\test\\pic.bmp");
я сохраняю в файл изображение StringGrid-а, и всего того, что находится над ним... Просто поменяй название компонента на свое (если это оконный компонент, разумеется) либо снимай скриншот формы и вырезай из него тот кусок, который тебе нужен
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
02.06.2015, 22:01  [ТС] 42
а кокой include нужен для этого?

Добавлено через 9 минут
Подключил #include <memory>
Карту тоже в панель поместил и панель на задний план.
Все работает. Спасибо!

Добавлено через 23 часа 6 минут
Еще такой вопрос. У меня есть таймер, который хочет заставлять эти панельки мигать. Возможно передавать в один этот таймер вновь созданные панели? Например у меня есть Panel1, созданная изначально на форме. С ней проблем нет. Через таймер мигает. А как быть с динамически созданными панелями? Или для каждой из них таймер тоже создавать?
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
02.06.2015, 22:04 43
Цитата Сообщение от Sergey_03 Посмотреть сообщение
А как быть с динамически созданными панелями? Или для каждой из них таймер тоже создавать?
Смею предположить, что в таком случае придется пилить свой класс, который включает в себя таймер, и мигающую панель, но это как предположение
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
02.06.2015, 22:42 44
Sergey_03, Создай перехватчик, у каждой панели будет у тебя таймер. А вообще - надо смотреть, как должны мигать панели, и какой интервал у таймера. И сколько панелей. Может и одним таймером обойтись (как вариант - сделать интервал таймера в 20 раз чаще, чем интервал мигания панелей, и по каждому первому тику показывать/гасить какую-то часть панелек, по каждому второму - другую часть, и так далее)
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
02.06.2015, 22:49  [ТС] 45
частота - секунда. колличество мигающих панелей не известно. любая может замигать, если тревога по её адресу прошла. я брал обычную панель, делал её красной размером 10 на 10 и в зависимости от сработки менял её координаты на координаты одной и созданных панелек. таким образом она мигала в углу той или иной панельки. но проблема в том, что при наступлении следующего события надо, чтобы все прошлые тревоги тоже мигали, а так она просто переносится с панельки на панельку. панелек с картинками может создаваться очень много обычно это штук 500, но в зависимости от проекта до 10000 и каждая из них может сработать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
02.06.2015, 22:52 46
Все панели могут мигать одновременно? Тогда просто по каждому тику таймера пробегаться по всем панелям, и, если панель помечена как "тревожная" (она же как-то помечена, правда?) - то рисовать/скрывать в ее углу значок.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
02.06.2015, 23:00  [ТС] 47
идея такая и есть и работает. каждая панелька помечена в плане её координат. они передаются в общую структуру события и если это событие - тревога(например) по этим координатам или она или что то 10 на 10, должно мигать. в реальных условиях. они конечно все мигать не будут. максимум штук 50. но хотелось бы иметь такую возможность чисто теоретически.
Цитата Сообщение от volvo Посмотреть сообщение
Тогда просто по каждому тику таймера пробегаться по всем панелям,
а каким образом? они же динамически создаются.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
02.06.2015, 23:02 48
И чего? Массива что-ли нет, где все указатели на динамически созданные панели хранятся?
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
02.06.2015, 23:12  [ТС] 49
Идея очень хорошая. Я попробую реализовать. Пока мне мало понятно, как это сделать. В цикле как то выяснять, сколько и какие панельки созданы. У меня получилось создавать в случае наступления тревоги красные панельки 10 на 10 и привязывать их к тем или иным координатам. Но как заставить их мигать по одному таймеру - пока не знаю. Там суть - пришла первая тревога - замигала панелька в нужном месте, следующая тревога пришла - первая панелька продолжает мигать и замигала вторая в нужном месте. И так далее. Не мигая(просто чтобы они появлялись - получается.)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
02.06.2015, 23:40 50
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Не мигая(просто чтобы они появлялись - получается.)
Прекрасно. Пришла тревога - сгенерировал панельку 10*10 красного цвета в нужных координатах, указатель на нее затолкал в массив (или список, что удобнее - тебе решать). По тику таймера просто ходишь по всему массиву этих красных панелек и делаешь
C++
1
2
for(int i = 0; i < alarmCount; i++)
  AlarmPanels[i]->Visible = !AlarmPanels[i]->Visible;
Все очень просто...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
02.06.2015, 23:42  [ТС] 51
Во как интересно. Спасибо. Попробую!
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
04.06.2015, 10:25  [ТС] 52
Сделал пробу отдельно все работает. Перенес к себе - не работает. Компилится без ошибок. Глобально в дефайнах объявил
C++
1
2
TPanel* Panel[5000];
int redpanel=500;
Там, где происходит событие (Form11)
C++
1
2
3
4
5
6
7
8
Panel[redpanel]= new TPanel(Form26->Panel22);
Panel[redpanel]->Width = 29;
Panel[redpanel]->Height = 17;
Panel[redpanel]->Color = clRed;
Panel[redpanel]->Parent=Form26->Panel22;
Panel[redpanel]->Left = pm.d[devLoop].d_X[devAdr];
Panel[redpanel]->Top = pm.d[devLoop].d_Y[devAdr];
redpanel++;
На самой форме графики (Form26) в таймере
C++
1
2
3
4
5
void __fastcall TForm26::Timer10Timer(TObject *Sender)
{
    for(int i = 500; i < redpanel; i++)
    Panel[i]->Visible = !Panel[i]->Visible;
}
таймер включен.
панельки создаются, отображаются правильно и там, где нужно, но не мигают. Почему - непонятно..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
04.06.2015, 11:22 53
Раз на тестовом работает, то, чтобы разобраться с конкретно этим случаем, боюсь, нужно иметь в наличии весь проект.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
04.06.2015, 11:26  [ТС] 54
А нельзя как то попробовать работу таймера перенести в 11-ю форму? видимо значение redpanel в него не попадает. Вообще странно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
04.06.2015, 11:47 55
В хидере указал extern int redpanel, чтобы с других форм был доступ?
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
04.06.2015, 13:03  [ТС] 56
Да, работает. Спасибо. А можно заставить работать gif анимацию в image? гружу, но не работает. отображается только статично.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
04.06.2015, 13:07 57
А вот с этим у 2009-го могут быть проблемы. Попробуй: Ребят, киньте нормальный компонент для просмотра гифок! , но я почти уверен, что не получится, и придется по таймеру менять статичные картинки.
1
nick42
04.06.2015, 13:07
  #58

Не по теме:

sorry

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
04.06.2015, 13:08 59
nick42, в цикле меняется видимость панелей, которые должны мигать. Их просто больше одной... И до следующего тика таймера.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
04.06.2015, 13:10  [ТС] 60
Цитата Сообщение от volvo Посмотреть сообщение
придется по таймеру менять статичные картинки.
жаль. не удастся обхитрить.)
0
04.06.2015, 13:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2015, 13:10
Помогаю со студенческими работами здесь

Копирование картинки из drawgrid в drawgrid
В общем имеется два компонента drawgrid. В один компонент загружены картинки через массив Bitmap....

Картинку из БД поместить в кнопку
Мне нужно сделать тест по формулам. Формулы я поместил картинками в бд. Как можно из бд в кнопку...

Поместить текст под картинку
Как можно поместить текст под картинку? &lt;table class=&quot;table_folder&quot;&gt; &lt;tr&gt; &lt;td&gt;&lt;a...

Поместить картинку в центре виджета
Немного не понимаю как сделать. Есть скрипт ротации баннеров, немогу отцентрировать &lt;script&gt; var...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru