DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(2) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | Nomal入力値を元に描画させたい(2) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | NomalVSTOとWebView2の共存って可能?(2) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | NomalDataGridViewの特定セルにボタンを配置する方法(3) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalTask.Runの使い方(4) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalランダムファイルを高速化させたい(5) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | Nomal印刷部数の固定(1) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomalプログラムについて。(2) | Nomal拡張子関連付けのサンプルで削除時 例外発生(1) | Nomalユーザーコントロールをフォームで使用した時のエラー(6) | NomalマルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する(12) | Nomal画像の大きさを取得するには(4) | Nomalファイルがドライブ内で占有する容量(3) | NomalC#FormのXボタンイベントで、e.Cancel が使えない(2) | NomalAxWindowsMediaPlayerでプレイリストの途中から再生するには(2) | NomalWebView2でJavaScriptの実行の終了イベント(4) | NomalDataTableのDataRowVersion毎のInt型値の比較がうまくいかない(5) | NomalGPTかMBRを判断したい(2) | Nomalアセンブリ言語について。(1) | Nomalマクロについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomalアセンブリ言語について。(20) | Nomalシステムコールについて。(2) | Nomal Parallel.Forで思ったより早くならない(5) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomalコーディングについて。(3) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | NomalAngleSharpのクエリー文(2) | Nomalデフォルトプロパティを使いたい(6) | Nomalテキストボックスでの制御(7) | NomalUSBカメラをピクチャボックスに表示(3) | Nomal二次元配列内の文字の置き換え(3) | Nomalcolor型を引数にする方法(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | NomalEndConnectでのエラー(2) | Nomalボタンクリック時のLeaveイベントについて(1) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(2) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomal非同期プログラミング時のConsole.WriteLineの動作(4) | NomalC#からストアドにDecimalを渡すと値が丸められる(4) | Nomalインスタンスの型を文字列で指定したい(2) | NomalSendKeys.Sendが効いていない(2) | Nomal他のプロジェクトのコントロールがツールボックスに表示されない(3) | Nomal複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい(9) | Nomal呼び出し元によってWebApi側の処理速度に差が出る(1) | NomalPanelのDock=Topだとうまくいかない。代替案。(2) | Nomal.NetでのIPv6の比較(5) | Nomal.Net 5.0 におけるDLL参照問題?(7) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | Nomal親スレッドへ処理の移譲(7) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal新たにshowしたフォームでのボタンのクリック(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) |



■記事リスト / ▼下のスレッド
■34738 / 親記事)  テキストボックスでの制御
□投稿者/ 炎の妖精さん 一般人(3回)-(2021/05/26(Wed) 09:18:40)
  • アイコン環境/言語:[Win10 VB.NET] 
    分類:[.NET] 

    2021/05/26(Wed) 09:55:32 編集(投稿者)

    DOBON.NET様のサイトには大変お世話になっております。

    テキストボックスにて
    以下の制御を実装したいと考えているのですが可能しょうか?
    もし制御が複雑になりそうな場合、別の方法を検討します。


    @キャレット位置によってインクリメントの値を変えたい(|←キャレット)
    ex1) 1|23.45 ⇒ 2|23.45
    ex2) 123|.45 ⇒ 124|.45
    ex3) 123.45| ⇒ 123.46|

    Aキャレット先頭位置に移動不可
     先頭は1文字2文字目の間にキャレットがあるようにしたい(Homeキー押下や先頭位置でマウスクリックしても常に先頭に移動しないようにしたい)
    ex1) 123.4|5 ⇒ 1|23.45
