473,883 Members | 1,610 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

testing parent-child relations using only id's

Hi,

I've been trying to write a function to test whether one class is
derived from another class. I am given only id's of the two classes.
Therefore, direct use of template methods is not an option.

Let's call the id of a class "cid" (for "class id").

The function signature should look like this:
*************** *************** ************
bool isDerivedFrom(c id child, cid parent);
*************** *************** ************

I see two basic options:
(1) Test whether we can typecast from an instance of the child class to
an instance of the parent class. If the typecast fails (by returning
NULL or throwing an exception), then we know that the child is *not*
derived from the parent. eg,
(a) Use dynamic_cast<> (somehow), since it throws an exception if
you try to cast to a non-parent class.
(2) Manually (as preprocessing) build a tree structure of id's that
parallels the actual class hierarchy, to examine later during runtime.

I would *much* prefer option#1, since it is more extensible. However, it
is difficult to figure out how, since it requires templates under the
hood, and these must be abstracted away to cid's in the final function
signature. That is why I am writing to this newsgroup. :-)

Perhaps under the hood, we can use dynamic_cast<> in a helper function:

template<class TChild, class TParent>
bool isDerivedFrom()
{
TChild* child = new TChild();
try
{ dynamic_cast<TP arent*>(child);
}
catch(exception &) { return false; }

return true;
}

*************** *************** *************** *************** *************** *********
How can I get the 'isDerivedFrom( cid child, cid parent)' function to
call this templated version appropriately?
*************** *************** *************** *************** *************** *********

Here are the utilities that I have to work with:
(1) A generic IObj superclass, as parent to all classes in the system.
Each subclass has an associated cid and implements a virtual getter
function for it:
const cid IObj::getCID(); //get the cid for this class
(2) A mapping from cid's to create functions which return an instance of
the specified class, as an IObj* pointer:
IObj* getNewObj(cid c);
(3) (probably not useful in this case) A mapping from cid's to strings
representing class names:
string& getClassName(ci d c);

Here are some problems I discovered in my implementation attempts, which
we need to be aware of:
(1) Casting from IObj* always fails via dynamic_cast<> (since IObj is
parent to every class, and dynamic_cast<> can only cast from child classes).
(2) Casting from void* always succeeds via C-cast (since it is totally
non-typesafe) and cannot be done at all via dynamic_cast<>.

For instance, I tried this, but it always fails due to #1:

template<class TParent>
bool isDerivedFrom(c id child)
{
IObj* childObj = getNewObj(child );
try
{ dynamic_cast<TP arent*>(childOb j); //always fails, since childObj
is a ptr to IObj, *not* a ptr to whatever its ultimate derived type is
}
catch(exception &) { return false; }

return true;
}

The real magic would be to use ***MACROS***, to temporarily forgo uses
of IObj.

*************** *************** *************** *************** *************** *********
How can I implement the macro(s) "MACRO_GET_CLAS S_NAME" and/or
"MACRO_GET_CHIL D_OBJ" below?
*************** *************** *************** *************** *************** *********

MAGIC #1. (How can I implement the macros here?)

bool isDerivedFrom(c id child, cid parent)
{
try
{
dynamic_cast<MA CRO_GET_CLASS_N AME(parent)>(MA CRO_GET_CHILD_O BJ(child));
}
catch(exception &) { return false; }

return true;
}

MAGIC #2. (How can I implement the macro here?)

template<class T>
class WrapperClass
{
static bool isDerivedFrom(c id child) // this func ptr can be stored
*non-templated* in a map of (cid, static funcs), so it's useful
{
try
{ dynamic_cast<T> (MACRO_GET_CHIL D_OBJ(child));
}
catch(exception &) { return false; }

return true;
}
};

I tried the following, but attempting to use them in "MAGIC #1" and
"MAGIC#2" did not compile. I also *hate* them because they require
exhaustively listing class id's,

which is not very extensible (eg, if someone else wants to add classes
to my program).

