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

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

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

Студворк — интернет-сервис помощи студентам
Всем доброго дня. Имеется папка с картинками (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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2015, 15:04
Ответы с готовыми решениями:

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

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

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

89
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
27.05.2015, 08:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Таким образом зажав мышкой именно на картинке не получится таскать?
Я же написал: картинка должна быть в состоянии disabled... - по самой картинке этого не скажешь, но для мыши она делается прозрачной и "таскать" можно саму панель с картинкой.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.05.2015, 09:05  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Я же написал:
Да, спасибо, я понял. Тут вопрос возник в конце 21-го поста. Даже не знаю,как выкрутиться...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
27.05.2015, 10:29
Цитата Сообщение от nick42 Посмотреть сообщение
картинка должна быть в состоянии disabled...
Это не обязательно. При обращении через Parent можно и Enabled-картинку таскать...
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Даже не знаю,как выкрутиться...
То есть, я правильно понимаю, что ScrollBox - только для того, чтобы картинки хранить, как только ты начал тащить картинку, ты ее обязательно перенесешь из ScrollBox-а на какой-то другой контрол? Тогда я бы добавил в DinDown перед ReleaseCapture еще и изменение Parent-а панельки, на которой лежит картинка. То есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TForm1::DinDown(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y)
{
    const int SC_DRAGMOVE = 0xF012;
    TImage *im = static_cast<TImage*>(Sender);
    if (im->Parent->Parent != this)
    {
        im->Parent->Parent = this;
        TPoint p = ScrollBox1->ClientToParent(Point(im->Parent->Left, im->Parent->Top), this);
        im->Parent->Left = p.X;
        im->Parent->Top = p.Y;
    }
    ReleaseCapture();
    im->Parent->Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
}
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.05.2015, 10:45  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
ScrollBox - только для того, чтобы картинки хранить, как только ты начал тащить картинку, ты ее обязательно перенесешь из ScrollBox-а на какой-то другой контрол?
Да, именно так.
Спасибо, буду пробовать!

Добавлено через 12 минут
Отлично все работает, только почемуто пришлось X и Y на маленькие поменять, а то ошибка была
C++
1
2
[BCC32 Error] Unit1.cpp(198): E2316 'X' is not a member of 'TPoint'
[BCC32 Error] Unit1.cpp(199): E2316 'Y' is not a member of 'TPoint'
Наверное из-за аргументов в обработчике.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
27.05.2015, 10:55
Ну, не знаю, у меня в XE2 у структуры TPoint есть и поле .x и свойство .X... В твоей версии, значит, нет таких свойств, приходится использовать поля.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
27.05.2015, 11:04  [ТС]
Я понял. На результат это не влияет. Все работает. Вообще надо уже с 2009 бульдера на XE перейти давно.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 11:04  [ТС]
Подскажите - как теперь правильно по кнопке удалить все эти динамически созданные объекты...
Пробую
C++
1
2
3
f=1;
   for( int i = 1; i < f; i++)
    { delete Panel[i]; delete Image[i];}
но помоему неправильно это
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
30.05.2015, 11:37
Создавай изображение в подчинении панели:
C++
1
Image[f]=new TImage(Panel[f]); // Owner изображения - панелька
, и пусть его удалением при удалении самой панели занимается VCL. Тебе достаточно будет только
C++
1
2
for(int i = 0; i < panel_count; i++)
  delete Panel[i]
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 13:08  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Image[f]=new TImage(Panel[f]);
Так и есть изначально.
Все работает, спасибо. На всякий случай хотел уточнить.
А возможно при наведении мышкой на мои объекты, отображать их текущие координаты в чемто..? в панельке наверное..
И если можно, переименовать тему наверно в что то типа - работа с динамически созданными объектами. А то к DrawGrid это уже давно не имеет отношения.

Добавлено через 16 минут
В грид я передаю по кнопке
C++
1
2
3
4
 for( int y = StringGrid1->FixedRows ; y < StringGrid1->RowCount-1; y++)
    {  StringGrid1->Cells[1][y] = Panel[y+1]->Left;
       StringGrid1->Cells[2][y] = Panel[y+1]->Top;
    }
но хотелось бы что то типа всплывающей подсказки при наведении.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
30.05.2015, 13:14
Цитата Сообщение от Sergey_03 Посмотреть сообщение
А возможно при наведении мышкой на мои объекты, отображать их текущие координаты в чемто..?
Объекты - это TImage? У них есть событие OnMouseEnter/OnMouseLeave. Первое срабатывает, когда мышь появилась надо объектом, второе - когда ушла с него. Так вот по первому можно показывать любую нужную информацию в любом другом компоненте, по второму - очищать тот компонент.
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 13:47  [ТС]
я так понимаю, если в моем случае картинки у меня в панелях, то объекты - панели? Или для этого можно использовать и картинки, как объекты? Без разницы?

Добавлено через 27 минут
Сделал обработчики на пробу
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::DinDown1(TObject *Sender)
{
    Panel1->Caption = "23";
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::DinDown2(TObject *Sender)
{
    Panel1->Caption = "256";
}
и присвоил их
C++
1
2
Image[f]-> OnMouseEnter =DinDown1;
                Image[f]-> OnMouseLeave =DinDown2;
работает, но почему то после первого клика или после первого перетаскивания панельки с картинкой перестает работать. Как починить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
30.05.2015, 14:56
Ну да... А вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::DinDown(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y)
{
    const int SC_DRAGMOVE = 0xF012;
    TImage *im = static_cast<TImage*>(Sender);
    if (im->Parent->Parent != this)
    {
        im->Parent->Parent = this;
        TPoint p = ScrollBox1->ClientToParent(Point(im->Parent->Left, im->Parent->Top), this);
        im->Parent->Left = p.x;
        im->Parent->Top = p.y;
    }
    ReleaseCapture();
    im->Parent->Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
 
    // ***** Добавляем еще кое-что *****
    tagTRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(tme);
    tme.dwFlags = TME_LEAVE;
    tme.hwndTrack = im->Parent->Handle;
    ::TrackMouseEvent(&tme);
}
?
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 20:03  [ТС]
да..ктобы сомневался, все работает...Спасибо!

Добавлено через 45 минут
еще такой момент, если возможно..реально както отображать координаты в панели в режиме передвигания панелек с картинками?
Я пишу в обработчике
C++
1
2
3
4
void __fastcall TForm1::DinDown1(TObject *Sender)
{
    Timer1->Enabled = 1;
}
и в таймере
C++
1
2
3
4
5
6
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    TPanel *im1 = static_cast<TPanel*>(Sender);
    Panel1->Caption = im1->Parent->Left;
 
}
компилится, при наведении на панельку с картинкой ошибка обращения к памяти
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
30.05.2015, 20:16
Sergey_03, Sender в обработчике тика таймера - не то, что ты думаешь. Тебе надо при нажатии на изображение запоминать в глобальной переменной (или в поле класса формы) ту панель, которая лежит под изображением, и уже в таймере отслеживать ее перемещение. То есть, как-то вот так:

C++
1
2
3
4
5
// DinDown
    const int SC_DRAGMOVE = 0xF012;
    TImage *im = static_cast<TImage*>(Sender);
    currPanel = static_cast<TPanel*>(im->Parent); // <--- Вот оно. Запомнил, за чем следить
    // ...
, и уже в таймере:
C++
1
2
3
4
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Panel1->Caption = IntToStr(currPanel->Left);
}
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 20:39  [ТС]
при компиляции не узнает currPanel
както объявить нужно? голова уже запуталась
[BCC32 Error] Unit1.cpp(196): E2451 Undefined symbol 'currPanel'
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
30.05.2015, 20:44
Я вот так объявил, для теста:
C++
1
2
3
4
5
6
7
8
9
10
class TForm1 : public TForm
{
__published: 
    // ... IDE-managed Components ...
 
private:
    TPanel *currPanel; // <---
public:
    __fastcall TForm1(TComponent* Owner);
};
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 20:58  [ТС]
объявил, но
C++
1
2
3
4
5
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Panel1->Caption = IntToStr(currPanel->Left);
 
}
после компиляции сразу
eaccessviolation ошибка при запуске
может это потому, что панелек еще нет?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33478 / 21576 / 8250
Регистрация: 22.10.2011
Сообщений: 37,034
Записей в блоге: 12
30.05.2015, 21:05
Пардон, а ты что, до того, как назначить что-то currPanel включаешь таймер? Как же у тебя твой код работает, и выдает AV только когда ты начинаешь тянуть картинку? Таймер должен включаться после того, как произведено указанное выше присваивание. Ну, для пущей надежности - сделай:
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    if (currPanel)
    {
        Panel1->Caption = IntToStr(currPanel->Left);
    }
}
, а при отпускании изображения (обработчик OnMouseUp) опять сбрасывай currPanel в 0... Не знаю как еще проверить, на моем проекте все прекрасно работает...

