Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2020-12

GetClipboardFormatName causing an Error 216

15 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

James Richters

I'm trying to write a programs to get data from the windows clipboard that was put into it with Notepad++ using vertical editing. It uses a non-standard format and I'm trying to figure it out. GetClipboardFormatName is supposed to get me the name of non-standard formats,
but whenever I try to run it, I get a runtime error 216

I found some python code at: https://gist.github.com/adam-p/2514182 that I'm trying to convert to FPC.
My fork is at:
https://gist.github.com/Zaaphod/7d94e1d712a5b9ac2bcb0bc79f039a63 Which shows both the original python code and my FPC attempt

It works fine for standard formats:

Running "i:\programming\gcode\test\clipboard formats.exe " Number of formats: 4
13 CF_UNICODETEXT
16 CF_LOCALE
1 CF_TEXT
7 CF_OEMTEXT

But if I highlight some text in Notepadd++ using vertical editing, holding down Shift and ALT while using the arrow keys to highlight a block of text, and the copy that to the clipboard, I get the following:

Running "i:\programming\gcode\test\clipboard formats.exe " Number of formats: 6
13 CF_UNICODETEXT
49882
Runtime error 216 at $774C246C
$774C246C
$76932F63
$76932EB7
$004017EC main, line 60 of i:/programming/gcode/test/clipboard formats.pas
$00408F67

Line 60 is:
               GetClipboardFormatName(Format_Id,FN,250);

It only gets run for non-standard formats. As I understand it that's all it us supposed to be used for.

It's pretty short program so I pasted it below.

Any ideas on what I'm doing wrong here?

James

---------------------------------------------

uses
   Windows,strings;
Type
   BT = Record
      BT_ID: Byte;
      BT_Name: String;
   End;

Const
builtin_type: Array [0..22] of BT = (
{ 0} (BT_ID:2 ;BT_Name:'CF_BITMAP' ),
{ 1} (BT_ID:8 ;BT_Name:'CF_DIB' ),
{ 2} (BT_ID:17 ;BT_Name:'CF_DIBV5' ),
{ 3} (BT_ID:5 ;BT_Name:'CF_DIF' ),
{ 4} (BT_ID:130 ;BT_Name:'CF_DSPBITMAP' ),
{ 5} (BT_ID:142 ;BT_Name:'CF_DSPENHMETAFILE' ),
{ 6} (BT_ID:131 ;BT_Name:'CF_DSPMETAFILEPICT'),
{ 7} (BT_ID:129 ;BT_Name:'CF_DSPTEXT' ),
{ 8} (BT_ID:14 ;BT_Name:'CF_ENHMETAFILE' ),
{ 9} (BT_ID:15 ;BT_Name:'CF_HDROP' ),
{10} (BT_ID:16 ;BT_Name:'CF_LOCALE' ),
{11} (BT_ID:18 ;BT_Name:'CF_MAX' ),
{12} (BT_ID:3 ;BT_Name:'CF_METAFILEPICT' ),
{13} (BT_ID:7 ;BT_Name:'CF_OEMTEXT' ),
{14} (BT_ID:128 ;BT_Name:'CF_OWNERDISPLAY' ),
{15} (BT_ID:9 ;BT_Name:'CF_PALETTE' ),
{16} (BT_ID:10 ;BT_Name:'CF_PENDATA' ),
{17} (BT_ID:11 ;BT_Name:'CF_RIFF' ),
{18} (BT_ID:4 ;BT_Name:'CF_SYLK' ),
{19} (BT_ID:1 ;BT_Name:'CF_TEXT' ),
{20} (BT_ID:6 ;BT_Name:'CF_TIFF' ),
{21} (BT_ID:13 ;BT_Name:'CF_UNICODETEXT' ),
{22} (BT_ID:12 ;BT_Name:'CF_WAVE' ));

Var
   i,j,Number_Of_Formats : Byte;
   Format_ID : DWord;
   FN : LPTSTR;
   Format_Name : String;
