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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Can only modify an image if it contains a bitmap", Как избавиться? 
:(
    Опции темы
quard
  Дата 16.4.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 dll:
Код

library cnv;

uses
  ExtCtrls, Graphics;

procedure dllMain(Img: TImage);
begin
  Img.Canvas.Brush.Color := clGreen;
  Img.Canvas.FillRect(Img.ClientRect);
end;

exports
  dllMain;

begin
end.


прога:

Код

// ...

procedure dllMain(Img: TImage); external 'cnv.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  dllMain(Image1);
  Image1.Canvas.Brush.Color := clRed;
  Image1.Canvas.FillRect(Image1.ClientRect);
end;

end.



При нажатии на кнопку ругается: "Can only modify an ... " smile(((
 smile  smile  
PM MAIL   Вверх
Alexeis
Дата 17.4.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Ругается он потому что не заданы размеры изображения.
Вообщем я это обошел так.
Код

procedure dllMain(Img :TImage); external 'cnv.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  dllMain(Image1);
end;


Код

library cnv;
uses
  Classes, Controls, ExtCtrls, Graphics;


procedure dllMain(Img : TImage);
begin
  Img.picture.Bitmap.Width  := Img.ClientWidth;
  Img.Picture.Bitmap.Height := Img.ClientHeight;
  Img.Picture.Bitmap.Canvas.Brush.Color := 0;
  Img.Picture.Bitmap.Canvas.FillRect(Img.ClientRect);
end;
    
exports    
  dllMain;

begin

end.
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
quard
Дата 17.4.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Гм... Получилось! Сэнк..)) smilesmile
Но получается что рисовать можно только на канве битмапа smile((... 
PM MAIL   Вверх
z-END
Дата 17.4.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

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



Цитата(quard @  17.4.2006,  19:32 Найти цитируемый пост)
Но получается что рисовать можно только на канве битмапа

именно так.. а чтобы рисовать на чем угодно нужно использовать промежуточную канаву..
т.е. например есть картинка JPEG загружаем ее в picture_1 далее канаве_1 задаем теже размеры что и у picture_1, после чего делаем канава_1.Draw(0,0,picture_1.graphic); и уже канаву_1 отображаем в TImage, где уже спокойно рисуемsmile 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
quard
Дата 18.4.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Работает. Но я столкнулся с новой проблемой:

Изображения не накладываются др. на др.:
Если после того как на битмапе нарисовала dll вызвать 
какой-нить метод канвы битмапа (даже, собственно, не рисуя 
 например Image1.Picture.Bitmap.Canvas.Brush.Color) из главной программы то Bitmap.Canvas очищается... Чё делать?(( smile 

ЗЫ: Даа не разрисуешься тут ... smile smile  
PM MAIL   Вверх
Alexeis
Дата 18.4.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



quard, я тоже это заметил когда тестил, более того теряются даже размеры канвы заданные в основной програмее. smile  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
quard
Дата 18.4.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Гм. неужели с этим никто никогда не сталкивался и не решил эту траблу... 
А ведь так нужно.... smile  
PM MAIL   Вверх
Snowy
Дата 18.4.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Попробуй переделать на procedure dllMain(var Img : TImage);
Если не поможет, то передавай не TImage, а TBitmap. А при выходе из процедуры, делай Image1.Picture.Assign(bmp).  
PM MAIL   Вверх
quard
Дата 19.4.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Snowy  Пробовал. Бесполезно... smile smile  smile 
PM MAIL   Вверх
quard
Дата 21.4.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кароче единственный выход который я нашел это передача DC.
Походу запрещено передвать Image как параметр а потом рисовать на нем....
При передаче DC вроде все норм. но опять трабла:

Так рисует:
Код

procedure dllMain(var DC: HDC);
begin
  SelectObject(DC, CreateSolidBrush(Random($00FFFFFF)));
  Rectangle(DC, 0, 0, 70, 70);
end;


Так а так нет:
Код

procedure dllMain(var DC: HDC);
begin
  ShowMessage('sdfgsdhhfghgh');
  SelectObject(DC, CreateSolidBrush(Random($00FFFFFF)));
  Rectangle(DC, 0, 0, 70, 70);
end;


Помогите плз. А то я уже совсем не знаю чё делать...  smile  
PM MAIL   Вверх
Alexeis
Дата 21.4.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



quard, может дело в том что у длл нет с программой общего менеджера памяти, может просто подключить и в проект и в длл fastsharemem ??? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
quard
Дата 21.4.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

 может дело в том что у длл нет с программой общего менеджера памяти, может просто подключить и в проект и в длл fastsharemem ??? 


alexeis1,
да даже если прога без всяких длл... Просто процедура

Код

procedure Proc1(DC: HDC);
begin
  MessageBox(0, nil, nil, 0); // Если это убрать то все пашет
  SelectObject(DC, CreateSolidBrush(Random($00FFFFFF)));
  Rectangle(DC, 0, 0, 50, 50);
end;


не работает (где бы она не находилась/ будь то длл или основная прога) сам проверь...
 
PM MAIL   Вверх
Alexeis
Дата 21.4.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Есть вариант - передавать указатель на реальный битовый массив и присваивать затем значения реальных цветов один раз по входе в функцию другой раз в программе после получения результата, а вообще лучше устанавливать pixelformat в pf24bit. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
quard
Дата 21.4.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Гм.. а можно пример?
smile 
PM MAIL   Вверх
Alexeis
Дата 25.4.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



здесь я писал как получать адреса
http://forum.vingrad.ru/index.php?showtopic=91640 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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