PDA

View Full Version : Trying to fill only PART of a frame with a background color.



MooCow
December 28th, 2019, 05:03
I can fill a WHOLE frame with a backcolor value, but I'm looking to fill only a name label with a color, and later add a stringfield control next to it, and I can't get it to display the color. Does backcolor only apply directly to frames, so that I have to make a new framedef? I'm trying to avoid making a bitmap image just for a single color.



<template name="frame_char">
<genericcontrol>
<!-- <frame name="groupbox" /> -->
<frame name="charsheetbox" />
</genericcontrol>
</template>

<!-- This is a new template for single-line string entries. -->
<template name="kult_string_entry_singleline">
<frame_char>
<genericcontrol>
<!-- <anchored to="kult_string_entry_singleline" position="insidetopleft" offset="0,0" height="5" /> -->
<!-- <bounds>0,0,-1,-1</bounds> -->
<backcolor>#999999</backcolor> <!-- This color doesn't show up. -->
</genericcontrol>
<!-- <backcolor>#999999</backcolor> --><!-- This line works, but it's for the entire frame. -->
</frame_char>
</template>

Trenloe
December 28th, 2019, 06:42
Add a frame to the window control. See the frame definition in the Wiki developer guide here: https://www.fantasygrounds.com/refdoc/windowcontrol.xcp

See various examples in the CoreRPG templates. You don’t have to have a new bitmap image, just use one of the existing frame definitions.

Or try it with a control that has definite dimensions.

And, if you’re using a string field control then use that, not a genericcontrol.