Begin
   FN:=StrAlloc (255);
   OpenClipboard(0);
   Number_Of_Formats := CountClipboardFormats();
   Writeln('Number of formats: ',Number_Of_Formats);
   format_id := 0;
   for i := 1 to Number_Of_Formats do
      Begin
         Format_Name := 'FAILED';
         Format_ID:=EnumClipboardFormats(Format_ID);
         For J:= 0 to 22 do
            Begin
               If Format_ID = builtin_type[J].BT_ID then
                  Format_Name := builtin_type[J].BT_Name;
            End;
         If Format_Name = 'FAILED' Then
            Begin
               FN:='';
               Writeln(Format_ID);
               GetClipboardFormatName(Format_Id,FN,250);
               Writeln(FN);
               If strpas(FN)  '' Then
                  Format_Name := StrPas(FN);
            End;
         Writeln(Format_ID,' ',Format_Name);
     End;
CloseClipboard();
End.

Reply by email

Martin Frb
to James Richters
James Richters wrote
I'm trying to write a programs to get data from the windows clipboard that was put into it with Notepad++ using vertical editing.

Just for Info, SynEdit (trunk) can handle notepad++ column selection

See the code at.
There are 2 common formats (and as a 3rd the one used by SynEdit). NP++ uses one of them, not sure which.

components\synedit\syneditmiscclasses.pp
  TSynClipboardStream = class
     class function ClipboardFormatMSDEVColumnSelect: TClipboardFormat;
     class function ClipboardFormatBorlandIDEBlockType: TClipboardFormat;

IIRC in both cases the text is in the normal ClipBoard.AsText. Each line is one column segment.

'MSDEVColumnSelect' acts as a flag if present.
'Borland IDE Block Type' has a single byte. the value $02 indicates column mode.

Register the format, to get the ID, then check if it is on the clipboard.

Either check the synEdit source, or google the 2 format names....

Reply by email

Alexander Grotewohl
to James Richters: I'm trying to write a programs to get data from the windows clipboard that was put into…

Your

FN:='';

is clobbering the pointer 'FN' with nonsense.