違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■34742 / ResNo.3)  Re[3]: NumericUpDownコントロールでの制御
□投稿者/ 魔界の仮面弁士 大御所(1338回)-(2021/05/26(Wed) 15:49:05)
  • アイコンNo34741に返信(炎の妖精さんさんの記事)
    >> NumericUpDown だと、キーボードの上下キーやスピンボタンを操作して
    >> 増減させたときに、キャレット位置がリセットされてしまう仕様ですよね。

    この問題は、リセット後に再復帰させることでクリアできるかも。

    Inherits NumericUpDown
    Protected Overrides Sub UpdateEditText()
     Dim upDownEdit = Controls.OfType(Of TextBoxBase)().Single()
     Dim pos = upDownEdit.SelectionStart
     MyBase.UpdateEditText()
     upDownEdit.SelectionStart = pos
    End Sub


    > VB6のNumericUpDownコントロールの制御が

    VB6 に NumericUpDown コントロールは付属していなかったような…?
    そのコントロールのファイル名や、
    デザイン時のプロパティ設定を教えていただけますか?

    形状が似たものとして、UpDown Control (mscomct2.ocx) や
    Outrider SpinButton Control (spin32.ocx) はありますが、
    これらは TextBox ではありませんし。


    > その通りです。
    > 最大値:999.99 最小値:0.00  ※負の値は無し

    テキスト入力中のキャレット位置については、どう扱う予定なのでしょうか?

    Backspace で文字列が消されたり、
    複数の文字を選択した状態でキー入力で上書きされることもありますよね。


    > 次の桁に繰り上げ、繰り下げをしたいです。
    Incrment させたい値を算出するために、キャレット位置と
    現在のテキスト内容が必要ですね。

    System.Windows.Forms.UpDownBase+UpDownEdit クラスを取得し、
    TextBoxBase.SelectionStart プロパティが変化した時に
    Text プロパティに対して何文字目の位置にいるかを
    特定するコードを用意する必要がありそうです。

    ただし RichTextBox とは異なり、SelectionChanged イベントに
    相当するものが無いのが最大のネックかも。
    (先のコードでは Idle イベントで代用)
違反を報告
引用返信
■34743 / ResNo.4)  Re[4]: NumericUpDownコントロールでの制御
□投稿者/ 魔界の仮面弁士 大御所(1339回)-(2021/05/26(Wed) 16:26:38)
  • アイコンNo34742に追記(魔界の仮面弁士の記事)
    > VB6 に NumericUpDown コントロールは付属していなかったような…?
    > そのコントロールのファイル名や、
    > デザイン時のプロパティ設定を教えていただけますか?

    ここは気になる所なので、確認よろしくお願いします。


    > Text プロパティに対して何文字目の位置にいるかを
    > 特定するコードを用意する必要がありそうです。

    手抜きサンプル。

    ProposeIncrementValue の実装がイマイチですが、
    ある程度はそれっぽく動くかも。

    Option Strict On
    Imports System.Text.RegularExpressions
    Partial Public NotInheritable Class NumericUpDownEx
     Inherits NumericUpDown
     Protected Overrides Sub UpdateEditText()
      Dim upDownEdit = Controls.OfType(Of TextBoxBase)().Single()
      Dim pos = upDownEdit.SelectionStart
      MyBase.UpdateEditText()
      upDownEdit.SelectionStart = pos
      Increment = ProposeIncrementValue(pos)
     End Sub

     Protected Overrides Sub OnTextBoxKeyDown(source As Object, e As KeyEventArgs)
      Dim c = DirectCast(source, TextBoxBase)
      Increment = ProposeIncrementValue(c.SelectionStart)
      MyBase.OnTextBoxKeyDown(source, e)
      Increment = ProposeIncrementValue(c.SelectionStart)
     End Sub

     Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
      Dim c = Controls.OfType(Of TextBoxBase)().Single()
      Increment = ProposeIncrementValue(c.SelectionStart)
      MyBase.OnMouseClick(e)
      Increment = ProposeIncrementValue(c.SelectionStart)
     End Sub

     Private Function ProposeIncrementValue(pos As Integer) As Decimal
      '0.00〜999.99 の範囲を前提とした手抜き実装
      Dim m = Regex.Match(Text, "(?<Left>\d+)\.(?<Right>\d+)")
      If Not m.Success Then
       Return 0D
      Else
       Dim L = m.Groups("Left").Value
       'Dim R = m.Groups("Right").Value
       If L.Length + 3 = pos Then
        Return 0.01D
       ElseIf L.Length < pos Then
        Return 0.1D
       ElseIf L.Length = 3 Then
        If pos <= 1 Then
         Return 100D
        ElseIf pos = 2 Then
         Return 10D
        Else
         Return 1D
        End If
       ElseIf L.Length = 2 Then
        If pos <= 1 Then
         Return 10D
        Else
         Return 1D
        End If
       ElseIf L.Length <= 1 Then
        Return 1D
       Else
        Return 0D
       End If
      End If
     End Function
    End Class
