Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 09/17/2011 in all areas

  1. Name: Transport.lvlib Submitter: ShaunR Submitted: 27 Aug 2011 Category: Remote Control, Monitoring and the Internet LabVIEW Version: 2009License Type: Other (included with download) Transport.lvlib is a LabView API to simplify and accelerate networked communication development. It simplifies development by abstracting TCPIP, UDP and Bluetooth and TLS interfaces into a single polymorphic vi which is a thin wrapper around the conventional open, read, write, close and listener VIs for all the network interfaces. Features: Supports TCP/IP, Bluetooth, UDP (p2p, broadcast and multicast) and TLS. Supports symetric encryption (blowfish). Supports compression (zlib). INSTALLATION: Run the supplied installer and follow the instructions. Click here to download this file
    1 point
  2. You can still use it, but show the caption instead of the label. I use a similar method for changing languages. Captions are not used nearly as frequently as they should be (IMHO)
    1 point
  3. All controls/indicators have a "visible" property.
    1 point
  4. I've never really like using "is a" as a measure of whether a class should inherit from another class. I think it's too loosely defined and easily leads to design problems that are hard to resolve. The Circle-Ellipse Problem is an example where it breaks down. That could be the right business decision and I'm not criticising it, but be aware it is probably not the correct architectural decision. At the very least you'll be losing some readability. More likely the problem you've run into indicates an error in your design. If this code is going to be supported and extended over the long-term you'll probably end up wishing you had fixed it. Personally if I had to make a quick fix I would have gone with Shaun's solution. Move all the code from Parent.Operate into a new method, Parent.Operate(Shared), and have Parent.Operate simply delegate to Parent.Operate(Shared). I can't say definitively it's a better solution, but instinctively it makes more sense to me.
    1 point
  5. Daklu, the style of my writing below is fairly terse and occassionally EMPHATIC. I've done this to emphasize key points that I think you've missed in How Things Work. Some customers in the past have felt I'm insulting them writing this way, but it is the only way I know through the limited text medium to highlight the key points. My only other option is to post just the key bits and leave out a lot of the exposition, but that doesn't seem to be as helpful when communicating. So, please, don't think I'm calling you dumb or being disdainful. I'm trying to teach. The problem is that you're almost right. Customers who are completely off-base are easier to teach because they need the whole lesson. Here, I'm just trying to call out key points, but presenting them in their full context to make sure it's clear what fits where. Throughout the post, refer to the graphic at the end of the post as it may clarify what I'm talking about. Dalku wrote: No. If there is, that's a bug that needs to be reported to NI ASAP. Think about what you just asked for... ignore the DVR part for a moment. You just asked for a PARENT object to invoke a CHILD class method. That cannot ever happen. You cannot pass a parent object directly to a function that takes a child object. The parent object in question IS NOT a child -- the parent object does not have the child's private data, nor does it have all the methods that may have been defined on the child class. For this reason, LV will break the wire if you try to wire a parent wire to a child terminal -- the wire is broken because there are zero situations in which this can successfully execute. You CAN pass a child object to a parent terminal. That is because a child IS an instance of the parent -- it has all the necessary data and methods defined to act as a parent object. What you can do is take a child wire, up cast it to a parent wire and make a Parent DVR out of that. Alternatively, you could take a child wire, make a Child DVR wire, and then upcast that to a Parent DVR wire... these two processes produce the idenitical result: a parent DVR that contains child data. Upcast and downcast DO NOT create new objects EXCEPT when they return an error. The point of a cast is to say, "I have an existing object. Please check that it is this type and approve it to go downstream if it passes this test." You use this only when you need to do something for a specific type of object and you do not have the ability to edit the parent and child classes in order to add the appropriate dynamic dispatch VIs to both. Preserve Run-time Class (PRTC) is the same thing. "Allow this object to pass downstream if it passes this test, otherwise create a new object that does pass the test." The test in this case is "Does the object in have the same TYPE AT RUN TIME as the OBJECT (not the wire) on the target object input?" If the left object is the same or a child class of the center object then there is no error. You will ALMOST NEVER WIRE PRTC WITH A CONSTANT FOR THE CENTER TERMINAL. I would say "never" because I can't think of any useful cases, but maybe someone has something out there. If you are wiring the center terminal of PRTC with a constant, something is wrong in your code. You use the PRTC to assert that the left object, which comes from some mystical source, is the right type to fulfill run-time type requirements of dynamic dispatch VIs, automatic downcast static VIs, and the Lock/Unlock of Data Value References. In all three of these cases, there is some input (either the input FPTerm or the left side of the Inplace Elt Struct) that must be passed across to the output (either the output FPTerm or the right side of the Inplace Elt Struct) WITHOUT PASSING THROUGH ANY FUNCTION THAT CHANGES THE OBJECT'S TYPE. You're free to change the object's value, but not its type. Sometimes you pass the object to functions where LV cannot prove that the type is maintained. Easy example -- pass the object into a Global VI and then read the Global VI. You'd never do this, of course, but it demonstrates the problem. LV cannot know that the object you read from the global is the same object you wrote in -- some other VI elsewhere might have written to the global in parallel. But you, as the programmer, know that there are no other writes to the global VI, so you use the PRTC to assert "this is going to be the right object type." You wire the original input (as described above) to the center terminal, and the output of the global to the left terminal, and pass the result to the original output terminal (as described above). Does that make sense?
    1 point
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.