0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

XMLからformのDataGridViewへ値をセットして更新

Last updated at Posted at 2019-03-13

やってることー
1)xmlからsymbolを読み込み、TokenList mySymbolTokenList に格納する
2)mySymbolTokenListを使って、
a)QuotesProviderをインスタンス生成しupdateイベントハンドラをセットする
b)GridDataViewに必要分のGridDataViewRowを生成する
c)symbolと、生成したGridDataViewRowを格納したDictionary SymbolRowDictionaryを生成する
3)前述(2)で生成したQuotesProviderのupdateイベントのハンドラにおいて更新されたsymbolとSymbolRowDictionaryを紐付けて
GridDataViewRowのセル内容を更新する


{
updates

//2019/3/15
ListView1の更新データを0行目にinsertRowするように変更

}

using elsystem;			//datetime
using tsdata.common;    //TokenList
using tsdata.marketdata;//QuotesProvider
using elsystem.xml;     //xml
using elsystem.collections; //Vector;
using elsystem.windows.forms; //form

//const
const:
    //Dropboxディレクトリにあるxmlファイルを開く
    string FILE_URL("E:\チーム Dropbox\kamo tsuyoshi\TradeStation\project_0314\sourceSymbol.xml");
//var
var:TokenList mySymbolTokenList(null);
var:Vector QuotesProvidersVector(null);

var:Dictionary SymbolRowDictionary(null);
var:Dictionary SymbolQuotesProviderDictionary(null);

method void AT_initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin
    //--------------------------------
    //環境セットアップ
    //--------------------------------

    //Dictionaryインスタンス生成
    SymbolRowDictionary = Dictionary.Create();
    SymbolQuotesProviderDictionary = Dictionary.create();
    //Vectorインスタンス生成
    QuotesProvidersVector = Vector.Create();


    //mySymbolTokenListを指定のxmlファイルから生成し、TokenList mySymbolTokenListに格納
    //**関数からの戻り値はobjectを戻せない、stringで受取ってからTokenListを作る。二度手間
    mySymbolTokenList = TokenList.create($getStringFromXML(FILE_URL)); 

    //GUI作成のformを表示する
    form1.show();
    //formをセットアップ
    fillListView();
    fillGrid();


    createQuotesProvider();


end;


//--------------------------------------------
// provider 初期化
//--------------------------------------------
method void createQuotesProvider()
var:TokenList list ,QuotesProvider QP , int n;
begin
    list = TokenList.Create();
    list.add("SymbolRoot");
    list.Add("vwap");
    list.Add("description");
    list.Add("Ask");
    list.Add("Bid");
    list.add("asksize");
    list.Add("bidsize");
    list.Add("PreviousClose");
    list.Add("last");
	list.add("ExchangeListed");	//銘柄が上場している取引所



    for n=0 to mySymbolTokenList.Count-1 begin

        QP = new QuotesProvider;
        QuotesProvidersVector.push_back(QP);    //インスタンスを動的配列にセットしておく

        QP.Fields = list;
        QP.Updated += QP_updated;
        QP.Symbol = mySymbolTokenList[n];
        QP.LoadProvider();
    end;
end;




method void fillListView()
var:ListViewItem lvItem , ListViewItem newItem , int n;
begin

    ListView1.AddColumns("symbol");
    ListView1.AddColumns("銘柄名");

    ListView1.AddColumns("ASK");
    ListView1.AddColumns("Bid");

    ListView1.AddColumns("AskSize");
    ListView1.AddColumns("BidSize");
	ListView1.AddColumns("市場");

end;    


method void fillGrid()
var:DataGridViewColumn col , DataGridViewRow myRow, int n ;  
begin
    // add a string column
    col = DataGridViewColumn.Create("symbol");  
    DataGridView1.columns.Add(col);
    col = dataGridViewColumn.Create("銘柄");
    DataGridView1.Columns.Add(col);
    col = dataGridViewColumn.Create("終値");
    DataGridView1.Columns.Add(col);
    col = dataGridViewColumn.Create("前日終値");
    DataGridView1.Columns.Add(col);
    col = dataGridViewColumn.Create("前日比");
    DataGridView1.Columns.Add(col); 

    //add row
    for n = 0 to mySymbolTokenList.Count-1 begin

        myRow = datagridviewrow.Create("");

        DataGridView1.Rows.Add(myRow);

        myRow.Cells[0].Value = mySymbolTokenList[n];

        setDictionaryObj(mySymbolTokenList[n] ,myRow);

    end;
end;

//---------------------------------------
//symbolをkeyにしたDictionaryに値としてdataGridViewRowをセットする
//---------------------------------------
method void setDictionaryObj(string strSymbol , DataGridViewRow row)
var: string strSymbolRoot;
begin
    //===========!!!!重要!!!!=========
    //updateイベントで取得できるsymbolRootが4桁の文字データなのでそれに合わせて、4桁部分のみ切り取って格納する
    //例:"8798-TS" ==>  "8798" で格納。そのため、leftstr()を使う。
    strSymbolRoot = leftStr(strSymbol , 4);
    if SymbolRowDictionary.Contains(strSymbolRoot) = false then begin
        SymbolRowDictionary.add(strSymbolRoot , row);   //Dictionary.add("keyname",初期値)
    end;

end;

//---------------------------------------
//symbolをkeyにしたDictionaryからvalueであるDataGridViewRowを取得しうりう
//---------------------------------------
method DataGridViewRow getDataGridViewRowFromDictionary(string strSymbolRoot)
var : DataGridViewRow row;
begin
    if SymbolRowDictionary.Contains(strSymbolRoot)=false then begin
        row = null;
    end else begin
        row = SymbolRowDictionary.Items[strSymbolRoot] astype DataGridViewRow;
    end;
return row;
end;





method void QP_updated( elsystem.Object sender, tsdata.marketdata.QuoteUpdatedEventArgs args ) 
begin
    updateRow(sender);
    updateDataList(sender);

end;

method void updateRow(elsystem.object sender)
var:QuotesProvider objQP ,DataGridViewRow row ,string strsymbolRoot, double zenjituhi;
begin
    objQP = sender astype QuotesProvider;
    strsymbolRoot = objQP.Quote["symbolRoot"].stringvalue;

    //DataGridの値を更新する、この方法が一番効率的で簡単
    row = getDataGridViewRowFromDictionary(strsymbolRoot);
    row.SetCell(1,objQP.Quote["description"].stringvalue);
    row.SetCell(2,numtostr(objQP.Quote["last"].doublevalue , 0));   //小数点以下を指定できるのでtoString()ではなくnumtostrを使う
    row.SetCell(3,numtostr(objQP.Quote["PreviousClose"].doublevalue , 0));
    zenjituhi = (objQP.Quote["last"].doublevalue / objQP.Quote["PreviousClose"].doublevalue) * 100;
    row.SetCell(4,numtostr(zenjituhi,3));
end;

method void updateDataList(elsystem.Object sender)
var:string strsymbolRoot , ListViewItem newItem , QuotesProvider objQP ;
begin
    objQP = sender astype QuotesProvider;
    strsymbolRoot = objQP.Quote["symbolRoot"].stringvalue;
    

    //listItemを作成する
    
    newItem = ListViewItem.Create(strsymbolRoot);
    newItem.AddColumns(objQP.Quote["description"].stringvalue);
     
    newItem.AddColumns(objQP.Quote["ASK"].doublevalue);
    newItem.AddColumns(objQP.Quote["BID"].doublevalue);
    newItem.AddColumns(objQP.Quote["asksize"].integervalue);
    newItem.AddColumns(objQP.Quote["bidsize"].integervalue);    
	newItem.AddColumns(objQP.Quote["ExchangeListed"].stringvalue);
	
    //ListView1.addRow(newItem);
	ListView1.InsertRow(0,newItem.SubItems[0],newItem.SubItems[1],newItem.SubItems[2],newItem.SubItems[3],newItem.SubItems[4],newItem.SubItems[5],newItem.SubItems[6]);

end;


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?