違反を報告
引用返信
■34744 / ResNo.5)  Re[4]: NumericUpDownコントロールでの制御
□投稿者/ 炎の妖精さん 一般人(5回)-(2021/05/26(Wed) 17:31:43)
  • アイコン> >> NumericUpDown だと、キーボードの上下キーやスピンボタンを操作して
    > >> 増減させたときに、キャレット位置がリセットされてしまう仕様ですよね。
    >
    > この問題は、リセット後に再復帰させることでクリアできるかも。
    ソースの提示、ありがとうございます。参考になります。


    >>VB6のNumericUpDownコントロールの制御が
    >
    > VB6 に NumericUpDown コントロールは付属していなかったような…?
    > そのコントロールのファイル名や、
    > デザイン時のプロパティ設定を教えていただけますか?
    >
    > 形状が似たものとして、UpDown Control (mscomct2.ocx) や
    > Outrider SpinButton Control (spin32.ocx) はありますが、
    > これらは TextBox ではありませんし。
    VB6の開発環境が構築出来ていない為、ソース上での確認になりますが、
    XNUM.OCXのライブラリが適用されていました。(リネームされた場合は申し訳ありませんが元のライブラリは不明です)


    > テキスト入力中のキャレット位置については、どう扱う予定なのでしょうか?
    >
    > Backspace で文字列が消されたり、
    > 複数の文字を選択した状態でキー入力で上書きされることもありますよね。
    複数文字の選択は出来ないのが望ましいですが、制御が複雑になりそうなので複数選択しないように注釈を載せておきます。
    Backspaceキーでの制御ですが
    ex1) 100|.00 ⇒ 10|.00
    ex1) 1|.00 ⇒ 0|.00
    ex1) 100.23| ⇒ 100.20|
    ex1) 100.2|3 ⇒ 100.3|0
    という制御になります。

違反を報告
引用返信
■34745 / ResNo.6)  Re[5]: NumericUpDownコントロールでの制御
□投稿者/ 魔界の仮面弁士 大御所(1340回)-(2021/05/26(Wed) 19:19:47)
  • アイコンNo34744に返信(炎の妖精さんさんの記事)
    > XNUM.OCXのライブラリが適用されていました。

    Visual Studio 6.0 / Visual Basic 6.0 標準のものではないですよね。
    自作のライブラリですか?

    サードパーティ製品だとしたら、製品名まで分からないと
    第三者には何のことか分からないです。(^_^;)


    > Backspaceキーでの制御ですが
    > ex1) 100|.00 ⇒ 10|.00
    普通に操作すれば、
     "100|.00" → "10|.00" ⇒補正後⇒ "|10.00"
    になってしまいますが、 No34742 の応用で補正前後の SelectionStart を維持すれば、
     "100|.00" → "10|.00" ⇒補正後⇒ "10|.00"
    とできますね。


    > ex1) 1|.00 ⇒ 0|.00
    通常の操作では、
     "1|.00" → "|.00" ⇒補正後⇒ "|0.00"
    になる流れですが、「SelectionStart が 0 の時は 1 に修正する」という処理を組み込めば
     "1|.00" → "|.00" ⇒補正後⇒ "0|.00"
    にできるでしょう。

    ここで言う補正処理とは、UpdateEditText() メソッドの呼び出しを指しています。
    UpdateEditText() メソッドは通常、「LostFocus 時」または
    「ユーザー編集後の最初の Value プロパティ参照時」に呼ばれるようになっています。


    NumericUpDown には、補正処理に関連するメソッドとして、下記のものが用意されています。

     Protected Overridable Sub UpdateEditText()
      … オーバーライド可能。
        値が編集されていた場合に、Text プロパティを補正するためのもの。

     Protected Sub ParseEditText()
      … オーバーライドできない。
        Value プロパティを更新し、UserEdit プロパティを False にするもの。

     Protected Overridable Sub ValidateEditText()
      … オーバーライド可能。
        既定では ParseEditText() と UpdateEditText() を呼ぶだけ。


    > ex1) 100.23| ⇒ 100.20|
    バックスペースを 2 回押した場合は
     "100.23|" → "100.2|" → "100.|" ⇒補正後⇒ "100.00|"
    で、1 回だけなら
     "100.23|" → "100.2|" ⇒補正後⇒ "100.20|"
    という流れと読み取りましたが、如何でしょうか。
    キャレットの後ろに文字列が無ければ、補正後は末尾になる、という想定です。

    この想定は、そちらの認識と相違ありますか?



    > ex1) 100.2|3 ⇒ 100.3|0
    > という制御になります。
    @ "100.2|3" → "100.|3" ⇒補正後⇒ "100.|30"
    A "100.2|3" → "100.|3" ⇒補正後⇒ "100.3|0"
    B "100.2|3" → "100.|3" ⇒補正後⇒ "100.30|"
    のパターンのうち、Aになるわけですね。(自分は@を予想していました)
    この場合、キャレット位置はどのようなルールで算出される想定でしょうか。

    私の予想はこんな感じでした。

    @案:キャレットがピリオド直後にあったので、補正後もピリオドの直後となる
    A案:小数部に居た場合、末尾から数えて 1 桁目なので、補正後も小数部の末尾から 1 桁目
    B案:小数部が補正されて桁数が変化した場合、補正後は小数部の末尾となる



    ついでに、小数点が削除された場合の算出案

    C "1.|23" → "1|23" ⇒補正後⇒ "1|23.00"  整数部の先頭 1 文字目を維持する想定
    D "100.|23" → "100|23" ⇒補正後⇒ "999.99|"  範囲外の値だった場合は末尾固定案
    E "100.|23" → "100|23" ⇒補正後⇒ "999|.99"  整数部の左から3文字目に居たので、補正後も整数部の左から3文字目
    F "100.|23" → "100|23" ⇒補正後⇒ "9|99.99"  整数部の百の位の位置に居たので、補正後も整数部の百の位


    小数部にフォーカスが行かないようにできれば良いのですが、ドラッグ操作での範囲選択もあるため、
    小数部にカーソルが完全に行かないように制限するのは難しいでしょうね。
