tomsamson: modeless dialog

Hallo,
ich öffne ein modeless dialog per js,soweit so gut,wenn ich aber die Höhe ändere (durch ändern des dialogHeight Parameters),verschiebt es immer das Dialogfenster an die Position,wo es ursprünglich geöffnet wurde.
Mann öffnet z.B. ein modeless dialog an xPos=100 und yPos 100,dann dragt man es irgendwo anders hin.
Wenn man nun die Höhe des dialogs per Skript z.B. auf (dialogHeight= ) 200 setzt,bleibt das Fenster nicht dort,wo man es hingedraggt hatte,sondern erscheint nach der Größenänderung an xPos=100 und yPos=100,also dort,wo man es ursprünglich geöffnet hatte.
Weis einer,wie man es verhindern kann,dass durch ändern von dialogHeight das Fenster so verschoben wird?

  1. Tag tomsamson.

    ich öffne ein modeless dialog per js,soweit so gut,wenn ich aber die Höhe ändere (durch ändern des dialogHeight Parameters),verschiebt es immer das Dialogfenster an die Position,wo es ursprünglich geöffnet wurde.

    So ganz ohne relevanten Code kann ich dir vorerst nur die Lektüre von MSDN: showModelessDialog-Methode empfehlen.

    Siechfred

    --
    «Ich liebe euch doch alle!»
    1. Tag tomsamson.

      ich öffne ein modeless dialog per js,soweit so gut,wenn ich aber die Höhe ändere (durch ändern des dialogHeight Parameters),verschiebt es immer das Dialogfenster an die Position,wo es ursprünglich geöffnet wurde.

      So ganz ohne relevanten Code kann ich dir vorerst nur die Lektüre von MSDN: showModelessDialog-Methode empfehlen.

      Siechfred

      Hallo Siechfred,danke für die Antwort,
      auf msdn hab ich schon geschaut,aber da wird nur erklärt,wie man das modeless dialog benutzt,leider steht da nichts zu meinem Problem.
      Ich hoffe mit einem Beispiel wird mein Problem klarer:
      Ok,das folgende bitte einfach in eine Textdatei einfügen und dann als html datei speichern:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
      <HTML>
      <HEAD>
      <TITLE>showModelessDialog Method</TITLE>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
      <META NAME="AUTHOR" CONTENT="InetSDK">
      <META NAME="MS.LOCALE" CONTENT="EN-US">
      <META NAME="ROBOTS" CONTENT="noindex">

      <SCRIPT>
      function fnResize(){
      mywindow.dialogHeight="300px"
      }

      function fnRandom(iModifier){
      return parseInt(Math.random()*iModifier);
      }
      function fnSetValues(){
      var iHeight=oForm.oHeight.options[oForm.oHeight.selectedIndex].text;
      if(iHeight.indexOf("Random")>-1){
        iHeight=fnRandom(document.body.clientHeight);
      }
      var iWidth=oForm.oWidth.options[oForm.oWidth.selectedIndex].text;
      if(iWidth.indexOf("Random")>-1){
        iWidth=fnRandom(document.body.clientWidth);
      }
      var iTop=oForm.oTop.options[oForm.oTop.selectedIndex].text;
      if(iTop.indexOf("Random")>-1){
        iTop=fnRandom(screen.height);
      }
      var iLeft=oForm.oLeft.options[oForm.oLeft.selectedIndex].text;
      if(iLeft.indexOf("Random")>-1){
        iLeft=fnRandom(screen.width);
      }
          var sEdge=oForm.oEdge.options[oForm.oEdge.selectedIndex].text;
      var bCenter=oForm.oCenter.options[oForm.oCenter.selectedIndex].text;
      var bHelp=oForm.oHelp.options[oForm.oHelp.selectedIndex].text;
      var bResize=oForm.oResize.options[oForm.oResize.selectedIndex].text;
      var bStatus=oForm.oStatus.options[oForm.oStatus.selectedIndex].text;

      var sFeatures="dialogHeight: " + iHeight + "px; dialogWidth: " + iWidth + "px; dialogTop: " + iTop + "px; dialogLeft: " + iLeft + "px; edge: " + sEdge + "; center: " + bCenter + "; help: " + bHelp + "; resizable: " + bResize + "; status: " + bStatus + ";";

      return sFeatures;
      }
      function fnOpen(){
      /* The  method constructor looks like:
      showModelessDialog(
        sURL="The page that is opened"
        sArguments="Extra values or object references"
        sFeatures="features of the window";

      )
      */
      var sFeatures=fnSetValues();

      mywindow=window.showModelessDialog("SMLD_target.htm", oForm.oArguments.value, sFeatures)
      }
      </SCRIPT>

      <!-- SAMPLE_STYLE_START -->
      <LINK REL="stylesheet" HREF="/workshop/basicSDKIE4.css"
      TYPE="text/css">
      <!-- SAMPLE_STYLE_END -->
      </HEAD>
      <!--TOOLBAR_START-->
      <!--TOOLBAR_EXEMPT-->
      <!--TOOLBAR_END-->

      <BODY TOPMARGIN=0 LEFTMARGIN=0 BGPROPERTIES="FIXED" BGCOLOR="#FFFFFF"
      LINK="#000000" VLINK="#808080" ALINK="#000000">
      <BLOCKQUOTE CLASS="body">

      <H1>showModelessDialog Method</H1>
      <P>This sample demonstrates the use of the <b>showModelessDialog</b> method.  Select the possible values for the supported parameters to adjust how the modeless dialog box is displayed.  Click the Push To Create button to open the modeless dialog box based upon the selected values.
      The method syntax used to open the window is displayed at the bottom of the page when the dialog box is opened.</P>

      <FORM NAME="oForm">
      <FIELDSET><LEGEND><b>showModelessDialog Method Options</b></LEGEND>
      <TABLE>
      <TR><TD><LABEL FOR=dHeight>Dialog Box Height (Integer)</LABEL></TD><TD><SELECT ID="dHeight" NAME=oHeight><OPTION>-- Random --<OPTION>150<OPTION>200<OPTION>250<OPTION>300<OPTION>400<OPTION>500</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dWidth>Dialog Box Width (Integer)</LABEL></TD><TD><SELECT ID="dWidth" NAME=oWidth><OPTION>-- Random --<OPTION>150<OPTION>200<OPTION>250<OPTION>300<OPTION>400<OPTION>500</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dTop>Dialog Box Top (Integer)</LABEL></TD><TD><SELECT ID="dTop" NAME=oTop><OPTION>-- Random --<OPTION>150<OPTION>200<OPTION>250<OPTION>300<OPTION>400<OPTION>500<OPTION></SELECT></TD></TR>
      <TR><TD><LABEL FOR=dLeft>Dialog Box Left (Integer)</LABEL></TD><TD><SELECT ID="dLeft" NAME=oLeft><OPTION>-- Random --<OPTION>150<OPTION>200<OPTION>250<OPTION>300<OPTION>400<OPTION>500<OPTION></SELECT></TD></TR>
      <TR><TD><LABEL FOR=dCenter>Dialog Box Center (Boolean / TOP and LEFT must be set to an empty value [last option])</LABEL></TD><TD><SELECT ID="dCenter" NAME=oCenter><OPTION>Yes<OPTION>No</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dEdge>Dialog Box Edge (String)</LABEL></TD><TD><SELECT ID="dEdge" NAME=oEdge><OPTION>Raised<OPTION>Sunken</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dHelp>Dialog Box Help (Boolean)</LABEL></TD><TD><SELECT ID="dHelp" NAME=oHelp><OPTION>Yes<OPTION>No</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dResize>Dialog Box Resizable (Boolean)</LABEL></TD><TD><SELECT ID="dResize" NAME=oResize><OPTION>Yes<OPTION>No</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dStatus>Dialog Box Status (Boolean)</LABEL></TD><TD><SELECT ID="dStatus" NAME=oStatus><OPTION>Yes<OPTION>No</SELECT></TD></TR>
      <TR><TD><LABEL FOR=dArguments>Dialog Box Arguments</LABEL></TD><TD><SELECT NAME=oArguments ID="dArguments">
      <OPTION VALUE="Dialog Box Arguments # 1">Dialog Box Arguments # 1</OPTION>
      <OPTION VALUE="Dialog Box Arguments # 2">Dialog Box Arguments # 2</OPTION>
      <OPTION VALUE="Dialog Box Arguments # 3">Dialog Box Arguments # 3</OPTION>
      <OPTION VALUE="Dialog Box Arguments # 4">Dialog Box Arguments # 4</OPTION>
      </SELECT>
      </TD></TR>
      <TR><TD><LABEL FOR=dCommand>Create Modeless Dialog Box</LABEL></TD><TD></TD></TR>
      <TR><TD></TD><TD ID=oFeatures></TD></TR>
      </TABLE>
      <br>
      <br>
      <INPUT ID="dCommand" NAME=oCommand TYPE=button VALUE="Push To Create" onclick="fnOpen()">
      <br>
      <br>
      <INPUT ID="dCommand" NAME=oCommand TYPE=button VALUE="resize" onclick="fnResize()">
      </FORM>

      <!-- START_PAGE_FOOTER -->
      <BR><BR><BR>
      &copy; <A CLASS="clsIncCpyRt" HREF="http://www.microsoft.com/isapi/gomscom.asp?TARGET=/info/cpyright.htm" TARGET="_top">2002 Microsoft Corporation. All rights reserved. Terms of use</A>.
      <!-- END_PAGE_FOOTER -->

      </BLOCKQUOTE>
      </BODY>
      </HTML>

      Das ist nur das Beipiel von msdn mit einem zusätzlichen Button,mit dem man das Problem simulieren kann.In der gespeicherten HTML Daeti kann man jetzt per druck auf "push to create" ein modeless dialog mit random properties öffnen.Nach dem öffnen des dialogs dieses einfach ein bischen herumdraggen.Wenn man jetzt den resize button drückt,wird das Fenster zwar in seiner Höhe geändert (gewünschtes Resultat) aber leider auch an die Position geschoben,wo es ursprünglich geöffnet wurde,bleibt also nicht da,wo man es vor dem resizen hingedragt hatte.(=ungewünschtes Resultat)
      Weis jemand,wie man dieses verschieben durch ändern der dialogheight vermeiden kann?
      Ich habe keine Lösung gefunden,mit der man das umgehen kann,deshalb wollte ich einen workaround machen,bei dem man sich vor dem resizen die position des dialogfensters merkt,dann die höhe ändert und dann das Fenster an die gemerkte position zurückschiebt.
      Das habe ich unter anderem so probiert:

      var oldx=this.screenLeft-4//alte position des Fensters merken
      var oldy=this.screenTop-30
      dialogLeft=oldx
      dialogTop=oldy
      dialogHeight=newHeight+"px"//fensterhöhe ändern
      dialogLeft=oldx//Fenster an alte Position zurückschieben
      dialogTop=oldy

      Leider scheint bei der Eigenschaft screentop die Höhe der titlebar des dialogfensters mit reinzuspielen,leider ist die aber bei verschiedenen windows versionen unterschiedlich (win2k/winxp mit klassik style und win xp modern style haben unterschiedliche titlebar höhen).
      Bei winxp mit modern style ist die titlebar 30 hoch,deshalb ziehe ich beim merken von oldy 30 von screentop ab.
      Leider funktioniert diese Lösung so also nur für eine Windows version,bei anderen verschiebt es das Fenster leicht,da die titlebar dort eine andere Höhe hat.
      Falls es keine Möglichkeit gibt,das verschieben des dialogs durch ändern der dialogheight zu vermeiden,weis jemand,wie man die position des dialogs so erhählt/berechnet,dass man das Fenster nach dem resizen dorthin zurückschieben kann (und dass bei allen win versionen geht)?

      1. Tag tomsamson.

        auf msdn hab ich schon geschaut,aber da wird nur erklärt,wie man das modeless dialog benutzt,leider steht da nichts zu meinem Problem.

        Doch, indirekt schon:

        dialogLeft:sXPos Sets the left position of the dialog window
                         relative to the upper-left corner of the desktop.
        dialogTop:sYPos  Sets the top position of the dialog window
                         relative to the upper-left corner of the desktop.

        Also sind die Angaben relativ zum Desktop.

        Ich habe keine Lösung gefunden,mit der man das umgehen kann,deshalb wollte ich einen workaround machen,bei dem man sich vor dem resizen die position des dialogfensters merkt,dann die höhe ändert und dann das Fenster an die gemerkte position zurückschiebt.

        Ja, was Besseres fiele mir auch nicht ein, ist aber auch logisch, da du die Werte für dialogLeft und dialogTop unverändert lässt, weshalb der IE den Dialog nach Ändern der Dimension auf die Position, die unverändert vorhanden ist, schiebt. Wenn du einfach beide Werte von vornherein weglässt, verschiebt der IE beim Resize auch nichts an der Position.

        var oldx=this.screenLeft-4
        var oldy=this.screenTop-30

        So kann es nicht gehen, da sich diese Werte auf das Browserfenster beziehen, siehe MSDN: screenTop. Eine (ungetestete) Möglichkeit wäre vielleicht, die Werte nach dem Verschieben (evtl. onmove) zu holen und dann beim Resize neu zu setzen.

        Siechfred

        --
        «Ich liebe euch doch alle!»
        1. Tag tomsamson.

          auf msdn hab ich schon geschaut,aber da wird nur erklärt,wie man das modeless dialog benutzt,leider steht da nichts zu meinem Problem.

          Doch, indirekt schon:

          dialogLeft:sXPos Sets the left position of the dialog window
                           relative to the upper-left corner of the desktop.
          dialogTop:sYPos  Sets the top position of the dialog window
                           relative to the upper-left corner of the desktop.

          Also sind die Angaben relativ zum Desktop.

          Ich habe keine Lösung gefunden,mit der man das umgehen kann,deshalb wollte ich einen workaround machen,bei dem man sich vor dem resizen die position des dialogfensters merkt,dann die höhe ändert und dann das Fenster an die gemerkte position zurückschiebt.

          Ja, was Besseres fiele mir auch nicht ein, ist aber auch logisch, da du die Werte für dialogLeft und dialogTop unverändert lässt, weshalb der IE den Dialog nach Ändern der Dimension auf die Position, die unverändert vorhanden ist, schiebt. Wenn du einfach beide Werte von vornherein weglässt, verschiebt der IE beim Resize auch nichts an der Position.

          ------------>
          Leider ändert das weglassen von dialogleft und dialogtop beim öffnen des Fensters nichts.

          var oldx=this.screenLeft-4
          var oldy=this.screenTop-30

          So kann es nicht gehen, da sich diese Werte auf das Browserfenster beziehen, siehe MSDN: screenTop. Eine (ungetestete) Möglichkeit wäre vielleicht, die Werte nach dem Verschieben (evtl. onmove) zu holen und dann beim Resize neu zu setzen.

          Siechfred

          -->wenn ich dialogLeft und dialogTop abfrage,gibt es mir immer nur die Werte zurück,die beide variablen beim öffnen des Fensters hatten,nicht die Werte,die sie nach dem draggen haben sollten.
          Falls du es ausprobiert hast,könntest du vielleicht ein Beispiel posten,bei dem es geht?