タグ:備忘録 ( 274 ) タグの人気記事

Delphi XE Pro - XML ファイルの値を変えてファイルに書き込む。
Delphi XE Pro - XMLファイルの値取得がわからない 【"略"を変更】

例えば以下のようなXMLファイルがあったとする。
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description>
<em:description>ソフト説明</em:description>
<em:name>テスト</em:name>
<em:version>0.0.1</em:version>
</Description>
</RDF>

これのノードの<em:version>0.0.1</em:version>の値を書き変えたい場合にどうするのかすぐにわからなかったのでメモ。
procedure TForm2.Button3ArrangeClick(Sender: TObject);
const
NamespaceURI: string = 'http://www.mozilla.org/2004/em-rdf#'; // 検索するノードの名前空間(xmlns:emの値)
NodeName: string ='name';
NodeVer : string ='version';
var
FileName : string;
XMLDocument1: IXMLDocument1;
XMLNode, XMLNodeVerData: IXMLNode;
MemoString, ReleaseVerData: string;

begin
Memo1.Text:='';
Memo2.Text:='';

if OpenDialog1.Execute then
begin
FileName := OpenDialog1.FileName;
Form2.Caption := FileName;

XMLDocument1 := LoadXMLDocument1(FileName);

for MemoString in XMLDocument1.XML Do // 読み込んだファイルを
Memo2.Lines.Add(MemoString); // 表示する

XMLNode := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes.FindNode(NodeName, NamespaceURI);
if XMLNode = nil then
begin
XMLNode := XMLDocument1.documentElement.ChildNodes.First.AttributeNodes['em:' + NodeName];
if not (XMLNode = nil) then
Memo1.Lines.Add(XMLNode.NodeValue)
else
begin
Memo1.Lines.Add('--Not Found--');
end;
end
else
begin
// version 探索
XMLNodeVerData := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes.FindNode(NodeVer, NamespaceURI);
ReleaseVerData := VarToStr(XMLNodeVerData.NodeValue);
ReleaseVerData := '0.1.0_Rev002';
XMLNodeVerData.NodeValue := ReleaseVerData;
// XMLDocument1.SaveToXML(ReleaseVerData); // 必要?
try // ファイルが他のソフトで開かれている場合のためにtryでの実行は必須
XMLDocument1.SaveToFile(FileName); // 更新実行
except on E: Exception do
MessageDlg('install.rdf に対するエラー:'+#13#10+ // 例外メッセージを表示
E.Message, mtError, [mbOK],0);
end;

Memo1.Lines.Add(XMLNode.NodeValue);
end;
end;
end;

