Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2008, 17:56
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
Счастье Пишу *.dll помогите с методами

Добрый день.
Я начинающий дельфист.
Владею лишь языком программирования 1С.
Мне необходимо написать библиотеку dll со следующими методами:

ЗагрузитьКартинку(Каталог,ИмяФайла); // загружает картинку (карта города)

НарисоватьКружокНаКартинке(Х,У,Радиус); //рисует на загруженной картинке кружок.

СохранитьФрагмент(Х,У,Ширина,Высота,Каталог,ИмяФайла); //сохраняет фрагмент загруженной картинки в каталог



Принцип работы с данной библиотекой будет такой:
В среде 1С я создаю объект("моя_библиотека.dll")
И начинаю использовать его методы.

1. С помощью метода ЗагрузитьКартинку , я подгружаю картинку в память
2. Рисую на картинке кружок(при необходимости несколько)
3. Сохраняю фрагмент в каталоге.

Загружаю этот фрагмент из каталога в программу 1С


И вот. Решил написать руками на Дельфи 7
И вообще давно уже хотел изучить этот язык
Но чтобы начать...

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

На текущий момент я уже написал скелет библиотеки. (по туторам)
С одним методом ПолучитьХендлГлавногоОкна1С()
Все вроде работает....

Нужна реализация трёх ,указанных выше методов.

С уважением....

Последний раз редактировалось mdbm, 26.05.2008 в 18:00.
Ответить с цитированием
  #2  
Старый 26.05.2008, 18:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

м-м-м...
Ну проверять надо, но должно быть что-то типа:

Код:
var
  Image : TBitmap;

// Загрузка
procedure LoadBitmap(AFileName : String); // AFileName - полное имя файла
begin
  If Not Assiged(Image) Then Image := TBitmap.Create;
  Try
    Image.LoadFromFile(AFileName);
  Excpet
    FreeAndNil(Image);
    Raise;
  End;
end;

// Освобождение. Вызывается после окончания работы с картинкой
procedure FreeBitmap;
begin
  If Assiged(Image) Then FreeAndNil(Image);
end;

// Рисуем кружок
procedure DrawCircle(X, Y, R : Integer);
begin
  If Not Assiged(Image) Then 
    Raise Exception.Create('Image doesn''t loaded.');

  // Здесь, возможно, надо еще настроить кисть и карандаш
  Image.Canvas.Ellipse(Rect(X-R,Y-R,X+R,Y+R));
end;

// Сохраняем кусок
procedure SaveBitmapPart(X,Y,W,H : Integer; AFileName : String);
var
  Buf : TBitmap;
begin
  Buf := TBitmap.Create;
  Try
    Buf.PixelFormat := pf24Bit;
    Buf.Width := W;
    Buf.Height := H;
    Buf.CopyRect(Rect(0,0,W,H),Image.Canvas,Rect(x,y,x+W,y+W));
    Buf.SaveToFile(AFileName);
  Finally
    Buf.Free;
  End;
end;

exports
  LoadBitmap,
  FreeBitmap,
  DrawCircle,
  SaveBitmapPart;
  
Ответить с цитированием
  #3  
Старый 26.05.2008, 19:03
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
По умолчанию

[Error] UMain.pas(61): Undeclared identifier: 'Assiged'
[Error] UMain.pas(78): Undeclared identifier: 'CopyRect'
[Fatal Error] mdbm_imager.dpr(11): Could not compile used unit 'UMain.pas'
Ответить с цитированием
  #4  
Старый 26.05.2008, 19:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

думать бум?
Assigned
Buf.Canvas.CopyRect(...);

Смотрим справку и работаем головой.
Обычные очепятки.
Ответить с цитированием
  #5  
Старый 26.05.2008, 19:22
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
По умолчанию

Спасибо большое...
Остается один вопросик.
Если я пишу руками в UMain.pas процедуру
Компилятор ругается, что
[Error] UMain.pas(16): Unsatisfied forward or external declaration: 'TMain.LoadBitmap'

смотрю в файл ***TBL.pas там нет моих методов...
Получается что где-то тут надо что-то сделать ?
Пробую описать процедуры прямо в файле TBL , но он не принимает...



Как быть ?
Извиняюсь за глупые вопросы...обязуюсь получить ответ и усвоить...
Ответить с цитированием
  #6  
Старый 26.05.2008, 19:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Э-э-э... мужик, ты dll пишешь или COM-компонент?
Ответить с цитированием
  #7  
Старый 26.05.2008, 19:39
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