Just leave that line out, it isn't necessary. Or do like FN^:=#0; if you want C-string like functions to report zero length..
Alexander Grotewohl https://dcclost.com ________________________________
Earlier message 129 lines
From: fpc-pascal on behalf of James Richters via fpc-pascal Sent: Wednesday, December 30, 2020 7:09 PM To: 'FPC-Pascal users discussions' Cc: James Richters Subject: [fpc-pascal] GetClipboardFormatName causing an Error 216 I'm trying to write a programs to get data from the windows clipboard that was put into it with Notepad++ using vertical editing. It uses a non-standard format and I'm trying to figure it out. GetClipboardFormatName is supposed to get me the name of non-standard formats, but whenever I try to run it, I get a runtime error 216 I found some python code at: https://gist.github.com/adam-p/2514182 that I'm trying to convert to FPC. My fork is at: https://gist.github.com/Zaaphod/7d94e1d712a5b9ac2bcb0bc79f039a63 Which shows both the original python code and my FPC attempt It works fine for standard formats: Running "i:\programming\gcode\test\clipboard formats.exe " Number of formats: 4 13 CF_UNICODETEXT 16 CF_LOCALE 1 CF_TEXT 7 CF_OEMTEXT But if I highlight some text in Notepadd++ using vertical editing, holding down Shift and ALT while using the arrow keys to highlight a block of text, and the copy that to the clipboard, I get the following: Running "i:\programming\gcode\test\clipboard formats.exe " Number of formats: 6 13 CF_UNICODETEXT 49882 Runtime error 216 at $774C246C $774C246C $76932F63 $76932EB7 $004017EC main, line 60 of i:/programming/gcode/test/clipboard formats.pas $00408F67 Line 60 is: GetClipboardFormatName(Format_Id,FN,250); It only gets run for non-standard formats. As I understand it that's all it us supposed to be used for. It's pretty short program so I pasted it below. Any ideas on what I'm doing wrong here? James --------------------------------------------- uses Windows,strings; Type BT = Record BT_ID: Byte; BT_Name: String; End; Const builtin_type: Array [0..22] of BT = ( { 0} (BT_ID:2 ;BT_Name:'CF_BITMAP' ), { 1} (BT_ID:8 ;BT_Name:'CF_DIB' ), { 2} (BT_ID:17 ;BT_Name:'CF_DIBV5' ), { 3} (BT_ID:5 ;BT_Name:'CF_DIF' ), { 4} (BT_ID:130 ;BT_Name:'CF_DSPBITMAP' ), { 5} (BT_ID:142 ;BT_Name:'CF_DSPENHMETAFILE' ), { 6} (BT_ID:131 ;BT_Name:'CF_DSPMETAFILEPICT'), { 7} (BT_ID:129 ;BT_Name:'CF_DSPTEXT' ), { 8} (BT_ID:14 ;BT_Name:'CF_ENHMETAFILE' ), { 9} (BT_ID:15 ;BT_Name:'CF_HDROP' ), {10} (BT_ID:16 ;BT_Name:'CF_LOCALE' ), {11} (BT_ID:18 ;BT_Name:'CF_MAX' ), {12} (BT_ID:3 ;BT_Name:'CF_METAFILEPICT' ), {13} (BT_ID:7 ;BT_Name:'CF_OEMTEXT' ), {14} (BT_ID:128 ;BT_Name:'CF_OWNERDISPLAY' ), {15} (BT_ID:9 ;BT_Name:'CF_PALETTE' ), {16} (BT_ID:10 ;BT_Name:'CF_PENDATA' ), {17} (BT_ID:11 ;BT_Name:'CF_RIFF' ), {18} (BT_ID:4 ;BT_Name:'CF_SYLK' ), {19} (BT_ID:1 ;BT_Name:'CF_TEXT' ), {20} (BT_ID:6 ;BT_Name:'CF_TIFF' ), {21} (BT_ID:13 ;BT_Name:'CF_UNICODETEXT' ), {22} (BT_ID:12 ;BT_Name:'CF_WAVE' )); Var i,j,Number_Of_Formats : Byte; Format_ID : DWord; FN : LPTSTR; Format_Name : String; Begin FN:=StrAlloc (255); OpenClipboard(0); Number_Of_Formats := CountClipboardFormats(); Writeln('Number of formats: ',Number_Of_Formats); format_id := 0; for i := 1 to Number_Of_Formats do Begin Format_Name := 'FAILED'; Format_ID:=EnumClipboardFormats(Format_ID); For J:= 0 to 22 do Begin If Format_ID = builtin_type[J].BT_ID then Format_Name := builtin_type[J].BT_Name; End; If Format_Name = 'FAILED' Then Begin FN:=''; Writeln(Format_ID); GetClipboardFormatName(Format_Id,FN,250); Writeln(FN); If strpas(FN) '' Then Format_Name := StrPas(FN); End; Writeln(Format_ID,' ',Format_Name); End; CloseClipboard(); End.

Reply by email

Martin Frb
to James Richters: I'm trying to write a programs to get data from the windows clipboard that was put into…
James Richters wrote 9 lines
Var FN : LPTSTR; Begin FN:=''; Writeln(Format_ID); GetClipboardFormatName(Format_Id,FN,250);

Check the msdn help.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getclipboardformatnamea

FN must point to an existing buffer (allocated mem) that receives the result.

FN : Array [0..255]of Byte;
GotLen := GetClipboardFormatName(Format_Id, LPTSTR(@FN[0]),250);

then "move()" the received bytes into a string, make sure to use UniqueString() or similar

Reply by email

Alexander Grotewohl
to Martin Frb

The memory for FN is allocated at the top with StrAlloc()

Alexander Grotewohl https://dcclost.com ________________________________
Earlier message 29 lines
From: fpc-pascal on behalf of Martin Frb via fpc-pascal Sent: Wednesday, December 30, 2020 8:00 PM To: Cc: Martin Frb Subject: Re: [fpc-pascal] GetClipboardFormatName causing an Error 216 On 31/12/2020 01:09, James Richters via fpc-pascal wrote: > Var > FN : LPTSTR; > > Begin > > FN:=''; > Writeln(Format_ID); > GetClipboardFormatName(Format_Id,FN,250); > Check the msdn help. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getclipboardformatnamea FN must point to an existing buffer (allocated mem) that receives the result. FN : Array [0..255]of Byte; GotLen := GetClipboardFormatName(Format_Id, LPTSTR(@FN[0]),250); then "move()" the received bytes into a string, make sure to use UniqueString() or similar

