MFC "Hidden" or "Default" Function Key Accelerators? - c++

I have a pretty normal MFC SDI application.
I recently started using things from the new MFC feature pack (eg CMFCToolbar), and after all these changes, I am seeing some unexplained behavior in keyboard shortcuts.
It seems some resource IDs have function key shortcuts (like F6), but I cannot find out how this works, or how to disable it.
For example, if I mouseover ID_ABC in a toolbar, I see a tooltip like:
ABC (F2)
Do ABC action
I don't see VK_F2 anywhere in the accelerator table, or anywhere at all for that matter. I also cannot find (F2) anywhere at all in the solution. This all seems very weird to me. Pressing F2 does indeed do ABC.
If I delete the entire accelerator table, that seems to "fix" the problem, but then of course I have no accelerators. As soon as I add any accelerator back, the problem re-appears.
Usually, when I run into these things, I seem to be on my own, and the cause of the problem is usually "far away", sort of like landing in some random function after a bad memory access, and saying, "why am I here"??
But if anyone knows anything about this, thanks!

Just look into the accelerator table in the resource file of your application. Yes, many standard commands do have accelerator keys assigned (eg Ctlr+S is mapped to the File Save command). You can delete the commands you do not want (individually, not the whole accelerator table). The application "remembering" the old accelerator table assignments (or not working with the new ones) may be due to saving these in the registry. Go there and delete the "Workspace" tree for your application, and then test anew.
Menu item labels must contain the shortcut as well, separated by a tab (eg File &Open\tCtlr+O). Status bar hints and tooltips are created by a string resource, with the same ID as the menu or toolbar item. You can create/edit these in the Menu Editor or the String Table Editor. The two items are separated by a newline character.

Related

WXWidgets TextCtrl or RichTextCtrl

I'm using wxWidgets for a log window of a piece of software which runs for many hours. The log can accumulate 10,000's of entries. Does the community have a suggestion for how not to have the GUI thread choke for many seconds when updating a textctrl or richtextctrl with this many lines? I'm open to using either control type but richtext is preferable to I can highlight warnings or errors.
It's currently set to readonly, so undo, redo, paste, etc are not active. I'm currently freezing and thawing it before and after adding content.
In a test case, I add 10000 lines to the text control with a freeze and thaw before and after. This operation still takes over a minute. Are these text controls simply incapable of handling long content?
Assuming your display is like a log, where each "line" is it's own entry, try using the wxListCtrl in "virtual mode". Basically, you maintain the data in your own control (a vector, array, whatever works) and the control asks you for only the data that is currently visible.
Inherit wxListCtrl with your own class and implement OnGetItem. When a row is visible, your derived control will have this method called for each row (and each column if you implement multiple columns) and you provide it with the data for that row, accessed directly from your array (list, vector, whatever).
More information is available in the wxWidgets docs here: http://docs.wxwidgets.org/3.0/classwx_list_ctrl.html#a92370967f97215e6068326645ee76624
The suggestion to use wxListCtrl in #avariant answer is a good one, however a wxTextCtrl with wxTE_RICH style should still be capable of appending 10000 lines in well less than a minute if you freeze/thaw it before/after. I'd be curious to know if you can reproduce the problem in the text sample included with wxWidgets (which already has a menu item doing something like this) and, if so, which wxWidgets port do you use.

Disabling a ComboBox item in Win32 API

