DELPHI BOOT CAMP / DELPHIでビジュアル開発に挑戦しよう ◆ DAY3: Delphiプログラミングを学ぼう [JAPAN]

Posted by on in Programming

◇◆◇◆ Delphi Boot Camp / Delphiでビジュアル開発に挑戦しよう ◇◆◇◆

Day3: DelphiでUI設計のポイントを学ぼう

 

2016年9月14日(水) 、Webによるオンラインセミナー 「Delphi Boot Camp / Delphiでビジュアル開発に挑戦しよう」を実施しました。Delphi Boot Campは延べ4日間にわたり実施されているWebセミナーで、当記時はそのセミナー3日目の内容について記載しています。

詳しいBoot Camp説明はこちらのブログに記載があります。 Boot Camp申し込みのページは下記にもあり、内容も記載されていますので、ご興味のある方は覗いてみてください。

Webセミナー「Delphi Boot Camp」:http://forms.embarcadero.com/delphi-boot-camp-2016

このブログでは、Day3にてご紹介した内容のサマリーと、参考資料を掲載いたします。

 

Day3 では RAD Studio 勉強会 @ 大阪 より 毛利 春幸さんにお越しいただき、講師をしていただきました。

毛利 春幸
RAD Studio 勉強会@大阪
元ハードウェア担当でロジック回路設計やFPGA(VHDL)などのプログラムの経歴を有す。初代Delphi(Windows3.1)から使い続けて20年、200万カードを管理するカラオケ会員システムやアプリを担当している。

 

Day3のセミナーの動画はこちらからご覧ください: 

http://forms.embarcadero.com/delphi-boot-camp-2016

※ページ下部の[オンデマンド視聴]から[登録実行]を行ってご視聴ください。準備ができ次第、順次アップロードされます。

 

以下、Webセミナー上でご紹介したリンク情報など記載いたします。

 

■Object Pascalのコーディング

 

■ほんのさわりだけのOOP入門

クラスとオブジェクト:http://docwiki.embarcadero.com/RADStudio/Berlin/ja/クラスとオブジェクト(Delphi)

 

■文字列

文字列型: http://docwiki.embarcadero.com/RADStudio/Berlin/ja/文字列型(Delphi)

 

■メモリ操作

メモリ操作の例外 ARC: http://docwiki.embarcadero.com/RADStudio/Berlin/ja/ Delphi_モバイル_コンパイラでの自動参照カウント

 

■番外:Interface

オブジェクト インターフェース:http://docwiki.embarcadero.com/RADStudio/Berlin/ja/オブジェクト_インターフェイス

 

■高度な言語機能(1) ジェネリクス

ジェネリックス: http://docwiki.embarcadero.com/RADStudio/Berlin/ja/ジェネリックス:インデックス

ジェネリクスの説明で最初に「シンプルな例」としてプレゼンテーションに記載されていたコード例を以下に掲載

ジェネリクス

{ジェネリクス}
TMyClass<T > = class
  private
   F1: T;
   F2: T;
 public
   procedure Add(v1, v2: T);
  function Take_out(): T;
 end;

var
 myObj: TMyClass<Integer>;
  i_result: Integer;

begin
  myObj := TMyClass<Integer>.Create;
  myObj.Add(1, 2);
  i_result  := myObj.Take_out;
//

 

ジェネリックメソッド

{ジェネリックメソッド}
TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure my_func<T: class, constructor>(obj: T);
  public
    { Public 宣言 }
end;

procedure TForm1.my_func<T>(obj: T);
begin
  obj := T.Create();
end;
//

 

ジェネリック制約

{ジェネリック制約}
IMyInterface<T> = Interface(IInterface) ['{D722F0F8-293C-49B9-8D89-4BC522B6FF62}']
    procedure proc1(i: T);
end;

TMyClass<T: IInterface> = class
  private
    F1: T;
  public
    function get_if: T;
end;

var
  myObj:  TMyClass<IMyInterface<Integer> >;
begin
  myObj := TMyClass<IMyInterface<Integer> >.Create;
  myObj.get_if.proc1(1);
//

 

ジェネリックのデモに使用したデモコードの抜粋

{ジェネリックのデモに使用したデモコードの抜粋}
uses
System.Generics.Collections;

type
  IAddTest<T> = interface ['{B112813C-E9BA-43F5-B2CB-D509CE316C42}']
    function getValue(): T;
  end;

  TAddTest<T> = class(TInterfacedObject,IAddTest<T>)
    Fi: T;
    constructor Create(i: T);
    function getValue(): T;
  end;

//TfForm1 Class 内のPublic
public
    ///<summary>単純なGenerics Method</summary>
    function generic_func1<T: class, constructor>: T;
    ///<summary>整数足し算</summary>
    function addr<T: IAddTest<Integer> >(i1, i2: T): Integer; overload;
    ///<summary>小数点足し算</summary>
    function addr_float<T: IAddTest<Double>>(i1, i2: T): Double; overload;

implementation
 
{$R *.dfm}

function TForm1.addr<T>(i1, i2: T): Integer;
begin
  Result := i1.getValue + i2.getValue;
end;

function TForm1.addr_float<T>(i1, i2: T): Double;
begin
  Result  := i1.getValue + i2.getValue;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i1, i2: IAddTest<Integer>;
  i3: Integer;