mdbm после слова implementation в основном юните пишем
Код:
procedure LoadBitmap(AFileName : String); external 'MyDLL.dll';
procedure FreeBitmap; external 'MyDLL.dll';
procedure DrawCircle(X, Y, R : Integer); external 'MyDLL.dll';
procedure SaveBitmapPart(X,Y,W,H : Integer; AFileName : String); external 'MyDLL.dll';
Это статическая загрузка функций из библиотеки, т.е. все будет загружаться при старте программы. про динамическую загрузку почитайте книжку какую-нить, лень писать .

И еще. Я бы декларировал функции в библиотеке с помощью метода stdcall, т.е. в коде библиотеки пишете
Код:
procedure FreeBitmap; stdcall;
Аналогично для остальных функций. Но тогда в коде программы надо объявлять точно так же
Код:
procedure FreeBitmap; stdcall; external 'MyDLL.dll';
Это надо для совместимости с другими программами (точнее с программами, написанными на других ЯП).

И еще. В DLL лучше не юзать строки (String), а указатели на символы (PChar) для передачи строковых параметров, иначе надо еще с самой DLL'кой таскать еще 1 DLL'ку, там все в каментах написано. Почитайте.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.

Последний раз редактировалось zip000, 26.05.2008 в 19:41.
Ответить с цитированием
  #8  
Старый 26.05.2008, 19:42
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
По умолчанию

Хе...Ну вроде dll получается при компиляции...
Это по сути внешняя компонента для 1С

Так то вроде все процедуры без ошибок компилирует...
Вот тока загвостка в Unsatisfied forward or external declaration

А ну вроде СОМ...


Все вроде, нашел ошибку )))

Ща потестю ....

Последний раз редактировалось mdbm, 26.05.2008 в 19:45.
Ответить с цитированием
  #9  
Старый 26.05.2008, 19:53
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
По умолчанию

Блин не получается....
dll скомпилировалась, но новые процедуры не вошли в нее...
Вошли лишь те, что описаны в TBL.pas

Я их создавал с помощью View > Type Library

А те, что мне порекомендавал lmikle я просто разместил в коде руками...в UMain.pas
И их нет в TBL.pas
Ответить с цитированием
  #10  
Старый 26.05.2008, 19:57
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
По умолчанию

Вот собственно код....
Компилируется , но не полностью

Цитата:
unit UMain;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
ComObj, ActiveX, V7MasterD7_TLB, StdVcl, AddInObj, Windows, Messages,
AddInLib, ComCtrls, Gauges,Variants, Classes, Graphics,
Controls, SysUtils,Dialogs, StdCtrls, ExtCtrls;

type
TMain = class(TAutoObject, IMain)
protected
function h1C: Integer; safecall;
procedure LoadBitmap(AFileName : String); safecall;
procedure FreeBitmap; safecall;
procedure DrawCircle(X, Y, R : Integer); safecall;
procedure SaveBitmapPart(X,Y,W,H : Integer; AFileName : String); safecall;
end;

implementation

uses ComServ;

var
Image : TBitmap;


function TMain.h1C: Integer;
var wnd:hwnd;
begin
_pExtWndsSupport._AddRef;
_pExtWndsSupport.GetAppMainFrame(wnd);
RESULT:=wnd;
end;

procedure TMain.LoadBitmap(AFileName : String);
begin
If Not Assigned(Image) Then Image := TBitmap.Create;
Try
Image.LoadFromFile(AFileName);
Except
FreeAndNil(Image);
Raise;
End;
end;


procedure TMain.FreeBitmap;
begin
If Assigned(Image) Then FreeAndNil(Image);
end;


procedure TMain.DrawCircle(X, Y, R : Integer);
begin
If Not Assigned(Image) Then
Raise Exception.Create('Image doesn''t loaded.');


Image.Canvas.Ellipse(Rect(X-R,Y-R,X+R,Y+R));
end;


procedure TMain.SaveBitmapPart(X,Y,W,H : Integer; AFileName : String);
var
Buf : TBitmap;
begin
Buf := TBitmap.Create;
Try
Buf.PixelFormat := pf24Bit;
Buf.Width := W;
Buf.Height := H;
Buf.Canvas.CopyRect(Rect(0,0,W,H),Image.Canvas,Rec t(x,y,x+W,y+W));
Buf.SaveToFile(AFileName);
Finally
Buf.Free;
End;
end;


initialization
TAutoObjectFactory.Create(ComServer, TMain, Class_Main,
ciMultiInstance, tmApartment);
end.
Ответить с цитированием
  #11  
Старый 26.05.2008, 19:58
mdbm mdbm вне форума
Прохожий
 
Регистрация: 26.05.2008
Сообщения: 7
Репутация: 10
По умолчанию

Как прописать процедуры и где, чтоб они вошли в компилируемый dll-файл ?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:42.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025