xsharp.eu • SystemMenuClose etc
Page 1 of 5

SystemMenuClose etc

Posted: Wed Mar 13, 2019 12:13 am
by Anonymous
Probably a very simple problem, followed by an "interesting" note

Where do I put the following VO code in an X# app please?

METHOD ExitButton( ) CLASS MainMenu
Local oTb as TextBox
oTb := TextBox{self, cAppVersion, "Do you really want to quit?"}

oTb:TYPE := BOXICONQUESTIONMARK + BUTTONYESNO

IF (oTb:Show() = BOXREPLYYES)

self:Close()
App{}:Quit()
RETURN true // Quit application.

ELSE

RETURN FALSE

// Don't quit the application.

ENDIF

RETURN NIL

I can't seem to find it anywhere. I've tried in a few places and the app either crashes with a dialog box, or does nothing..

I'll also be looking to do a similar thing with closing windows, but I'm assuming that'll just be self:EndWindow() or similar.


NOTE: EVERY time I hit COMPILE, I get the following:
error XS2012: Cannot open 'C:XIDEProjectsTest ProjectBinDebugMdiApp1.exe' for writing -- 'The process cannot access the file 'C:XIDEProjectsTest ProjectBinDebugMdiApp1.exe' because it is being used by another process.'

Sometimes I need to hit the compile button 2 or 3 times before it will compile properly. I can read what the message says, but is it something I'm doing or a switch I need to set somewhere?

SystemMenuClose etc

Posted: Wed Mar 13, 2019 12:46 am
by lumberjack
BiggyRat wrote:Probably a very simple problem, followed by an "interesting" note
Where do I put the following VO code in an X# app please?
I can't seem to find it anywhere. I've tried in a few places and the app either crashes with a dialog box, or does nothing..
I'll also be looking to do a similar thing with closing windows, but I'm assuming that'll just be self:EndWindow() or similar.
Sometimes I need to hit the compile button 2 or 3 times before it will compile properly. I can read what the message says, but is it something I'm doing or a switch I need to set somewhere?
Hi Jeff, I assume this is a VO application and not a .NET compliant one. You should have it as per the MDI application template, sorry easiest way of saying it. Should be the same as in VO, but the MDI VO template should run as is.

.NET and WinForms have a bit of different way of doing things.

See this pseudo hand written example:

Code: Select all

FUNCTION Start() AS VOID
  VAR oForm := MyFirstXSharpForm()
  Application.Run(oForm)
RETURN

CLASS MyFirstXSharpForm INHERIT Form 
  CONSTRUCTOR()
    SUPER()
    Size := Size{100, 100} // Check if it is not dimension, out of top of my head
    Text := "My first XSharp Form"
    VAR btn := Button{}
    btn:Text := "Close"
    btn:Location := Point{5,5}
    btn:Click := MyButtonClick  // what the click event will fire
    SELF:Controls:Add(btn)
  RETURN
  METHOD MyButtonClick(o AS OBJECT, e AS EventArgs) AS VOID
    SELF:Close()
  RETURN
END CLASS
Regarding the "locking" issue. I reported it to Chris quite a while ago and in his environment cannot reproduce. It is almost as if the compiler is slow in releasing and exiting when you have an error. I found it to happen when I have the /ppo switch on while UnitTesting #command implementations.
HTH,

SystemMenuClose etc

Posted: Wed Mar 13, 2019 4:09 am
by Chris
As Johan says, it should work exactly the same way as in VO, if you find anything that behaves in a different way in X# than in an equivalent VO app, then this is a bug, please report it to us.

Can you please explain exactly what you want to do, when do you want to exit the app? The method is named "ExitButton", which suggests you want to respond to a button click, but you are using the menu class, so maybe you just want to exit from a menu option instead? I'd say do the same thing in VO, to avoid any complexities coming from a new environment to you, and when you have it working as you expect in VO, just do the same in the X# app as well.

About the message that the file is in use, this seems that the app hasn't closed yet, after you run it. Possibly it is not visible, but it is still running for some reason. When it finally shuts down, you can now compile the app again with no problem. Please go to Tools->Preferences in XIDE, Compiler page, check the "Check if running before compile" checkbox in the bottom right, this should make XIDE check for the app already running in advance, before calling the compiler.

Chris

SystemMenuClose etc

Posted: Wed Mar 13, 2019 4:26 am
by wriedmann
Hi Jeff,
if you would like to put that code in a VO GUI Classes application, the ShellWindow would be the main window class.
And to stop a window from closing, you can ovveride the QueryClose() event method:

Code: Select all

METHOD QueryClose(oEvent)
local oTB as TextBox

oTB := TextBox{SELF, "Quit", "Do you really want to quit?"}
oTB:TYPE := BOXICONQUESTIONMARK + BUTTONYESNO
IF (oTB:Show() = BOXREPLYYES)
  RETURN TRUE // Quit application.
