Outlook 次の未読メールへ移動して既読にする
適当なフォームにボタンとテキストボックスを作って下記コードをボタンに割り当てる。
スレッドビューの場合にはメールの選択が出来ないみたい。謎仕様。。。。。
しかたないのでDisplayメソッドでポップアップさせてしまうか、テキストボックスへの表示にするか。
Private Sub buttonKidokuNext_Click() Dim m As MailItem, e As Explorer, fo As Folder, ms As Items Set e = Application.ActiveExplorer Set fo = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) Set ms = fo.Items.Restrict("[UnRead] = True") If ms.Count = 0 Then Exit Sub ms.Sort "[ReceivedTime]" Set m = ms(1) If fo.Store.IsConversationEnabled Then 'スレッドビューの場合 m.Display False TextBox1.Text = Join(Array(m.ReceivedTime, m.SenderName, m.Subject, m.Body), vbCrLf) Else 'スレッドビューじゃない場合(こっちが理想) e.ClearSelection e.AddToSelection m End If m.UnRead = False End Sub
New-Object -ComObject excel.application のお行儀の悪い楽なお片付け
プログラムなどでExcel操作をすると、プロセスが残ってしまう問題。
残らないようにするには、
Workbook
Worksheet
Range
その他色々・・・・・・・使ったあとに全てのオブジェクトに対して、いちいち
- ReleaseComObject
- 又は FinalReleaseComObject
- 最後におまじないの強制ガベージコレクション?
をしなければならない。そして頑張って片付けたつもりなのに何か開放忘れがあり、結局プロセスが残ってしまうことが良くある。。。。めんどくせえ
お行儀がなんぼのもんじゃいw
スクリプトなどで立ち上げたExcelのプロセスをタスクマネージャで確認してcommandline列を追加すると、"automation -Embedding"という謎のパラメータが入っている。これを手がかりにKillしてやれば良いのでは?
- 推測
- killしたあとのExcelはOSさんが勝手に片付けてくれる
- 実行時間がそれほど長くないプログラムならばリークしたメモリが何日も残ることはない
- ならば、 kill=片付け で問題ないのでは?
#automationのExcelをkillする $pstokill = Get-WmiObject win32_process | where commandline -match "EXCEL.*automation -Embedding" | select ProcessId, name, commandline (Get-Process | where Id -eq $pstokill.ProcessId).kill()
C++Builder用ソースをVisual Studio Codeで閲覧するとき インテリセンスのハイライトがうまく効かない
C++Builder10.2 Tokyoで行った。VCLプロジェクトのソースでだいたい良い感じになった。
それ以外のバージョンやプロジェクトタイプについては分からない。
FastReport対応。
definesはインテリセンスが吐くエラー内容を見て、それらしいものを埋めていった。
compilerArgsにはビルド時に指定されていたオプションを全部つっこんでみた。
.vscode\c_cpp_properties.json を下記の様に作成。
{ "configurations": [ { "name": "Win32", "compilerPath": "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\bin\\bcc32c.exe", "includePath": [ "${workspaceFolder}/**", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\dinkumware64", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\crtl", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\fmx", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\rtl", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\sdk", "C:\\Program Files (x86)\\Embarcadero\\Studio\\19.0\\include\\windows\\vcl", "C:\\Program Files (x86)\\FastReport VCL Enterprise\\LibD25", "c:\\program files (x86)\\embarcadero\\studio\\19.0\\source\\ComServers\\OfficeXP", "c:\\program files (x86)\\embarcadero\\studio\\19.0\\source\\cpprtl\\Source\\except", "c:\\program files (x86)\\embarcadero\\studio\\19.0\\include\\windows\\crtl\\JA", "c:\\program files (x86)\\embarcadero\\studio\\19.0\\include\\windows\\rtl\\JA", "C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\19.0\\hpp\\Win32", ], "intelliSenseMode": "clang-x64", "cStandard": "c11", "cppStandard": "c++11", "defines": [ "VCL_FULL", "_C_AS_CPP", "__BORLANDC__", "UNICODE", "_UNICODE", "_DEBUG", "__clang__", "__declspec(x)=", "__attribute__(x)=", "__builtin_va_list=char*", "__builtin_va_start(v,l)=(v=(va_list)(&l+1))", "__builtin_va_end(v,l)=", "__published=public", "__fastcall=", "__property=", "__classmethod=" ], "compilerArgs": [ "-fdeclspec", "-fms-extensions", "-fno-limit-debug-info", "-fborland-extensions", "-fdiagnostics-format", "borland", "-nobuiltininc", "-nostdsysteminc", "-triple", "i686-pc-win32-omf", "-emit-obj", "-cxx-abi", "borland", "-masm-verbose", "-ffunction-sections", "-fexceptions", "-fcxx-exceptions", "-fseh", "-mdisable-fp-elim", "-fno-spell-checking", "-fno-use-cxa-atexit", "-fno-threadsafe-statics", "-main-file-name" ] } ], "version": 4 }
C++ 戻り値のオーバーロード
戻り値だけが異なる同じ名前の関数をオーバーロード定義は出来ない。
クラスにして型変換オペレータを定義すればほぼ近いことが出来る。
#include <iostream> #include <string> using namespace std; class C { int v; public: C(int _v){ v = _v; } operator int(){ return v * 2; } operator string(){ return to_string(v * 2); } }; int main(){ int r1 = C(3); string r2 = C(4); cout << r1 << endl; cout << r2 << endl; }
Excelの表からSQLのINSERT文のVALUE行作成時、数値以外にシングルクォーテーション
数値以外に対してシングルクォーテーションで囲みたい
Excelでは日付も数値とみなされるので、isNumber関数とかValue関数では判定出来ないが、CELL("format",A1)を使えば、セル書式に基づいて判断できる
セル書式の1文字目は
- 数値 : "F"
- 日付 : "D"
なので"F"以外をシングルクォーテーションで囲めば良い。TEXTJOINとMAPとLAMBDAを組み合わせる。
セル範囲[$A2:$D2]から一発でvalues行を作成
=CONCAT("(",TEXTJOIN(",",FALSE,MAP($A2:$D2, LAMBDA(v, LET( t,"'"&v&"'", d,"'"&TEXT(v,"yyyy/mm/dd hh:mm:ss")&"'", f,LEFT(CELL("format",v),1), IF(f="F",v, IF(f="D",d, t ) ) ) ) )),"),")

一般ユーザにレジストリ変更を一部だけ許可する
通常、一般ユーザはHKEY_CURRENT_USERしか変更出来ないが、HKEY_LOCAL_MACHINEなどの一部だけを許可したいとき。
$regkeyのところは、設定したいレジストリキー。
Users に対して許可する。
ContainerInheritとObjectInheritを指定するので、配下も許可することになる。
$regkey="HKLM:SOFTWARE\WOW6432Node\ImageMagick" $acl=Get-Acl $regkey $idRef = [System.Security.Principal.NTAccount]("Users") $regRights = [System.Security.AccessControl.RegistryRights]::FullControl $inhFlags = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit $inhFlags+= [System.Security.AccessControl.InheritanceFlags]::ObjectInherit $prFlags = [System.Security.AccessControl.PropagationFlags]::None $acType = [System.Security.AccessControl.AccessControlType]::Allow $rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType) $acl.AddAccessRule($rule) $acl | Set-Acl -Path $regkey
確認
$acl=Get-Acl $regkey $acl.Access
固定長テキストファイルから桁指定でcsvファイルへ抜き出し
subAddQuoteは$strの$s文字目から$n文字を抜き出し(ゼロ始まり)
セル内は="xxxx"の形にするので、Excelで開いたときに指数形式に勝手に変換されたり、頭の0を取り除かれたりしない。
col1~3はCSVの列名になる。
function subAddQuote([string]$str, [int]$s, [int]$n){ return "=""" + $str.substring($s,$n) + """" } cat "in.txt" | foreach { [PSCustomObject]@{ col1 = subAddQuote $_ 163 4 col2 = subAddQuote $_ 267 12 col3 = subAddQuote $_ 568 8 } } | export-Csv out.csv