The most important properties of controls are controlling the data binding. And that is controlsource for most controls, including listbox and combobox. Unlike textboxes, editboxes, options, checkboxes and spinners (and whatever I forgot) they have further binding properties because while the general purpose of data binding is to bind to a single field and store a single value, in listboxes and comboboxes this single value will be picked from a list, and so the secondary binding property - the rowsource - is about the list of items to pick from.
I don't know if you're well versed with data normalization, but this mechanism is aiming for that, the best use case is binding to the primary key of a list of data, to pick one of them and store it as a foreign key. This is where VFP data binding goes hand in hand with database normalization.
The third and even more versatile list control is the grid, it does not only compare to, but it
is the core of a browse window. It does not have a controlsource at all, it only has a property determining the list of data to display, and that'll usually be a workarea which contains a table, cursor, viewcursor, well you know that because that concept should be well known from legacy FoxPro. The grid does not have a single controlsource, because that is the job of the control the grid hosts, one per column, usually a textbox. You know that from a BROWSE, too, the cells of a browse display the fields of a dbf as a textbox does. Including very specific behavior like not displaying memo content, but instead, the word memo or Memo, depending on whether data is in the field. For certain field types you want to change from a textbox to another control, but that's the topic of another chapter.
What I want to say with this is the chapter of data binding of controls is the most important, because it makes thinking of Value vs. Text vs. DisplayValue almost obsolete, once. The values you enter into textbox/editbox or pick in a listbox/combobox go into the controlsource fields and that's where your code picks them up again. Mike is still right the Value property is most important, because it holds the value to store, before it is stored in the valid event. And that's where you can go back to what I said about event order, the valid is also where you decide, whether the entered value should be accepted or rejected.
It's even less pain of knowing the details, though, as data binding takes care your data types are correct, if you bind a textbox.controlsource to a numeric field, the textbox will not accept input of text, for example, so data type checks are not your concern, the controlsource really is a two-way binding of data from and to dbf fields.
If you then add in binding, you rarely need any valid event code at all, you can have a final data rule check routine before you save the buffer or ask the user to enter mandatory values or stay within business rules in the general case. Like having a start date earlier than an end-date. This is a check you can only really do after both dates are entered. Just one of many reasons you don't want to fiddle with all the details and finally work on what you should still know from legacy coding: The workareas, current workareas, current row, but also, if a business rule check requires it, a group of rows, like all n child/detail rows pointing to the same parent row. That's something you can forget to check on a single control anyway.
So, to summarize, once you learn data binding and buffering - and that's a lot - you have a few benefits and less to care about control properties, more about dbfs/workareas/cursors fields, about SQL and/or LOCATE/SEEK, etc., the forms just are means to change your tables, finally the data is all you process.
The properties of the visual controls of interest right after data binding properties then are those determining behavior of controls while you input data, like Format and InputMask of the textbox.
Also, as a very general rule: Look up a property in the help, it'll tell you as one of the first sentences, whether it's a readonly property or not. A readonly property obviously is not for setting it, so it has an informative character.
Just as a little start help: Create an SCX form, use the data environment to add a dbf, when you're in the visual dataenvironment and drag a field into the form canvas, you will get a control with data binding to that field, so you can study how that's set. Especially using the properties window set to only display non-default properties only (right click on the top combobox in the properties window.
Bye, Olaf.
Olaf Doschke Software Engineering