#define MACRO_GET_CLASS _NAME(id) ( \
id == kCID_Foo ? Foo \
: id == kCID_Bar ? Bar \
: NILL )
#define MACRO_GET_CHILD _OBJ(id) ( \
( id == kCID_Foo ? new Foo() \
: id == kCID_Bar ? new Bar() \
: NULL ) )

(Please ignore the memory leaks resulting from using "new" without using
"delete" here. I had a solution to prevent that, but it's not worth
cluttering my questions here by presenting it. :-) )

Aaargh! Where's a hack when you need one? :-( I'm about to hack out my
brains.

Thanks for any suggestions.

Suzanne

Jul 22 '05 #1
16 2683
Suzanne Vogel wrote:
Hi,

I've been trying to write a function to test whether one class is
derived from another class. I am given only id's of the two classes.
What do you mean by "id's?" At first I thought you meant the type_info
objects returned by the typeid operator, but after reading below, I
guess you mean integer constants.
Therefore, direct use of template methods is not an option.

Let's call the id of a class "cid" (for "class id").

The function signature should look like this:
*************** *************** ************
bool isDerivedFrom(c id child, cid parent);
*************** *************** ************

I see two basic options:
(1) Test whether we can typecast from an instance of the child class to
an instance of the parent class. If the typecast fails (by returning
NULL or throwing an exception), then we know that the child is *not*
derived from the parent. eg,
(a) Use dynamic_cast<> (somehow), since it throws an exception if
you try to cast to a non-parent class.
(2) Manually (as preprocessing) build a tree structure of id's that
parallels the actual class hierarchy, to examine later during runtime.
Why does that need to be done as preprocessing? Anyway, I think such a
"tree structure" is what you need. TC++PL has a similar example (p.
416) using a std::map, with class names as the keys.
I would *much* prefer option#1, since it is more extensible. However, it
is difficult to figure out how, since it requires templates under the
hood,
It does?
and these must be abstracted away to cid's in the final function
signature. That is why I am writing to this newsgroup. :-)

Perhaps under the hood, we can use dynamic_cast<> in a helper function:

template<class TChild, class TParent>
bool isDerivedFrom()
{
TChild* child = new TChild();
try
{ dynamic_cast<TP arent*>(child);
That cast will never throw. dynamic_cast only throws when you try to
cast to a reference; if a cast to a pointer type fails, dynamic_cast
just returns 0. Anyway, no cast is needed in this situation; a pointer
to a child class always can be assigned to a pointer to any of the
child's public base classes. In your example, if TChild does *not* have
TParent as a public base, you'll get a compile-time error.
}
catch(exception &) { return false; }
Why are you trying to catch a temporary by non-const reference?

return true;
}

*************** *************** *************** *************** *************** *********

How can I get the 'isDerivedFrom( cid child, cid parent)' function to
call this templated version appropriately?
*************** *************** *************** *************** *************** *********
Here are the utilities that I have to work with:
(1) A generic IObj superclass, as parent to all classes in the system.
Each subclass has an associated cid and implements a virtual getter
function for it:
const cid IObj::getCID(); //get the cid for this class
(2) A mapping from cid's to create functions which return an instance of
the specified class, as an IObj* pointer:
IObj* getNewObj(cid c);
(3) (probably not useful in this case) A mapping from cid's to strings
representing class names:
string& getClassName(ci d c);
Here are some problems I discovered in my implementation attempts, which
we need to be aware of:
(1) Casting from IObj* always fails via dynamic_cast<> (since IObj is
parent to every class, and dynamic_cast<> can only cast from child
classes).
I think you've got it backwards: dynamic_cast is used to cast from
parent classes to their children.
(2) Casting from void* always succeeds via C-cast (since it is totally
non-typesafe) and cannot be done at all via dynamic_cast<>.

For instance, I tried this, but it always fails due to #1:

template<class TParent>
bool isDerivedFrom(c id child)
{
IObj* childObj = getNewObj(child );
try
{ dynamic_cast<TP arent*>(childOb j); //always fails, since childObj is
a ptr to IObj, *not* a ptr to whatever its ultimate derived type is
}
catch(exception &) { return false; }

return true;
}

