記事カテゴリ

ユーザー機能


 2024年4月23日(火) 17:47 JST

[Delphi] テキストファイル操作

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    30,678

テキストファイルを操作してプログラムの動作記録をとりませんか?ログをとっておくと後からデバッグを行うときにとっても便利。
ログの書き出し用にコンポーネントを作成すると使い回しが利いてさらに便利。
テキストファイルにログを書き込みための手順は以下のようになる。

  1. テキストファイルのオープン
    テキストファイルのオープンは新規の場合と、すでにファイルがある場合とで異なる。
      ・新規の場合 → Reset
      ・すでに存在する場合 → Rewrite
  2. 次にオープンしたファイルを上書き用に変更します。変更にはAppendを使用する。
  3. 書き込みには Writeln と Flush を使用します。Writeln でバッファに書き込みし、Flush でバッファからテキストファイルに書き出す。
  4. 書き込みが終わったら、CloseFileでクローズして終わる。

以下にサンプルでログ出力用のサンプルのソースを掲載するので参考に。

unit FileLogger;

interface

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

type
  TFileLogger = class(TComponent)
  private
    FFile: TextFile;
    FFilename: String;
    FSeparator: String;
    FDateFormat: String;
    FTimeFormat: String;
  protected
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Report(sMsg: String);
  published
    property Filename: String read FFileName write FFileName;
    property Separator: String read FSeparator write FSeparator;
    property DateFormat: String read FDateFormat write FDateFormat;
    property TimeFormat: String read FTimeFormat write FTimeFormat;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Sample', [TFileLogger]);
end;

{ TFileLogger }

constructor TFileLogger.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  // フォーマットの初期化
  FDateFormat := 'yyyy/mm/dd';
  FTimeFormat := 'hh:nn:ss';
  FSeparator := #9;
end;

destructor TFileLogger.Destroy;
begin
  inherited;
  CloseFile(FFile);
end;

procedure TFileLogger.Loaded;
var
  sFileName: String;
begin
  inherited;
  if (csDesigning in ComponentState) then Exit;
  // ファイルポインタの初期化
  if (FFilename <> '') then
    sFilename := FFileName
  else
    sFilename := FormatDateTime('yyyymmdd', Date) + '.txt';

  AssignFile(FFile, sFilename);

  if FileExists(sFilename) then
    Reset(FFile)
  else
    Rewrite(FFile);
  Append(FFile);
end;

procedure TFileLogger.Report(sMsg: String);
var
  s: String;
begin
  s := FDateFormat + FSeparator + FTimeFormat + FSeparator;
  s := FormatDateTime(s, Now) + sMsg;
  Writeln(FFile, s);
  Flush(FFile);
end;

end.

以上のコードがログ出力サンプルコンポーネントです。

[Delphi] DateTimePicker の書式変更

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    9,200

DateTimePicker の書式を用途に応じて変更したくはないか?
Delphi の日付の書式は通常 LongDateFormat、ShortDateFormat 変数を変更するのだが、DateTimePicker はこの方法で変更できない。DateTimePicker には、Delphi の日付書式設定が全く効かない。
また、DateTimePicker のプロパティには、Short と Long の二通りの設定しかなく、年月だけ表示したい場合などやや柔軟性に欠ける。
従って、変更には以下の方法を使用することになる。
このときの書式には Delphi の書式ではなく、Windows の日付書式を使用することになる。また commctrl ユニットを uses 節に追加する必要がある。

※ Delphi で月をあらわす書式は "mm" だが、Windows では "MM" となる。

uses
  commctrl;

procedure ChangeDateFormat;
var
  szFormat: PChar;
begin
  szFormat := 'yyyy/MM/dd';  // Windows の日付書式
  SendMessage(DateTimePicker1.Handle, DTM_SETFORMAT, 0, longint(szFormat));
end;

[Delphi] うるさい音をミュート!

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    6,612

音が出てうるさいと思ったことはありませんか? また、何でここで音が出るんだろう?と思ったことはありませんか? そんなときには強引に音が出るデバイスに対して止めに入るなんてのも1つの手かもしれませんね。
まず、「Beep」ボタンをクリックして音が出ることを確かめてください。音が出ることを確かめたら 「Mute」をクリックして音が出なくなるのを確かめます。最後に「Loud」をクリックして元の音量に戻ることを確かめてください。ただし「Mute」は2回クリックしないようにお願いします。

サンプルプログラムのダウンロードは→[Delphi FAQ用サンプル] うるさい音をミュート!

[Delphi] 全角スペース文字対応のTrim

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    14,175

Delphiの標準関数(Trim、TrimLeft、TrimRight)は全角の空白を取り除いてくれません。 全角空白を取り除くためには、ループしてこの文字を見つけて取り除く必要があります。以下に全角対応のTrimを作成しました。

※2012/05/02 Unicode対応

  • ZTrim ... 全角対応 Trim
  • LTrim ... 全角対応 TrimLeft
  • RTrim ... 全角対応 TrimRight

[Delphi] カレントレコードをコピーする

  • 記事を友だちにメール
  • 印刷用ページ
  • 投稿者:
  • 表示回数
    6,872

今見ているデータの一部を編集して、新しくデータを作成したいありませんか?こんなときには、現在のレコードをコピーしてそのレコードを編集するのが簡単!
ということで、以下はカレントレコードをコピーする関数の例です。

procedure AppendCurrent(Dataset: TDataset); 
var 
  aField: Variant; 
  i: Integer; 
begin 
  // バリアント型の配列を作成 
  aField := VarArrayCreate([0, Pred(DataSet.FieldCount)], VarVariant); 
  // フィールドのデータを先ほどの配列にコピー 
  for i := 0 to Pred(DataSet.FieldCount)do 
    aField[i] := DataSet.Fields[i].Value; 
  // 新規レコードを追加 
  DataSet.Append ; 
  // 新規レコードに配列のデータを書き戻し 
  for i := 0 to Pred(DataSet.FieldCount)do 
    DataSet.Fields[i].Value := aField[i]; 
end; 

サイトカレンダー

サイトカレンダーをスキップ

2024年 04月
«
»
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

新着情報

記事 新着(24時間)

-

コメント 新着(2日)

-

トラックバック 新着(2日)

-

リンク 新着(2週)

新しいリンクはありません

ファイル (14日)