違反を報告
引用返信
■34746 / ResNo.7)  Re[5]: NumericUpDownコントロールでの制御
□投稿者/ 炎の妖精さん 一般人(6回)-(2021/05/26(Wed) 21:52:17)
  • アイコン魔界の仮面弁士さん

    ありがとうございます。
    大変参考になります。

    提示頂いたコードを参考に反映させていきます。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34731 / 親記事)  USBカメラをピクチャボックスに表示
□投稿者/ はる 一般人(1回)-(2021/05/22(Sat) 22:58:01)
  • アイコン環境/言語:[Windows10 VisualStudio2019 c# Framework4.8] 
    分類:[.NET] 

    初めて投稿します。
    OpenCvSharp4を使用してUSBカメラをピクチャボックスに表示するプロクラムを作成しています。

    1280×720は表示できるんですが、これ以上サイズをあげると
    「 graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows); の行で
    保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。'」のエラーが表示されます。
    いろいろ調べてみたのですが原因がわからず。

    詳しい方いらっしゃいましたら教えて頂けないでしょうか?
    宜しくお願い致します。



    int WIDTH = 1280;
    int HEIGHT = 720;
    Mat frame = new Mat();
    VideoCapture capture = new VideoCapture();
    Bitmap bmp ;
    Graphics graphic;

    private void OpenCv()
    {
    //カメラ画像取得用のVideoCapture作成
    capture = new VideoCapture(0);
    if (!capture.IsOpened())
    {
    MessageBox.Show("使用できるカメラがありません。");
    return;
    }
    capture.FrameWidth = WIDTH;
    capture.FrameHeight = HEIGHT;

    frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3);

    bmp = new Bitmap(frame.Cols, frame.Rows, (int)frame.Step(), System.Drawing.Imaging.PixelFormat.Format24bppRgb, frame.Data);

    PicOpenCv.Width = frame.Cols;
    PicOpenCv.Height = frame.Rows;

    graphic = PicOpenCv.CreateGraphics();

    BgWorker.RunWorkerAsync();
    }

    private void BgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows);
    }

    private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker bw = (BackgroundWorker)sender;

    while (!BgWorker.CancellationPending)
    {
    capture.Grab();
    OpenCvSharp.Internal.NativeMethods.videoio_VideoCapture_operatorRightShift_Mat(capture.CvPtr, frame.CvPtr);
    bw.ReportProgress(0);
    }
    }

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34732 / ResNo.1)  Re[1]: USBカメラをピクチャボックスに表示
□投稿者/ 魔界の仮面弁士 大御所(1334回)-(2021/05/23(Sun) 12:04:49)
  • アイコンNo34731に返信(はるさんの記事)
    > 他のメモリが壊れていることが考えられます。'」のエラーが表示されます。
    フィールド変数である private Mat frame; が
    UI スレッドと作業スレッドの双方で共有されている点が気になりました。

    スレッドを跨がないよう、ローカル変数で処理されては如何でしょう。

    たとえば、ReportProgress の第二引数に対して、
    frame.Cols と frame.Rows の 2 つを(int[]、Size、Point、Recangle 等で)渡し、
    それを ProgressChanged 時に e.UserState から受け取って使うとか。


    > OpenCvSharp4を使用してUSBカメラをピクチャボックスに表示するプロクラムを作成しています。

    VideoCapture だとカメラ指定がインデックス管理のみだったので、
    複数のカメラ(内蔵前面カメラ、内蔵背面カメラ、外部USBカメラなど)の指定が
    しにくかったり、USB ポートを変えると番号がズレることがあって
    個人的にはあまり使わなくなってしまいました。
    (最近は、AForge.Video.DirectShow で撮影)
