|
I also work a lot at industrial automation. Unfortunately, there are a lot of bad trends in UI in the industry, and the fixed or fluid design is one of the pain points.
Often, developers don't understand specific needs of the people working in the industry. From the other hand, many of their "requirements" are just the ridiculous artifact of their inertial of thinking and bad habits inadequate to computing, such as the habit to work with the old-time devices. This week, I work with oscilloscopes which themselves run Windows 7.
One especially ridiculous trend it to imitate old analog gauges and scales, with all kinds of shadows and destructing highlights, where a simple numeric display could do the best. I cannot understand vanity of those people, such efforts look miserable to me. There is a trend to use two buttons for on and off, where a check box is the most compact and intuitive.
At the same time, it would be wrong to make bold generalization. In particular, it is important to see a difference between different types of UI, in two aspects: purpose and... touch screen vs. keyboard/mouse.
People cannot do UI for touch screen, face it. Windows and other general-purpose Windowed systems don't provide adequate support. People cannot nicely point a close box with a finger (even with keyboard/mouse, hitting it with a mouse is a mouse is a bad habit which causes fatigue, irritation and poor performance).
One important thing to understand: people use their motoric memory. The body remembers where to click. But this is so only with well-designed touch screen and is not quite applicable to keyboard interface, where fluid design can prevail.
One thing is most certainly failing in usability: MDI. It should be exterminated from everywhere by all means. Microsoft is trying hard to phase it out, for some good reasons. The second thing to get rid of is multiple windows interface. I don't count some modal dialogs, but only if there are not too many of them, and only when the modality is really well motivated, not just by the simplicity of development.
—SA
Sergey A Kryukov
|
|
|
|
|
The type of information display (getting a little off topic I guess) is indeed not the most efficient or concise way to display it I do agree, however I don't think that we can also make a statement that its not useful in all situations. The industry I work in for example (similar to yours), its much easier to interpret quickly a needle pointing to a red range on a gauge than look at a number and ask if its within normal range or getting close to something dangerous. I don't believe that in the industrial automation world that there will ever be a replacement for analog gauges even digitally represented.
A good case study of this is glass cockpits (I'm also a pilot), where it takes a lot longer to interpret numeric data than graphical. Pilots have a few seconds to scan gauges before getting eyes back outside where they need to be. To me, glass cockpit gauges are the best representation because if you notice, they don't have numbers on them, just a needle and colors. The numeric data is underneath. The scale is distracting and doesn't give any additional information...
That being said (and more back to the point), sometimes the best way to represent data isn't the one that makes the most efficient use of space. On top of that we need to logically group data so that its presented in a way that doesn't require the user to switch displays too often.
Maybe a "single form" UI design is the answer to some of that, and maybe WPF is another piece of the puzzle because it's more vector based than raster, but in the world of industrial automation we just aren't there yet.
MDI was a useful container for what we were attempting to accomplish. It provided a container for forms so that they couldn't be moved outside the assigned display (the IA applications we use sometimes use multiple screens from the same computer for 2 users). I still haven't found another way to accomplish this without code-behind.
I'm still not convinced (not saying you aren't convincing, just in general ) that the single form UI Microsoft is moving to is increasing productivity or usability. If we all worked on tablets I would say yes, but we all still work on multiple monitor, multi-tasking computers and the concept doesn't seem well thought out yet...
|
|
|
|
|
Even though you made some good points, I cannot agree with your response on MDI and single-window interface (I hope you understand that I spoke of rich interface where the role of separate windows is played by tabs, expanding/docking panels or other similar elements). As to WPF, I don't know who is "not there". I used to develop WPF-only product, some 4 years ago, and started with WPF even earlier...
—SASergey A Kryukov
|
|
|
|
|
Quote: ... Our field engineers making changes to screens typically use laptops to edit screens that run on 23" monitors, so every time they open a screen, WF graciously resizes them (thanks MS!).
Here is a hack to deal with that frustration. Inherit from this Form instead of Forms.Form.
Imports System.ComponentModel
Imports System.Runtime.InteropServices
Public Class FormWithDesignSize
Inherits Form
Private Const DefaultMax As Int32 = 2000 'set this to whatever you need
Private _MaxDesignWidth As Int32 = DefaultMax
Private _MaxDesignHeight As Int32 = DefaultMax
<Category("Design")> _
<DisplayName("MaxDesignWidth")> _
Public Property aaa_MaxDesignWidth() As Int32 'Prefix aaa_ is to force Designer code placement before ClientSize setting
Get ' avoids need to write customer serializer code
Return _MaxDesignWidth
End Get
Set(ByVal value As Int32)
_MaxDesignWidth = value
End Set
End Property
<Category("Design")> _
<DisplayName("MaxDesignHeight")> _
Public Property aaa_MaxDesignHeight() As Int32 'Prefix aaa_ is to force Designer code placement before ClientSize setting
Get ' avoids need to write customer serializer code
Return _MaxDesignHeight
End Get
Set(ByVal value As Int32)
_MaxDesignHeight = value
End Set
End Property
Protected Overrides Sub SetBoundsCore(ByVal x As Int32, ByVal y As Int32, ByVal width As Int32, ByVal height As Int32, ByVal specified As BoundsSpecified)
If Me.DesignMode Then
' The Forms.Form.SetBoundsCore method limits the size based on SystemInformation.MaxWindowTrackSize
' From the GetSystemMetrics function documentation for SMCXMINTRACK:
' "The minimum tracking width of a window, in pixels. The user cannot drag the window frame to a size
' smaller than these dimensions. A window can override this value by processing the WMGETMINMAXINFO
' message."
' See: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385%28v=vs.85%29.aspx
' This message also appears to control the size set by the MoveWindow API,
' so it is intercepted and the maximum size is set to MaxWidth by MaxHeight
' in the WndProc method when in DesignMode.
' Form.SetBoundsCore ultimately calls Forms.Control.SetBoundsCore that calls SetWindowPos but,
' MoveWindow will be used instead to set the Window size when in the designer as it requires less
' parameters to achieve the desired effect.
MoveWindow(Me.Handle, Me.Left, Me.Top, width, height, True)
Else
MyBase.SetBoundsCore(x, y, width, height, specified)
End If
End Sub
Private Const WMGETMINMAXINFO As Int32 = &H24
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
If Me.DesignMode AndAlso m.Msg = WMGETMINMAXINFO Then
Dim MMI As New MINMAXINFO
' retrieve default MINMAXINFO values from the structure pointed to by m.LParam
Marshal.PtrToStructure(m.LParam, MMI)
' reset the ptMaxTrackSize value
MMI.ptMaxTrackSize = New POINTAPI(_MaxDesignWidth, _MaxDesignHeight)
' copy the modified structure back to LParam
Marshal.StructureToPtr(MMI, m.LParam, True)
End If
End Sub
<StructLayout(LayoutKind.Sequential)> _
Private Class MINMAXINFO
Public ptReserved As POINTAPI
Public ptMaxSize As POINTAPI
Public ptMaxPosition As POINTAPI
Public ptMinTrackSize As POINTAPI
Public ptMaxTrackSize As POINTAPI
End Class
<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure POINTAPI
Public X As Int32
Public Y As Int32
Public Sub New(ByVal X As Int32, ByVal Y As Int32)
Me.X = X
Me.Y = Y
End Sub
Public Overrides Function ToString() As String
Return "(" & X.ToString() & ", " & Y.ToString() & ")"
End Function
End Structure
<DllImport("user32.dll")> _
Private Shared Function MoveWindow(ByVal hWnd As IntPtr, ByVal x As Int32, ByVal y As Int32, ByVal nWidth As Int32, ByVal nHeight As Int32, ByVal bRepaint As Boolean) As Boolean
End Function
End Class
|
|
|
|
|
If I could vote twice I would, thank you. I've been trying to find a good solution for this for a while now.
I owe you a 12-pack.
|
|
|
|
|
You are welcome. I'm glad you find it useful.
|
|
|
|
|
Hi there!
I have a dll with its lib file which i can't add them into my project.
The dll contains functions of a data card which i want to use for data acquistion.
I have uploaded the mentioned files here.
<a href="http://filecloud.io/e87rwzvp">http://filecloud.io/e87rwzvp</a>[<a href="http://filecloud.io/e87rwzvp" target="_blank" title="New Window">^</a>]
<a href="http://filecloud.io/j8rvzg57">http://filecloud.io/j8rvzg57</a>[<a href="http://filecloud.io/j8rvzg57" target="_blank" title="New Window">^</a>]
I'll appreciate it if anyone can help me with that.
Thanks in advance.
|
|
|
|
|
I'm not going to download random code.
Are these .NET assemblies? If not, then referencing them will not work - you'd need to P/Invoke them. Does the manufacturer supply an SDK?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
hi
thanks for your attention
it does not said anything about dll to be in .net framework or not.
i have guessed that it should be .net from the manual and functions provided there.
and those uploaded files are not my code. they are dll and lib files.
|
|
|
|
|
You can't write code by "guessing". You'll need to know what methods are available, and only the manufacturer knows how the device talks to the system (what the driver is capable of)
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
You can only set a reference the .DLL's that are COM-based or .NET-based. Other than that, you MUST have the documentation on what functions the .DLL's export and what types their parameters and return values are and use P/Invoke to call them instead. This is information that you have to get from the manfucturer of your device.
|
|
|
|
|
thanks Eddy Vluggenand and Dave Kreskowiak
I used P/Invoke and it seems it will work with that.
As you mentioned there is just a manual with functions of dll and their parameters.
I will check soon.
Thanks again
|
|
|
|
|
I have created asp.net web application in windows 7. I am able to run locally but i am not able to run from other system.
What could be the possible reason.
If anybody knows, please reply me.
Thanks in advance.
|
|
|
|
|
Where is it hosted - locally? What do you mean with "run from other system" - viewing it in a browser or hosting it?
What about the firewalls? Which server do you use - IIS or something else?
|
|
|
|
|
|
Can you specify the error showing while running on other system I am faced lot of problem related COM components. Some errors can fix by setting necessary privileges for com components . By using DOM settins
|
|
|
|
|
Hello,
I'm recreating the Fenêtre Volante screensaver from the Mac for Windows. I know you can rename a *.exe file to *.scr, and Windows will recognize it as a screensaver when it's in the %WINDIR%\System32 directory.
I'm creating it on a Windows 8 (x86) device, and it is running fine in any directory. It also runs fine when I test it on another Windows 8 device (also x86).
When I'm testing the same .scr file on two Windows 7 (x64) computers in the System32 directory, it says it can either not find the required runtime or it just can't start because the SHIM version cannot be determined or something like that.
But when the executable is not in the System32 directory, it runs fine.
I've tested this with both .Net Framework 4.0 and 4.5.
The screensaver is using the Application Settings to save the screensaver settings.
Can anybody please help me?
Paul van der Stel
|
|
|
|
|
What about SysWOW64 on 64bit OS instead of System32 ?
|
|
|
|
|
Thank you for your (great) reply!
It worked! Why did I not think of this? I feel so stupid...
Paul van der Stel
|
|
|
|
|
hi,
I have to develop asp.net web service using c# and wpf application. my requirement is mentioned bellow.
1) wpf application has to communicate asp.net web service.
2) To display callback messages in wpf application, these call back messages sent by asp.net web service.
could you tell me how to implement to handle callback messages. If delegates are usefull then where to declare the delegate and how to use.
Could you send me the sample if you have.
regards,
chittibabu
|
|
|
|
|
If only someone had written an article[^] here on Code Project about this?
|
|
|
|
|
Hi,
I'm getting with increasing frequency the following Error when building my Forms App:-
Error 1 The build stopped unexpectedly because of an internal failure.
Microsoft.Build.Exceptions.BuildAbortedException: Build was canceled. Failed to successfully launch or connect to a child MSBuild.exe process. Verify that the MSBuild.exe "C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" launches successfully, and that it is loading the same microsoft.build.dll that the launching process loaded. If the location seems incorrect, try specifying the correct location in the BuildParameters object, or with the MSBUILD_EXE_PATH environment variable.
at Microsoft.Build.BackEnd.NodeProviderOutOfProc.CreateNode(Int32 nodeId, INodePacketFactory factory, NodeConfiguration configuration)
at Microsoft.Build.BackEnd.NodeManager.AttemptCreateNode(INodeProvider nodeProvider, NodeConfiguration nodeConfiguration)
at Microsoft.Build.BackEnd.NodeManager.CreateNode(NodeConfiguration configuration, NodeAffinity nodeAffinity)
at Microsoft.Build.Execution.BuildManager.PerformSchedulingActions(IEnumerable`1 responses)
at Microsoft.Build.Execution.BuildManager.HandleNewRequest(Int32 node, BuildRequestBlocker blocker)
at Microsoft.Build.Execution.BuildManager.IssueRequestToScheduler(BuildSubmission submission, Boolean allowMainThreadBuild, BuildRequestBlocker blocker) C:\Users\Bram\Documents\Visual Studio 2012\Projects\SgCntr\SgCntr\SgCntr.csproj SgCntr
Anybody Any Idea for Any reason why?
Most times it just works when I try again. It also doesnot seem to connect to an MS BugReport Option.
Regards,
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: Anybody Any Idea for Any reason why? None, but the starting question remains the same; does it happen when you disable all addins?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Hi,
Got a better picture of when this happens.
In Win User Mode the Code builds mostly fine (but does not run propperly due to access rights, as previously discussed) when in User Mode.(the error in question cropped up once or twice, but restarting the Build process has always solved it so far.)
When I swicth to Win Admin mode and try to buil the very same code in the very same directory I consistently get this error. I am trying to build in Admin mode to prove the point about access rights to the DB.
As for Add Ons, I have VS2012 R2, as it came 'Out of the Box' + all automatic MS Updates. Iow: I have not added anything on to it, and would not know what else to disable.
Thanks,
Bram van Kampen
|
|
|
|
|
hi,
i created a application in dropbox using vb.net 2012 web application, so i using oauth for getting token, so i got the token but other process of account info and files getting and upload like that process i cant do it. so please give a sample application for this requirement, its very helpful to me and also in future reference... Thanks in advance
|
|
|
|
|