SaveToXML と SaveToFile の違いがよくわからない(´・ω・`)

註1:
 本当は「Document1.」や「XMLDocument1.」の「1」は不要なのですが
 エキサイトブログのセキュリティの関係で投稿不可になるので「1」を付けて記事を投稿しました。
註2:
 公開用に編集するのが面倒なので使っているソースコードをそのままupしました。
[PR]

by arigayas | 2013-05-25 19:54 | Delphi Programming | Trackback | Comments(0)
サクラエディタ 2.0.8.0 で追加された フォントサイズ変更 マクロ機能
サクラエディタのマクロ - ダブルクリックした単語を自動検索


参照先→Sakura Editor / PatchUnicode / #398 フォントサイズの拡大or縮小
何かキーを押しながらマウスホイールの操作で表示しているテキストのフォントサイズを変更することは2013年5月現在、対応してない。
その代わりにショートカットキーでフォントサイズの変更するちょっと便利なマクロが追加されたので紹介する。

フォントサイズ拡大マクロ
SetFontSize(0, 1);
とだけ書いて fontsize_p1.mac というファイル名で保存する。

フォントサイズ縮小マクロ
SetFontSize(0, -1);
とだけ書いて fontsize_m1.mac というファイル名で保存する。

sakura.exe のあるフォルダの直下にmacroというフォルダをつくってそれぞれを保存する。
ただしWindows Vista 以降ではProgram Files には簡単に保存できなくなったので
%appdata%\sakura\macro
というフォルダに保存するのもアリかと。


フォントサイズ拡大マクロAlt+PgUp というショートカットキーに割り当てる例を説明する。
  1. 2つのファイルをフォルダに保存したら
  2. 設定 > 共通設定 > {マクロ} タブ を開く
  3. 「マクロ一覧」の[参照]ボタンを押してfontsize_p1.mac のあるフォルダを選択
  4. 「名前」に”フォントサイズ拡大”と記入
  5. 「File」にfontsize_p1.mac を選択して[設定]ボタンを押す
  6. キー割り当て}タブを開く
  7. 「種別」で"外部マクロ"を選択
  8. 「機能」の列に表示された”フォントサイズ拡大”を選択
  9. 「機能」の列 と 「キー」の列 の間にある”ALt”のチェックボックスにクリックしてチェックを入れる
  10. 「キー」の列の表示されてる”Alt+PgUp(RollUp)”を選択
  11. [割付]ボタンを押して[OK]ボタンを押して完了


ちなみにフォントサイズ縮小は Alt+PgDn を割り当てました。
[PR]

by arigayas | 2013-05-19 22:49 | Soft | Trackback | Comments(0)
[解決しました] Delphi XE Pro - 2つのボタンを procedureを使って一時的に無効にしたい。
2つのボタンを procedureを使って一時的に無効にしたいと思って作ってみたけど無効にならなくて何故だ?と思ったので記事にしてみた。
フォームにButtonを2つ置く。
b0003577_1231565.png

以下のようなコードを書いて、それぞれ1つ目のButtonOnOff(Sender);にブレイクポイントを置いて実行してみた。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ButtonOnOff(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ButtonOnOff(Sender);
Form1.Caption := '1111111';
ButtonOnOff(Sender);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
ButtonOnOff(Sender);
Form1.Caption := '2222222';
ButtonOnOff(Sender);
end;

procedure TForm1.ButtonOnOff(Sender: TObject);
begin
if Button1.Enabled = True then
begin
Button1.Enabled := False;
Button2.Enabled := False;
end
else
begin
Button1.Enabled := True;
Button2.Enabled := True;
end;
end;

end.
しかし、Form1.Caption := の所に戻ってくると押したボタンだけが無効になっている。
そんで2回目の ButtonOnOff(Sender); で不可解な動きになるので
理由がわかる方はコメントかトラックバックをお願いします(≧_≦)

追記:「Button2.Enabled := False;」の次に ShowMessage(''); を書くと2つのボタンがちゃんと無効になる。

2013年5月17日追記 2013年5月23日にも追記
[PR]

by arigayas | 2013-05-16 12:43 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - RadioGroup コンポーネントの仕様を把握していなかった。
YouTube に書いた説明文とほぼ同じです。

RadioGroup コンポーネントの仕様を把握していなかった為につまづいたので記録しました。

RadioGroup の選択項目をクリックすることによって 「Edit」 や「ボタン」を
有効(ボタンON)/無効(ボタンOFF)にするコードを書いたつもりでした。

しかし、RadioGroup の項目の横に「Edit」や「ボタン」を置いて
その間とかをクリックすると無効状態でも有効になってしまって
ボタンが動いてしまうバグ(**)というか仕様に遭遇したので
RadioGroup を使わない方式で作り直すことにした。[**]

(**):筆者が想定していた動きと違うという意味でバグかな。
[**]:このブログを書いた時点ではUIを変えることを決めただけです。
    おそらく GroupBox と RadioButton を使うことにします。



ちなみに動画のために作ったソフトとソースコードは削除済み。
動画作成に使ったソフト→AG-デスクトップレコーダー ダウンロードページ
[PR]

by arigayas | 2013-05-14 12:55 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - ステータスバーの表示を数秒後に消すには?[3秒後にしました]
ステータスバーの表示を数秒後に消すには?
と任意の秒数後に表示を消したい的な質問して回答をいただました。

しかし処理した内容(途中経過)の表示に使おうとして実行したら例外が出るようになってしまって
どうしたらいいのかわからないので手に負えないのでソースから削除しました(´;ω;`)

でTwitterでDEKOさんの回答の参照先の筆者さんのLynaさんから以下のような助言をもらった。
「OnTimer内でTimer1.Enabled:=False;とした上で目的の処理を続けて書くと良いと思います。」
ので書き直してみた。

フォームに Timer を貼ってプロパティの Interval には 3秒 という意味の3000と入れてます。
b0003577_21221434.png
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not (StatusBar1.SimpleText ='') then
begin
Timer1.Enabled := false;
StatusBar1.SimpleText :='';
end;
end;
として試しにFormCreateする時に
StatusBar1.SimpleText :='テスト中'; 
と入れると起動後3秒後にステータスバーから「テスト中」という文字列は消えました。
しかしこれだとTimerが止まっているので他のところのボタンとかに
StatusBar1.SimpleText :='2回目のテスト'; 
と入れても消えてくれません。
消えるようにするにはTimerを動かすようにするために
StatusBar1.SimpleText :='2回目のテスト'; 
と書く前に
Timer1.Enabled := True;
を入れないといけません。

しかしいちいちいろんなところで
Timer1.Enabled := True;
StatusBar1.SimpleText :='hogehoge';
を書き込むのは面倒なので以下のようにまとめてみました。
procedure TForm1.StatusBarInfo(i: Integer);
begin
Timer1.Enabled := True;
case i of
0 : StatusBar1.SimpleText :=''; // Clear
1 : StatusBar1.SimpleText :='ファイルパスを確認しました';
2 : StatusBar1.SimpleText :='ファイルをダウンロードが完了しました';
3 : StatusBar1.SimpleText :='';
4 : StatusBar1.SimpleText :='';
5 : StatusBar1.SimpleText :='';
6 : StatusBar1.SimpleText :='';
7 : StatusBar1.SimpleText :='';
8 : StatusBar1.SimpleText :='';
9 : StatusBar1.SimpleText :='99999';
else
begin
ShowMessage('無設定ですよ');

StatusBarInfo(0);
end;
end;

end;

Timerを動かして文字列を書き込んでTForm1.Timer1TimerでTimerを止めた後にステータスバーから文字列を削除されるはず。
で他のところからは「StatusBarInfo(数字)」で呼びたいメッセージ番号を書くという感じにしてみました。
たぶんこのソース、まだ改良点があるんだろうなぁ・・・。

2013年4月30日追記その1: with do文を使ってみた。
procedure TForm1.StatusBarInfo(i: Integer);
begin
Timer1.Enabled := True;
with StatusBar1 do
begin
case i of
0 : SimpleText :=''; // Clear
1 : SimpleText :='ファイルパスを確認しました';
2 : SimpleText :='ファイルをダウンロードが完了しました';
3 : SimpleText :='';
4 : SimpleText :='';
5 : SimpleText :='';
6 : SimpleText :='';
7 : SimpleText :='';
8 : SimpleText :='';
9 : SimpleText :='99999';
10: SimpleText :='';
else
begin
ShowMessage('無設定');

StatusBarInfo(0);
end;
end;
end
end;
上記のようなwith do文を使っている中に
10:StatusBar1.SimpleText :='';
として潜り込ませてみも動いたのはちょっとビックリしたw

2013年4月30日追記その2:
button1をクリックして「StatusBarInfo(1) の文字列」と「StatusBarInfo(2) の文字列」を続けて表示したい場合に
処理;
StatusBarInfo(1);
処理;
処理;
StatusBarInfo(2);
処理;
と書くとStatusBarInfo(1);のタイマーが有効のままStatusBarInfo(2);が呼ばれるので実行時には一瞬変わったかも?と思うぐらいの時間しか「StatusBarInfo(2) の文字列」が表示されません。
ぼけーっと見ていたら「StatusBarInfo(2) の文字列」が表示されずに消えますw
この様にならない為に
処理;
StatusBarInfo(1);
処理;
処理;
Timer1.Enabled := False; // 一旦タイマーを止める意味で無効にする。
StatusBarInfo(2);
処理;
と書くと「StatusBarInfo(1) の文字列」と「StatusBarInfo(2) の文字列」がちゃんと表示される。
// 2013年4月30日追記終わり

以下は勘違いかもですが、
[PR]

by arigayas | 2013-04-27 21:18 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - XMLファイルの値取得がわからない 【"略"を変更】
例えば以下のようなXMLファイルがあったとする。
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description>
<em:description>ソフト説明</em:description>
<em:name>テスト</em:name>
<em:version>0.0.1</em:version>
</Description>
</RDF>
追記:2013年4月18日21時13分xmlns:em のURI?を略さずに書くことにしました。


これの<em:name>テスト</em:name>の「テスト」という値(文字列)を取得方法がわからない。
しかも<em:name>の位置は不確定なので決め打ちが出来ないので困りもの。
試しに以下のようなDelphiのコードを書いた。
procedure TForm2.Button1Click(Sender: TObject);
var
DirPath: string;
document1: IXMLDocument;
Description1st: IXMLNode;
node: IXMLNode;
numString: int16;

begin
if OpenDialog1.Execute then
begin
DirPath := OpenDialog1.FileName;

Form2.Caption := DirPath;

document1 := LoadXMLDocument(DirPath);
Memo1.Lines.Add('+++++++++++');

node := document1.DocumentElement;
Memo1.Lines.Add(node.NodeName); // RDF

node := document1.DocumentElement.ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // Description

node := document1.DocumentElement.ChildNodes.First.ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // em:description

numString := document1.DocumentElement.ChildNodes.First.ChildNodes.Count;
Memo1.Lines.Add(IntToStr(numString)); // 4

numString := document1.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes.Count;
Memo1.Lines.Add(IntToStr(numString)); // 1

node := document1.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // #text
Memo1.Lines.Add(node.Text); // ソフト説明

node := document1.DocumentElement.ChildNodes.First.ChildNodes.First.ChildNodes['name'];
Memo1.Lines.Add(node.NodeName); // em:name
Memo1.Lines.Add(node.Text); // null

node := document1.DocumentElement.ChildNodes[0].ChildNodes.First.ChildNodes['em:name'].ChildNodes.First;
Memo1.Lines.Add(node.NodeName); // #text
Memo1.Lines.Add(node.Text); // null
Memo1.Lines.Add(BoolToStr(node.HasChildNodes)); // 0 って


Memo1.Lines.Add('+++++++++++');
end;

end;

end.

node := document1.DocumentElement.ChildNodes[0].ChildNodes.First.ChildNodes['em:name'].ChildNodes.First.Textがnullになるのは何故?

まぁXMLをわかっていないのがバレバレですけどね(苦笑)

山本隆 さんの回答を元にアレンジしてみました。
[PR]

by arigayas | 2013-04-18 01:19 | Delphi Programming | Trackback(1) | Comments(4)
2013年4月からのアニメ
2013年1月からのアニメ へのリンク。
5分ぐらいは赤文字。

2011年10月以前から放送開始
  • ワンピース
2011年10月から放送開始
  • HUNTER×HUNTER

2012年4月から放送開始
  • 宇宙兄弟

2013年1月から放送開始
  • ちはやふる2
  • 天元突破グレンラガン [TOKYO MXで再放送]
  • ニコニコ動画で配信分
    • ヘタリア The Beautiful World
    • 直球表題ロボトアニメ [2月から放送と配信開始して4月に終了]


2013年4月から放送開始
  • ガッ活! 第2シリーズ
  • 進撃の巨人
  • RDG(レッドデータガール) [ニコ生のみの配信なので]
  • 翠星のガルガンティア [ニコ生のみの配信なので]
  • サイクロプス少女さいぷ~ [3月からYoutube][2013年5月28日追記]
  • 精霊の守り人 [2013年5月24日からGyaOで配信開始 / 6月12日から視聴開始(一気に8話まで見た)][2013年6月22日追記]
  • ニコニコ動画で配信分
    • 絶対防衛レヴィアタン [GREE枠]
    • よんでますよ、アザゼルさん。Z
    • 波打際のむろみさん
    • はたらく魔王さま!
    • 俺の妹がこんなに可愛いわけがない。
    • 惡の華
    • 断裁分離のクライムエッジ
    • 這いよれ! ニャル子さんW
    • 銀河機攻隊 マジェスティックプリンス
    • 革命機ヴァルヴレイヴ
    • とある科学の超電磁砲S
    • 秘密結社 鷹の爪 MAX
    • スパロウズホテル [2013年5月28日追記]
    • やはり俺の青春ラブコメはまちがっている。[2013年5月28日追記]
    • ゆゆ式 [2013年5月28日追記]
    • 血液型くん! [2013年5月28日追記]
    • あいうら [2013年5月28日追記]


More
[PR]

by arigayas | 2013-04-15 05:00 | 雑記 | Trackback(1) | Comments(0)
Delphi XE Pro - XML ファイルを ini ファイルのように使うには? (読み込み編)
Delphi XE Pro - XML ファイルを ini ファイルのように使うには? (保存編)

保存されている XML ファイルは以下のようなXMLファイルです。
<Project1>
<Form>
<Form Name="Width">651</Form>
<Form Name="Height">338</Form>
</Form>
<Path>
<Path Name="TempSaveFolder"></Path>
</Path>
</Project1>