違反を報告
引用返信
■34734 / ResNo.2)  Re[2]: USBカメラをピクチャボックスに表示
□投稿者/ はる 一般人(3回)-(2021/05/23(Sun) 13:57:42)
  • アイコン魔界の仮面弁士さん。ありがとうございます。

    No34732に返信(魔界の仮面弁士さんの記事)
    > ■No34731に返信(はるさんの記事)
    >>他のメモリが壊れていることが考えられます。'」のエラーが表示されます。
    > フィールド変数である private Mat frame; が
    > UI スレッドと作業スレッドの双方で共有されている点が気になりました。
    >
    > スレッドを跨がないよう、ローカル変数で処理されては如何でしょう。

    試してみましたが、同じエラーでした。
     サイズを大きくしても、
    > graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows);
     のframe.ColsとRowsが1280×720になります。

    > frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3); MatType.CV_8UC3にしてるのが原因かなとは思うのですが詳細な説明が見つけれず。。

    >(最近は、AForge.Video.DirectShow で撮影)
    は初めて聞きました。検索して出てきたのがOpenCvだったので。
    これも調べてみます。

      
違反を報告
引用返信
■34735 / ResNo.3)  Re[2]: USBカメラをピクチャボックスに表示
□投稿者/ はる 一般人(5回)-(2021/05/23(Sun) 16:20:14)
  • アイコン魔界の仮面弁士さん
    > (最近は、AForge.Video.DirectShow で撮影)

    ものすごく簡単でした。
    こちらに切り替えます。ありがうございました。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34730 / 親記事)  二次元配列内の文字の置き換え
□投稿者/ Wan 一般人(4回)-(2021/05/22(Sat) 22:09:35)
  • アイコン環境/言語:[Windows10 VisualStudio2019 VB.net WindowsForm] 
    分類:[.NET] 

    Excelのあるセル範囲を1列だけ選択して配列に変換したとします。
    Dim Rng As Excel.Range
    Dim Arry As Object(,)
    Rng = myExcel.Application.Selection
    Arry = Rng.Value2
    すると、次のような二次元配列ができました。
    (1,1) a
    (2,1) b
    (3,1) c
    (4,1) a
    (5,1) b
    (6,1) d
    (7,1) e
    (8,1) a
    これが約1000行位あります。
    後に、Excelのセルに戻す必要性から、配列としての構造を変えたくありません。

    (質問)
    配列を検索してaをAに変換する方法を教えて頂けませんでしょうか?
    一旦、一次配列に変換してLinqを使って変換して、再び上記の形に再変換するしか無いのでしょうか?単純に二次元配列をループして一つずつ変換するしか無いのでしょうか?
    ※配列の構造はこのままで、検索+置き換えを行いたい。
    ExcelのRangeのままやった方がいいのかな?

    詳しい方いらっしゃいましたら教えて頂けないでしょうか?
    宜しくお願い致します。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34733 / ResNo.1)  Re[1]: 二次元配列内の文字の置き換え
