DLL的PCHAR参数传递问题?高手请进,现在没有分!!!!
DLL是函数的声明:
Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:PChar;var Fcolor:Tcolor):pchar;stdcall;
Begin
Application.Handle:=PH;
with TBGSetupForm.Create(Application) do
try
begin
Return:='0';
if IsImage then
begin
RBTNImage.Checked:=IsImage;
edtImageName.Text:=Fname;
end
else
begin
RBTNColor.Checked:=not IsImage;
OldColor:=FColor;
CBColorValue.Selected:=Fcolor;
PLPreviewColor.Color:=Fcolor;
end;
ShowModal;
end;
finally
//如何让选择的文件名称返回到调用者?
FName:=PChar(EdtImageName.Text);
FColor:=PLPreviewColor.Color;
Result:=Return;
Free;
end;
end;
主程序:
unit BGSetup;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs, jpeg;
type
TBGSetupForm = class(TForm)
BTNOK: TButton;
BTNCancel: TButton;
RBTNImage: TRadioButton;
RBTNColor: TRadioButton;
edtImageName: TEdit;
CBColorValue: TColorBox;
PLPreviewColor: TPanel;
BTNAllColor: TButton;
ColorDialog: TColorDialog;
ImgPreviewImage: TImage;
OpenPictureDialog1: TOpenPictureDialog;
procedure BTNOKClick(Sender: TObject);
procedure BTNCancelClick(Sender: TObject);
procedure RBTNImageClick(Sender: TObject);
procedure RBTNColorClick(Sender: TObject);
procedure CBColorValueChange(Sender: TObject);
procedure BTNAllColorClick(Sender: TObject);
procedure edtImageNameExit(Sender: TObject);
procedure edtImageNameKeyPress(Sender: TObject; var Key: Char);
private
Return:Pchar;
OldColor:TColor;
{ Private declarations }
public
{ Public declarations }
end;
Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:pchar;var Fcolor:Tcolor):pchar;stdcall;
var
BGSetupForm: TBGSetupForm;
implementation
{$R *.dfm}
Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:PChar;var Fcolor:Tcolor):pchar;stdcall;
Begin
Application.Handle:=PH;
with TBGSetupForm.Create(Application) do
try
begin
Return:='0';
if IsImage then
begin
RBTNImage.Checked:=IsImage;
edtImageName.Text:=Fname;
end
else
begin
RBTNColor.Checked:=not IsImage;
OldColor:=FColor;
CBColorValue.Selected:=Fcolor;
PLPreviewColor.Color:=Fcolor;
end;
ShowModal;
end;
finally
//如何让选择的文件名称返回到调用者?
FName:=PChar(EdtImageName.Text);
FColor:=PLPreviewColor.Color;
Result:=Return;
Free;
end;
end;
procedure TBGSetupForm.BTNOKClick(Sender: TObject);
begin
if RBTNImage.Checked then Return:='1';
if RBTNColor.Checked then Return:='2';
close;
end;
procedure TBGSetupForm.BTNCancelClick(Sender: TObject);
begin
Return:='0';
close;
end;
procedure TBGSetupForm.RBTNImageClick(Sender: TObject);
begin
OldColor:=PLPreviewColor.Color;
PLPreviewColor.Color:=clBtnFace;
RBTNColor.Checked:=False;
CBColorValue.Enabled:=False;
BTNAllColor.Enabled:=False;
EdtImageName.Enabled:=true;
end;
procedure TBGSetupForm.RBTNColorClick(Sender: TObject);
begin
EdtImageName.Enabled:=False;
RBTNImage.Checked:=false;
PLPreviewColor.Color:=OldColor;
CBColorValue.Enabled:=True;
BTNAllColor.Enabled:=True;
end;
procedure TBGSetupForm.CBColorValueChange(Sender: TObject);
begin
PLPreviewColor.Color:=CBColorValue.Selected;
end;
procedure TBGSetupForm.BTNAllColorClick(Sender: TObject);
begin
// ColorDialog.Color:=CBColorValue.Selected;
if ColorDialog.Execute then
begin
CBColorValue.Selected:=ColorDialog.Color;
PLPreviewColor.Color:=ColorDialog.Color;
end;
end;
procedure TBGSetupForm.edtImageNameExit(Sender: TObject);
var pic:TPicture;
begin
if EdtImageName.Text<>'' then
if Fileexists(EdtImageName.Text) then
begin
try
pic:=TPicture.Create;
try
pic.LoadFromFile(EdtImageName.Text);
except
EdtImageName.Clear;
EdtImageName.SetFocus;
messagebox(handle,'指定文件不是图形文件,或者是本程序不能兼容的文件类型。','信息',MB_ICONINFORMATION OR MB_OK);
end;
ImgPreviewImage.Picture:=pic;
finally
Pic.Free;
end;
end
else
begin
messagebox(handle,'指定文件不存在,请重新指定。','警告',+MB_ICONWARNING OR MB_OK);
EdtImageName.Clear;
EdtImageName.SetFocus;
end;
end;
procedure TBGSetupForm.edtImageNameKeyPress(Sender: TObject;
var Key: Char);
begin
if key=#13 then EdtImageNameExit(sender);
end;
end.