MooCow
December 28th, 2019, 07:33
The stringfield control isn't even implemented yet. This code is supposed to be for the gray label to the left of it:
_________________________________
||||||LABEL|||||| String content |
""""""""""""""""""""""""""""""""""""""""""""""

I tried to follow your directions - at least what I imagined them to be - and the colors still aren't showing up.

I don't know what you mean by "definite dimensions". I tried putting in "bounds", "width" and "height" a little here and there, with values ranging from matching the absolute position on the page, to the position within the frame, but nothing is showing up.



<template name="kult_string_entry_singleline">
<frame_char>
<genericcontrol>
<frame name="charsheetbox">
<bounds>0,0,30,10</bounds>
<backcolor>#999999</backcolor>
</frame>
</genericcontrol>
<!-- <backcolor>#333333</backcolor> --><!-- This line works. -->
</frame_char>
</template>

Moon Wizard
December 28th, 2019, 07:40
The backcolor tag is separate from frame tag. The background color will be drawn first, and then the frame drawn on top, then the contents of the control.

Regards,
JPG

MooCow
December 28th, 2019, 08:00
The backcolor tag is separate from frame tag. The background color will be drawn first, and then the frame drawn on top, then the contents of the control.

Regards,
JPG

So how do I draw a frame bitmap, and then, within that bitmap, on top of it, draw a smaller box filled with a single color? Are ALL background colors drawn first, before ALL the bitmaps, regardless of where they are? Do I have to make a png image just to fill a box with a single color?

Moon Wizard
December 28th, 2019, 08:10
You have to layer controls to do something like that.

Regards,
JPG

MooCow
December 28th, 2019, 09:04
You have to layer controls to do something like that.

Regards,
JPG

Yes, I'm trying to layer the controls. Aren't I doing that in the code I posted? I tried nesting some more controls in, but it displayed nothing but the original charsheetbox bitmap:



<template name="frame_char">
<genericcontrol>
<!-- <frame name="groupbox" /> -->
<frame name="charsheetbox" />
</genericcontrol>
</template>

<!-- This is a new template for single-line string entries. -->
<template name="kult_string_entry_singleline">
<frame_char>
<genericcontrol>
<bounds>59,68,-244,15</bounds>
<frame name="groupbox">
<genericcontrol>
<bounds>59,68,-254,15</bounds>
<frame name="groupbox">
<bounds>0,0,30,10</bounds>
<backcolor>#999999</backcolor>
</frame>
</genericcontrol>
</frame>
</genericcontrol>
<!-- <backcolor>#333333</backcolor> --><!-- This line works. -->
</frame_char>
</template>


I don't even know what the bounds should be set to, or how "definite dimensions" even work.

Moon Wizard
December 28th, 2019, 09:19
Control definitions can't be nested. Each control must be defined separately. By layering, I mean that the controls are defined in a way such that they overlay the same layout space in the window class definition. In that way, the control defined first will be drawn first (i.e. on the bottom), the control defined next will be drawn on top of that one, and so on.

Regards,
JPG

MooCow
December 28th, 2019, 09:40
Control definitions can't be nested. Each control must be defined separately. By layering, I mean that the controls are defined in a way such that they overlay the same layout space in the window class definition. In that way, the control defined first will be drawn first (i.e. on the bottom), the control defined next will be drawn on top of that one, and so on.

Regards,
JPG

Oh, so templates cannot define more than one control?
...despite "addTextWidget()" being able to add and position text to a template?
...and so all the anchoring needs to be done outside templates?
I got anchoring outside templates to work, but figured that it was so much repetitive code to write.

MooCow
December 28th, 2019, 15:56
No, that can't be true, because there's createControl(). Can't you nest controls with that, just like with addWidget()?

It would be neat if I could just have a single template, that created a frame, and then resolved a label and a stringfield from two arguments (using code, I guess). This is, of course, provided that you can create a control at init-time, that would be as long as the label within it, and would allow the stringfield to be posted just after it. This seems to be doable with things like this:


local w,h = labelwidget.getSize();
labelwidget.setPosition("bottomleft", w/2, h/2-4);

Trenloe
December 28th, 2019, 18:09
No, that can't be true, because there's createControl(). Can't you nest controls with that, just like with addWidget()?
1) If you didn’t know, Moon Wizard is the main FG developer who actually codes the FG application. So, I’d tend to believe what he says if I were you.
2) When look at the API documentation, try to keep in mind the FG objects where an Interface call is called from - the createControl Interface is called from within a window instance not from within another control. So, no, you can’t create a control within another control.
3) A widget is not actually a control, it’s a special FG object that acts differently, so try not to think of them as controls.

MooCow
December 29th, 2019, 02:31
1) If you didn’t know, Moon Wizard is the main FG developer who actually codes the FG application. So, I’d tend to believe what he says if I were you.
2) When look at the API documentation, try to keep in mind the FG objects where an Interface call is called from - the createControl Interface is called from within a window instance not from within another control. So, no, you can’t create a control within another control.
3) A widget is not actually a control, it’s a special FG object that acts differently, so try not to think of them as controls.

1) Some people will teach the Bohr atomic model to people, as if it was the truth. This lie is propagated because they figure that it's all that their student's brains can handle. I get the feeling, judging by the short, almost enigmatic, replies, that mods around here are too busy to address things like exceptions to rules, and that's when white lies are often told.
2) Thank you for confirming this. I now have a solid base to stand on.
3) The reason why I'm not using it as a label, is because the length of the label also needs to push the stringfield control forward. That piece of Core RPG code is smart, but very misleading.

Thank you.

damned
December 29th, 2019, 03:03
Moon Wizard does make enigmatic replies which do assume some knowledge. Many go whoosh for me.

Andraax
December 29th, 2019, 13:32
1) Some people will teach the Bohr atomic model to people, as if it was the truth. This lie is propagated because they figure that it's all that their student's brains can handle. I get the feeling, judging by the short, almost enigmatic, replies, that mods around here are too busy to address things like exceptions to rules, and that's when white lies are often told.

The Bohr model is taught because it is a simplification of the truth. Just like Newtonian physics is taught as a simplification. It works in most "normal" situations and you don't need the overly complex models until you need to handle situations way outside the norm.

Trenloe
December 29th, 2019, 14:39
I get the feeling, judging by the short, almost enigmatic, replies, that mods around here are too busy to address things like exceptions to rules, and that's when white lies are often told.
As I proved with my responses to you - the things that you thought allowed nesting of controls, don't. Moon Wizards response to you was 100% accurate. A simple "Control definitions can't be nested." response from the main developer should have been enough - it's not enigmatic, it should be pretty clear! If you're going to second guess clear statements from the FG main developer then you're going to end up wasting a lot of your time, and possibly the time of others too. Your choice really...

MooCow
December 29th, 2019, 14:56
The Bohr model is taught because it is a simplification of the truth. Just like Newtonian physics is taught as a simplification. It works in most "normal" situations and you don't need the overly complex models until you need to handle situations way outside the norm.
...and that's why people who teach hide the truth, and that's why I don't trust them: They presume to know "what I need", and that I can't handle the truth.
...and the thing about the Bohr model specifically, is that it's not even a simplification. It's just an old and obsolete model, taught out of tradition. It just confuses people. ...but that's beside the point.
I can program a dozen languages. I can handle simple scripting.


As I proved with my responses to you - the things that you thought allowed nesting of controls, don't. Moon Wizards response to you was 100% accurate. A simple "Control definitions can't be nested." response from the main developer should have been enough - it's not enigmatic, it should be pretty clear! If you're going to second guess clear statements from the FG main developer then you're going to end up wasting a lot of your time, and possibly the time of others too. Your choice really...
You can be accurate and truthful without being clear. I followed up with three questions, in order to get the clarification I needed, but it wasn't until I doubted Moon Wizard in a second post, that I got answers to those questions. ...so I am sorry if you're feeling provoked by my doubt, but I think I had to provoke you a bit.

Trenloe
December 29th, 2019, 15:07
You can be accurate and truthful without being clear.
I don't know how clearer "Control definitions can't be nested." could be.


...but I think I had to provoke you a bit.
That'll end up with people not responding at all. You might enjoy "provoking" people, but people spending their free time trying to help others out generally don't.

Anyway, I see that my trying to assist you in navigating the waters of this forum are falling on deaf ears. I'll stop trying to educate you, as my attempts won't be believed or will be "provoked" to try to get more, or will be second guessed, or discussed until the (moo) cows come home - and I have better things to do with my time than that. Others may enjoy it, but I don't. Good luck with what you're trying to do.

MooCow
December 29th, 2019, 15:33
I don't know how clearer "Control definitions can't be nested." could be.
My followup questions were:
1) Oh, so templates cannot define more than one control?
2) ...despite "addTextWidget()" being able to add and position text to a template?
3) ...and so all the anchoring needs to be done outside templates?
Those were the things that were still unclear to me at the time. It took your answer to clarify that for me.


That'll end up with people not responding at all. You might enjoy "provoking" people, but people spending their free time trying to help others out generally don't.
Well, I did sit around and wait for a reasonable bit, and figured that if I didn't get these questions sorted out, then it wouldn't matter if people wouldn't respond to me in the future. Don't respond to me in the future if you wish, but at least I'll get stuck at a later date, rather than yesterday.
That being said, you seem to have outright taken offence at some mere doubt. This wasn't my intention. My doubt was sincere, if that's worth something to you, and you did answer my questions just fine.

Andraax
December 29th, 2019, 16:12
...and the thing about the Bohr model specifically, is that it's not even a simplification. It's just an old and obsolete model, taught out of tradition. It just confuses people. ...but that's beside the point.

Bohr's model actually can be derived from quantum mechanics as a first-order approximation. It does make correct predictions for selected systems. So "inaccurate" is the right word, not "false". Even if the electron's existence somehow depended on this theory (which it does not), it would not have been proven false by quantum mechanics. After all, you cannot predict the orbital precession of Mercury using Newtonian physics, and yet, Mercury still orbits the Sun - it's not a lie. Newtonian physics still works in most situations, which is why it's still taught as a "basic" model. Same with electrons - in most situations thinking of atoms using Bohr's model is "close enough" for what one needs to do.

You gotta learn to walk before you learn to run or fly.


I can program a dozen languages. I can handle simple scripting.

Only 12? I passed 12 languages decades ago, sometime after my stint as a chemistry major.

And, as Trenloe says, Moon Wizard is the best expert on this subject. If he says it's not currently possible, then it's not. You are better off requesting a change using the request page than telling Moon Wizard why he's wrong.

MooCow
December 29th, 2019, 16:37
Bohr's model actually can be derived from quantum mechanics as a first-order approximation. It does make correct predictions for selected systems. So "inaccurate" is the right word, not "false". Even if the electron's existence somehow depended on this theory (which it does not), it would not have been proven false by quantum mechanics. After all, you cannot predict the orbital precession of Mercury using Newtonian physics, and yet, Mercury still orbits the Sun - it's not a lie. Newtonian physics still works in most situations, which is why it's still taught as a "basic" model. Same with electrons - in most situations thinking of atoms using Bohr's model is "close enough" for what one needs to do.
You gotta learn to walk before you learn to run or fly.
The nature of the electron is completely false in Bohr's model. It may be "close enough" for predictions, but it's very far off from the actual existential truth. This leads to special cases that some people would have use of, and it also leads to people having to relearn the fundamentals of physics later on. Meanwhile you can teach string theory in a proper manner to people. You don't have to do the math - you can teach it first, and then go on to the charge of electron fields just like any X variable in math. This would be both accurate AND true.


Only 12? I passed 12 languages decades ago, sometime after my stint as a chemistry major.
I wasn't claiming to know the MOST amount of languages - just enough languages to learn a simple XML-hybrid script.


And, as Trenloe says, Moon Wizard is the best expert on this subject. If he says it's not currently possible, then it's not. You are better off requesting a change using the request page than telling Moon Wizard why he's wrong.
Even the best experts in chemistry, may teach the Bohr model. You even argue for it, despite your expertize. ...and it's not just chemistry teachers. Our whole society is built on lies upon lies, and trusting in liars in positions of authority. Trusting in people even when you stumble upon contradictive facts, is foolish. I don't trust people. I only trust dead things.

Zacchaeus
December 29th, 2019, 17:27
Let's draw a line under discussion of whatever a Bohr model is.

Andraax
December 29th, 2019, 17:28
Our whole society is built on lies upon lies, and trusting in liars in positions of authority. Trusting in people even when you stumble upon contradictive facts, is foolish. I don't trust people. I only trust dead things.

I'm surprised you program in anything other than pure machine code. After all, every computer language out there is a simplification and you obviously believe that they must therefore all be lies...

:square:

damned
December 29th, 2019, 22:17
Well, I did sit around and wait for a reasonable bit, and figured that if I didn't get these questions sorted out, then it wouldn't matter if people wouldn't respond to me in the future. Don't respond to me in the future if you wish, but at least I'll get stuck at a later date, rather than yesterday.
That being said, you seem to have outright taken offence at some mere doubt. This wasn't my intention. My doubt was sincere, if that's worth something to you, and you did answer my questions just fine.

When people are responding with assistance - be it small or big - they are doing it on their time.
Sometimes people will come specifically in response to a request/post and other times they will reply while they are here.
Either way people are spending their time to help (in this case) you.
Whether you are here for 5 mins and ask 1 question or 23hrs and 55mins and asking 6 questions, most times others will not sit here waiting for your next question so that they can respond.
You might take 5mins to ask the next question or 5hours. Either way the respondent may have moved on to do other things with their time.
The person who was responding to you is pretty much the second most knowledgeable person around here and you have probably just lost access to him as a resource.
There are lots of ways to get help/attention.
Keep telling all the living that you dont trust them and eventually they will probably all invest their efforts/attention elsewhere.

damned
December 29th, 2019, 22:33
BTW my post is not an attack on you. It is however somewhat of a critique of your forum etiquette. For the very most part, everyone here wants to see everyone else here enjoy their roleplaying activities, particularly as they relate to Fantasy Grounds. We want you to succeed in your endeavor.

Kelrugem
December 29th, 2019, 23:42
Thanks, damned :)

MooCow,

you were wondering about why you got banned on other forums (in some other thread here). Just look at this thread, you were disregarding the expertise of a main developer; not only this, even the expertise of teachers and scientists whose fields are not subject of this thread and forum. This can lead to that people do not want to answer you even before they ever wrote you. Others already explained it :) (Following your argumentation about that it is "better to get stuck later than earlier", isn't it even better to delay the point of getting stuck by not pushing other people away from you? :) "Dead things" may not always be as good as people helping you here :) )

(and, by the way even quantum physics isn't complete; especially fundamental physics is subject to change because there is no "construct/tool" to prove it, just "weak proofs" in form of experiments. There is a reason why there are terms like "postulate", "conjecture", "assumption", "axiom" and so on; even, no, especially in scientific works, good scientist aren't lying about when theories break :) A good scientist knows that knowledge has to be adjusted and changed and even "facts" may turn out to be wrong. Roughly, you can only falsify things; thence, from that point of view it is maybe better when people learn to relearn by learning first things like Bohr or Newton :) that is probably more important than knowing which things science declares to be the fundaments of nature at that time being :) Thus, you should probably not take science as an example anymore because your argumentation with respect to this has problems, it is a bit more complicated than you may expect.

In general: When you want to know more things because you expect/think that there is more than the answers show, then just politely ask and do not accuse people of hiding things from you :) )

Best,

a theoretical and mathematical physicist who finally couldn't resist to answer when there is science mentioned here! :p

MooCow
December 30th, 2019, 01:37
I'm surprised you program in anything other than pure machine code. After all, every computer language out there is a simplification and you obviously believe that they must therefore all be lies...
:square:
The thing with machine code is that nowadays the hardware varies from computer to computer, and with it memory allocations (except for maybe address four, if they kept that tradition), so I've only ever known to program ONE computer in machine code. I think that hardware reference manual really redefined what "well-written tutorial" meant - every fact in its proper place. The most annoying part was that the EPROM burner was broken half the time, so whether or not my code worked in practice, couldn't be verified.

ASM is a comfortable lie that doesn't compromize much - you could look up every instruction for its machine code counterpart in a list if you wanted - and if I knew of some machine code way to help me, I wouldn't hesitate to use it. However, I also want to keep within officially allowed standards.



When people are responding with assistance - be it small or big - they are doing it on their time.
Sometimes people will come specifically in response to a request/post and other times they will reply while they are here.
Either way people are spending their time to help (in this case) you.
Whether you are here for 5 mins and ask 1 question or 23hrs and 55mins and asking 6 questions, most times others will not sit here waiting for your next question so that they can respond.
You might take 5mins to ask the next question or 5hours. Either way the respondent may have moved on to do other things with their time.
The person who was responding to you is pretty much the second most knowledgeable person around here and you have probably just lost access to him as a resource.
There are lots of ways to get help/attention.
Keep telling all the living that you dont trust them and eventually they will probably all invest their efforts/attention elsewhere.
I guess that's their choice. My other option would be to lie and tell them all sorts of rosy stories, and end up with clunky, repetitive code as a result.

However, I'm tired of being the one to blame here: From the start of this thread I've had patience with elusive definitions such as "definite dimensions", from these experts. I've asked what that meant, and gotten no answer - no specific tag to use, no place within the XML hierarchy to use it, no reference point for the coordinates, et cetera. Not a single piece of code. Their answers have been unclear from the start, and they could do better. We could discuss that for another page if you wish, since that's a slightly bigger topic than a mere one post doubt. Personally I'd prefer to go back to coding.

Andraax
December 30th, 2019, 02:10
The thing with machine code is that nowadays the hardware varies from computer to computer, and with it memory allocations (except for maybe address four, if they kept that tradition), so I've only ever known to program ONE computer in machine code. I think that hardware reference manual really redefined what "well-written tutorial" meant - every fact in its proper place. The most annoying part was that the EPROM burner was broken half the time, so whether or not my code worked in practice, couldn't be verified.

Then load new microcode to force the CPU to use your definition of machine code. I've done this in the past, to force a CPU to handle an instruction set that was not native to the CPU (microcode was for an Intel 80386 instruction set to run on a Data General Eclipse processor).

Besides, a lie is a lie. You yourself said that you "don't trust people" - so why would you trust a computer language that a person conceived, designed, and wrote?

MooCow
December 30th, 2019, 03:22
Then load new microcode to force the CPU to use your definition of machine code. I've done this in the past, to force a CPU to handle an instruction set that was not native to the CPU (microcode was for an Intel 80386 instruction set to run on a Data General Eclipse processor).
Are we talking some sort of firmware upgrade here? ...because the instruction set was hardcoded into the transistors in the chips I used. Besides, wouldn't that language be higher level than the underlying transistors? (I didn't use those fancy C language chips.)
Besides, I'm looking to share my code later, and would like to not bother things such as virus scanners. That's why I'm adhering to the FG reference manual.


Besides, a lie is a lie. You yourself said that you "don't trust people" - so why would you trust a computer language that a person conceived, designed, and wrote?
You make a good point, but there's a sliding scale between a brief comment in a forum, and Intel's blueprints as applied to a verified chip. I trust reference manuals to work as intended. Sometimes they don't, and sometimes they do. Sometimes I will be the one writing the manual, and horrible, horrible things happen. (I am sorry, Valve!) The problem here was that the reference documentation seemed to contradict the forum comment.

Andraax
December 30th, 2019, 03:53
Are we talking some sort of firmware upgrade here? ...because the instruction set was hardcoded into the transistors in the chips I used. Besides, wouldn't that language be higher level than the underlying transistors? (I didn't use those fancy C language chips.)
Besides, I'm looking to share my code later, and would like to not bother things such as virus scanners.

Microcode is loaded when the CPU powers up. It's the instructions that translate traditional opcodes into actual operations in the hardware. Some CPUs load the microcode from a hardstore on the chip, some load the microcode from a ROM / PROM / EEPROM. This happens long before a virus scanner activates. Some CPUs (such as the mentioned Eclipse processor) will allow a process to load / reload microcode, even on the fly, to change the way a CPU interprets machine opcodes. Most CPU manufacturers nowadays allow you to load custom microcode - they use the technique inhouse to allow software engineers to develop software for a new CPU that has not been created yet. The opcodes are designed, microcode is written to interpret those opcodes for the new CPU, and loaded into an older CPU, to allow the software for a new CPU to be written at the same time the CPU hardware is being designed and debugged.

But I'm a living person and therefore I lie. Maybe you should check some dead sources; this technique has been around since the 1940s, I'm sure some of the people who wrote the papers involved are dead by now.

MooCow
December 30th, 2019, 04:21
Microcode is loaded when the CPU powers up. It's the instructions that translate traditional opcodes into actual operations in the hardware. Some CPUs load the microcode from a hardstore on the chip, some load the microcode from a ROM / PROM / EEPROM. This happens long before a virus scanner activates. Some CPUs (such as the mentioned Eclipse processor) will allow a process to load / reload microcode, even on the fly, to change the way a CPU interprets machine opcodes. Most CPU manufacturers nowadays allow you to load custom microcode - they use the technique inhouse to allow software engineers to develop software for a new CPU that has not been created yet. The opcodes are designed, microcode is written to interpret those opcodes for the new CPU, and loaded into an older CPU, to allow the software for a new CPU to be written at the same time the CPU hardware is being designed and debugged.
Yes, a scanner wouldn't react to successfully installed microcode, but it would react to a scanned executable containing heuristics that would - if executed - try to edit hardware, or at least future iterations could. Besides, altering hardware of other people's computers would be a breach of trust that's probably covered by the FG ToS. There's also the fact that any future CPU firmware upgrades would wipe my microcode.


But I'm a living person and therefore I lie. Maybe you should check some dead sources; this technique has been around since the 1940s, I'm sure some of the people who wrote the papers involved are dead by now.
I did check more dead sources, although I'm only taking the word of Wikipedia, which doesn't have a good track record. Would this source have contradicted your post, I would have doubted you. That's how I work.

LordEntrails
December 30th, 2019, 04:26
My followup questions were:
1) Oh, so templates cannot define more than one control?
2) ...despite "addTextWidget()" being able to add and position text to a template?.
I believe this was answered before, widgets are not controls. Or something like that, I don't know the difference myself :)

Andraax
December 30th, 2019, 04:57
Yes, a scanner wouldn't react to successfully installed microcode, but it would react to a scanned executable containing heuristics that would - if executed - try to edit hardware, or at least future iterations could. Besides, altering hardware of other people's computers would be a breach of trust that's probably covered by the FG ToS. There's also the fact that any future CPU firmware upgrades would wipe my microcode.

Well, that's ok; since any sort of simplification is apparently anathema to you, you're just forcing people to do things "the right way". Simplification is a lie - you should not be simplifying in any way, according to your stated philosophy.

MooCow
December 30th, 2019, 06:44
I believe this was answered before, widgets are not controls. Or something like that, I don't know the difference myself :)

Yes, my initial questions have all been sorted out, but thank you none the less. :)

MooCow
December 30th, 2019, 06:47
Well, that's ok; since any sort of simplification is apparently anathema to you, you're just forcing people to do things "the right way". Simplification is a lie - you should not be simplifying in any way, according to your stated philosophy.
All I was asking them to do, was to not skip over any sort of scripting exceptions. I saw scripting exceptions in the reference docs, and I wanted to make sure that there was no way for me to script things to my liking. I don't know how this is weird to you guys, but apparently it is.

Moon Wizard
December 30th, 2019, 06:48
Going to close this thread for now; since the original question has been answered, and the thread has diverged quite a bit.

Thanks,
JPG