我有一个带有按钮的表单,可以打开Primafaces overlayPanel.在面板中有另一个按钮执行Ajax操作,然后关闭叠加层.
这是一个完全没有Ajax操作的简化版本:
<h:form>
<p:commandButton id="button1" value="Open overlay" type="button"/>
<p:overlayPanel for="button1" widgetVar="ovl" dynamic="true">
<p:commandButton value="Close" oncomplete="ovl.hide();"
update="@form"/>
</p:overlayPanel>
</h:form>
Run Code Online (Sandbox Code Playgroud)
请注意,面板必须具有,dynamic="true"因为必须在实际应用程序中提取动态内容,并且update="@form"需要更新其他表单组件.
问题是:如果我有两个属性,dynamic="true"并且update="@form"叠加层仅在第一次出现.单击"关闭"按钮后,如果我再次单击"打开覆盖",则面板将不会显示.
我究竟做错了什么?
(使用PrimeFaces 3.5和GlassFish 3.1.2.2)
假设我有这种层次结构:
public abstract class AbstractEntity implements Cloneable {
...
public AbstractEntity clone() {
Cloner cloner = new Cloner();
AbstractEntity cloned = cloner.deepClone(this);
return cloned;
}
}
public class EntityA extends AbstractEntity {
...
}
Run Code Online (Sandbox Code Playgroud)
这很好,我可以这样做:
EntityA e1 = new EntityA();
EntityA e2 = (EntityA) e1.clone();
Run Code Online (Sandbox Code Playgroud)
但我必须做一个手动的类型转换.有没有办法使用java Generics让clone()方法返回子类的实际类型?
谢谢!
我有一个像这样的jsf facelet页面(非常简化的版本):
<h:form id="frmAnagPersonName">
<p:commandButton value="Edit" icon="ui-icon-gear"
update="@form :frmEdit"
onsuccess="_dlgEdit.show()"/>
...
<p:dataTable etc...
...
</h:form>
<p:dialog id="dlgEdit" widgetVar="_dlgEdit" dynamic="true" modal="true" closable="true"
header="Person Identity">
<h:form id="frmEdit" >
<p:panelGrid id="pnlEdit" columns="2">
<p:outputLabel id="lblName" for="eName" value="Name"/>
<p:inputText id="eName" value="#myBean.personName}"
</p:panelGrid>
</h:form>
</p:dialog>
Run Code Online (Sandbox Code Playgroud)
它工作正常,直到我在对话框中放置一个dynamyc Header:
<p:dialog ... header="#{myBean.header}" ... >
Run Code Online (Sandbox Code Playgroud)
我必须在以下位置更改update属性p:commandButton:
update="@form :dlgEdit"
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,对话框只会在第一次单击按钮时显示.它不会第二次出现,然后再出现......
为什么?如何让对话框始终显示?
谢谢
我有一个多线程的应用程序有很多表单,但我必须实例化一些类,并在创建表单之前调用一些初始化的东西.当然,我必须执行相应的终结代码.
这是.dpr文件的简化示例:
begin // .dpr project file
LoadDlls;
try
Config := TConfig.Create;
try
Application.Initialize;
Application.Title := 'Foo';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TOtherForm, OtherForm);
//...other forms...
Application.Run;
finally
Config.Free;
end;
finally
UnloadDlls;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这里的问题是finally块内部的代码在我的表单的OnDestroy/ destructors 之前执行.这清楚地看着单位finalization部分Form:
finalization
if Application <> nil then DoneApplication;
Run Code Online (Sandbox Code Playgroud)
并且DoneApplication呼叫Application.DestroyComponents有效地释放所有Application拥有的形式.
因此,创建的表单Application.CreateForm将在主begin..end块内的任何代码之后被销毁.
我想要的是,在Application.Run所有表单被销毁之后,它们的OnDestroy事件处理程序可以看到Config我的dll中定义的对象和外部函数.同上,如果引发异常.但是我也想要标准的应用程序的异常处理if Config.Free或UnlodDllsraise(应用程序必须仍然存在).
注意:
finalization块(可能在.dpr中?)来保持代码更清晰和可调试;我认为,最简单的办法是显式调用Application.DestroyComponents …
也许是一个愚蠢的问题,但......
我正在写一个class应该注意保持一个窗口(FGuestHWnd从现在开始)视觉锚定到"主机窗口"(FHostHWnd).
FGuestHWnd并且HostHWnd没有父母/所有者/子女关系.FGuestHWnd 属于另一个过程 - 不在乎.FHostHWnd是VCL的Window句柄TWinControl,因此它是我进程中的子窗口.它可以位于父/子树内的任何级别.例如,让我们说它是一个TPanel.现在我必须"挂钩" FHostHWnd移动/调整大小并SetWindowPos(FGuestHWnd...在我的自定义计算后调用.
调整大小非常简单:我可以使用SetWindowLong(FHostHWnd, GWL_WNDPROC, ...)"重定向" FHostHWnd的WndProc到我的自定义WindowPorcedure和陷阱WM_WINDOWPOSCHANGING.FHostHWnd当其中一个祖先调整大小时,此消息会自动发送,因为它FHostHWnd是客户端对齐的.
移动,如果我没有遗漏某些东西,有点棘手,因为如果我移动主要形式FHostHWnd并没有真正感动.它保持相对于其父级的相同位置.因此,它不会以任何方式通知祖先的运动.
我的解决方案是将任何ANCESTOR的WndProc"重定向"到自定义窗口过程,并仅为"移动"消息捕获WM_WINDOWPOSCHANGING.在这种情况下,我可以FHostHWnd通过自定义消息通知.我班上的一些领域将跟踪Win Handles链,原始WndProc addesses和新的WndProc地址.
这里有一些代码来解释我的结构:
TMyWindowHandler = class(TObject)
private
FHostAncestorHWndList: TList;
FHostHWnd: HWND;
FGuestHWnd: HWND;
FOldHostAncestorWndProcList: TList;
FNewHostAncestorWndProcList: TList;
//...
procedure HookHostAncestorWindows;
procedure UnhookHostAncestorWindows;
procedure HostAncestorWndProc(var Msg: TMessage);
end;
procedure TMyWindowHandler.HookHostAncestorWindows;
var
ParentHWnd: HWND;
begin
ParentHWnd …Run Code Online (Sandbox Code Playgroud) 我编写了一个TThread后代类,如果引发异常,则将异常的Class和Message保存在两个私有字段中
private
//...
FExceptionClass: ExceptClass; // --> Class of Exception
FExceptionMessage: String;
//...
Run Code Online (Sandbox Code Playgroud)
我以为我可以raise在OnTerminate事件中遇到类似的异常,以便主线程可以处理它(这是一个简化版本):
procedure TMyThread.Execute;
begin
try
DoSomething;
raise Exception.Create('Thread Exception!!');
except
on E:Exception do
begin
FExceptionClass := ExceptClass(E.ClassType);
FExceptionMessage := E.Message;
end;
end;
end;
procedure TMyThread.DoOnTerminate(Sender: TObject);
begin
if Assigned(FExceptionClass) then
raise FExceptionClass.Create(FExceptionMessage);
end;
Run Code Online (Sandbox Code Playgroud)
我希望发生标准的异常处理机制(一个错误对话框),但我得到了混合的结果:对话框出现但后面是系统错误,或者(或者更有趣)对话框出现但是调用该线程的函数去了似乎从未提出异常.
我猜问题是关于调用堆栈.
这是个坏主意吗?
是否有另一种方法可以将线程异常与主线程分离,但以标准方式再现它们?
谢谢
delphi ×3
delphi-7 ×2
jsf-2 ×2
primefaces ×2
finalization ×1
generics ×1
java ×1
tthread ×1
winapi ×1
windows ×1