カテゴリ:Delphi Programming( 42 )

「できるDelphi / C++Builder 10.x Starter Edition」ってあったら買いたい。
多分発売されることはないだろうけど、
「できるDelphi / C++Builder 10.x Starter Edition」っていう本があったら買いたい。
IDE の使い方(*)の説明が図解で解説されているのを期待する。

*:例えば、
  • ブレークポイントの設定の詳細な使い方。
  • 監視式の詳細な使い方。
  • パッケージやコンポーネントのインストールについて。
  • バージョン管理(Subversion、Git、Mercurial)の使い方や具体例。GitならGitHubの使用例を。
  • お勧めのアドオン、プラグイン。

こんなところかな。

Delphi / Object Pascal については、税抜きで6000円と高価ですがこの本で学習するのが良いかもしれません。
OBJECT PASCAL HANDBOOK


2017年5月25日追記
  • 「できるDelphi 10.1 Starter Edition」から「できるDelphi / C++Builder 10.x Starter Edition」に改題
  • OBJECT PASCAL HANDBOOKへのリンク。


[PR]

by arigayas | 2016-11-10 04:47 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - IDEなどにインストールすべきものを教えて欲しい。「CnPack」と「IDE Fix Pack」以外で
30回目の エンバカデロ・デベロッパーキャンプ の東京会場での LT をUstream で見ていました。
そこで RAD Studio や Delphi や C++Builder にインストールすると作業が快適になるツールとして、
CnPackCnPack Open Source Projects が紹介されていた。XE8 からの新機能の「Castalia」とバッティングするので起動時のオプションに「/NOCASTALIA」と良いらしい。

これをインストールしたところ、いくつかの便利になったので記録しておきます。
  • ソースコードの表示が変わってBegin~endやif文やfor文などの制御文が対応した色で分り易くなったり、
    b0003577_22093512.png

    Beginの開始位置が変わっても大丈夫!
    b0003577_00401883.png
  • フォームのサイズを固定サイズにするのが簡単になったり
    b0003577_22461505.png
  • ボタンなどのコンポーネントを配置した時に短縮した名前にするか?と聞いてくる。
    b0003577_23284829.png

CnPack の日本語化を誰かやって欲しいなぁと思ったり。 この記事を書いている間に作られましたw 

CnPack 日本語化ファイル 20150530版。 - 全力わはー翻訳は途中までだそうです。


[2015年6月7日追記]
  • 変数などにマウスカーソルを合わせると同じソースコード内で強調表示してくれます。
    b0003577_22035012.png
  • [CnPack 日本語化ファイル 20150530版導入済みです]
    エディタ上で文字を選択すると行数番号の横に「ソースツールブロック」というのが表示される。
    b0003577_02263381.png

    このツールで選択した文字列を 編集 / コメント化 / Web検索 などが出来る。

CnPack 以外には IDE Fix Pack をインストールしてあります。→ IDE Fix Pack | Andy's Blog and Tools

IDE Fix Packは、Version 2009 以降の IDE の細かなバグを修正したものをまとめた物です。

ソースコードが長くなった場合にレスポンスに問題が出てくるらしいのですが
IDE Fix Packを入れてあればレスポンスにほぼ問題なく使えるらしいです。
以下の2つのリンクはインストール前後でのレスポンスの差を動画にした記事へのリンクです。

CnPack や IDE Fix Pack は、2016年9月下旬に無期限無償公開された C++Builder 10.1 Berlin Starter EditionDelphi 10.1 Berlin Starter Edition にもインストールが可能です。



↓更新日時↓
[PR]

by arigayas | 2015-05-31 00:51 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - 正規表現で一致する文字を抽出して表示する
ひとつだけの場合
uses
RegularExpressions 追加して正規表現を使えるようにする。

procedure TForm1.Button1Click(Sender: TObject);
var
Str: string;
hoge: TMatch;
begin
 Str := 'ふかふかふか(やってみる)(lv196799094)';

 if TRegEx.IsMatch(Str,'lv\d+') then
  begin
   hoge := TRegEx.Match(Str,'lv\d+');
   ShowMessage(hoge.Value);   出力結果: lv196799094
  end;