Добавлено через 1 минуту
Ах, вот оно что:
Цитата Сообщение от Sergey_03 Посмотреть сообщение
при наведении на панельку с картинкой ошибка обращения к памяти
, то есть, таймер ты тоже включаешь не там, где нужно. Включай в том же месте, где запомнил currPanel, при клике на изображение, а не при OnMouseEnter...
1
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
30.05.2015, 23:20  [ТС]
Вот немного разобрался, все совсем как надо заработало, может пригодится кому.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Image[f]-> OnMouseDown =DinDown;
Image[f]-> OnMouseEnter =DinDown1;
Image[f]-> OnMouseLeave =DinDown2;
//---------------------------------------------------------------------------
//таскание картинок
  void __fastcall TForm1::DinDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
 {
    const int SC_DRAGMOVE = 0xF012;
    TImage *im = static_cast<TImage*>(Sender);
    if (im->Parent->Parent != this)
    {
        im->Parent->Parent = this;
        TPoint p = ScrollBox1->ClientToParent(Point(im->Parent->Left, im->Parent->Top), this);
        im->Parent->Left = p.x;
        im->Parent->Top = p.y;
    }
    ReleaseCapture();
    im->Parent->Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    tagTRACKMOUSEEVENT tme;
    tme.cbSize = sizeof(tme);
    tme.dwFlags = TME_LEAVE;
    tme.hwndTrack = im->Parent->Handle;
    ::TrackMouseEvent(&tme);
}
//------------------------------------------------------------------------------
//курсор на панельке с картинкой или таскает
void __fastcall TForm1::DinDown1(TObject *Sender)
{
    TImage *im = static_cast<TImage*>(Sender);
    currPanel = static_cast<TPanel*>(im->Parent);// <--- Вот оно. Запомнил, за чем следить
    Timer1->Enabled = 1;
}
//---------------------------------------------------------------------------
//курсор покинул панельку с картинкой
void __fastcall TForm1::DinDown2(TObject *Sender)
{
    Timer1->Enabled = 0;
    Panel1->Visible = 0;
}
//---------------------------------------------------------------------------
//таймер  отображения и таскания координат в панеле 1
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    if (currPanel)
    {
    Panel1->Caption = IntToStr(currPanel->Left)+"   "+IntToStr(currPanel->Top);
    Panel1->Left = currPanel->Left + 50;
    Panel1->Top = currPanel->Top;
    Panel1->Visible = 1;
    }
}
//---------------------------------------------------------------------------
Спасибо.
0
21 / 9 / 4
Регистрация: 15.12.2014
Сообщений: 663
01.06.2015, 18:34  [ТС]
А возможно сохранить картинку карты, на которую я таскаю мои панельки с картинками девайсов
и картинки девайсов ,
то есть общее отображение карты с девайсами
в один фал картинки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2015, 18:34

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru