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

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

26.05.2015, 15:04. Показов 6583. Ответов 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru