dbTalk Databases Forums  

Preventing a form from opening a second time

comp.databases.paradox comp.databases.paradox


Discuss Preventing a form from opening a second time in the comp.databases.paradox forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Robert Wiltshire
 
Posts: n/a

Default Preventing a form from opening a second time - 07-25-2008 , 11:51 PM







I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of the
form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance of
the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire

































Reply With Quote
  #2  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM






third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #3  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM



third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #4  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM



third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #5  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM



third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #6  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM



third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #7  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM



third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #8  
Old   
Steven Green
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 06:49 AM



third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..

--
Steven Green - Myrtle Beach, South Carolina USA

Diamond Software Group
http://www.diamondsg.com/main.htm
Paradox Support & Sales

Diamond Sports Gems
http://www.diamondsg.com/gemsmain.htm
Sports Memorabilia and Trading Cards

"Robert Wiltshire" <nomail (AT) nospam (DOT) com> wrote

Quote:
I have a form that assists me with programming tasks,
and I would like to make sure it does not open a second time.

Using a script,
I am familiar with doing something like the following
( I am typing this off the top of head, so it is not syntax checked )

stFormname=":ztools:\\coding\\pickfields.fsl"
stTitle = "Pick Field Utility"
if not f.attach(stTitleOfForm) then
f.open(stFormname)
endif

And that would be fine,
except, as part of my issue,
I would like the code to be *inside* the form itself,
not in an external script.

I ended up figuring out 2 ways to do this,
and I wanted to share this experience,
but I welcome any input from others on how to do this.
This post gets a little long, so proceed with caution. =)

Remember, I want the prevention code to be inside the form,
not in an external script, form, or library.


Solution 1 :

I decided to start in the init section of the form,
and I am using either pdox 10 sp3 or pdox X3.

Inside the form, I found the following useful :

f.attach()
stTitleThisForm = f.getTitle()

This allows me to fetch the title on the fly, as the form that is opening,
and eliminates the need to hard code the form title.
( which I think is a huge plus )

I then used enumFormnames(arForms) to list all open forms to an array,
and I can step through that array to see that the form is in there twice.
If I find that arForms contains stTitleThisForm more than once,
I simply exited the form that was loading as follows :

eventInfo.setErrorCode(canNotArrive)
close()
return

This closes the form, and only leaves one instance of the form open on the
desktop.
But, that form is not guaranteed to be on top,
and even though I did not want this form open 2 times,
I did want the open copy of this form to come to the top of the pile.

So as many programming tasks happen,
the main idea was fairly easy, but the last touch was a pita.


If I had a form handle, I could use f.bringToTop(),
but.........I dont see any way to get a handle to the first instance of
the form,
from the code in that form as it is opening the second time.

The problem is, the title of the 1st instance is the same title as the 2nd
instance,
and we are now talking about the code that is running in the 2nd instance
of the form.

If you call enumFormnames(arForms)
and then call ( or somethign similar, depending on what forms open)
if arForms[1] = arForms[2] then
msgInfo("Note","2 titles are the same")
endif
So, this proves that pdox thinks both instances of the form have the same
name.
Obviously the above indexes to the array need to be correct,
to reflect where they are ni the array.
I simply used arForms.view() to look at array and determine necessary
index.

Trying
f.attach(arForms[1]) and f.attach(arForms[2])
always returned a form handle to the 2nd instance of the form,
which makes sense , since it was the same exact title.

Without the form handle,
I was unable to call the pdox form method bringToTop.


I did find that there was a windows api call,
and the uses statement looks like

"USER32"
BringWindowToTop(hWnd CLONG) CLONG

This requires a windows handle for the form,
not a paradox form handle.
This ended up being fairly easy to get,
using the paradox procedure : enumDesktopWindowHandles,
which returns all paradox form handles in a dynarray,
with the index of the dynarray being the handle,
and the value being the window name.

enumDesktopWindowHandles(dyHandles)

We get the handle for the currently executing 2nd instance of the form
rather easily as follows :
;This gets handle of the current instance of the form
liHandleThisForm = f.windowHandle()

;init handle of the 1st instance we are looking for
liHandleOtherForm = 0

Now step thru dynarray, and find title
but remember title is in the dynarray 2 times
and we want the handle for the one that is different from the current form

foreach stHandle in dyHandles
stTitle = dyHandles[stHandle]

if stTitle = stTitleThisForm then
liHandle = longint(stHandle)
if liHandle <> liHandleThisForm then
liHandleOtherForm = liHandle
quitloop
endif
endif

endforeach

;If for some reason, we didnt find it, do not call windows api function
if liHandleOtherForm = 0 then
return(false)
endif

; call api function, to bring 1st instance to the top of the pile
liRet = BringWindowToTop(liHandleOtherForm)

and then exit and close self as mentioned before



Second Solution

I had mentioned before,
the issue to get pdox form handle is difficult
because both instances have the same exact title.

I went and manually entered the form title to be
stTitle = "Pick Field Utilityx"

My idea was to modify the title of the open form,
so that it had a slightly differnt value than the form in the init stage.
This worked rather well.

So the init method looks like

method init(var eventInfo Event)

var
fThis,fOrig form
stTitleThisForm,stNewTitle string
endvar

; attach to current form, and get its title
fThis.attach()
stTitleThisForm = fThis.getTitle()

; for new title, removes last char from orig title
stNewTitle = stTitleThisForm.substr(1,stTitleThisForm.sizeEx()-1)

; if possible, attach to corrected title, bring to top, and close down
if fOrig.attach(stNewTitle) then
fOrig.bringtotop()
eventInfo.setErrorCode(canNotArrive)
close()
return
endif

; form was not open, so change this form title
fThis.setTitle(stNewTitle)

endMethod

Thats it.
It seems to work ok.


I added this to the close method of this form,

;fix up title to original
f.attach()
f.setTitle(f.getTitle() + "x")

I was thinking of putting a box object on the form,
and putting all relevant code inside it,
so that I could simply plop it on any form that needed this code,
but I did not get around to that yet.

Perhaps there are easier ways to do this.
Comments, suggestions, and discussion always welcome.


Robert Wiltshire



































Reply With Quote
  #9  
Old   
Robert Wiltshire
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 11:52 AM




Quote:
third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..
Interesting idea, thank you.
This would certainly need something in the close event to whack the file.

I suppose games could be played with environment strings too.

The only thing that bothers at me at first
with either the file technique ( or environment string) ,
is ..........what if form does not clean up after itself for some unusual
reason.

I had the same concerns with solution #2
where I modified the form title after opening.

Issue might be similar to a ".lck" file being left stray.
It is not usual that it happens, but if it did,
figuring out why the form is not opening,
and then finding the file to delete might prove to be difficult.

Thank you for suggestion.








Reply With Quote
  #10  
Old   
Robert Wiltshire
 
Posts: n/a

Default Re: Preventing a form from opening a second time - 07-26-2008 , 11:52 AM




Quote:
third possible solution.. when you open the form, create a companion text
file.. if the text file exists, don't open the form.. should be way less
code..
Interesting idea, thank you.
This would certainly need something in the close event to whack the file.

I suppose games could be played with environment strings too.

The only thing that bothers at me at first
with either the file technique ( or environment string) ,
is ..........what if form does not clean up after itself for some unusual
reason.

I had the same concerns with solution #2
where I modified the form title after opening.

Issue might be similar to a ".lck" file being left stray.
It is not usual that it happens, but if it did,
figuring out why the form is not opening,
and then finding the file to delete might prove to be difficult.

Thank you for suggestion.








Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.3
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.