小编yan*_*kee的帖子

Primefaces动态overlayPanel只显示一次

我有一个带有按钮的表单,可以打开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)

primefaces jsf-2

7
推荐指数
2
解决办法
1万
查看次数

使用泛型在抽象类中实现常用方法

假设我有这种层次结构:

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()方法返回子类的实际类型?

谢谢!

java generics

6
推荐指数
2
解决办法
226
查看次数

如果commandButton中的update ="dlg",则Primefaces p:dialog并不总是显示出来

我有一个像这样的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)

但在这种情况下,对话框只会在第一次单击按钮时显示.它不会第二次出现,然后再出现......
为什么?如何让对话框始终显示?

谢谢

primefaces jsf-2

5
推荐指数
1
解决办法
9995
查看次数

我可以保证在表单销毁后执行自定义终结代码吗?

我有一个多线程的应用程序有很多表单,但我必须实例化一些类,并在创建表单之前调用一些初始化的东西.当然,我必须执行相应的终结代码.

这是.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.FreeUnlodDllsraise(应用程序必须仍然存在).

注意:

  • 我宁愿不使用finalization块(可能在.dpr中?)来保持代码更清晰和可调试;
  • 现在,我不想改变太多代码(例如动态创建表单)

我认为,最简单的办法是显式调用Application.DestroyComponents …

delphi exception-handling finalization delphi-7

4
推荐指数
1
解决办法
485
查看次数

如何从WndProc内部获取Window Handle?

也许是一个愚蠢的问题,但......

我正在写一个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)

windows delphi winapi

4
推荐指数
2
解决办法
1956
查看次数

我可以在TThread的OnTerminate事件中引发异常吗?

我编写了一个TThread后代类,如果引发异常,则将异常的Class和Message保存在两个私有字段中

private
  //...
  FExceptionClass: ExceptClass;  // --> Class of Exception
  FExceptionMessage: String;
  //...
Run Code Online (Sandbox Code Playgroud)

我以为我可以raiseOnTerminate事件中遇到类似的异常,以便主线程可以处理它(这是一个简化版本):

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 delphi-7 tthread

3
推荐指数
1
解决办法
2119
查看次数