问题描述:
procedure txttojpeg(txt, filename: stringbrush_color: tcolorfont: tfont
font_color: tcolorwidth, height: integer)
var
temp: tbitmap
jpeg: tjpegimage
i, j: integer
begin
temp := tbitmap.create
try
temp.height := height
temp.width := width
temp.transparent := true
temp.canvas.brush.color := brush_color
temp.canvas.font := font
temp.canvas.font.color := font_color
j := 0
for i := 0 to form1.memo1.lines.count - 1 do
begin
j := j + 15
temp.canvas.textout(10, j, form1.memo1.lines.strings[i])表示距离,top,left.
end
temp.SaveToFile('c:\1.bmp')
finally
temp.destroy
end
end
procedure TForm1.Button1Click(Sender: TObject)
begin
txttojpeg(memo1.lines.text, savedialog1.filename + '', clwhite, Memo1.Font, clblack, memo1.width, memo1.height)
end
end.
解析:
Delph和BCB虽是一个公司,同为VCL框架,但是毕竟指让雀是两种语言,不会像楼上说的.换成->就可以的.
现假设楼主有一定的C++基础,能使用基本的BCB6,改写如下:
1.新建一新工程,加入一Memo和一Button,控件Name为Memo1和Button1(即默认的名字)
2.向Memo1中加入任意内容,双击Button1产生单击事件
3.加入滑并如下代码:
---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
---------------------------------------------------------------------------
#pragma package( *** art_init)
#pragma resource "*.dfm"
TForm1 *Form1
---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
---------------------------------------------------------------------------
void txttojpeg(TMemo* Memo1,AnsiString filename,TColor brush_color,TFont* font,TColor font_color,int width, int height)
{
Graphics::TBitmap *temp=new Graphics::TBitmap()
temp->Height=height
temp->Width=width
temp->Transparent=true
temp->Canvas->Brush->Color=brush_color
temp->Canvas->Font=font
temp->Canvas->Font->Color=font_color
int i=0,j=0
for (i=0i<Memo1->Lines->Counti++){
j = j + 15
temp->Canvas->TextOutA(10,j,Memo1->Lines->Strings[i])
}
temp->SaveToFile(filename)
delete temp
}
---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
txttojpeg(Memo1 ,"12.bmp", clWhite, Memo1->Font, clBlack, Memo1->Width, Memo1->Height)
}
---------------------------------------------------------------------------
4.代码中重复的可省略,程序在BCB6 SP4下编译运行通过
在Delphi编程中使用C语言代码
Windows下编程的工具有很多 例如VB Delphi VC等等 我在这里不想讨论 它们的具体哪个更好一点 这种幼稚的问题 玩过DOS程序设计的人都知道 DOS下很多语言的实质核心还是调用系统提供的汇编中断函数 到了Windows下 它就变成了我们常说的API了 而在Windows下写程序很多时候都是调用API 语言 只不过是一个表达工具而已
我现在已经参加工作大约有半年左右 我们公司是用Borland公司的Delphi作为主开发工具 本着未偏袒任何一个工具的立场 我说句山键公道话:Delphi是目前Win 下开发程序的最快速 最有效率的工具
Delphi适合用来开发应用程序 但是有时侯一些底层的东西可以直接使用C语言来开发 我在公司经常开发跟硬件相关的项目 而很多硬件的SDK包是用C来写的 这个时候我一般把它们转换成Delphi(PASCAL)语法的代码 下面谈一下我的个人粗浅经验 因为当时学校教的是Pascal语言 所以我对C语言并不是太熟手 下面的观点或者代码如有错漏之处希望高手们放小弟一马:)
一:将C语基唯销言的程序编译成DLL供Delphi调用 这种方法过于简单 而且需要额外带一个DLL文件 所以不在本文的讨论范围之内
二:直接转换C语言代码到DELPHI代码
C语言的函数格式与Delphi不同 它们是函数返回类型在前 函数声明在后 对于没有任何返回类型的函数则定义为VOID类型
例如:Delphi中函数function MyFunction:(intIN:integer):Bool相应的C语言代码就变成Bool MyFunction(int intIN)又例如procedure MyProcedure====>void MyProcedure采用这种方法 一般要求对C语言比较熟悉 我一般是采用这种方法 下面是我收集整理的自己常用的Delphi与C之间的类型对应表 其中左边是C类型 右边是对应的Delphi类型:
以下是引用片段 ABC > TABC ACCEL > TAccel ATOM > TAtom BITMAP > TBitMap BITMAPCOREHEADER 搏游 > TBitmapCoreHeader BITMAPCOREINFO > TBitmapCoreInfo BITMAPFILEHEADER > TBitmapFileHeader BITMAPINFO > TBitmapInfo BITMAPINFOHEADER > TBitmapInfoHeader BOOL > Bool CBT_CREATEWND > TCBT_CreateWnd CBTACTIVATESTRUCT > TCBTActivateStruct CHAR > Char CHAR* > PChar CLIENTCREATESTRUCT > TClientCreateStruct COLORREF > TColorRef PAREITEMSTRUCT > TCompareItemStruct STAT > TComStat CREATESTRUCT > TCreateStruct CTLINFO > TCtlInfo CTLSTYLE > TCtlStyle CTLtype > TCtltype DCB > TDCB DDEAACK > TDDEAck DDEADVISE > TDDEAdvise DDEDATA > TDDEData DDEPOKE > TDDEPoke DEBUGHOOKINFO > TDebugHookInfo DELETEITEMSTRUCT > TDeleteItemStruct DEVMODE > TDevMode DOUBLE > Double DRAWITEMSTRUCT > TDrawItemStruct DWORD > LongInt ENUMLOGFONT > TEnumLogFont EVENTMSG > TEventMsg FARPROC > TFarProc FIXED > TFixed FLOAT > Single GLYPHMETRICS > TGlyphMetrics HANDLE > THandle HANDLETABLE > THandleTable HARDWAREHOOKSTRUCT > THardwareHookStruct HELPWININFO > THelpWinInfo INT > Integer KERNINGPAIR > TKerningPair LOGBRUSH > TLogBrush LOGFONT > TLogFont LOGPALETTE > TLogPalette LOGPEN > TLogPen LONG > LongInt LONG DOUBLE > Extended LONG INT > LongInt LPSTR > PChar LPWSTR > PWideChar MAT > TMat MDICREATESTRUCT > TMDICreateStruct MEASUREITEMSTRUCT > TMeasureItemStruct MENUITEMTEMPLATE > TMenuItemTemplate MENUITEMTEMPLATEHEADER > TMenuItemTemplateHeader METAFILEPICT > TMetaFilePict METAHEADER > TMetaHeader METARECORD > TMetaRecord MINMAXINFO > TMinMaxInfo MOUSEHOOKSTRUCT > TMouseHookStruct MSG > TMsg MULTIKEYHELP > TMultiKeyHelp NCCALCSIZE_PARAMS > TNCCalcSize_Params NEWTEXTMETRIC > TNewTextMetric OFSTRUCT > TOFStruct OUTLINETEXTMETRIC > TOutlineTextMetric PAINTSTRUCT > TPaintStruct PALETTEENTRY > TPaletteEntry PANOSE > TPanose PATTERN > TPattern POINTFX > TPointFX PSTR > PChar PWSTR > PWideChar RASTERIZER_STATUS > TRasterizer_Status RGBQUAD > TRGBQuad RGBTRIPLE > TRGBTriple SEGINFO > TSegInfo SHORT > SmallInt SHORT INT > SmallInt SIZE > TSize TEXTMETRIC > TTextMetric TPOINT > TPoint TRECT > TRect TTPOLYCURVE > TTTPolyCurve TTPOLYGONHEADER > TPolygonHeader UINT > Word UNSIGNED > Word UNSIGNED CHAR > Byte UNSIGNED INT > Word UNSIGNED LONG > LongInt(DWORD) UNSIGNED LONG INT > LongInt UNSIGNED SHORT > Word UNSIGNED SHORT INT > Word VOID* > Pointer WINDOWPLACEMENT > indowPlacement WINDOWPOS > indowPos WNDCLASS > ndClass WORD > Word
lishixinzhi/Article/program/Delphi/201311/24758
你提供的程序是没有主程序的,所以转换之后的代码也不能作为独立程序编译运行。
C/C++语言
#include <string.h>#define byte unsigned char
struct tag_Buffer
{
byte Head // 头标志
byte Len // 包长度
}
typedef struct tag_Buffer _Buffer
byte c_key[32] = {
0xAB, 0x11, 0xCD, 0xFE, 0x18, 拦此数0x23, 0xC5, 0xA3, 0xCA, 0x33,
0xC1, 0xCC, 0x66, 0x67, 0x21, 0xF3, 0x32, 0x12, 0x15, 0x35,
0x29, 0xFF, 0xFE, 0x1D, 0x44, 0xEF, 0xCD, 0x41, 0x26, 0x3C,
0x4E, 0x4D} // key密钥
// 加密 扒御参数:IN OUT数据源, IN长度 返回:加密长度
int MyEncode(void *Buffer, int Len)
{
byte *Src
int i, j
byte x
int Result
Src = (byte *)Buffer
if (*Src == 0xC1)
{
Src ++
Src ++
x = *Src
Src ++
for (i = 3 i <= Len - 1 i++)
{
j = 简首 i & 0x8000001F
*Src= *Src ^ x ^ c_key[j]
x = *Src
Src ++
}
Result = Len
}
else
Result = -1
return Result
}
// 解密 参数:IN OUT数据源, IN长度 返回:解密长度
int MyDecode(void *Buffer, int Len)
{
byte Src[101]
int i
int Result
memcpy(Src, Buffer, Len)
if (Src[0] == 0xC1)
{
for (i = Len-1 i>=3 i--)
{
Src[i] = Src[i] ^ Src[i-1] ^ c_key[i]
}
Result = Len
memcpy(Buffer, Src, Len)
}
else
Result = -1
return Result
}
此代码在gcc/g++ 4.9.2版本编译通过(需要额外添加main函数)。
在C++中,由于C++语言的特性
建议将
int MyEncode(void *Buffer, int Len)和
int MyDecode(void *Buffer, int Len)修改为
int MyEncode(void *Buffer, const int &Len) int MyDecode(void *Buffer, const int &Len)通过严格的限制其IN特征来提高代码效率。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)