人気ブログランキング |
カテゴリ:Delphi Programming( 44 )

Delphi - 使用するファイルを他のソフトから書き込み禁止にして作成ソフトから書き込む方法

最近作成しているToDoリストソフトでToDoリストをテキストファイルに保存しているのですが、
他のテキストエディタとかで開いて内容を書き換えられるのは良くない(*)と思ったのですが、
やり方がさっぱり分からなかったのでTwitterで聞いてみたら答えていただけたので共有のために記事にします。
ちなみにButtonを押した時に動いたのか分かりにくかったので Memo1.Lines.Add をいくつか追加しています。

「TwitterではTLから見えなくなったら答えようがないから今後はMLで聞いてね!」と忠告を受けました(反省)


MemoとButtonを3つ配置します。
b0003577_22312941.png

unit LockFileUnit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

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

var
Form1: TForm1;

implementation

{$R *.dfm}

var
FileName: string;
LInput: TFileStream;

procedure LockFile;
begin
if FileExists(FileName) then
LInput := TFileStream.Create(FileName, fmOpenWrite or fmShareDenyWrite);
end;

procedure UnlockFile;
begin
if Assigned(LInput) then
FreeAndNil(LInput);
end;

procedure TForm1.Button1Click(Sender: TObject);
// FormCreate
begin
FileName := 'todo.txt';
if FileExists(FileName) then // ファイルがあったら実行する
begin
Memo1.Lines.Add('FormCreate');
Memo1.Lines.LoadFromFile(FileName);
Memo1.Lines.Add('FormCreate pass');
end;

LockFile;
end;

procedure TForm1.Button2Click(Sender: TObject);
// SaveFile
begin
UnlockFile;
Memo1.Lines.Add('SaveFile');
Memo1.Lines.SaveToFile(FileName);
Memo1.Lines.Add('SaveFile pass');
LockFile;
end;

procedure TForm1.Button3Click(Sender: TObject);
// FormDestroy
begin
UnlockFile;
Memo1.Lines.Add('UnlockFile');
end;

end.
ファイルの開き方や読み書きの属性についての embarcaderoのドキュメント→System.Classes.TFileStream.Create - RAD Studio API Documentation

(*):テキストエディタで書き換えてもToDoリストの内容には反映されないなど。

今回使用した環境は、Delphi 10.3 Community + Windows 10 Pro 1803です。



by arigayas | 2019-03-02 22:51 | Delphi Programming | Trackback | Comments(0)
約1年半前に購入した日本語版「OBJECT PASCAL HANDBOOK」を読み始めた。[更新停止中]

出版社のページ → CUTT System:OBJECT PASCAL HANDBOOK ← 目次あり


2016年10月に購入した「OBJECT PASCAL HANDBOOK」(本体価格:6000円の本)を3月5日に読み始めた。
買ってから一度2、3日ぐらいで30ページぐらいを寝る前に読んだんですが、
パソコンで全く試さずに読んでいたら、記述されている事が気になりストレスになってしまって読むのを止めてしまいました。

6000円も出して購入したこの本を死蔵させるのは勿体ないと思いこの3月を強化月間として読むことにしました。
あと今年の誕生日に「独習PHP 第3版」を買ったのもある。「OBJECT PASCAL HANDBOOK」を読み終えたら「独習PHP 第3版」をやるつもり。

この本は大きく三部に分かれている。

  1. 基礎 [第1章~第6章]
  2. OBJECT PASCAL での OPP [第7章~第13章]
  3. 高度な機能 [第14章~第18章]

3月中に第2部の「OBJECT PASCAL での OPP」の途中まで行きたいと思ってる。→4月になっても第2章の終わりまでしか読めていない・・・。

使用環境は、Windows10 / Delphi 10.2 Starter版(新しいバージョンが出たら毎回更新予定)


↓2018年4月25日に電子書籍版が出る事を知ったので追記↓


デモのソースコードのダウンロード先はこちら
>> MarcoDelphiBooks/ObjectPascalHandbook: Object Pascal Handbook demos source code
b0003577_18000403.png
「Clone of download」をクリックすると下の状態になるので
b0003577_18000436.png
「Download ZIP」をクリックして「ObjectPascalHandbook-master.zip」を適当な場所にダウンロードして解凍(展開)します。
フォルダ数[134]とファイル数[647]が多いです。ちなみに解凍(展開)後のサイズは約12MBです。

↑2018年4月25日追記終わり↑


気になった事をメモっていこうと思う。

by arigayas | 2018-03-08 10:47 | Delphi Programming | Trackback | Comments(10)
「できるDelphi / C++Builder 10.x Community 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へのリンク。


2018年8月2日追記
  • 2018年7月19日に、従来の Professional Edition 相当を無償化したので、「できるDelphi / C++Builder 10.x Starter Edition」から「できるDelphi / C++Builder 10.x Community Edition」に改題
  • テストについての解説。テストツールを使うなら DUnitX という事なのでこのツールについての解説とやり方。
  • GetItでおすすめ。
  • データベース関連。



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 にもインストールが可能です。



↓更新日時↓

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;




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;
という状態です。




追記分

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);
みたいな感じで。

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秒
と表示されます。

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


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している過去バージョンは使い物にならないから全部削除だな(´・ω・`)

by arigayas | 2013-05-30 15:22 | Delphi Programming | Trackback | Comments(0)