VB 中关于自定义对话框Dialog 的问题……
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB 中关于自定义对话框Dialog 的问题……相关的知识,希望对你有一定的参考价值。
自定义对话框Dialog1中有三个文本框,输入后为a,b,c〔都是Integer类型〕三个变量赋值,然后又在窗体Form1中用到这三个变量,请问:a,b,c这三个变量应该如何声明?(用不用Public之类的 ?)
主要是这个声明问题,如果回答中加上第二种方法(不用声明)的话,我会追加分数。
谢谢高手们~
我们肯定经常有用到从一个模式对话框得到一个返回值的时候,比如说,我在一个程序里面弹出一个选择客户的对话框,在这个对话框关 闭的时候我希望知道用户是选择了哪一个客户。(当然可以直接把值贱给调用窗体中的某个控件,但如果不是窗体中的事件在调用呢?)经测试,VBA宏调用窗体在unload 时,会清除相应的变量及属性值,因此VBA不支持这些方法.
'最简单的方法也是最不值得提倡的方法就是声明一个全局变量。把客户的id放到这个全局变量里。
'假设我的选择客户的窗体名叫frmQuery,在frmQuery上有一个列表,我希望在这个列表里面显示所有北京的客户供用户 选择,在用户选择之后我得到客户的id。
'第一种方法,就是给窗体添加属性(address)和事件(selected)。
'操作方法:在frmQuery的代码窗口点击菜单的“工具”--“添加过程”,点选“属性”,在上面的文本框里输入addres s,确定。vb环境会自动添加两个过程,get Address 和let Address。这样frmQuery这个窗体就多出来一个属性Address.当执行frmQuery.address="北 京"这句话的时候。就会执行let address这个过程。
定义一个变量在let Address过程里面记录下vNewValue,这样就可以在显示列表的时候只显示北京的客户。
'然后点击菜单“工具”--“添加过程”,点选“事件”,在上面的文本框里输入Selected。vb会自动给窗体添加一个事件。 我们给这个事件添加几个参数,改成Public Event selected(id as string)
在用户选择之后。使用raiseevent selected(m_id)触发这个事件。然后unload me退出模式窗体。
'在form1里面调用这个窗体。
'在开始用Private WithEvents frmQ as frmQuery声明这个窗体。
'在希望显示窗体的时候使用set frmQ=new frmQuery实例化这个窗体。然后
frmQ.address="北京"
frmQ.show 1'运行到这里会暂停而不执行后面的语句。直到对话框被卸载。
set frmQ=nothing'释放
'在form1代码窗口的上面,平常用来选择控件和事件的两个下拉框左面会多出来一个frmQ.选择他之后会在'右面的下拉框看到它 的事件selected.
'在这个事件里进行其他的操作。
'第二种方法(推荐)。
'在frmQuery里面添加一个函数SelectID
dim sel as string'定义一个变量保存用户选中的客户
public Function SelectID(address as string) as string
sel = "上海" '处理用户选择,需完善此句代码.
'在这些东西都处理完之后就显示窗体
me.show 1'因为是模式窗体,所以窗体显示以后不会接着往下执行。只用在窗体被卸载的时候才能继续执行后面的语句。
SelectID=sel '这句话将在窗体被卸载的时候执行。
end function
'在用户点选列表的时候设置m_id的值为客户的id
'当用户退出时候
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
t = sel
End Sub
'在form1里面调用。只需要
customerID=frmQuery.SelectID("北京;上海;天津;成都")
set frmQuery=nothing
'就可以得到用户的选择。
'以下为 property 用法
Public Property Get 选择() As String
选择 = a
End Property
Public Property Let 选择(ByVal vNewValue As String)
a = vNewValue
End Property 参考技术A 只能用public a as interger这样声明为全局变量
如不用声明,就只好不关闭dialog1,而是用dialog1.hide隐藏,然后用dialog1.text1这样直接引用文本框的内容。而且show dialog1时不能是vbmodal显示模式窗体。
另一种方法更麻烦,写盘保存三个变量,然后在form1里读取。本回答被提问者采纳
.obj 中定义的 c++ 多个
【中文标题】.obj 中定义的 c++ 多个【英文标题】:c++ multiple defined in .obj 【发布时间】:2017-08-01 05:55:41 【问题描述】:所以我有 3 个 MFC 对话框:
-
Dialog1 - 主对话框
Dialog2 - Dialog1 的子对话框
Dialog3 - Dialog2 的子对话框
XXXResourceFile.h - Dialog2 和 Dialog3 使用的资源文件;仅包含资源(宏常量、仅在文件中使用的 typedef 结构和 typedef 结构的数组);没有课
在 Dialog1 中,我需要 Dialog2 的引用(用于显示窗口/模态)。
在 Dialog2 中,我需要 Dialog1(用于调用 GetParent())和 3(用于显示窗口/模态)的引用
在 Dialog3 中,我需要 Dialog1 和 2 的引用(用于调用 GetParent()/GetAncestor())
当前设计:
//Dialog1.h - by co-dev
...
#include Dialog2.h"
...
//Dialog2.cpp - by co-dev
...
#include "Dialog2.h"
#include "XXXResourceFile.h"
#include "Dialog1.h"
#include "Dialog3.h"
...
//Dialog3.cpp - my initial code/design
...
#include "Dialog3.h"
#include "Dialog2.h"
#include "Dialog1.h"
#include "XXXResourceFile.h"
我的理想设计:
//Dialog1.h
#include "Dialog2.h"
...
//Dialog2.h
#include "Dialog1.h"
#include "Dialog3.h"
#include "XXXResourceFile.h"
//Dialog3.h
#include "Dialog1.h"
现在在当前设计中,我在所有这些标题中添加了#pragma once
。我收到错误 lnk 2005(表示 XXXResourceFile 中的数组已在 Dialog3.obj 中定义,无法双击错误,因为它不在标头或源文件上,而是在 obj 上)。
我的问题是:
-
你能评论一下这个文件的当前设计和理想设计吗?需要更正的内容,缺少的内容等...
我认为我还没有完全理解
#pragma once
的用法。据我所知(也基于我的共同开发人员所说的),它仅包含在头文件中。 cpp 文件呢?
另外,由于我的问题是包含 XXXResourceFile.h,#pragma once
的正确用法应该在 此标头 上吗?还是将包含此标头的文件?这一点是我真正感到困惑的部分。
【问题讨论】:
发布的代码不会导致生成任何目标代码。不足以说明您的问题。 【参考方案1】:这里有头文件循环依赖:
//Dialog1.h
#include "Dialog2.h"
...
//Dialog2.h
#include "Dialog1.h"
#include "Dialog3.h"
#include "XXXResourceFile.h"
//Dialog3.h
#include "Dialog1.h"
Dialog1.h 包含包含 Dialog1.h 的 Dialog2.h。
Dialog1.h 包含 Dialog2.h,其中包含 Dialog3.h,其中包含 Dialog1.h。
您可以使用前向声明和指针类型来打破这一点。
// Dialog1.h
class Dialog2;
class Dialog1
Dialog2* ptrDialog2;
;
// Dialog1.cpp
#include "Dialog2.h"
// Dialog2.h
class Dialog1;
class Dialog2
Dialog1* ptrDialog1;
;
// Dialog2.cpp
#include "Dialog1.h"
【讨论】:
这是另一个问题的解决方案。以上是关于VB 中关于自定义对话框Dialog 的问题……的主要内容,如果未能解决你的问题,请参考以下文章