Jump to content
David Schwartz

ways to organize related code in a form?

Recommended Posts

I've been building this "workbench" app of sorts (for lack of a better term for it) that has some contextual stuff at the top, a block at the left that shows files, and a big chunk of overlaid stuff that's in a tabbed notebook with a few levels of sub-notebooks below some of the main tabs. It's designed to simplify a very haphazard and unorganized process where you need to switch between a half-dozen different apps to do things.

 

(I know lots of people detest such designs, but let's not go down that path, ok?)

 

The tabsheets have controls on them, and behind each list/tree control are 5-10 methods, some of which are event handlers for the control. Delphi's IDE doesn't really help with organizing them, and in fact sorts everything alphabetically when it has the chance.

 

I've looked at lots of code over the years, and I've seen most of the same 3 patterns: (1) all the methods are ordered alphabetically by name; (2) they're ordered by function; (3) they're ordered in a way that clusters the methods around a common control (so all the methods for a given treeview are all nearby each other).

 

Today I decided to add a grouping mechanism for something using a TTreeView on a new tab. This has buttons to Add main items (Level=0); Add and remove sub-items (Level=1); Edit text associated with the sub-items; Save/Load to/from storage (INI files); Save/Load to/from the TreeView; and some other minor stuff. (As an aside, I need to save additional data in each of the top-level items, and discovered the use of OnCreateNodeClass in TTreeView (or at least RzTreeView). They're sort of like class helpers, but they let you add data to the storage items.)

 

Anyway, I'm trying to figure out if there's any sane way to collect these related methods together and manage them as a group?

 

I know about Delphi's form templates, but most of the things on this form only have one instance. It's not like there are several of the same things, as there aren't.

 

I wish I could pull this related code into a separate unit, but the damn event handlers make that problematic since they pretty much need to be in the same unit as the form class, unless you set them all up as proxies.

 

Splittiing things into an MVC or MVVM design breaks things along what occur to me as odd lines.

 

I'm curious what approaches others may have taken to address this in larger form units.

Share this post


Link to post
13 minutes ago, David Schwartz said:

I'm curious what approaches others may have taken to address this in larger form units.

So your asking for input on how to organize your big ball of mud while keeping it a big ball of mud? Okay, I've got some of those myself.

 

I don't know why you need to ask for help on this as you seem competent enough to figure this out for yourself by trial and error, but here goes; Generally I organize the functions of a unit as:

  • Global functions.
  • Unit wide (interface section) utility functions.
  • Class constructors/destructor.
  • Class utilities.
  • Class methods ordered by context/task.

Disclaimer: Not completely sober

Share this post


Link to post
Guest

I would like to see the "screenshot" of your tool in use! It's possible?

Share this post


Link to post
4 hours ago, David Schwartz said:

I'm curious what approaches others may have taken to address this in larger form units.

In the first place, I would split in in a number of other forms or frames and host them in the tabsheet and panels you have on the main form.

 

Share this post


Link to post
23 hours ago, Anders Melander said:

 

I don't know why you need to ask for help on this as you seem competent enough to figure this out for yourself by trial and error,

 

For the past decade or so, I've worked remotely mostly maintaining some apps written originally in D4-D7 that have hardly changed. The current place I work has an over-engineered platform that might have made sense back in 2003, but today it looks pretty ancient.

 

Another thing they've all had in common is that refactoring has been made verboten. The second day on this present job I was told "do not touch any of the production code except these things that need to be updated for specific customer tickets." I've been reminded many times in both writing (general warnings to all devs) and verbally in meetings. 

 

I get hired as a supposed "Delphi expert" and then they put me in a straight-jacket and only take it off long enough to replace a screw or nail or tighten-down a loose bolt here and there.

 

That is to say, I have not had much opportunity to see substantial apps written to more contemporary paradigms. I'm curious if apps people write today still end up being structured like they were back in the D4-7 days.

 

I see that due to interesting innovations in the C#/.NET platform, things there can be structured much differently than Delphi. I don't suspect the Delphi language gods will ever bring it up to contemporary standards, let alone keep up, since they seem to have a pretty stubborn allergy to anything that's different from what was in D7, with a few exceptions introduced with D2010 and XE.

 

Things like triadic expressions have a hyper-localized impact. But there are a few things in C# that could substantially alter how our apps are structured if they were adopted. (I'm not holding my breath.)

 

But the folks who hang out here are a quite innovative lot, and I figure if anybody might have figured out some interesting approaches since 2005, maybe there's something useful to share.

 

(I did some work for Boian Mitov a few years back, and the way he structures his code is pretty eye-opening in many ways. It's nothing like what I've ever seen anywhere I've worked maintaining legacy Windows apps. Granted, it's mostly library code, so it's not going to be confined to the boundaries of a typical Delphi Windows app. But still, using his libs in a regular app does result in code with a distinctively different look and feel from most typical code.)

 

Edited by David Schwartz

Share this post


Link to post
17 hours ago, FPiette said:

In the first place, I would split in in a number of other forms or frames and host them in the tabsheet and panels you have on the main form.

I've considered that, but it seems like it would result in a bunch of circular references between the main form and the embedded forms that need to access state data on the main form, especially things the embedded forms manage.

Edited by David Schwartz

Share this post


Link to post
19 hours ago, emailx45 said:

I would like to see the "screenshot" of your tool in use! It's possible?

Nah, it would take too many of them, and a lot of explaining. 

 

This one I'm thinking of is a collection of steps that I found myself doing repeatedly that I figured out how to collect into a single app. It started out as what one might consider enhancements to the File Explorer. We keep flipping between open files and clicking a few things, copying from here and pasting there, opening a file in one app, then finding the file it output and opening it in another app, then previewing its output file(s) and saving them somewhere else. It's a very well-defined process in most respects, and this tool provides access to "next steps" in a couple of mouse clicks without having to sift through open windows stacked on top of each other on the desktop. Later I integrated a bunch of common git functions into it, to help keep our work in sync with git. Git GUIs know about git, but not about our files and how we work with them. This tool makes git follow our overall process without us having to think much about it, which is super helpful because it has been biting us in the ass left and right. We need to be focusing on our tasks at hand, not dealing with the peculiar ways git manages things.

 

Now it's got nearly 10 tabs that help us deal with different tasks. One is a Search panel similar to grep that looks through files in a project with certain extensions. I was using an external search tool for this, but always the same few variations, so I just added a tab with those actions on it. 

 

Another is a tab for notes, and it now has 5 sub-tabs that offer different perspectives on how we invariably have to approach our work. This is very unique to our workflow. I put RichEdits on them so we can highlight text, change font characteristics, etc. Everybody has a different way of taking and organizing notes, and most of the time we sound like the parable of the blind men eating an elephant. We're all working on the same processes, but our perspectives are all very different. Sometimes someone else will have run into something you just ran into, and they may have made a note of it themselves, but nobody has access to each other's notes. We talk in our daily meeting, but this is an effort to get some meaningful structure on our work.

 

For example, we just had a big production mess occur where we had some older logo files suddenly show up on a bunch of invoices that got printed and mailed out. People were blaming git and this and that, then someone happened to ask if there were hyphens or underscores in the logo filenames. Another guy said, yes, but there were some that had both abc_123.png as well as abc-123.png. That sounded familiar, and I dug through my notes and found one I made where I discovered that one of the production tools automatically changes underscores to hyphens. And wouldn't you know ... those hyphenated files were the ones that were "old" and were used on these invoices instead of the ones with underscores! For nearly a decade there was ONE GUY who was doing most of this work, and he has all of this knowledge stashed away in his head. He's gone and now there are four of us eating this elephant and arguing over what parts we're dealing with while nobody is seeing the bigger picture.

 

As I mentioned above, one tab was added just for helping with git. It has several sub-tabs for different git processes. Everything is done with mouse-clicks to avoid typos. One implements our entire "check-in process" (promote to master?) step-by-step. As an aside, I ran into a bug with git where it looks like branch names in git are generally not case-sensitive. But in this case, something in how git was responding to a command showed it was treating a branch name WITH CASE-SENSITIVITY. I discovered it because I made one character in a drop-down list lower-case instead of upper-case, and in certain cases the code acted like it was not a known branch name. I'm still unclear if this is due to submitting the commands via Windows API or if it's a bug in certain git calls.

 

Two others apps are much simpler. They're more of a collection of steps that you might see in a typical Unix script, but in this case we have to launch Windows apps and click a few things. Ironically, these are all parts of a completely automated process, but these versions of the tools cannot be automated. (I'm still trying to figure out how to use the production versions, but they seem to be controlled by another process through some connections that we cannot touch outside of the production network.)

 

My overall goal is to reduce as much of our processing to mouse clicks within highly contextualized displays as possible. It's not the "mouse clicks" part that's new, it's how everything is organized. Most of our processes involve between 3 and 8 different windows apps at the same time. Here I'm either bringing the relevant data into the same app, or popping up another app right when it's needed, then you can close it and proceed.

 

Edited by David Schwartz

Share this post


Link to post
Guest

Just as a painter shows off his finished art, I would like to see how many sketches were needed for this!

Quote

... hard to imagine what Eden would be like without going through physical death!
In dreams, everything is beautiful and possible!
But what if, when we get there, it's a real hell?

 

Share this post


Link to post
2 hours ago, David Schwartz said:

For the past decade or so...

Okay, but that didn't really explain anything. Are you just rubber ducking?

Share this post


Link to post
On 12/5/2020 at 7:34 AM, FPiette said:

In the first place, I would split in in a number of other forms or frames and host them in the tabsheet and panels you have on the main form.

6 hours ago, David Schwartz said:

I've considered that, but it seems like it would result in a bunch of circular references between the main form and the embedded forms that need to access state data on the main form, especially things the embedded forms manage. 

If you have circular reference, that means your frames don't properly expose their features. None of the frame should ever refer to the hosting form! None should ever know that thei are hosted by a form. The frame does his work and returns results back to the hosting form thru methods, properties and events. The components in the frame, making the UI, shall NEVER referenced directly from the outside (Consider those components as strict private). If they must get values from the outside, then properties shall be used for the purpose.

 

Let's take a trivial example: Assume an application having to compute the sum of two numbers and display the result. You build a form having what is required to display the sum and use a frame to let the user input the numbers and compute the sum.

 

The frame would expose properties for the numbers so that the form can initialize it for example from a configuration file having default values. If no initialization required, the form simply do not touch those properties.

 

When the user enter numbers in the frame, code in the frame compute the sum, store the result in a property and trigger an OnSumAvailable event (A TNotifyEvent). The form assign an event handler to the frame OnSumAvailable and from that event handler read the frame property containing the sum and display where it has to be displayed.

 

In that architecture, you have a object derived from TFrame which encapsulate a behavior (UI and computation) and expose properties and event to support the behavior (It could also contain methods) without any assumption about how it is used. There is NO reference in the frame to the rest of the application. The is NO circular reference.

 

In that architecture, the frame don't know and don't care how the computed sum is displayed on the hosting from. And the form don't know and don't care host the numbers are entered by the user. If will have zero impact if the frame is updated to use a track bar to enter the number or simple TEdit and zero impact if the form display the result in TLabel or a fancy 7-digits display component.

  • Like 1

Share this post


Link to post
On 12/5/2020 at 7:32 PM, Anders Melander said:

Okay, but that didn't really explain anything. Are you just rubber ducking?

Sorry, not sure what you're referring to here. 

 

Regardless, I reserve the right to utter nonsense from time to time. 🙂

 

Edited by David Schwartz

Share this post


Link to post
20 hours ago, FPiette said:

If you have circular reference, that means your frames don't properly expose their features. None of the frame should ever refer to the hosting form! None should ever know that thei are hosted by a form.

Ok, gotcha. The main form has a bunch of context, or current state data displayed. I guess I could pass in what's needed to the form.

 

But some of the tabs also update current state. So I guess I'd need to accommodate that.

 

That's what I was thinking of when I said what I said.

 

 

 

Share this post


Link to post
3 hours ago, David Schwartz said:

Ok, gotcha. The main form has a bunch of context, or current state data displayed. I guess I could pass in what's needed to the form.

You should pass the less possible data to the low level. Even if it is easier to pass a huge record with everything, you must refrain. Only pass what is needed.

 

3 hours ago, David Schwartz said:

But some of the tabs also update current state. So I guess I'd need to accommodate that.

The current state will be updated by events from the lower level of code (the frame or embedded form). On by function returning a value.

 

Share this post


Link to post
9 hours ago, David Schwartz said:

Sorry, not sure what you're referring to here. 

Rubber Ducking: Monologuing a description of a problem to someone (or something) in order to get a better understanding of it.

  • Thanks 1

Share this post


Link to post
3 hours ago, Anders Melander said:

Rubber Ducking: Monologuing a description of a problem to someone (or something) in order to get a better understanding of it.

I'm sure @David Schwartz knows what rubber ducking is. If he didn't he'd just have typed it in to a search engine to find out. So I guess he didn't understand how rubber ducking applied here.

Share this post


Link to post
42 minutes ago, David Heffernan said:

I guess he didn't understand how rubber ducking applied here

Yes maybe. I guess I'm just puzzled by the need of posting questions about stuff one can easily or better answer oneself - and the walls of text that has little to do with the topic,

I'm not against rubber ducking, I use it extensively myself, but rubber ducking in public is just wasting other peoples time.

  • Like 1

Share this post


Link to post
Guest

For some people with schizophrenia, but for the most attentive, it would be a way to ask for advice.
It is good to have someone around ... even on a desert island, as is the technological world, where everyone is dominated by their ego.

 

Sometimes, it is necessary to have a duck to talk ... even if he tries to answer!
quack quack

Share this post


Link to post
On 12/7/2020 at 5:51 AM, Anders Melander said:

Rubber Ducking: Monologuing a description of a problem to someone (or something) in order to get a better understanding of it.

Yeah, that probably fits.

 

On 12/7/2020 at 9:01 AM, David Heffernan said:

I'm sure @David Schwartz knows what rubber ducking is. If he didn't he'd just have typed it in to a search engine to find out. So I guess he didn't understand how rubber ducking applied here.

I did not, and ... I work and live alone, so I get to spend plenty of time conversing with Google.  This place is sort of like a virtual "water cooler" for me where I can discuss stuff with people that I can't really discuss with anybody else. Yes, sometimes the internal monologue leaks out. I happen to enjoy reading what people have to say when that happens since I don't get to talk with many folks at all about any of this IRL. 

 

On 12/7/2020 at 9:59 AM, Anders Melander said:

Yes maybe. I guess I'm just puzzled by the need of posting questions about stuff one can easily or better answer oneself - and the walls of text that has little to do with the topic,

I'm not against rubber ducking, I use it extensively myself, but rubber ducking in public is just wasting other peoples time.

Sorry, sometimes I do tend to ramble.

Share this post


Link to post
22 hours ago, David Schwartz said:

Yeah, that probably fits.

...

 

Sorry, sometimes I do tend to ramble. 

  I like to write code as if I am presenting to group of 5 to 10 people. Considering what each person would comment or smirk or nod with. (old guys said C tick for ;  )    
   
   Here we need a navigator class that finds things and saves the view and url in that view. It would be like the finder in the Macintosh or find on your newer D10 palette.


   Also how many of your jobs have a F1 thru F12 spec. that each view has twelve buttons to navigate with? A. pull navigation off What is the fix to keep these buttons working when a view is removed? A. Show only controls that work.
   
   This outline uses the Vcl.Forms.screen  to iterate thru all forms and uses findcomponent to get a reference for bookmarks. The screens object is windows business we are bypassing the need to know much about the forms in the application and use Tcontrol on back side for showing the object.  Windows will show each tab properly when the show event is fired from Menu or button.     
 


outline of test
1.     Make a browser form that has a addressbar and assign drag drops   

2.     At runtime create browser forms and set the parent to each tabsheet set dropdrop too!
2.1    Add a menu // for the mice less plus possible shortcut keys
2.3    add tree node // untested plus 

3.    At runtime populate a flow panel with bookmark objects

4.   drill into tabs look at stuff. 
5.   drop  bookmark on stuff. // enddrag here sets text, form name, controlname.  

6.   Stream the bookmarks to a save file these bookmarks have properties to hold the address bar text and the formname and parent
7.   Next runtime the saved bookmarks are loaded into the flow panel when needed. 

8.    The code to iterate the screens and controls and assigns found form,parent to a reference.
8.1   The bookmark click event is assigned 
       refformParent.show//   as long as the form is not minimized this shows whatever it takes to show the control. 
       refformParent.focus// 
8.2  good time to assign drag drop stuff to buttons that should work across the whole app            
9    I would have the navigator as the main form because the forms are so readily surfaced this way.

 

oops screens is the name of the menu handler--here is example adding a goto for the enduser.

this is runtime loaded from inifile  Note click assigned in here as well

 

Purpose  jump to another form panel. 

procedure addGotos(slGoto: Tstrings);
var
  ii,ss: integer;
  slDetail: Tstrings;
  aGoto: Tpfjumper;
  AformName: string;
  aForm,firstform: Tform;
  aPanel: TPanel;
  agotoName:string;
  aGotoControl: TControl;
begin
  slDetail := TStringList.create;
  for ii := 1 to slGoto.Count - 1 do
  begin
    firstform := nil;
    aGotoControl := nil;

    slDetail.CommaText := slGoto[ii];
    agotoname := slDetail[5];
    aformName := slDetail[0];
    for ss := 0 to Screen.FormCount - 1 do
    begin
      aForm := Screen.Forms[ss];
      if not assigned(firstForm) and (aform.name = aformName) then 
      begin
        firstForm := AForm;
        //since we have panels with the same name we find the appropriate panel
        //when the form is found  
        aPanel := firstform.findcomponent(slDetail[1])as TPanel;
      end;
      if not assigned(aGotoControl) then
       agotocontrol := aForm.FindComponent(agotoName)as Tcontrol;
      if assigned(aGotoControl) and assigned(firstForm) then
      begin
        // saves passes the panel for the jumpstation the gotocontrol knows
        // its owner and parent
        aGoto := TpfJumper.Create(Aform);
        with aGoto do
        begin
          Name := slDetail[2];
          Left := strtoint(slDetail[3]);
          Top  := strtoInt(slDetail[4]);
          width := 80;
          height := 44;
          //Caption := Name;
          hint := Name;
          Flat := True;
          onclick := firstform.onClick;
          gotoControl := aGoToControl;
          parent := aPanel;
          break;
        end;
      end;
    end;
  end;
  slDetail.Free;
end;
 

 

Pat

Edited by Pat Foley
add code example

Share this post


Link to post
On 12/10/2020 at 11:39 AM, Pat Foley said:

  I like to write code as if I am presenting to group of 5 to 10 people. Considering what each person would comment or smirk or nod with. (old guys said C tick for ;  )    
   
   Here we need a navigator class that finds things and saves the view and url in that view. It would be like the finder in the Macintosh or find on your newer D10 palette.


   Also how many of your jobs have a F1 thru F12 spec. that each view has twelve buttons to navigate with? A. pull navigation off What is the fix to keep these buttons working when a view is removed? A. Show only controls that work.
   
   This outline uses the Vcl.Forms.screen  to iterate thru all forms and uses findcomponent to get a reference for bookmarks. The screens object is windows business we are bypassing the need to know much about the forms in the application and use Tcontrol on back side for showing the object.  Windows will show each tab properly when the show event is fired from Menu or button.     
 


outline of test
1.     Make a browser form that has a addressbar and assign drag drops   

2.     At runtime create browser forms and set the parent to each tabsheet set dropdrop too!
2.1    Add a menu // for the mice less plus possible shortcut keys
2.3    add tree node // untested plus 

3.    At runtime populate a flow panel with bookmark objects

4.   drill into tabs look at stuff. 
5.   drop  bookmark on stuff. // enddrag here sets text, form name, controlname.  

6.   Stream the bookmarks to a save file these bookmarks have properties to hold the address bar text and the formname and parent
7.   Next runtime the saved bookmarks are loaded into the flow panel when needed. 

8.    The code to iterate the screens and controls and assigns found form,parent to a reference.
8.1   The bookmark click event is assigned 
       refformParent.show//   as long as the form is not minimized this shows whatever it takes to show the control. 
       refformParent.focus// 
8.2  good time to assign drag drop stuff to buttons that should work across the whole app            
9    I would have the navigator as the main form because the forms are so readily surfaced this way.

 

oops screens is the name of the menu handler--here is example adding a goto for the enduser.

this is runtime loaded from inifile  Note click assigned in here as well

 

Purpose  jump to another form panel. 

procedure addGotos(slGoto: Tstrings);
var
  ii,ss: integer;
  slDetail: Tstrings;
  aGoto: Tpfjumper;
  AformName: string;
  aForm,firstform: Tform;
  aPanel: TPanel;
  agotoName:string;
  aGotoControl: TControl;
begin
  slDetail := TStringList.create;
  for ii := 1 to slGoto.Count - 1 do
  begin
    firstform := nil;
    aGotoControl := nil;

    slDetail.CommaText := slGoto[ii];
    agotoname := slDetail[5];
    aformName := slDetail[0];
    for ss := 0 to Screen.FormCount - 1 do
    begin
      aForm := Screen.Forms[ss];
      if not assigned(firstForm) and (aform.name = aformName) then 
      begin
        firstForm := AForm;
        //since we have panels with the same name we find the appropriate panel
        //when the form is found  
        aPanel := firstform.findcomponent(slDetail[1])as TPanel;
      end;
      if not assigned(aGotoControl) then
       agotocontrol := aForm.FindComponent(agotoName)as Tcontrol;
      if assigned(aGotoControl) and assigned(firstForm) then
      begin
        // saves passes the panel for the jumpstation the gotocontrol knows
        // its owner and parent
        aGoto := TpfJumper.Create(Aform);
        with aGoto do
        begin
          Name := slDetail[2];
          Left := strtoint(slDetail[3]);
          Top  := strtoInt(slDetail[4]);
          width := 80;
          height := 44;
          //Caption := Name;
          hint := Name;
          Flat := True;
          onclick := firstform.onClick;
          gotoControl := aGoToControl;
          parent := aPanel;
          break;
        end;
      end;
    end;
  end;
  slDetail.Free;
end;
 

 

Pat

Pepto-Bismol might help with that...

  • Haha 1

Share this post


Link to post

Maybe this helps:

 

"Because they are not good at looking at things from the listener’s point of view and considering what type of information would help explain a point, their conversations often are disjointed and lack logical or meaningful connections. They tend to ramble on, go off on tangents, or not focus on any particular point. What drives the way they talk is what they are focused on, what they are interested in rather than what holds the attention of whoever they are conversing with. In one-on-one conversations and in groups, they stand out as disorganized, jumbled and confused due to the mismatch between what they want to say and the topic at hand.

 

"A frequent reaction of someone conversing with an adult who has Asperger’s is to experience the person as thinking out loud to themselves, rather than trying to have a mutual conversation. Whatever comes to mind is said out loud."

 

Roberson, Kenneth. Adult Asperger's Syndrome: The Essential Guide 

 

This is something I've been learning about myself over the past year. It explains a lot of ways people have regarded me since I was very young. This is just a small part of it. Thanks for noticing.

Edited by David Schwartz
  • Thanks 1

Share this post


Link to post
Guest

We hope it doesn't develop into Tourette's Syndrome! :classic_ninja:

Share this post


Link to post
On 12/12/2020 at 7:26 PM, David Schwartz said:

Maybe this helps:

 

"Because they are not good at looking at things from the listener’s point of view ... mismatch between what they want to say and the topic at hand.

Roberson, Kenneth. Adult Asperger's Syndrome: The Essential Guide 

...

 

Boy,

I hope not. WOW that is spot on diagnosis I thought it was simply a setting boundaries issue mixed with Irish Alzheimer's 'just able to remember who to hold a grudge against.' But I will work on active listening skills where both the speaker and listener learn from the conversation. Thanks.

.
My suggestion for you is sell the goodness of an improved codebase to the boss who tells marketing boss to offer improved product to customers who may be getting approached by unscrupled vendors. These customers may be getting an itch by a vendor to move to 'new' stuff and conversations with the customer about your company's 'new' ointment is needed. Can any work being done now use overloaded procedures being passed (enlightened) allowing existing procedures to keep being passed(deprecatedrD7) 

 

For me I should have asked are the circular references caused by a tabsheet management routine or is it needing something like shared DataModule. Only if the former should I have mentioned using Tcontrols and adding the custom Component coding horror I presented as example of reducing circular references.  Also my control is an example of leaving argument names from a refactor into a control.  

 

The caveat on controls is a published property like gotoControl can't be renamed maketopwindowControl without breaking old source in old D.  New D simply doesn't allow the design window to show but it will compile it.  The bigger issue should a control show everything like a treeview or hide everything like a menu. In runtime tabsheets are only showing when selected. Showing all the tabs is needed only in design. In runtime only one please. The user walks thru the tabsheets with treeview using keyboard keys. CRUD and back/next buttons can be added. Launch another instance of the program with inifile data shows the state of the program a year earlier.  Right clicking on task bar set instances windows side by side or stacked that should answer the first question.      

Share this post


Link to post
On 12/12/2020 at 11:53 PM, emailx45 said:

We hope it doesn't develop into Tourette's Syndrome! :classic_ninja:

for sure! 🙂 Luckily it's a genetic neurological disorder that comes at birth and does not "develop". It actually sort of "mellows out" (in a manner of speaking) over time as one develops compensatory behaviors.

 

It's most noticeable in youth. 

 

This whole thing got started last year when I was talking with my sister who has a couple of daughters who the school regards as "special needs". (This is America where anything outside of "normal" is regarded as "broken" or "faulty" in some respect.)

 

One kid was diagnosed with ADD / ADHD and the other was diagnosed with two forms of dyslexia. Both have genius-level IQs so it's clearly not innate abilities.

 

I mentioned that if they knew what these things were back when I was in school, they probably would have diagnosed me with ADD and/or ADHD. 

 

My sister replied, "No, they probably would have diagnosed you with Aspurger's, You have classic symptoms."

 

I wasn't sure what to make of that. I've been poking around the edges of it for the past year or so and started looking more closely over the past few months. Frankly, I'm amazed at how dead-on some of the recognized symptoms are at identifying things I've encountered throughout my life that up until now had no explanation. They have always look like random things and no particular pattern. But given this context, I can actually see a very clear and consistent pattern.

 

The main reason I'm even bothering to discuss this here is because I've run into lots of programmers over the years who, in retrospect, probably have undiagnosed Asperger's as well. It's considered a "disability", now defined as an "Autistic Spectrum Disorder". They don't test so-called "high-functioning" people for that, although I don't know what might happen today now that they know all this stuff.

 

But it seems that the same cross-wiring that results in odd behavioral issues also makes those with Aspurger's particularly well-suited for programming and engineering jobs, as well as patent lawyers and certain roles in medical research.

 

I did work with a guy once who has Tourette's. His whole family had it and they were all part of some long-term study. Today he's the director of a bioinformatics lab doing genetic and genomic research.

 

Edited by David Schwartz
  • Like 1

Share this post


Link to post

OT: You're on the same boat with Albert Einstein, Bill Gates ... There is a book of psycho diagnostics. I don't remember the name. Originally there were 500 diagnostics. Today there are 5,000 of them !!! High IQ means nothing. Psychologists have not taken him very seriously for 30 years. No one knows exactly what it is. Not even the author himself. He pointed this out.

I have always thought differently than the general population. That's why I've always been considered a weirdo. Now I take offense if someone tells me I'm normal:classic_smile:

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×