I would like to disable an item in a combobox in my Win32 application (C++). I'm not quite sure how to do this. I'm trying to achieve something that looks like this:
Notice how CollectionItem2 and 3 are greyed-out.
Any help would be very much appreciated!
If you truly need a combobox for this, then (as #IInspectable said) you'll need to do a custom drawn control. Basically, you'll have to store some information saying which items are disabled/grayed, and draw the items appropriately based on whether they're enabled or not.
There may be a somewhat easier way though. This is normally done with a Split Button. This is button with the BS_SPLITBUTTON style set. When the drop-down part of the button is clicked, it sends a BCN_DROPDOWN notification.
You normally respond to that by displaying a menu, typically using TrackPopupMenu to display it immediately below the button (or immediately to its right, if you prefer). This is a normal menu, so it can have items enabled, disabled, grayed, have check boxes, etc., as you see fit.
If you're using MFC, it has a CSplitButton class that wraps the Split Button, simplifying the code a little bit--you can pass an identifier of a menu and sub-menu when you create the CSplitButton object, and it handles things from there.
A sample result probably looks pretty familiar:
Note: MFC also has a CMfcMenuButton class. This has roughly similar functionality, but is somewhat clumsier to use. If memory serves, it is compatible with older versions of Windows (but the split button goes back to Vista, so it's fine unless you really need to support XP).

How to look for a specific mapping in the navigator window

I'm new to powercenter and the learning curve of this tool seems to be different from the programming languages I'm used to. Where I work everyone tells me to ask people in the office. Access to the internet is non existant. Stack overflow is one of the few places where I can look for info.
I would like to do something basic like, in the navigator window, there are sometimes thousands of mappings with veeeery similar names, I would like to know if there is a way to enable a "control-f" type of functionality. As of right now, placing the mouse on the window and writing the name kinda helps, but since the names are stuff like
k_l_ll_sigpir_proyectname_mappingname
and there are dozens and hundreds that share the same structure: "k_l_ll_sigpir_" trying to navigate when you don't know where info is other than the name is a bit of a nightmare, compared to other tools at least.
Can someone point me in the right direction? Thanks in advance.
I guess I was able to find something that might help, although this is a bit counter-intuitive. I'm assuming you want to find and open some mapping in Mapping Designer. Here goes:
After you've connected to Repository and have the right folder opened (not just connected!), choose Tools => Queries from the menu bar. A Query Browser should open for you.
Choose New to create a new query
In the Query Editor there's a grid. Choose Object Name in the Parameter Name column. Change the Operator to Contains and put whatever you're looking for as Value 1 (using your example: mappingname)
Click the blue play button on the menu bar or choose Query => Execute from top menu. Give this a few seconds.
Give it a few more seconds...
A Query Results window should be opened for you. NOTE: if you've been clicking anything it might get opened in the background - just check the Designer button on Start Bar. It should contain all the objects that contain mappingname string it the name. We've not limited this to mappings only though (I'll discuss this below).
=== now here's the odd part ===
You can right click any item on the list in Query Results window and choose Open in Workspace. And it won't work :)
Switch back to Query Editor window and close it (don't close the Query Results!). You may save you'r query if you like to.
You should be back at Query Browser. Close it.
Return to Query Results.
Right click the desired item and choose Open in Workspace.
Voila!
Now some remarks:
The whole repository is searched. The Query Results may therefore contain items from other folders, than the one you have open. Trying to Open in Workspace such objects won't work since the folder is not open in Designer.
You may construct more sophisticated queries. Just click 'Add new...' icon on the Query Editor window. This will add a line and allow you to choose extra conditions. It will be spawned by a AND condition which you may change to OR. You get the idea.
PS.
Yes, it's odd, I know. Just don't blame me ;)
The quick answer is that the 'metadata manager' tool can do exactly what you ask for. It is basically a 'google search' for your entire data warehouse. Only hiccup is that it requires a lot of work from the admins of your power center servers to get it up and running...
Alternatives:
Basically it depends on what you want to DO with the mapping after you've found it and why you look for it in the first place:
1) in the 'designer tool' you can look under 'targets' in the right hand tree structure
- when you've found the target table you want the mappings for
- simply right-click and choose 'dependencies'
- in the following dialog uncheck everything except 'mappings'
- in the following right click on the most likely mapping and choose 'open in workspace'
2) in the repository database there is a view called opb_task_inst_run that contains a row for each session that has ever run. You can write simple sql against that view with '%like patterns%' to locate mappings... you may want to add a where clause to 'start time' for the most recent week or so - especially if the repository is old and runtime metadata has never been deleted...
Please write back if you need something different...
I'm not aware of the functionality you're after within informatica, however, the mappings are listed in alphanumeric order which should alleviate this. Within the mapping itself there is search functionality to find transformations within the mapping.
As far as a place to start learning Informatica, informatica tv is one place to get your feet wet https://network.informatica.com/support-videos.jspa

C++ Windows Forms:: Get TabControl Instance from Control (or from anywhere else, if possible)?

I have a TabControl in my Form and a few tools that enable the user to add new tabs in runtime, to delete them, to rename them and to save the whole thing. Of course, starting the program again will load the Tabs again. Each tab also contains a TextBox which will also be saved and loaded.
The next thing I wanted to add was the option to add a tab which contains other tabs.
So basically, I create a TabPage which doesn't contain a TextBox like the other tabs do, but instead contains another TabControl.
At the Time of creation I add one "SubTab" inside the "SubTabControl", but I want to be able to access this TabControl later and add more Tabs to it.
This has been really difficult for me. Any suggestions on how I can create a variable amount of TabControls and still be able to access them individually (to access each of their tabs)? I tried arrays but I couldn't get it to work and I also tried using GetNextControl to return the TabControl as a Control-Type object. This worked up to the point where I wanted to add more Tabs. Unfortunately, the returned object was of type Control, so I couldnt use the functions limited to TabControl.

Lookup Combo that supports remote data - load data only after user wants to

I'm building a VCL c++ builder application. I would like to see if anyone knows of a component that can load data in the lookup upon drop down only after a user has typed a few letters to limit the rows queried? Preferably after pressing Tab, or Enter.
What I would like best is to get a behaviour similar to what Linux command line has, but that might be wishful thinking. The way it would work is to drop down the combo list after user presses tab only if there is multiple options available, and to fill in additional text till the point where characters are not the same anymore, then if user presses tab again, drop down list.
The next best would be if the drop down would only allow drop down if user has typed a few letters, then pressing a specific button opens the dataset with the parameter of the typed text so far, then drops down the combo.
Does a component like this exist?
You can check out TMS Software. I'm not sure if it has something exactly for you, but their components are quite flexible. And you can send a feature request to them - to consider for next update. If you are lucky they might add it to next release.