Reply by email

Martin Frb
to Martin Frb: Check the msdn help. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser…
I missed you have
FN:=StrAlloc (255);

in that case see Alexanders response.

Martin Frb wrote 13 lines
FN must point to an existing buffer (allocated mem) that receives the result. FN : Array [0..255]of Byte; GotLen := GetClipboardFormatName(Format_Id, LPTSTR(@FN[0]),250); then "move()" the received bytes into a string, make sure to use UniqueString() or similar _______________________________________________ fpc-pascal maillist  -  https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply by email

James Richters
to Martin Frb: Check the msdn help. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser…

Thank you for the help. I always seem to have difficulties understanding how to interface with windows functions. I did see the msdn help.. to me it seemed that lpszFormatName was the LPTSTR variable that would contain the name, but that's not what is being passed to it at all... it's a POINTER to the variable, the docs never said it was a pointer.

This is what it shows and how I understood it:
int GetClipboardFormatNameA(
UINT format, // an Unsigned Integer Variable LPSTR lpszFormatName, // an LPSTR Variable which I understand is just a PChar int cchMaxCount // an Integer Variable );

There is just nothing anywhere that indicated to me that lpszFormatName was a pointer to a variable. If they were expecting a pointer, then I would think it would be shown something like this:

int GetClipboardFormatNameA(
UINT format,
Pointer to lpszFormatName,
int cchMaxCount
);

Anyway, THANKS for straightening me out on this!

I have it mostly working but when I try to use Move() I end up missing the first character of the format name.
I assume you mentioned using UniqueString() to fix this, but I don't know how to apply it.
Here is what I have now:
Var
   FN : Array[0..255] of Byte;
   Format_Name, Format_Name_Move : String;

...

               Name_Length:=GetClipboardFormatName(Format_Id,LPTSTR(@FN[0]),255);
               If Name_Length >0 Then
                  Begin
                     Format_Name:='';
                     For k:= 0 to Name_Length-1 Do
                        Format_Name:=Format_Name+Chr(FN[k]);
                     Move(FN,Format_Name_Move,Name_Length);
                  End;
               Writeln(Format_ID,'|',Name_Length,'|',Format_Name,'|',Format_Name_Move);
...

Here is the Output, you can see that my loop gets the entire name, but the Move() is missing the first letter..

I:\Programming\Gcode\Test>"Clipboard Formats.exe"
Number of formats: 6
13 CF_UNICODETEXT
49963|17|MSDEVColumnSelect|SDEVColumnSelect
49964|22|Borland IDE Block Type|orland IDE Block Type 16 CF_LOCALE
1 CF_TEXT
7 CF_OEMTEXT

James

Earlier message 29 lines
-----Original Message----- From: fpc-pascal On Behalf Of Martin Frb via fpc-pascal Sent: Wednesday, December 30, 2020 8:00 PM To: Cc: Martin Frb Subject: Re: [fpc-pascal] GetClipboardFormatName causing an Error 216 On 31/12/2020 01:09, James Richters via fpc-pascal wrote: > Var > FN : LPTSTR; > > Begin > > FN:=''; > Writeln(Format_ID); > GetClipboardFormatName(Format_Id,FN,250); > Check the msdn help. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getclipboardformatnamea FN must point to an existing buffer (allocated mem) that receives the result. FN : Array [0..255]of Byte; GotLen := GetClipboardFormatName(Format_Id, LPTSTR(@FN[0]),250); then "move()" the received bytes into a string, make sure to use UniqueString() or similar

Reply by email

James Richters
to Martin Frb: Just for Info, SynEdit (trunk) can handle notepad++ column selection See the code at.…

Thanks for the info on SynEdit. Where can I find the synedit source related to the clipboard? I think the link you indtended ater 'See the code at.' Didn't come though, can you pleaese send it again?

James

Earlier message 30 lines
-----Original Message----- From: fpc-pascal On Behalf Of Martin Frb via fpc-pascal Sent: Wednesday, December 30, 2020 7:51 PM To: James Richters via fpc-pascal Cc: Martin Frb Subject: Re: [fpc-pascal] GetClipboardFormatName causing an Error 216 On 31/12/2020 01:09, James Richters via fpc-pascal wrote: > I'm trying to write a programs to get data from the windows clipboard > that was put into it with Notepad++ using vertical editing. > Just for Info, SynEdit (trunk) can handle notepad++ column selection See the code at. There are 2 common formats (and as a 3rd the one used by SynEdit). NP++ uses one of them, not sure which. components\synedit\syneditmiscclasses.pp TSynClipboardStream = class class function ClipboardFormatMSDEVColumnSelect: TClipboardFormat; class function ClipboardFormatBorlandIDEBlockType: TClipboardFormat; IIRC in both cases the text is in the normal ClipBoard.AsText. Each line is one column segment. 'MSDEVColumnSelect' acts as a flag if present. 'Borland IDE Block Type' has a single byte. the value $02 indicates column mode. Register the format, to get the ID, then check if it is on the clipboard. Either check the synEdit source, or google the 2 format names....

Reply by email

Martin Frb
to James Richters
James Richters wrote
Thanks for the info on SynEdit. Where can I find the synedit source related to the clipboard? I think the link you indtended ater 'See the code at.' Didn't come though, can you pleaese send it again?

Sorry, I assumed SynEdit would be recognized as part of Lazarus (yes its the fpc list, but the name may still be known). So I simply gave a file location in the Lazarus source.

It can be found here:
https://github.com/User4martin/lazarus/blob/master/components/synedit/syneditmiscclasses.pp#L1674

Some of the code is specific to SynEdit (E.g. information on code-folding).

But ReadFromClipboard
https://github.com/User4martin/lazarus/blob/master/components/synedit/syneditmiscclasses.pp#L1699

checks for either flag being present, and that is all you need. => Then the normal text, and line-ends in the text mark where each column ends.

Reply by email

James Richters
to Martin Frb

I don’t have Lazarus, just FPC, Thanks for the link. Thanks for the information, I understand how it works now. I appreciate the help.

James

Earlier message 19 lines
From: fpc-pascal On Behalf Of Martin Frb via fpc-pascal Sent: Thursday, December 31, 2020 12:37 PM To: Cc: Martin Frb Subject: Re: [fpc-pascal] GetClipboardFormatName causing an Error 216 On 31/12/2020 18:11, James Richters via fpc-pascal wrote: Thanks for the info on SynEdit. Where can I find the synedit source related to the clipboard? I think the link you indtended ater 'See the code at.' Didn't come though, can you pleaese send it again? Sorry, I assumed SynEdit would be recognized as part of Lazarus (yes its the fpc list, but the name may still be known). So I simply gave a file location in the Lazarus source. It can be found here: https://github.com/User4martin/lazarus/blob/master/components/synedit/syneditmiscclasses.pp#L1674 Some of the code is specific to SynEdit (E.g. information on code-folding). But ReadFromClipboard https://github.com/User4martin/lazarus/blob/master/components/synedit/syneditmiscclasses.pp#L1699 checks for either flag being present, and that is all you need. => Then the normal text, and line-ends in the text mark where each column ends.

Reply by email

James Richters
to James Richters

I have my project working the way I want it to, but I have one little quirk I am hoping to fix. When I look at the clipboard, the entry for MSDEVColumnSelect has zero length. I’m not too familiar with PChars, but is there a way to set it to zero length? I set it to #0 and it works ok with the #0 in there with Notepadd++ but I think it’s technically not correct. Is there some way to call SetClipboardData(); to have it write just the format ID and zero length data?

Here’s a code snip of the relevant section:

  EmptyClipBoard;
  h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
  pp:=pchar(GlobalLock(h));
  move(p^,pp^,l+1);
  GlobalUnlock(h);
  res:=(SetClipboardData(CF_OEMTEXT,h)=h);
  h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
  pp:=pchar(GlobalLock(h));
  OemToCharBuffA(p,pp,l+1);
  SetClipboardData(CF_TEXT,h);
  GlobalUnlock(h);
  If Vertical then
    Begin
      q:=#0;
      h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
      pp:=pchar(GlobalLock(h));
      move(q^,pp^,l+1);
      SetClipboardData(MSDEVColumnSelect,h);
      GlobalUnlock(h);
      q:=#2#0;
      h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
      pp:=pchar(GlobalLock(h));
      move(q^,pp^,l+1);
      SetClipboardData(BorlandIDEBlockType,h);
      GlobalUnlock(h);
    End;

James

Reply by email

James Richters
to James Richters

I have my project working the way I want it to, but I have one little quirk I am hoping to fix. When I look at the clipboard, the entry for MSDEVColumnSelect has zero length. I’m not too familiar with PChars, but is there a way to set it to zero length? I set it to #0 and it works ok with the #0 in there with Notepadd++ but I think it’s technically not correct. Is there some way to call SetClipboardData(); to have it write just the format ID and zero length data?

Here’s a code snip of the relevant section:

  EmptyClipBoard;
  h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
  pp:=pchar(GlobalLock(h));
  move(p^,pp^,l+1);
  GlobalUnlock(h);
  res:=(SetClipboardData(CF_OEMTEXT,h)=h);
  h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
  pp:=pchar(GlobalLock(h));
  OemToCharBuffA(p,pp,l+1);
  SetClipboardData(CF_TEXT,h);
  GlobalUnlock(h);
  If Vertical then
    Begin
      q:=#0;
      h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
      pp:=pchar(GlobalLock(h));
      move(q^,pp^,l+1);
      SetClipboardData(MSDEVColumnSelect,h);
      GlobalUnlock(h);
      q:=#2#0;
      h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE,l+1);
      pp:=pchar(GlobalLock(h));
      move(q^,pp^,l+1);
     SetClipboardData(BorlandIDEBlockType,h);
      GlobalUnlock(h);
    End;

