|
I have a form which is used for data entry and then data is saved by pressing a button. I load numerous controls in the load event of the form. When user saves, I just hide the form so I do not have to load all the data again when user I show the form again. This also means I have to clear all the controls for the next time the form is shown.
I am using events of controls to change properties of classes I have. For example, in textchanged event of textbox I might have something like: employee.Name = TextBox1.Text where employee is an object. However, when I hide the form I have to clear the text box which causes the text changed event. I can have a boolean variable (something like cleaningUp) set to true during hiding of the form. If this variable is set to true then it will exit the text changed event handler. Alternatively, I can also remove the handler for text box before I clear it up and then rewire it. This is a lot of work with a form which has many controls.
What am I doing wrong? Is there a better way of accomplishing my task?
|
|
|
|
|
CodingYoshi wrote: This is a lot of work with a form which has many controls.
Yes it is. Littering windows with individual controls for each individual data point is what I call the Bug Splat User Interface technique. It's not user friendly and it's not coding friendly. Prefer to use controls like PropertyGrid for data entry. They are both user friendly and coding friendly.
led mike
|
|
|
|
|
PropertyGrid? I do not understand how that will help? Can you elaborate with a simple class please.
|
|
|
|
|
CodingYoshi wrote: I do not understand how that will help?
Sorry, I have no idea how to help you understand things. I can provide information, but it is up to you gain the requisite knowledge to understand the information.
Getting the most out of the PropertyGrid[^]
led mike
|
|
|
|
|
I kind of like the idea of that a bit but you would really use that for something like, a customer data entry form instead of using a form that has individual controls on it?
Never though about it before bit maybe...
|
|
|
|
|
Ray Cassick wrote: instead of using a form that has individual controls on it?
Yes. Your other parts of the UI provide views and navigation mechanisms of the system. When the user selects something in the system that has multiple data points that can be edited you use the PropertyGrid.
led mike
|
|
|
|
|
led mike wrote: Littering windows with individual controls for each individual data point is what I call the Bug Splat User Interface technique.
led mike wrote: Prefer to use controls like PropertyGrid for data entry. They are both user friendly and coding friendly
Yes, and the OP will find there could be less complaints from the user, as well.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
"Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." - Rob Graham
|
|
|
|
|
CodingYoshi wrote: I can have a boolean variable (something like cleaningUp) set to true during hiding of the form. If this variable is set to true then it will exit the text changed event handler.
There's nothing wrong with this approach; I've had to use it myself.
The problem is with the design of the controls, in my opinion. The XXXChanged events do not in most (all?) cases distinquish between changes generated by the user and those generated programmically. As a result, your event handler can't tell the difference. So you wind up having to use a kludge like a boolean flag to indicate when the event is being raised in response to the user's action as opposed to being raised in response to a change made programmically.
|
|
|
|
|
Used to do it similar to what you mentioned, except I did not use XXChanged to repopulate back to the business object. It was messy.
Now I mainly use DataBinding. The controls are unbound before the save, then I just clear the controls according to the control type. At least the code is cleaner and more uniform now.
|
|
|
|
|
I need to create a VB.NET service to exchange files with an a PDA using Telnet protocl. The PDA sends/receives files from an AS/400, a Unix box and a Microsoft FTP server, but all of the "chat" examples I've found can not be used. I have the C code from the Unix application and I'd like to create methods in C++ that I can call from my VB.NET project.
Can anyone send me any examples?
TIA!
Mike
Greetings from Kalamazoo, MI
|
|
|
|
|
There are articles around here showing how to call C++ methods in VB.NET, you'll have to do a search on that
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
"Not only do you continue to babble nonsense, you can't even correctly remember the nonsense you babbled just minutes ago." - Rob Graham
|
|
|
|
|
Try Using a COM Object to Wrap around your C++ methods and libraries. so you can adapt it to other systems
JO
|
|
|
|
|
Hello,
I've a C function that take function ptr in argument:
double CFunc(
double (*funcptrA)(char *),
double (*funcptrB)(char *),
double (*funcptrC)(char *)
);
And I would like to transform it in a cool object design.
I've tried a lot of solutions (functor, interface) but the only way my compilator agree is to declare argument functions (funcptrABC) as static.
To illustrate, Here 's what i wrote first:
#include CFunc.h
class CplusFunc{
virtual double A(char*);
virtual double B(char*);
virtual double C(char*);
double CplusExec(){
retrun Cfunc(&A,&B,&C);
}
};
It doesn't work but give the semantic i would like to give to my object.
Have you got an idea?
|
|
|
|
|
mp3butcher wrote: but the only way my compilator agree
mp3butcher wrote: Have you got an idea?
Well if you are using VC++ 2008 there is the newly added support for TR1 including Polymorphic Function Objects[^]
led mike
|
|
|
|
|
I wrote portables applications for windows linux & mac then I search a portable technic that avoid the use of a microsoft specific one...But thanks for the idea
|
|
|
|
|
mp3butcher wrote: that avoid the use of a microsoft specific one
I don't know why I am bothering with this since you obviously don't actually READ the links I give you but TR1 is from the ISO C++ committee[^] and was published in 2005. So there might be any number of compilers that currently support some of it.
led mike
|
|
|
|
|
|
|
Excuse me for my fast answer, but I've seen this syntax in boost but I don't understand how to make it work:
MSVC2008 Compiler tells that member pointer functions,pointer function and boost::function haven't the same signature...
So, I can't pass to my c function otherthing than a static (member) pointer function
Can you, please, explain me further?
|
|
|
|
|
mp3butcher wrote: MSVC2008 Compiler tells that member pointer functions,pointer function and boost::function haven't the same signature
Well I don't know what you did since you posted no code. What I do know is that I successfully reproduced the concepts discussed in that article I linked to using MSVC2008
Also I am now confused as to what you are attempting to do. You originally seemed to be asking about design but in this last post you say:
mp3butcher wrote: So, I can't pass to my c function otherthing than a static (member) pointer function
Your C function is what it is. If you are asking what you can use to match the parameters of that function that's not even a design question.
If you are asking about design, I suggest you look at using interfaces rather than function pointers or functors or any of those new mechanisms.
"All other things being equal, the simplest solution is the best."
|
|
|
|
|
In fact my question has two linked aspects:
As I can't pass otherthing than a static member function to my cfunction( double (*g)(char*)):
1)I would like to know how I could make it a real parameter (not hardcoded) that belong to the caller of Cfunc.
2)I would like to know how I could make a cool cpp design permitting to overload the argument pointer function.
Then the design side of my question is the second aspect.
First I would like to parametrize my cfunction with member function belonging to the caller object...
If you see a manner to do it passing other thing that a static member function, I would be very glad.
PS: I think what i've done with the function<> template is not what you're thinking of:
class CPP{
double funcparam(char*);
void exec(){
function2<double> f=&CPP::funcparam;
CFUNC(f);
}
};
Silly isn't it?:(For this I think I haven't understand what to do...
the only way I've found to make it work is:
class CPP{
static double funcparam(char*);
void exec(){
CFUNC(&funcparam);
}
};
but it don't permit to overload funcparam...
|
|
|
|
|
mp3butcher wrote: First I would like to parametrize my cfunction with member function belonging to the caller object...
If you see a manner to do it passing other thing that a static member function, I would be very glad.
See the C++ FAQ[^]
mp3butcher wrote: 1)I would like to know how I could make it a real parameter (not hardcoded) that belong to the caller of Cfunc.
I'm not sure what that means but it might be an interface.
Learning Object Oriented Design cannot be done by asking questions and getting answers. You have to become a Student and study the subject by reading some of the mountains of information that is available on the subject. I strongly suggest that you do just that. One obvious place to start might be to read about Design Patterns[^].
led mike
|
|
|
|
|
I'm using c++ for years..I'm already student. I've read a lot of things on pointer function (including the FAQ) and i'm not so good in the design pattern and a newbie with boost::function.
So unstead of say RTFM and tell on me, I would prefer you tell me how a function<> can help me in my problem as i can't pass it to my cfunc...
|
|
|
|
|
mp3butcher wrote: I would prefer you tell me how a function<> can help me in my problem as i can't pass it to my cfunc...
That's like asking how to make gold from straw. If you are asking about an alternative design for function pointers then there are several options like interfaces, functors and the function<>, but you would start by changing CFunc. These are alternatives to using function pointers they are not function pointers and therefore cannot be used as parameters that are defined to be function pointers. Get it?
led mike
|
|
|
|
|
OK that's all I would like to know...Thank you.
I can't keep the cfunc as it is... Damned C!
|
|
|
|