ELSE
  RETURN FALSE
  // Don't quit the application.
ENDIF
Wolfgang

P.S. this code comes from the VO GUI classes help:
QueryClose.png
QueryClose.png (115.29 KiB) Viewed 349 times

SystemMenuClose etc

Posted: Wed Mar 13, 2019 5:36 am
by BiggyRat
Thanks Johan, Chris and Wolfgang. That code I ripped right out of the VO manual years ago, and currently use it for the EXIT button on the main menu of one of my apps. I also have a similar one that pops up with an "Are you sure" when closing other windows (Data, Shell etc)

What I wanted to know was WHERE in the X# code do I put my "Are you sure?" code? In VO it was in the QueryClose() method of the window. I cannot find such a Method in X#. Do I need to write one? I can see Closed() and Closing() but no Closed or QueryClosed.

SystemMenuClose etc

Posted: Wed Mar 13, 2019 6:45 am
by wriedmann
Hi Jeff,
with X# you can use the VO GUI classes, then you need the QueryClose() method.
Or you can use the WinForms classes - I need to check it out.
Or you can use the WPF classes, with another method.
What GUI classes do you are using? The X# sample "Standard VO MDI X# runtime" uses the VO compatible GUI classes, therefore you need the QueryClose() method.
Wolfgang

SystemMenuClose etc

Posted: Wed Mar 13, 2019 7:58 am
by BiggyRat
Ok, thanks Wolfgang. :) I'm trying to break the VO paradigm really. I'd like to use the "new and improved VO" - X# methods instead. I'd like to ask a user do they really want to "close this window" or "close the app" etc using X# coding.

Another thing that I can't really get my head around - PARTIAL Classes - what are they? Surely you have a Class, or you don't?

SystemMenuClose etc

Posted: Wed Mar 13, 2019 7:59 am
by robert
Jeff,
BiggyRat wrote:Probably a very simple problem, followed by an "interesting" note

NOTE: EVERY time I hit COMPILE, I get the following:
error XS2012: Cannot open 'C:XIDEProjectsTest ProjectBinDebugMdiApp1.exe' for writing -- 'The process cannot access the file 'C:XIDEProjectsTest ProjectBinDebugMdiApp1.exe' because it is being used by another process.'

Sometimes I need to hit the compile button 2 or 3 times before it will compile properly. I can read what the message says, but is it something I'm doing or a switch I need to set somewhere?
This usually means that the app has not closed properly and is still running. Considering that you are working on code that needs to quit the application that would make sense.
There is not much that we can do about this. I would use taskmanager or process explorer to kill the running app.

Robert

SystemMenuClose etc

Posted: Wed Mar 13, 2019 8:00 am
by robert
Jeff,
PARTIAL classes allow you to spread the contents of a class over multiple source files.

Robert

SystemMenuClose etc

Posted: Wed Mar 13, 2019 8:21 am
by lumberjack
Hi Jeff,
BiggyRat wrote:Ok, thanks Wolfgang. :) I'm trying to break the VO paradigm really. I'd like to use the "new and improved VO" - X# methods instead. I'd like to ask a user do they really want to "close this window" or "close the app" etc using X# coding.
Another thing that I can't really get my head around - PARTIAL Classes - what are they? Surely you have a Class, or you don't?
First paradigm shift, you need to clearly specify your "Environment". I am trying to make this VO code work on a WinForm:

Code: Select all

My VO code that I want to do on a WinForm(DOTNET)
I for one did not know why you don't get that code running, just copy it onto the VOForm you need it.... ;) Ok a joke I assumed you wanted to have a similar behaviour on a SystemWindows.Forms.Form object.

Code: Select all

using System.Windows.Forms
FUNCTION Start() AS VOID
  LOCAL oForm AS Form
  oForm := MyForm{}
  Application.Run(oForm)
RETURN
CLASS MyForm INHERIT Form
  CONSTRUCTOR()
    SUPER()
    SELF:InitializeForm()
  RETURN
  METHOD InitializeForm() AS VOID
    // Inside here you might probably have a Close button, menu with with Close option.
    // Both work the same they have a click event.
    LOCAL oCtrl AS Control
    oCtrl := Button{}
    oCtrl:Click := CloseClickEvent
    oCtrl := ToolStripMenuItem{}
    oCtrl:Click := CloseClickEvent
  RETURN
  METHOD CloseClickEvent(o AS OBJECT, e AS EventArgs) AS VOID
    IF MessageBox.Show(;
         "Are you really wanting to close the form?", "Question", ;
         MessageBoxButtons.YesNo, MessageBoxIcon.Question;
    ) == DialogResult.Yes
      SELF:Close()
    ENDIF
  RETURN
END CLASS
HTH,