James

Reply by email

Jean SUZINEAU
to James Richters

Le 01/01/2021 à 00:48, James Richters via fpc-pascal a écrit :

Show quoted text 7 lines
I’m not too familiar with PChars, but is there a way to set it to zero length? I set it to #0 and it works ok with the #0 in there with Notepadd++ but I think it’s technically not correct.

For me, it's correct. C strings are just terminated with a null character, no notion of length, the length is not recorded in the string as in Pascal.

Reply by email

Alexander Grotewohl
to Jean SUZINEAU

yes, this type of thing is why we use Pascal. pchar is your little bucket of ram that FPC in a sense knows nothing about. set it to #0 and pray for the best, cause that's what you do..

Alexander Grotewohl https://dcclost.com ________________________________
Earlier message 13 lines
From: fpc-pascal on behalf of Jean SUZINEAU via fpc-pascal Sent: Friday, January 1, 2021 2:41:18 AM To: Cc: Jean SUZINEAU Subject: Re: [fpc-pascal] GetClipboardFormatName causing an Error 216 Le 01/01/2021 à 00:48, James Richters via fpc-pascal a écrit : I’m not too familiar with PChars, but is there a way to set it to zero length? I set it to #0 and it works ok with the #0 in there with Notepadd++ but I think it’s technically not correct. For me, it's correct. C strings are just terminated with a null character, no notion of length, the length is not recorded in the string as in Pascal.

Reply by email

James Richters
to Alexander Grotewohl
yes, this type of thing is why we use Pascal. pchar is your little bucket

of ram that FPC in a sense knows nothing about. set it to #0 and pray for the best, cause that's what you do..

I'll just leave it with the #0, it doesn't seem to be hurting anything. Thanks to everyone for the help getting this to work. Here is what I ended up with if anyone is curious, or if someone comes across this doing a search.
https://gist.github.com/Zaaphod/7d94e1d712a5b9ac2bcb0bc79f039a63

Also, here is my little console application I needed it for, just as a simple example on how to put the vertical column editing mode into the clipboard
https://github.com/Zaaphod/Inches_To_Feet

James

Reply by email