□投稿者/ 魔界の仮面弁士 大御所(1335回)-(2021/05/23(Sun) 12:53:19)
  • アイコン2021/05/24(Mon) 09:14:14 編集(投稿者)

    No34730に返信(Wanさんの記事)
    > 単純に二次元配列をループして一つずつ変換するしか無いのでしょうか?
    ループ処理したくなければ、Range オブジェクトの Replace メソッドを使って
    一気に置換することが使えます。
    Rng.Replace("a", "A", Excel.XlLookAt.xlWhole, MatchCase:=True)

    複雑な置換条件(たとえば If 判定を伴うなど)が必要な場合には向かないですけれどね。


    > Rng = myExcel.Application.Selection
    Application プロパティを使っておられるようですが、
    変数 myExcel が Excel.Application 型であるならば、
     Rng = myExcel.Selection
    だけで良いと思いますよ。

    myExcel が Excel.Application 型以外なのだとしたら、Application を
     myApp = myExcel.Application
     Rng = myApp.Selection
    のように別の COM 変数に受け取って、使用後に ReleaseComObject すべきです。


    > 一旦、一次配列に変換して
    一次配列(primary array)というのは
    一次元配列(one-dimensional array)のことですね。

    二次元配列だと「複数行複数列」を表現できますが、一次元配列で書き戻した場合は、
    「単一行複数列」の意味になります。もしも一次元配列を複数行の Range に対して
    書き戻した場合には、同じ行が繰り返し出力されます。

    また、「単一行複数列」を行列変換して「複数行単一列」にするには、
    .PasteSpecial(Transpose:=True) を使うことができますが…
    今回は出番が無さそうですね。


    > Linqを使って変換して、再び上記の形に再変換するしか無いのでしょうか?
    多次元配列用の拡張メソッドを自前で用意してやれば、
    LINQ で処理できるようになります。

    しかし今回のように、配列の一部を置換することを目的とした
    全件走査となると、LINQ のメリットは薄い気がします。
    LINQ を用いたい理由が何かあるのでしょうか?

    クエリ構文の LINQ については、C# より VB の方が充実しているのですが、
    VB のラムダ式は C# のそれに比べて冗長的であるため、VB における
    メソッド構文の LINQ は、他言語のものよりも煩雑になりがちです。


    > 単純に二次元配列をループして一つずつ変換するしか無いのでしょうか?
    質問の意図が良く分かりませんが、それが手っ取り早いと思います。


    > 次のような二次元配列ができました。
    > (1,1) a
    > (2,1) b
    .NET 的には、「添字が 0 から始まる 1 次元配列」であれば、
    パフォーマンスが良いのですが(JIT で特別扱いされる)、このケースだと
    Excel 側の仕様で、1 始まりという特殊な 2 次元配列になってしまうんですよね。

    といっても、COM Interop 呼び出しのボトルネックに比べれば
    微々たる差なので、速度的な問題について気にするほどのものでは無いでしょう。


    > ExcelのRangeのままやった方がいいのかな?
    Excel と通信するたびにプロセス間通信が発生します。

    特にデータ量が多い場合、COM オブジェクトのメソッド呼び出しあるいは
    そのプロパティを読み書きする回数は、最小限にとどめておきましょう。

    処理内容によっては、VBA を使うことも検討してみてください。
    VBA であれば自プロセスとの通信となるため、データ量が多い要件だと、
    VB から操作するよりも早く処理できる可能性があります。

    また、速度面だけが問題の場合には、Excel を経由させることなく
    .xlsx を直接読み書きできるライブラリ(ClosedXml や ReoGrid など)を
    用いた方が処理効率の良いプログラムになります。
    COM オブジェクトの解放処理を気にする必要もなくなりますしね。
違反を報告
引用返信
■34736 / ResNo.2)  Re[2]: 二次元配列内の文字の置き換え
□投稿者/ Wan 一般人(5回)-(2021/05/25(Tue) 17:51:28)
  • アイコン魔界さん。いつも丁寧に有難う御座います。お礼が遅くなり誠に申し訳ありません。
    Excel VBAの関数等を使うということが、プロセス間通信となることは、少し考えればわかる事でしょうが、私の知識では考え付きませんでした。目から鱗です。なるほど、とうなるばかりです。また、Range.Replaceも知りませんでした。
    Application型もそうです。ご指摘通りです。
    何でも間でもVisualStudioから制御すればよいと考えていましたが、最終的には、VBAを使っていることを理解したので、VBAの利用を考えたいと思います。
    拡張メソッドについては、Web上に載っているので、この際、参考までに作っておきたいと思います。
    想像していた、範囲をはるかに超えた情報。いつも助かります。勉強になります。
    有難う御座いました。

違反を報告
引用返信
■34737 / ResNo.3)  解決済みです。
□投稿者/ Wan 一般人(8回)-(2021/05/25(Tue) 17:53:29)
  • アイコン
    解決済み

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34727 / 親記事)  color型を引数にする方法
□投稿者/ tamuLA 一般人(1回)-(2021/05/14(Fri) 06:32:55)
  • アイコン環境/言語:[VB.net] 
    分類:[.NET] 

    初めて投稿させて頂きます。

    Private Sub f(Optional c As Color = Color.Red)

    End Sub

    単純なコードですが、通らないようです。
    原因解る方おられましたら教えてください。

    Dim c As Color = Color.Red

    上記なら通るのですが・・・。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34728 / ResNo.1)  Re[1]: color型を引数にする方法
