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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое связывание DLL и параметры 
V
    Опции темы
sCreator
Дата 2.9.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

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



В exe
Код

type
  TMakeThumbNail = procedure(var src, dest: TBitmap; const ThumbSize: Word); stdcall;

в dll
Код

procedure MakeThumbNail(src, dest: TBitmap; ThumbSize: Word); stdcall;

Два разных объявления.
И работает?
PM   Вверх
Cinemaizer[Олег]
Дата 3.9.2011, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

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



Цитата(sCreator @  2.9.2011,  20:17 Найти цитируемый пост)
И работает? 

Эммм... объявление потом поправил, все равно не работало. Ну а в итоге, сделал как советовал Акелла.
PM MAIL WWW   Вверх
sCreator
Дата 3.9.2011, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 20.8.2009
Где: Московская област ь

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



Тогда понятно. Просто не прозвучало, а это тоже причина AV.
Кстати вместо таскания BORLNDMM.DLL можно посмотреть в сторону FastMM4.
Бесплатный альтернативный менеджер памяти для Delphi, обеспечивает в том числе и взаимодействие с Dll. и компилится в сам проект.
http://timokhov.blogspot.com/2007/03/delph...iii-fastmm.html
PM   Вверх
bems
Дата 3.9.2011, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ребят, сейчас 2011й год.
фастмм давно дефолтный менеджер в дельфи


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Cinemaizer[Олег]
Дата 3.9.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

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



Цитата(bems @ 3.9.2011,  11:40)
ребят, сейчас 2011й год.
фастмм давно дефолтный менеджер в дельфи

Я в семерке доселе еще работаю smile
PM MAIL WWW   Вверх
bems
Дата 3.9.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



тогда ставь. Просто подключить его первым юнитом недостаточно, нужно включить шаринг.
И прочитай моё сообщение выше, там написано какие еще проблемы с передачей классов в длл, кроме менеджера памяти


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Cinemaizer[Олег]
Дата 3.9.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

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



Цитата(bems @ 3.9.2011,  11:45)
тогда ставь. Просто подключить его первым юнитом недостаточно, нужно включить шаринг.
И прочитай моё сообщение выше, там написано какие еще проблемы с передачей классов в длл, кроме менеджера памяти

ОК. Спасибо!
PM MAIL WWW   Вверх
Cinemaizer[Олег]
Дата 3.9.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

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



Кстати, не совсем корректен код Акеллы. Малость переделал и упростил. В итоге, если исходник больше чем эскиз, то уменьшаем пропорционально, если же меньше, то увеличиваем (быть может не всем такой метод нужен, но мне именно такой необходим был):
Код

procedure JpegToBmp(jpg: TJPEGImage; bmpDest: TBitmap);
var
  tmp: TBitmap;
  ratio: double;
begin
  tmp := TBitmap.Create;
  try
    tmp.Assign(jpg);
    ratio:= iThumbnailMaxWidth/tmp.Width;
    if Round(ratio * tmp.Height)>iThumbnailMaxHeight then ratio:= iThumbnailMaxHeight/tmp.Height;
    bmpDest.Width:= Round(ratio * tmp.Width);
    bmpDest.Height:= Round(ratio * tmp.Height);
    SetStretchBltMode(bmpDest.Canvas.Handle, HALFTONE);
    StretchBlt(bmpDest.Canvas.Handle, 0, 0, bmpDest.Width, bmpDest.Height, tmp.Canvas.Handle, 0, 0, tmp.Width, tmp.Height, SRCCOPY);
  finally
    tmp.Free;
  end;
end;


2 Акелла: 

Чтобы четко вписать в размер эскиза с правильными пропорциями, сравнение соотношения корректнее делать не по первичным размерам, а по преобразованным:

Код

    ratio:= iThumbnailMaxWidth/tmp.Width;
    if Round(ratio * tmp.Height)>iThumbnailMaxHeight then ratio:= iThumbnailMaxHeight/tmp.Height;

PM MAIL WWW   Вверх
Akella
Дата 4.9.2011, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Cinemaizer[Олег)
, 3.9.2011,  17:37, post2397247] если же меньше, то увеличиваем

 smile  зачем?

Добавлено через 2 минуты и 43 секунды
Cinemaizer[Олег], чем больше условий и переходов, тем может дольше будет выполнятся код. А эскизы нужно создавать и показывать "на лету", без задержек.
PM MAIL   Вверх
Cinemaizer[Олег]
Дата 4.9.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

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



Цитата(Akella @  4.9.2011,  11:09 Найти цитируемый пост)
  зачем?

ну вот надо мне так smile 
чтобы исходник (с правильными пропорциями ессно) четко вписался в размеры эскиза. Ужель не встречался такой подход в каких-нибудь приложениях? Я встречал.


Цитата(Akella @  4.9.2011,  11:09 Найти цитируемый пост)
 А эскизы нужно создавать и показывать "на лету", без задержек. 

А в чем сложности то? Код у меня не сложнее твоего, разве что расчеты bmpDest.Width и bmpDest.Height всегда выполняются. И к слову, они в любом случае должны быть заданы явно, в твоем коде исходники меньшие по размеру чем эскиз, вообще не загружены будут. Плюс, еще вроде здесь ошибка:
Код

if tmp.Width > tmp.Height then
        ratio := iThumbnailMaxWidth / tmp.Height
      else
        ratio := iThumbnailMaxHeight / tmp.Height;


По идее, надо бы так:
Код

if tmp.Width > tmp.Height then
        ratio := iThumbnailMaxWidth / tmp.Width
      else
        ratio := iThumbnailMaxHeight / tmp.Height;


 

PM MAIL WWW   Вверх
Akella
Дата 4.9.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Если увеличивать, то нужно реализовать и сглаживание, а на это нужно время и ресурсы, особенно если качественное сглаживание.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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