The real magic would be to use ***MACROS***, to temporarily forgo uses
of IObj.
If you can't write the code by hand, what makes you think the
preprocessor can? Repeat after me: screw macros... screw macros...

<snip> bunch of nonsense with macros </snip>
Aaargh! Where's a hack when you need one? :-( I'm about to hack out my
brains.
:) I know how you feel. I'm not sure you need a "hack" just yet, though.

Try creating a bunch of class templates, one for CID, that defines the
exact type of the corresponding class. Then, use a dynamic_cast as a
"blood test" to figure out whether "parent" really is the daddy. In
fact, you can just return the result of the dynamic cast.

Good luck,
Jeff

Btw, if that all sounds like gibberish, say the word.
Thanks for any suggestions.

Suzanne


Jul 22 '05 #2
Try creating a bunch of class templates, one for each CID to define the
exact type of the corresponding class. Then, use a dynamic_cast as a
"blood test" to figure out whether "parent" really is the daddy. In
fact, you can just return the result of the dynamic cast.


Just realized this will only work if the CID's with which your function
is called are known at compile time. Do you know whether this is the
case? Do you know exactly how the function will be called?

Thanks,
Jeff

Jul 22 '05 #3
Jeff Schwab wrote:
Try creating a bunch of class templates, one for each CID to define
the exact type of the corresponding class. Then, use a dynamic_cast
as a "blood test" to figure out whether "parent" really is the daddy.
In fact, you can just return the result of the dynamic cast.

Just realized this will only work if the CID's with which your function
is called are known at compile time. Do you know whether this is the
case? Do you know exactly how the function will be called?


Oh, and one more thing...

Are the CID's consecutive? If so, there's a straightforward , run-time
approach that will work in constant time and requires no templates.
Create an array of pointers to objects of abstract class "Comparator ,"
or some such name. For each class with a CID, derive a class from both
Comparator and the class with the CID, and add it to the array at an
index corresponding to the CID. Your function can use the CID's as
indices into the array, and call methods of the Comparator-derived
objects. Inside those methods, the exact type of each object will be known.

Better yet, if you know the whole hierarchy ahead of time, you could
just build a big table of bool's. Even if the CID's aren't consecutive,
you could build a map with std::pair< CID, CID > as keys and bool's as
values.

Jul 22 '05 #4
Hi,

Jeff Schwab wrote:
Better yet, if you know the whole hierarchy ahead of time, you
could just build a big table of bool's. Even if the CID's
aren't consecutive, you could build a map with std::pair< CID,
CID > as keys and bool's as values.


How does that compare to a multimap<CID, CID> where the presence of a
particular ID pair would tell what your bool does?
Martin
Jul 22 '05 #5
Martin Eisenberg wrote:
Hi,

Jeff Schwab wrote:

Better yet, if you know the whole hierarchy ahead of time, you
could just build a big table of bool's. Even if the CID's
aren't consecutive, you could build a map with std::pair< CID,
CID > as keys and bool's as values.

How does that compare to a multimap<CID, CID> where the presence of a
particular ID pair would tell what your bool does?
Martin


Since the keys are unique, I don't think a multimap makes sense here.
On the other hand, your idea of testing for the very presence of keys
(rather than mapping them to boolean values) is a good one, and will
have a smaller footprint in memory. Instead of a std::map, a std::set<
std::pair< CID, CID > > probably makes the most sense.

-Jeff

Jul 22 '05 #6
Thanks for responding. I decided to ditch the dynamic_cast<> idea and
just go with a prebuilt-map of cid's.
I've been trying to write a function to test whether one class is
derived from another class. I am given only id's of the two classes.
What do you mean by "id's?" At first I thought you meant the type_info
objects returned by the typeid operator, but after reading below, I
guess you mean integer constants.


Yes, integer constants.
Therefore, direct use of template methods is not an option.

Let's call the id of a class "cid" (for "class id").