保存したXMLファイルをiniファイル的に読み取るソースコード:
一応書いておきますが、uses XMLIniFile XMLIntfXMLDoc を追加しておくこと。
procedure TForm1.Button2Click(Sender: TObject);
var
Root : IXMLDocument;
SettingsXML: TXMLIniFile;
int : Integer;
Str : string;
begin
Root := LoadXMLDocument(ChangeFileExt(Application.ExeName, '.xml')); // 読み込むファイル名を指定

Root.Active := True;
SettingsXML := TXmlIniFile.Create(Root.DocumentElement);

try
self.Height := SettingsXML.ReadInteger('Form', 'Width' , int );
Self.Width := SettingsXML.ReadInteger('Form', 'Height', int );
self.Caption := SettingsXML.ReadString('Path', 'TempSaveFolder', Str);
finally
SettingsXML.Free;
end;
end;


保存編で書いたソースコードも合わせて実行するとフォームサイズが変わるプログラムが出来るはずです。
[PR]

by arigayas | 2013-03-03 07:04 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - XML ファイルを ini ファイルのように使うには? (保存編)
「XML ファイルを ini ファイルのように使うには?」と同じタイトルで
とある掲示板に投稿してヒントをもらって解決したので自分のブログにも書いておく。
まだ読み込み方法を調べないといけないんですけどね・・・。

それにしてもXMLファイルに書き込めるようになるまで時間が掛かったなぁ・・・。
日本語サイトだけの解決は厳しかった・・・。
以下の方法はXE1以降で使えます。

2013年3月2日 追加:
この記事を書いた翌日に質問した掲示板に追加の返答があったのを見て追加しました。
 // 実行結果は同じですがちょっとスマートになったかとw

uses XMLIniFile を追加して
フォームに XMLDocument (これがないと実行時にエラーになる)を貼付けて
XMLIntfXMLDoc uses に追加して
以下のようなソースを書いてXMLファイルをiniファイルのように出来ました。
改変前:
procedure TForm1.Button1Click(Sender: TObject);
var
Root : TXMLDocument;
settingsXML: TXMLIniFile;
RootTag : string;
SaveFolder: string;
begin
// XMLiniファイルに書き込む。
Root := XMLDocument1; // XMLDocument1の名前を変更した時の影響を減らすため。
RootTag := ExtractFileName(ChangeFileExt(Application.ExeName, ''));

Root.XML.Text := '<' + RootTag + '></' + RootTag + '>'; // XMLのルート部分をEXEファイル名に
Root.Options := [doNodeAutoIndent]; // オートインデントをON
Root.Active := True; // Active を True にしないと書き込まれない

settingsXML := TXmlIniFile.Create(Root.DocumentElement);
try
settingsXML.WriteInteger('Form', 'Width' , Form1.Width );
settingsXML.WriteInteger('Form', 'Height', Form1.Height );

settingsXML.WriteString('Path', 'TempSaveFolder', SaveFolder);

Root.SaveToFile(ChangeFileExt(Application.ExeName, '.xml')); // 書き込み実行

finally
settingsXML.Free;
end;
end;


質問した掲示板を見て2013年3月2日 改変:
procedure TForm1.Button1Click(Sender: TObject);
var
Root : IXMLDocument;
SettingsXML: TXMLIniFile;
RootTag : string;
SaveFolder: string;
begin
// XMLiniファイルに書き込む。
RootTag := ExtractFileName(ChangeFileExt(Application.ExeName, ''));
Root := NewXMLDocument();

Root.AddChild( RootTag ); // XMLのルート部分をEXEファイル名に
Root.Options := [doNodeAutoIndent]; // オートインデントをON
Root.Active := True; // Active を True にしないと書き込まれない

SettingsXML := TXmlIniFile.Create(Root.DocumentElement);
try
SettingsXML.WriteInteger('Form', 'Width' , Self.Width );
SettingsXML.WriteInteger('Form', 'Height', Self.Height );

SettingsXML.WriteString('Path', 'TempSaveFolder', SaveFolder);

Root.SaveToFile(ChangeFileExt(Application.ExeName, '.xml')); // 書き込み実行

finally
SettingsXML.Free;
end;
end;



で保存されるXMLは
[PR]

by arigayas | 2013-03-01 10:33 | Delphi Programming | Trackback(1) | Comments(0)
2013年01月に読んだ・見た物
arigayasの本棚 - 2013年01月 (4作品)
powered by booklog

[PR]

by arigayas | 2013-02-02 15:52 | | Trackback | Comments(0)