□投稿者/ YuO 一般人(1回)-(2021/05/14(Fri) 10:37:54)
  • アイコンNo34727に返信(tamuLAさんの記事)
    > Private Sub f(Optional c As Color = Color.Red)

    Optionalで設定する既定値は、定数式を指定する必要があります。
    Color.RedはSystem.Drawing.ColorであってもSystem.Windows.Media.Colorであってもプロパティであるため、定数式にはなりません。

    なので、
    ・引数をNullableにしてc.HasValueがFalseの場合はColor.Redとして扱う
    ・引数があるものとないものでOverloadsする
    あたりの対応が必要になります。

    refs)
    - https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/language-features/procedures/optional-parameters
    - https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.color.red
    - https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.colors.red

違反を報告
引用返信
■34729 / ResNo.2)  Re[2]: color型を引数にする方法
□投稿者/ tamuLA 一般人(2回)-(2021/05/14(Fri) 20:43:38)
  • アイコンYuOさんありがとうございました。
    Color.Redは定数じゃないんですね。
    プロパティと定数の違いなどあまり解っていなかったので、一通り再勉強しました。
    ご回答感謝致します。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■34717 / 親記事)  VSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について
□投稿者/ はると 一般人(1回)-(2021/05/11(Tue) 10:42:08)
  • アイコン環境/言語:[VS2019(VB)] 
    分類:[.NET] 

    はじめて投稿させていただきます。
    DOBONさんのサイトはよく参考にさせていただき、開発に大いに役立っています。

    以前、「プラグイン機能を持つアプリケーション作成」の記事を参考にさせていただき、動的プラグインを利用できるアプリケーションを作成しました。
    今回、新しく機能を盛り込むために、追加のプラグインを、プロジェクトの新規作成をする時に、VS2019(VB)のWindows Forms Appにて実施したところ、今回作成したプラグインが、定義された同一のインターフェイスの仲間として、リストアップできませんでした。
    試しに、プロジェクト作成をWindows Forms App(.Net Framework)から実施したものは、うまく読み込めます。
    この差異は、何にあるのか教えていただけませんか?

    なお、今回、別の不具合のため、Windows Forms App(.Net Framework)からのプラグイン作成では、要求する機能が使用できないため、「.Net Framework」からの作成ではなく、「.NET x.x」を使用したプロジェクトの作成が必要となっています。

    申し訳ありませんが、Windows Forms App(.Net Framework)からではない、「.NET x.x」を使用したプロジェクトで作成したプラグインを、「プラグイン機能を持つアプリケーション作成」の方法にて利用できるような解決策をご教授いただきければと思います。
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■34719 / ResNo.2)  Re[2]: VSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について
□投稿者/ はると 一般人(2回)-(2021/05/12(Wed) 07:32:52)
  • アイコンNo34718に返信(魔界の仮面弁士さんの記事)
    > ■No34717に返信(はるとさんの記事)
    >>以前、「プラグイン機能を持つアプリケーション作成」の記事を参考にさせていただき
    > こちらの記事でしょうか。
    > https://dobon.net/vb/dotnet/programing/plugin.html
    はい、この記事を参考にさせていただいております。


    > 未検証で投稿してしまいますが、作成したプラグイン プロジェクトの
    > <TargetFrameworks> はどうなっていますか?
    プラグインの方は、「.Net Framework」の場合、4.7.2
    「.Net Core」の場合は、5.0にてプロジェクトを新規作成しています。
    プラグイン呼び出し側のプロジェクトは、「.Net Framework4.7.2」です。


    > https://qiita.com/VBmouiya/items/cd2edab74a40152a9c6a
    > http://sourcechord.hatenablog.com/entry/2019/12/18/004659
    紹介させていただいたリンク先、まだ、じっくり確認できていませんが、取り急ぎ返信へのお礼と、上記質問への回答をさせていただきます。