The function signature should look like this:
*************** *************** ************
bool isDerivedFrom(c id child, cid parent);
*************** *************** ************

I see two basic options:
(1) Test whether we can typecast from an instance of the child class
to an instance of the parent class. If the typecast fails (by
returning NULL or throwing an exception), then we know that the child
is *not* derived from the parent. eg,
(a) Use dynamic_cast<> (somehow), since it throws an exception if
you try to cast to a non-parent class.
(2) Manually (as preprocessing) build a tree structure of id's that
parallels the actual class hierarchy, to examine later during runtime.


Why does that need to be done as preprocessing? Anyway, I think such a
"tree structure" is what you need.


Yes, I decided on (2). :-( Here's how:

Register classes as (cid, set<cid>) pairs at the beginning of the
program, where set<cid> represents all the direct parents of cid. After
registering all classes, "preprocess " (okay, sorry: misuse of
terminology) by transforming into (cid, set<cid>) pairs, where set<cid>
represents *all* predecessors (parents, grandparents, great-,...) of
cid. Then, start the main program loop which uses this inheritance
structure. If class A is derived from class B, then the cid of A has a
set<cid> which contains the cid of B.

It works. I could've done it before, but I so wanted to use
dynamic_cast<>! :-O
I would *much* prefer option#1, since it is more extensible. However,
it is difficult to figure out how, since it requires templates under
the hood,


It does?


dynamic_cast<> is templated. That's all I meant.
and these must be abstracted away to cid's in the final function
signature. That is why I am writing to this newsgroup. :-)

Perhaps under the hood, we can use dynamic_cast<> in a helper function:

template<class TChild, class TParent>
bool isDerivedFrom()
{
TChild* child = new TChild();
try
{ dynamic_cast<TP arent*>(child);


That cast will never throw.


It does in my test program. It works.
dynamic_cast only throws when you try to
cast to a reference;
Or to a pointer.
if a cast to a pointer type fails, dynamic_cast
just returns 0.
No, it throws an exception.
Anyway, no cast is needed in this situation; a pointer
to a child class always can be assigned to a pointer to any of the
child's public base classes.
I know, but I want to *test* whether TChild is *truely* a child of
TParent. I don't know that it is. I know that in some situations it
won't be, and the cast will fail. (And it does fail.)
In your example, if TChild does *not* have
TParent as a public base, you'll get a compile-time error.
No, that's static_cast<>, not dynamic_cast<>.
}
catch(exception &) { return false; }


Why are you trying to catch a temporary by non-const reference?


I don't care about the exception itself. All I care is that one was raised.
return true;
}

*************** *************** *************** *************** *************** *********

How can I get the 'isDerivedFrom( cid child, cid parent)' function to
call this templated version appropriately?
*************** *************** *************** *************** *************** ********* (1) Casting from IObj* always fails via dynamic_cast<> (since IObj is
parent to every class, and dynamic_cast<> can only cast from child
classes).


I think you've got it backwards: dynamic_cast is used to cast from
parent classes to their children.


No, I tried it again: dynamic_cast<> casts child to parent. Which makes
sense, since parents are smaller than children, and you'd certainly want
to cast to something smaller than yourself so as not to exceed memory
allocation.
(2) Casting from void* always succeeds via C-cast (since it is totally
non-typesafe) and cannot be done at all via dynamic_cast<>.

For instance, I tried this, but it always fails due to #1:

template<class TParent>
bool isDerivedFrom(c id child)
{
IObj* childObj = getNewObj(child );
try
{ dynamic_cast<TP arent*>(childOb j); //always fails, since childObj
is a ptr to IObj, *not* a ptr to whatever its ultimate derived type is
}
catch(exception &) { return false; }

return true;
}

The real magic would be to use ***MACROS***, to temporarily forgo uses
of IObj.


If you can't write the code by hand, what makes you think the
preprocessor can? Repeat after me: screw macros... screw macros...