begin
  {整数}
  i1  := TAddTest<Integer>.Create( StrToInt( Edit1.Text ) );
  i2  := TAddTest<Integer>.Create( StrToInt( Edit2.Text ) );
  i3  := addr<IAddTest<Integer> >(i1, i2);
  ShowMessage(IntToStr(i3));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i1, i2: IAddTest<Double>;
  i3: Double;
begin
  {小数点}
  i1  := TAddTest<Double>.Create( StrToFloat( Edit1.Text ) );
  i2  := TAddTest<Double>.Create( StrToFloat( Edit2.Text ) );
  i3  := addr_float<IAddTest<Double> >(i1, i2);
  ShowMessage(FloatToStr(i3));
end;
//

 

■高度な言語機能(2) 無名メソッド

http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Delphi_での無名メソッド

無名メソッドを変数に入れる例としてプレゼンテーションに記載されていたコード例を以下に掲載

{無名メソッドを変数に}
var
  l_proc_: TProc;
begin
  l_proc_ := procedure
    begin
      Sleep(1000)
    end;

 l_proc_();
end;

 

無名メソッドTThread例

{無名メソッドTThread例}
  TThread.CreateAnonymousThread(procedure
  var
    i: Integer;
  begin
    for i := 0 to 10 do
    begin
      TThread.Synchronize(TThread.CurrentThread, procedure
      begin
        Memo1.Lines.Append(IntToStr(i));
      end);
    end;
  end).Start();

 

無名メソッドTTask.Future例

{無名メソッドTTask.Future例}
var
  i: Integer;
  ifuture_: IFuture<Integer>;
  ifutures_: array[0..9] of IFuture<Integer>;
begin
  for i := 0 to Pred(Length(ifutures_)) do
    ifutures_[i] := TTask.Future<Integer>(function: Integer
    begin
      Sleep(1000);
      Result  := Random(10);
    end);
  for ifuture_ in ifutures_ do
    Memo1.Lines.Append(IntToStr(ifuture_.Value));
//

 

無名メソッドTParallel.For()例

{無名メソッドTParallel.For()例}
 TParallel.For(1, 10, procedure (i: Integer)
  begin
    Sleep(100*Random(10));
    OutputDebugString(PChar(IntToStr(i)));
  end);

 

無名メソッドのデモに使用したデモコードから抜粋

{無名メソッドのデモ}
uses
System.Threading;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  (Sender as TButton).Enabled := False;
  AniIndicator1.Enabled := True;
  AniIndicator1.Visible := True;
  TThread.CreateAnonymousThread(procedure
  var
    i: Integer;
    task_array: array[0..2] of ITask;
  begin
    for i := 0 to Length(task_array)-1 do
      task_array[i] := TTask.Run(procedure
      begin
        {ここで3つのタスクを実行}
        Sleep(3000);
      end);
    {ここで3つのタスク終了待ち}
    TTask.WaitForAll(task_array);
    TThread.Synchronize(TThread.CurrentThread, procedure
    begin
      AniIndicator1.Enabled := False;
      AniIndicator1.Visible := False;
      (Sender as TButton).Enabled := True;
    end);
  end).Start;
end;

 

■高度な言語機能(3) リフレクション

http://docwiki.embarcadero.com/RADStudio/Berlin/ja/属性(RTTI)

プレゼンテーションに記載されていたコード例を以下に掲載

RTTIを使ってTButtonのプロパティを変更

{RTTIを使ってTButtonのプロパティを変更}
var
  context:  TRttiContext;
  aprop:    TRttiProperty;
begin
  aprop := context.GetType(TButton).GetProperty('Caption');
  aprop.SetValue(Button1, 'Button2');
end;

 

RTTIを使ってTButtonのプロパティを取り出す

{RTTIを使ってTButtonのプロパティを取り出す}
var
  context:  TRttiContext;
  aprop:    TRttiProperty;
  atype:    TRttiType;
  avalue:   TValue;
begin
  atype   := context.GetType(TButton);
  aprop   := atype.GetProperty('Caption');
  avalue  := aprop.GetValue(Button1);

  OutputDebugString(Pchar(avalue.AsString));
end;

 

RTTIを使ってTButtonの名前空間を取り出す

{RTTIを使ってTButtonの名前空間を取り出す}
var
  context:  TRttiContext;
  atype:    TRttiType;
begin
  atype := context.GetType(TButton);
  OutputDebugString(Pchar(atype.QualifiedName));
end;

 

RTTIのデモに使用したデモコードから抜粋

{RTTIのデモに使用したデモコード}
uses
System.Rtti

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
  obj:  TFmxObject;
  context:  TRttiContext;
  aprop:    TRttiProperty;
begin
  aprop := context.GetType(TFmxObject).GetProperty('Name');
  EnumObjects(function(obj_: TFmxObject): TEnumProcResult
    begin
      if (obj_ is TFmxObject) and Assigned(obj_) then
        Memo1.Lines.Append( aprop.GetValue(obj_).AsString );
    end);
end;

 

■OBJECT PASCAL HANDBOOKについて

こちらのブログをご参照ください: 久々の Delphi (Object Pascal) 関連書籍 日本語版 [Japan]

http://community.embarcadero.com/blogs/entry/delphi-object-pascal



About
Gold User, No rank,
Sales consultant - Embarcadero Technologies , at Japan Twitter : @kazaiso

Comments

Check out more tips and tricks in this development video: