2020/02/14

覚え書き

多分今まで出ていたアプリケーションエラー全ての根源がわかった
オリジナルからあったサブマリンバグ

オリジナル当初からノード破棄したときのイベントで
・ノードごとに持っていたデータを破棄して(このデータに対してはちゃんとFreeAndNilっていう破棄したあと「nil(ヌル)」を代入してる)
・ノードのタイトルに「」を代入
・ノード移動履歴から削除
という三つの処理をしてたんだけどノード自体に「nil(ヌル)」を入れていなかった

オリジナルもおいらもノードを参照するときは必ず
Assigned 関数というのを使ってそのノードがちゃんと使えるのか確認してるんだけど
その関数は「変数または手続き型変数が nil (値が割り当てられていない) かをテストします」というもので
オリジナルではあんまり込み入ったことをしていなかったから表面化していなかっただけ
ただ一つだけこれが原因だろうなというのが UniCode ファイルを読み込んで
---------------------------
警告
---------------------------
xx.nnaをnanaファイルとして読み込めませんでした。
テキストファイルとして読み込んでみますか?
---------------------------
はい(Y)   いいえ(N) 
---------------------------

いいえを選ぶと Access violation になってタスクキルしか出来なくなる



オリジナルソース
//----------------------------------------
// ノード破棄
//----------------------------------------


procedure TTreeForm.TreeViewFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
begin
  FreeAndNil(NodeData(Node).Strings);
  NodeData(Node).Caption := '';
  MainForm.TreeViewFreeNode(Sender);
//↓に一行入れるだけで多い日も安心
  Node:=nil;
end;

2020/02/08

四捨五入

普段は何も考えてなかったけどやっぱり四捨五入はちゃんとしないとね

↓の「Roundoff 関数」は Delphi5 のヘルプ「Round 関数」のところに載ってる
通常の四捨五入を使う場合には以下の関数を使用してください』というやつ

100/6=16.6666666...
Trunc だと切り捨てられちゃう





function Roundoff(X: Extended):integer; begin if x >= 0 then Result := Trunc(x + 0.5) else Result := Trunc(x - 0.5); end; procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=1 to 10 do begin Memo1.Lines.Add(IntToStr(Roundoff(100/i))+' '+IntToStr(Trunc(100/i))); end; end;