Macros are beautiful. I like macros and cheese. :-) Okay, macros don't
work here.
<snip> bunch of nonsense with macros </snip>
Aaargh! Where's a hack when you need one? :-( I'm about to hack out my
brains.
:) I know how you feel. I'm not sure you need a "hack" just yet, though.


Thanks for your suggestions. I dehackified my solution. Boring old
cid's, no dynamic_cast<>. Poo.
Try creating a bunch of class templates, one for CID, that defines the
exact type of the corresponding class. Then, use a dynamic_cast as a
"blood test" to figure out whether "parent" really is the daddy. In
fact, you can just return the result of the dynamic cast.
I thought about that... Wasn't exactly sure what it meant, didn't want
to create one class corresponding to each class in my program...
Realized that it was just beating around the bush and not solving the
real problem: that dynamic_cast<> takes template params and not cid's
(argh!). But thanks for the suggestion.
Good luck,
Thanks. At least I'm satisfied that dynamic_cast<> is probably *not* the
solution. :-)
Jeff

Btw, if that all sounds like gibberish, say the word.


Nah. Thanks.

Suzanne

Jul 22 '05 #7
>>Better yet, if you know the whole hierarchy ahead of time, you
could just build a big table of bool's. Even if the CID's
aren't consecutive, you could build a map with std::pair< CID,
CID > as keys and bool's as values.

How does that compare to a multimap<CID, CID> where the presence of a
particular ID pair would tell what your bool does?


That's kinda what I decided on. I'm using hashmap<cid, set<cid> >, where
cid represents the child and set<cid> represents all its descendents. I
figured it saves space over the map<pair<cid,ci d>, bool> idea suggested
above.