違反を報告
引用返信
■34721 / ResNo.3)  Re[3]: VSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について
□投稿者/ 魔界の仮面弁士 大御所(1333回)-(2021/05/12(Wed) 15:04:56)
  • アイコンNo34719に返信(はるとさんの記事)
    >> <TargetFrameworks> はどうなっていますか?
    > プラグインの方は、「.Net Framework」の場合、4.7.2
    > 「.Net Core」の場合は、5.0にてプロジェクトを新規作成しています。
    > プラグイン呼び出し側のプロジェクトは、「.Net Framework4.7.2」です。

    <TargetFramework> は単一ターゲット(Visual Studio から指定可能)で、
    <TargetFrameworks> は複数ターゲット(手動編集が必要)です。
    https://docs.microsoft.com/ja-jp/dotnet/standard/frameworks

    先に紹介した URL は複数のターゲットを指定するための実例ですが、
    単一ターゲットで構わないなら、TargetFramework のみあれば OK です。


    なお、プラグインが System.Windows.Forms 名前空間を含む場合には、
    .vbproj / .csproj に対して <UseWindowsForms>true</UseWindowsForms> を指定し、
    ターゲット プラットフォームに Windows 向けの TFM を指定する必要があります。

    すなわち「net5.0」や「net6.0」ではなく、
    「net5.0-windows7.0」「net5.0-windows」「net6.0-windows」などが必要になるということですね。
    (指定可能なターゲットは、SDK および Visual Studio のバージョンによって異なります)

    Visual Studio からプロジェクトを新規作成する際に、
    .NET 5 向けの「Windows フォーム クラス ライブラリ」と
    .NET 5 向けの「クラス ライブラリ」とが別々に存在していますが、
    その違いは上記の TFM と UseWindowsForms の有無に現れます。

    プロジェクト作成後は、「クラス ライブラリ」と「Windows フォーム クラス ライブラリ」の
    違いが分かりにくいですが、TFM の有無は、Visual Studio のプロジェクトのプロパティだけでは区別できないため、
    .vbproj / .csproj ファイルの XML 記述を直接読み取って判断してみてください。


    参考までに、.NET 5 の WinForm 用のプラグインサンプルを書いてみました。
    https://www.vb-user.net/junk/replySamples/2021.05.12.14.54/Dobon34717.zip
違反を報告
引用返信
■34723 / ResNo.4)  Re[3]: VSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について
□投稿者/ Azulean 大御所(528回)-(2021/05/12(Wed) 22:13:19)
  • アイコンNo34719に返信(はるとさんの記事)
    > プラグインの方は、「.Net Framework」の場合、4.7.2
    > 「.Net Core」の場合は、5.0にてプロジェクトを新規作成しています。
    > プラグイン呼び出し側のプロジェクトは、「.Net Framework4.7.2」です。


    アプリ側(プラグイン呼び出し側)が .NET Framework なら、プラグインは .NET Framework で作る必要があります。


    .NET Core/.NET 5 系はオープンソース&クロスプラットフォームで再出発した経緯もあり、.NET Framework の後継ではありません。
    従って、.NET Framework 側から .NET Core や .NET 5 のアセンブリを読み込むことはできないはずです。

    試しに手元で読み込もうとすると、Assembly.GetTypes() で TypeLoadException がスローされています。



    今後:
    [1] アプリ側が .NET Framework のまま変更できないなら、.NET Framework で実現できる範囲でプラグインを検討してください。
    [2] アプリ側を .NET Core や .NET 5 に変更できるなら、両方合わせてください。
違反を報告
引用返信
■34724 / ResNo.5)  Re[4]: VSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について
□投稿者/ はると 一般人(3回)-(2021/05/13(Thu) 11:33:19)
  • アイコンNo34721に返信(魔界の仮面弁士さんの記事)

    > 参考までに、.NET 5 の WinForm 用のプラグインサンプルを書いてみました。
    > https://www.vb-user.net/junk/replySamples/2021.05.12.14.54/Dobon34717.zip

    サンプルまで作成していただいてありがとうございます。
    理解するうえで大変に参考になります。
    まだ、完全に自分の中で消化できない部分があるので、理解しながら、元のプロジェクトへの実装を試みていきたいと思います。
    その中で、新たな疑問が出てくるかもしれませんが、とりあえず、「.Net Framework」と「Netx.x」が共存でき、同一の方法で呼び出せることがわかりましたので、一旦「解決済み」とさせていただきたいと思います。
    ありがとうございました。
解決み!
違反を報告
引用返信
■34725 / ResNo.6)  Re[4]: VSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について
□投稿者/ はると 一般人(4回)-(2021/05/13(Thu) 11:37:49)
  • アイコンNo34723に返信(Azuleanさんの記事)
    返信ありがとうございます。
    魔界の仮面弁士さんの助言で解決できそうですので、もう少し頑張ってみます。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-6]






Mode/  Pass/


- Child Tree -