小问题,高手回答!(50分)

  • 主题发起人 主题发起人 jzrenxiaoyan
  • 开始时间 开始时间
J

jzrenxiaoyan

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现这样的效果:
form1 下有一button
当click button 的时候
动态创建一窗口 menudesign_form
并且在menudesign_form下动态创建一菜单
菜单的属性来源于d:/unit1.dfm 文件
如何实现?
 
呵呵.你想干什么
 
你知道*.DFM文件的格式么?
 
楼上啥意思?你说说是什么格式?
 
这里这么多高手,怎么没有响应啊?
 
可以
我不知道DFM具体怎么读取
但是我想应该可以使用读取文本文件的方式得到里面的数据
并根据里面的字段进行解析

比如以下是某个DFM文件中一个菜单的格式
object mnuMain: TMainMenu
Images = imgMenu
Left = 481
Top = 441
object mnusystem: TMenuItem
Caption = #35774#32622'(&S)'
ImageIndex = 3
object mnuLogin: TMenuItem
Caption = #29992#25143#30331#24405'(&Z)'
ImageIndex = 0
OnClick = mnuLoginClick
end
 
具体一点啊
如果dfm中有这样的菜单属性
我怎么把它解析出来并动态创建
 
直接使用TStream的ReadComponent函数好了
 
to MrMengyi:
是用这个函数
但是还有问题的
dfm中的mainmenu1的属性没有width,height
要不你试试
注意:只把dfm文件中的有关mainmenu1的属性读出来,并创建相应菜单,其他的控件不读!
有时间你写下代码,尝试一下
成功的话,另有分赠送!
 
原来这个不行啊?
我也没尝试过,我晚上试试吧~
另外请问那个dfm上是不是只有菜单控间啊?
 
to MrMengyi:
dfm文件中还包括很多其他控件的,菜单仅仅是其中的一个
 
可以的~
我试过了
var
binDfmFile : TStream;
begin
..... //初始化,读文件
binDfmFile.ReadComponent(nil); //返回值是一个新的Form,Show出来即可
.....
end;
 
我想实现这样的效果:
form1 下有一button
当click button 的时候
动态创建一窗口 menudesign_form
并且在menudesign_form下动态创建一菜单
菜单的属性来源于d:/unit1.dfm 文件
如何实现?
只动态显示出菜单,其他的控件都不显示啊
 
如果你的可以的话,
能否把源代码给出啊
谢谢了,急用!
 
~下午比较忙,没来及看。


你试试吧。
//-------------------
// Unit1.pas
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, Unit2;

type
TfrmMain = class(TForm)
opendlg: TOpenDialog;
btnLoad: TButton;
procedure btnLoadClick(Sender: TObject);
private
{ Private declarations }
procedure LoadDfm(filename:String);
public
{ Public declarations }
end;

var
frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnLoadClick(Sender: TObject);
begin
if openDlg.Execute then
begin
LoadDfm(openDlg.FileName);
end;
end;

procedure TfrmMain.LoadDfm(filename: String);
var
dfmFile : TStream;
binDfmFile : TStream;
frm : TForm1;
comp : TComponent;
begin
dfmFile := TFileStream.Create(filename, fmOpenRead);
binDfmFile := TMemoryStream.Create;
ObjectTextToBinary(dfmFile, binDfmFile);
binDfmFile.Position := 0;
// dfmFile 判断

comp := binDfmFile.ReadComponent(nil);
frm := comp as TForm1;
frm.Show;

dfmFile.Free;
binDfmFile.Free;
end;

end.


//-------------------------------
// Unit对应的dfm
object frmMain: TfrmMain
Left = 426
Top = 274
Width = 462
Height = 339
Caption = 'frmMain'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object btnLoad: TButton
Left = 104
Top = 88
Width = 75
Height = 25
Caption = 'Load...'
TabOrder = 0
OnClick = btnLoadClick
end
object opendlg: TOpenDialog
Filter = '*.dfm|*.dfm'
Left = 320
Top = 32
end
end

//---------------------------------
// Unit2.cpp(TForm1)
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Initialization
RegisterClass(TForm1);
RegisterClass(TMainMenu);

end.
//-----------------
// Unit2.dfm 里面没有东西
 
不行的
我只要读出来菜单控件的,
虽然你只注册了 RegisterClass(TMainMenu)
但是其他没有注册的控件会提示出错信息的啊
如果都注册的话,就都读出来了
要不你试试

读整个窗口的,我也实现了
我现在就是只想把菜单读出来
 
呵呵,那就不晓得了。可能要自己解析了~
 
接受答案了.
 
后退
顶部