(I've never used multimap before. Thanks for the tip.)

Suzanne

Jul 22 '05 #8
Jeff Schwab wrote:
Martin Eisenberg wrote:
Hi,

Jeff Schwab wrote:

Better yet, if you know the whole hierarchy ahead of time, you
could just build a big table of bool's. Even if the CID's
aren't consecutive, you could build a map with std::pair< CID,
CID > as keys and bool's as values.

How does that compare to a multimap<CID, CID> where the
presence of a particular ID pair would tell what your bool
does?
Martin


Since the keys are unique, I don't think a multimap makes sense


It turns out that my notion of retrieval from the multiset was wrong.
Suzanne's map<cid, set<cid> > idea is essentially what I had in mind.
here. On the other hand, your idea of testing for the very
presence of keys (rather than mapping them to boolean values) is
a good one, and will have a smaller footprint in memory.
Instead of a std::map, a std::set< std::pair< CID, CID > >
probably makes the most sense.


I like that the set of pairs is just the definition of a relation.
It needs only one lookup where Suzanne needs two, but in a larger
set. Would that noticeably affect speed? I also tried to figure out
which would be larger, but the results were nonsensical.
Martin
Jul 22 '05 #9
Martin Eisenberg wrote:
Jeff Schwab wrote:

Martin Eisenberg wrote:
Hi,

Jeff Schwab wrote:

Better yet, if you know the whole hierarchy ahead of time, you
could just build a big table of bool's. Even if the CID's
aren't consecutive, you could build a map with std::pair< CID,
CID > as keys and bool's as values.
How does that compare to a multimap<CID, CID> where the
presence of a particular ID pair would tell what your bool
does?
Martin


Since the keys are unique, I don't think a multimap makes sense

It turns out that my notion of retrieval from the multiset was wrong.
Suzanne's map<cid, set<cid> > idea is essentially what I had in mind.

here. On the other hand, your idea of testing for the very
presence of keys (rather than mapping them to boolean values) is
a good one, and will have a smaller footprint in memory.
Instead of a std::map, a std::set< std::pair< CID, CID > >
probably makes the most sense.

I like that the set of pairs is just the definition of a relation.
It needs only one lookup where Suzanne needs two, but in a larger
set. Would that noticeably affect speed? I also tried to figure out
which would be larger, but the results were nonsensical.
Martin


Each set carries some overhead. But creating a separate set for each
CID, the overhead has been multiplied by the number of CID's. That's
one reason I prefer the single-set approach. I don't like the added
complication of having two separate containers, either. Both approaches
have logarithmic complexity; which is faster probably depends on the
number of CID's present. A straight table lookup would be faster and
more compact than either of these approaches, if the difference between
the highest and lowest CID's isn't too big.

-Jeff

Jul 22 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

97
4467
by: Kjetil Torgrim Homme | last post by:
often when re-factoring code, I need to change the indent level of some chunk of code. due to the lack of an end marker, my Emacs has to use heuristics when re-indenting, and this will occasionally lead to mistakes. of course this is really _my_ fault, not Emacs', but it's annoying all the same. a colleague uses #fi, #yrt etc. to mark the end of blocks, but I don't find this satisfactory since neither Python nor Emacs has any...
1
2598
by: Paul Gobée | last post by:
What is the parent element of a button (IE6 on Win, transitional mode)? Is it the BODY, the browser default stylesheet, or something else? Contra "body is parent-element": - Buttons with no style specified have a different font-size than the body's font-size. - If I change the body's font-size, a button with no style specified remains at the same font-size
5
3661
by: Suzanne Vogel | last post by:
Hi, Given: I have a class with protected or private data members, some of them without accessor methods. It's someone else's class, so I can't change it. (eg, I can't add accessor methods to the parent class, and I can't make some "helper" class a friend of the parent class to help in accessing the data.) Problem: I want to derive a class that has a copy constructor that properly copies those data members.
2
2346
by: JSMiami | last post by:
The switchboard has a way of opening forms in either Add mode or in Edit mode. Is there anyway of testing for that mode in VB code? If not is there a way of testing (within a subform) if there is a parent? Thanks
5
2396
by: Zürcher See | last post by:
The Control class has the Parent property that is readonly. When the control is added to a controls collection of another control the Parent property refers to that control. "Who" set the Parent property? How to implement this "mechanism"? public abstract class MyControl { private MyControl parent; public MyControl Parent{get{return this.parent;}}
4
9790
by: Phil Powell | last post by:
I thought this would work but it seems to not work neither in Netscape nor in IE: <script type="text/javascript"> <!-- // OBTAINED FROM http://www.javascripter.net/faq/settinga.htm // NOTE THAT IF YOU SET days TO -1 THE COOKIE WILL BE SET TO YESTERDAY
5
3953
by: David K Allen | last post by:
Here's my problem. Have a database interface with several methods. I created a database class to implement the interface, and a set of unit tests to test each method. Now I want to support another database provider. The implementation is very easy: I simply create a new database class, and implement all the methods using the new database provider. My question is: How do I get this same set of unit tests to run in a loop? My problem is...
1
3819
by: bnchs | last post by:
This is C code. I am trying to fill each node's Parent field with its parent because I am drawing nodes to the screen. However, I have not been able to get this working. Reading the output from the code and tracing it, it seems that the code does not continue recursing down into the tree to insert. Can someone please point me to what is wrong and help me understand why it is wrong? Thank you. struct AvlNode* Insert( gint X, struct AvlNode*...
3
1458
by: =?Utf-8?B?c2lwcHl1Y29ubg==?= | last post by:
Hi I have setup UnitTests that go thru a SQL Server Table Sequentially using the UntTest Property for DataSource. What if I need to use 2 tables - I have a Parent child table that I need to process Do I do the db coding manually like I would in regular C# code by writing SELECT statments and looping thru datasets ???
4
1556
by: Andrew | last post by:
I want to create a set of Activity Diagram controls for process control. I need to create a base Diagram control that acts as a container for the Activity controls ( StartPoint, EndPoint, Actvity, Decision, Message,...). How do I implement it such that the only place I can drop an Activity control is on a Activity Diagram? I'm an experienced Delphi developer and I'm just getting started in C#. There appears to be significant...
0
9933
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9781
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
11118
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10732
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
10836
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
10407
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7960
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5982
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
3
3230
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.