end;

試しに Str := 'ふかふかふか(やってみる)(lv196799094)(lv200000000)'; とした場合にも出力結果はlv196799094となった。


複数個当てはまる場合
procedure TForm1.Button2Click(Sender: TObject);
var
 i: Integer;
 str, tempStr: string;
 hoges: TMatchCollection;
 SortList : TStringList;
begin
 Str := 'ふかふかふか(やってみる)(lv20000000000)(lv10000)(lv196799094)';

 if TRegEx.IsMatch(Str,'lv\d+') then
  begin
   hoges := TRegEx.Matches(Str,'lv\d+');
    if hoges.Count = 1 then
     
tempStr := hoges.Item[0].Value
    else // 複数候補がある場合は最大値を適用する
    begin    
     if hoges.Count > 1 then
      SortList := TStringList.Create;
      for I := 0 to hoges.Count - 1 do
       SortList.Add( hoges.Item[I].Value );
      SortList.Sort;
      for I := 0 to SortList.Count - 1 do //ソートされて最後が最大値になっているはず
       tempStr := SortList.Strings[i];
    end;
   ShowMessage(tempStr);   出力結果: lv20000000000
  end;
end;



[PR]

by arigayas | 2014-11-29 05:07 | Delphi Programming | Trackback | Comments(0)
[解決?] Delphi XE Pro - DUnit の使い方を知りたい というかファイルを指定して読み込ませる事ができるのか知りたい
Delphi XE Proでニコニコ生放送のコメントを表示するソフトを作っている。
しかし、Indy(ネットワーク関連の処理をまとめたコンポーネント群)の使い方がさっぱりわからないので
今のところ、とあるソフトでニコニコ生放送のコメント(XMLファイル)をダウンロードし、そのダウンロードしたXMLファイルを表示するソフトになっている。
あとNCVで保存したコメントファイルを開く事も出来るように今週改良を加えた。

しかし動作テストする為に毎回、最低でも6ファイルぐらいテスト用のXMLファイルを手動で開いて、ちゃんと動くのか読み込ませるのが面倒臭く感じてきたので
「Delphiで使えるテストツールがないかなぁ?」と思い軽く検索してみたら「DUnit」というのがあるのがわかったけど、関数(procedure/function)単位でテストするようだった。
この「DUnit」というは、ファイルを複数指定すると指定したファイルを順次読み込んでテストしてくれるのかどうか、詳しい方教えてください。

作ったプログラムのメインのpasファイルには、
procedure TForm1.XMLRaedVirtualView(FileName, Encoding);
って言う感じになっていて、テストプロジェクトには、
procedure TestTForm1.TestXMLRaedVirtualView;
var
 Encoding: TEncoding;
 FileName: string;
begin
 // TODO: メソッド呼び出しパラメータのセットアップ
FForm1.XMLRaedVirtualView(FileName, Encoding);
 // TODO: メソッド結果の検証
end;
という状態です。




追記分
[PR]

by arigayas | 2014-11-06 18:21 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - ListView での疑問。
ListView [ViewStyle=vsReport]に1行分のデータを追加するのに配列(StringList)でデータを渡して一気に追加したいけど出来るのかな?
ListView1.???? := StringList;
もしくは
ListView1.????.AddStrings(StringList);
みたいな感じで。
[PR]

by arigayas | 2013-07-02 23:24 | Delphi Programming | Trackback | Comments(2)
Delphi XE Pro - UnixTime を計算して経過時間を表示
Delphi XE Pro - Unixtime を 年月日 時分秒に変換

uses に DateUtils が必須です。
procedure TForm1.UnixtimeButton2Click(Sender: TObject);
var
UnixtimeStamp, StartTime, ElapsedTime : UInt64;

day, Hour, Minute, Second: Integer;
AdayOver : Integer; // 24 時間以上用

daystr : string;
TimeString : string;
begin
UnixtimeStamp := 1372995141;
TimeString := FormatDateTime('yyyy/mm/dd hh:mm:ss',UnixToDateTime(UnixtimeStamp));

ShowMessage(TimeString);


// 放送開始からの経過時間
StartTime := 1372485140;

ElapsedTime := UnixtimeStamp - StartTime; // 経過時間(秒数で格納)
ShowMessage(IntToStr(ElapsedTime) + '秒');

Hour := ElapsedTime div 60 div 60 ;

if Hour > 24 then
begin
day := Hour div 24;
AdayOver := Hour mod 24;
daystr := IntToStr(day) + '日目 ' + Format('%.2d',[AdayOver])+ '時間';
end
else
begin
daystr := IntToStr(Hour)+ '時間';
end;

Minute := ElapsedTime div 60 - Hour * 60 ;

Second := ElapsedTime - (Hour * 60 * 60 + Minute * 60) ;

TimeString := daystr + Format('%.2d',[Minute]) + '分' + Format('%.2d',[Second] ) + '秒';

ShowMessage(TimeString);

user_id_Memo.Text := TimeString;
end;


510001秒 が 
5日目 21時間40分01秒
と表示されます。
[PR]

by arigayas | 2013-06-30 00:29 | Delphi Programming | Trackback | Comments(5)
Delphi XE Pro - Unixtime を 年月日 時分秒に変換
uses に DateUtils が必須です。

procedure TForm1.UnixtimeButton2Click(Sender: TObject);
var
UnixtimeStamp : Int64;
// Temptime : TDateTime;
TimeString : string;
begin
UnixtimeStamp := 1372485141;
// Temptime := UnixToDateTime(UnixtimeStamp); Unixtime を TDateTime 型に変換してる。
TimeString := FormatDateTime('yyyy/mm/dd hh:mm:ss',UnixToDateTime(UnixtimeStamp));

ShowMessage(TimeString);
end;


以下のように表示される
2013/06/29 05:52:21

[PR]

by arigayas | 2013-06-29 15:00 | Delphi Programming | Trackback(1) | Comments(0)
Delphi XE Pro - TurboPower Abbrevia を使ってみるテスト
Delphi XE Pro - 今年の1月から作成していたソフト、XPI_Maker が完成した。

XPI_Maker に致命的なバグがあったので ZIP 形式の圧縮ファイルにする時のコンポーネントを
TurboPower Abbrevia 5.0 にしてみようと四苦八苦して心が折れたヽ(´ヮ`)/
コンポーネントのインストール方法をイマイチ理解していないの為かうまくインストールできないので強引にソースコードを追加したし(苦笑)

何も指定せずにフォルダの圧縮をするようにフォルダを投げると
出力される圧縮ファイルは絶対パスで圧縮されたファイルが作られる(´;ω;`)

英語サイトをググたりソースコードを追いかけて、恐らく「AbArcTyp.pas」の191~192行目にある
TAbStoreOption =
  (soStripDrive, soStripPath, soRemoveDots, soRecurse, soFreshen, soReplace);
の組み合わせを上手くすれば相対パスで圧縮されたファイルが作られると思うけど限界になったので休憩する。


休憩を終えて追記1回目:
使い方としては、
ほげほげ.StoreOptions := [soStripPath, soFreshen, soReplace];
などと指定する。
無指定だと、絶対パスを含むフォルダ構成で圧縮ファイルを作成するオプションのようだ。
soStripPath はフォルダ構成を無くして圧縮ファイルを作成するオプションのようだ。

追記2回目:
ドキュメントというかヘルプファイルを見つけた(苦笑)TurboPower Abbrevia 3.04 | SourceForge.net
soStripDrive
Drive letter information is removed from the stored file name.
(Note: This option is ignored in Linux.)

soStripPath
All path information is removed from the stored file name.

soRemoveDots
All relative path information is removed from the stored file name. For example,
if you call AddFiles with a FileMask of "..\TEST.TXT" ("../TEST.TXT" in Linux),
the parent of the current BaseDirectory is searched for a file named "TEST.TXT".
If the file is found, it is stored as "TEST.TXT".

soRecurse
Subdirectories of the search path are included in the search for files to add or freshen.

soFreshen
When adding an existing item to the archive, the item is freshened.

soReplace
When adding an existing item to the archive, the item is replaced.


2013年5月31日12時10分 追記3回目:
もしかして「TurboPower Abbrevia 」って相対パスでの圧縮ファイルにするのに対応していないのか?と思い始めてる。


2013年5月31日15時07分 追記4回目;
情報の後出しは良くないんですけど、deko さんのサイト[ 続・ZIP で圧縮 / 解凍したい (Delphi 2010 以降) ]を見てこのコンポーネントを使おうと思いました。
これを諦めて 7-zip.dll を使おうかと思い始めてます・・・。

2013年5月31日17時04分 追記5回目:
Twitter で おにさんに助言[ Twitter / onimaro2010 ... ]をいただいて「TurboPower Abbrevia 」を使って相対パスでの圧縮ファイルを作成するのに成功しました。
しかし、このコンポーネントは圧縮ファイルのファイル名の拡張子をチェックして圧縮ファイルにする処理を開始するから Firefox 等のアドオンで使われている xpi ファイルを指定すると「そんなファイルタイプを知らん!」と圧縮ファイルを作成してくれないので困った(´・ω・`)
SaveFileName := ChangeFileExt(SaveFileName, 'xpi');
とするだけじゃアプリケーションのメモリ内だけでファイル名の拡張子が変わるだけだけですし(´・ω・`)


2013年6月1日5時43分 追記6回目:
普通に「delphi ファイル名 変更」でググってファイル名の拡張子変更を解決したw
RenameFile(SaveFileName,ChangeFileExt(SaveFileName, 'xpi'));

upしている過去バージョンは使い物にならないから全部削除だな(´・ω・`)
[PR]

by arigayas | 2013-05-30 15:22 | Delphi Programming | Trackback | Comments(0)
Delphi XE Pro - 今年の1月から作成していたソフト、XPI_Maker が完成した。
2013年1月30日から作り始めたソフトXPI_Maker が昨日完成した。

作り始めたきっかけは、Mozilla Firefox のアドオンソフトで
2ちゃんねるを見る chaika の開発版を手軽に手元で作るためのソフトをGUIで作ってみたくなったからです。
chaika の開発者のF氏が忙しくなったのか新機能追加が全くなかったのだけど、
N氏が開発を引き継ぐことになってから猛烈に新機能追加されるようになったので最新バージョンが欲しくなったんです。
しかし、ただ最新バージョンを取得するだけならバッチファイル[ 7zip と Subversion を使って chaika チェックアウトして xpi を作るバッチファイル : arigayas の 雑記帳 ]を作れば充分なのです。

なぜ、バッチファイルじゃなく GUI で作ったのかというと chaika の不具合報告するのに
自分が今、どのリビジョンを使っているのか忘れてしまっても大丈夫なように
アドオンのインストール情報が書かれている install.rdf のバージョン情報を書き換えてしまおうと考えたからです。
バッチファイルでダウンロードした特定のファイルを編集するのは、たぶんかなり面倒臭いと思ったのもあります。
あとダウンロードして生成されるファイル名にもアドオン名とRevision番号があればわかりやすいと思ったのもあります。


ソフトの用件は
  1. ソフトが作成するファイル名には、アドオン名とRevision番号があること
  2. 圧縮ファイルを作成に自前で圧縮ファイルを作成すること
  3. 保存フォルダを選べること
  4. 特定のRevision を指定し取得して作成できること
  5. Subversion がインストール済みであること
  6. ボタンは なるべく少なくする
  7. 設定は記録されること

こんな感じで作り始めました。作り始めた初日には1ヶ月ぐらいで作り終わるかな?と思ってたけど、
プログラミング初心者の進捗は遅い&行き詰まったら心が折れやすいのもあって、
初日に思った4倍の時間が掛かってしまったw (一応、言い訳:プログラミングしてない日数は半分以上あります。)

b0003577_9232919.png


今後実装したい機能があって複数のアドオンに対応したいです。
現状だと複数のアドオンを設定するには、アドオン毎にフォルダを作成しないと設定ファイルを保存できない設計です。

使用例
b0003577_11523599.png


気が向いたら追記するかもしないし、全くしないかも知れない。

関連記事
[PR]

by arigayas | 2013-05-27 11:30 | Delphi Programming | Trackback(1) | Comments(0)
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)