作成者別アーカイブ: kawabata

「DelphiによるiPhone / iPadアプリ開発コンテスト」にノミネートされた

「DelphiによるiPhone / iPadアプリ開発コンテスト」にノミネートされた。

以下メール

—————————————————————-
このたびは、「DelphiによるiPhone / iPadアプリ開発コンテスト」
にご応募いただき誠にありがとうございます。

皆様からご応募いただきましたアプリについて厳正なる審査の結果、
お客様の「らぶらぶ倫敦」が最終候補に残りました。最優秀賞の発表
は、本日開催する「第26回 エンバカデロ・デベロッパーキャンプ」
の【G6】セッションにて実施いたします。会場にお越しいただけない
方は、Ustreamでライブ中継を視聴いただけます。ぜひご覧ください。

・デベロッパーキャンプ – ライブ中継
http://www.embarcadero.com/jp/developer-camp-japan/live

以上、よろしくお願い致します。

12日目 スリープタイマー




uses
	FMX.Types;

type
  TGameStep = (gsOpening,
               gsGameStart,
               gsStageReady,
               gsStageStart,
               gsOnStage,
               gsStageEnd,
               gsStageResult,
               gsGameResult,
               gsGameEnd
               );



type
  TSleepTimer = class
private
  FTimerForSleep: TTimer;
  FTimerInterval: Integer;
  FTimeMS: Integer;
  FNextGameStep: TGameStep;
  FCount: Integer;
  procedure OnTimer(Sender: TObject);
public
  constructor Create();
  destructor Destroy; override;
  procedure Sleep(aTimeMS: Integer; aNextGameStep: TGameStep);
  procedure Stop();
end;



{ TSleepTimer }

constructor TSleepTimer.Create;
begin
  FTimerInterval := 100;

  FTimerForSleep := TTimer.Create(nil);
  FTimerForSleep.OnTimer  := OnTimer;
  FTimerForSleep.Interval := FTimerInterval;
  FTimerForSleep.Enabled  := False;


end;

destructor TSleepTimer.Destroy;
begin
  FTimerForSleep.Enabled := False;
  FTimerForSleep.Free;

  inherited;
end;

procedure TSleepTimer.OnTimer(Sender: TObject);
begin
  FCount := FCount + 1;
  if FCount * FTimerInterval >= FTimeMS then
  begin
    GameModel.GameStep := FNextGameStep;
    Stop();
  end;

end;

procedure TSleepTimer.Sleep(aTimeMS: Integer; aNextGameStep: TGameStep);
begin
  FTimeMS := aTimeMS;
  FNextGameStep := aNextGameStep;
  FCount := 0;
  FTimerForSleep.Enabled  := True;
end;

procedure TSleepTimer.Stop;
begin
  FTimerForSleep.Enabled  := False;
end;

24日目+81 アプリが Ready for Sale になった。

アプリが Ready for Sale になった。

しかし、すぐに
Pending Contract
になったとのメールがきた。

契約が必要らしい。
iTune Connect のトップページから
Contracts, Tax, and Banking
をクリックして、必要事項を記載。

参考:
iPhone使いへの道

10日目 構造体を使ったリスト


unit untTrade;

interface

uses
  untIDateTime,
  untPair,
  untHistoricalList;

type
  TTradeRecord = record
  private
  Public
    Pair    : TPair;
    TimeStep: TTimeStep;

    procedure Init();
    procedure Assign(aTradeRecord: TTradeRecord);
  end;

  TTradeList = record
  private
    function getCount: Integer;
  Public
    Items: Array of TTradeRecord;

    procedure Init();
    procedure Assign(aTradeList: TTradeList);
    procedure Add(aTradeRecord: TTradeRecord);
    property Count: Integer read getCount;

  end;

implementation

{ TTradeRecord }

procedure TTradeRecord.Assign(aTradeRecord: TTradeRecord);
begin
  Self.Pair     := aTradeRecord.Pair;
  Self.TimeStep := aTradeRecord.TimeStep;

end;

procedure TTradeRecord.Init;
begin
  Self.Pair          := peUSDJPY;
  Self.TimeStep.enum := ts1Hour;

end;

{ TTradeList }

procedure TTradeList.Add(aTradeRecord: TTradeRecord);
begin
  SetLength(Self.Items, Length(Self.Items) + 1);
  Self.Items[High(Self.Items)].Assign(aTradeRecord);
end;

procedure TTradeList.Assign(aTradeList: TTradeList);
var
  i: Integer;
begin
  SetLength(Self.Items, aTradeList.Count);
  for i := 0 to Self.Count - 1 do
    Self.Items[i].Assign(aTradeList.Items[i]);
end;

function TTradeList.getCount: Integer;
begin
  Result := Length(Self.Items);
end;

procedure TTradeList.Init;
begin
  SetLength(Self.Items, 0);
end;

end.

6日目 TTimer を動的に利用する

unit untModel;

interface

uses
  FMX.Types;


type
  TModel = class
  private
    FDrawTimer: TTimer;
    procedure OnDrawTimer(Sender: TObject);
  public
    destructor Destroy; override;
    constructor Create();
  end;

implementation

{ TModel }
constructor TModel.Create;
begin
  FDrawTimer          := TTimer.Create(nil);
  FDrawTimer.OnTimer  := OnDrawTimer;
  FDrawTimer.Interval := 1000;
  FDrawTimer.Enabled  := False;
end;

destructor TModel.Destroy;
begin
  FDrawTimer.Free;
  inherited;
end;

procedure TModel.OnDrawTimer(Sender: TObject);
begin
  //
end;

end.

2日目 色の指定は uses に UIConsts

色の指定は uses に UIConsts

procedure TCandleChartCreator.DrawCandle;
var
  tmpRectF: TRectF;
begin

  ChartBitmap.SetSize(Round(FWidth), Round(FHeight));

  tmpRectF.Left   := FWidth *0.05;
  tmpRectF.Right  := FWidth *0.95;
  tmpRectF.Top    := FHeight*0.05;
  tmpRectF.Bottom := FHeight*0.95;

  with ChartBitmap.Canvas do
  begin
    BeginScene;
    Stroke.Kind := TBrushKind.bkSolid;
    Stroke.Color :=  claLime;
    StrokeThickness := 4;
    DrawRect(tmpRectF, 20, 20, AllCorners, 1.0);
    EndScene
  end;

end;

1日目 FX練習用ソフトの開発を始める

スケジュール

2014/8/31    1
2014/9/1    2
2014/9/2    3
2014/9/3    4
2014/9/4    5
2014/9/5    6
2014/9/6    7
2014/9/7    8
2014/9/8    9
2014/9/9    10
2014/9/10    11
2014/9/11    12
2014/9/12    13
2014/9/13    14
2014/9/14    15
2014/9/15    16
2014/9/16    17
2014/9/17    18
2014/9/18    19
2014/9/19    20
2014/9/20    21
2014/9/21    22
2014/9/22    23
2014/9/23 24
2014/9/24 1
2014/9/25 2
2014/9/26 3
2014/9/27 4
2014/9/28 5
2014/9/29 6
2014/9/30 7
2014/10/1 8
2014/10/2 9
2014/10/3 10

1日目 列挙型をもとにした構造体サンプル


type
  TPairEnum = (
    peEURUSD,
    peGBPUSD,
    peUSDCHF,
    peUSDJPY,
    peEURGBP,
    peEURCHF,
    peEURJPY,
    peGBPCHF,
    peGBPJPY,
    peCHFJPY,
    peUSDCAD,
    peEURCAD,
    peAUDUSD,
    peAUDJPY,
    peNZDUSD,
    peNZDJPY);


type
  TPair = record
  private
    FEnum: TPairEnum;

    function getName(): String;

    procedure setEnum(const Value: TPairEnum);
    procedure setName(const Value: String);
    function getCount: Integer;
    function getSerial: Integer;
    procedure setSerial(const Value: Integer);


  public
    property Enum:      TPairEnum read FEnum        write setEnum;
    property Serial:    Integer   read getSerial    write setSerial;
    property Name:      String    read getName      write setName;
    property ShortName: String    read getShortName;

    property Count: Integer read getCount;
  end;

implementation

{ TPair }

function TPair.getCount: Integer;
var
  tmpInfo :PTypeInfo;
  tmpData :PTypeData;
begin
  tmpInfo :=TypeInfo(TPairEnum);
  tmpData :=GetTypeData(tmpInfo);
  Result := tmpData.MaxValue - tmpData.MinValue + 1;
end;

function TPair.getName: String;
begin
  case FEnum of
    peEURUSD: result := 'EURUSD';
    peGBPUSD: result := 'GBPUSD';
    peUSDCHF: result := 'USDCHF';
    peUSDJPY: result := 'USDJPY';
    peEURGBP: result := 'EURGBP';
    peEURCHF: result := 'EURCHF';
    peEURJPY: result := 'EURJPY';
    peGBPCHF: result := 'GBPCHF';
    peGBPJPY: result := 'GBPJPY';
    peCHFJPY: result := 'CHFJPY';
    peUSDCAD: result := 'USDCAD';
    peEURCAD: result := 'EURCAD';
    peAUDUSD: result := 'AUDUSD';
    peAUDJPY: result := 'AUDJPY';
    peNZDUSD: result := 'NZDUSD';
    peNZDJPY: result := 'NZDJPY';
  else
    ShowMessage('TPair.getName');
  end;
end;

function TPair.getSerial: Integer;
begin
  result := Integer(FEnum);
end;

procedure TPair.setEnum(const Value: TPairEnum);
begin
  FEnum := Value;
end;

procedure TPair.setName(const Value: String);
var
  tmpValue: String;
begin
  tmpValue := trim(Value);
       if tmpValue = 'EURUSD' then self.enum := peEURUSD
  else if tmpValue = 'GBPUSD' then self.enum := peGBPUSD
  else if tmpValue = 'USDCHF' then self.enum := peUSDCHF
  else if tmpValue = 'USDJPY' then self.enum := peUSDJPY
  else if tmpValue = 'EURGBP' then self.enum := peEURGBP
  else if tmpValue = 'EURCHF' then self.enum := peEURCHF
  else if tmpValue = 'EURJPY' then self.enum := peEURJPY
  else if tmpValue = 'GBPCHF' then self.enum := peGBPCHF
  else if tmpValue = 'GBPJPY' then self.enum := peGBPJPY
  else if tmpValue = 'CHFJPY' then self.enum := peCHFJPY
  else if tmpValue = 'USDCAD' then self.enum := peUSDCAD
  else if tmpValue = 'EURCAD' then self.enum := peEURCAD
  else if tmpValue = 'AUDUSD' then self.enum := peAUDUSD
  else if tmpValue = 'AUDJPY' then self.enum := peAUDJPY
  else if tmpValue = 'NZDUSD' then self.enum := peNZDUSD
  else if tmpValue = 'NZDJPY' then self.enum := peNZDJPY
  else
    ShowMessage('TPair.setName');
end;


procedure TPair.setSerial(const Value: Integer);
begin
  FEnum := TPairEnum(Value);
end;


24日目+66 Macへの接続がうまくいかないときのチェック

コンピュータの再起動によってipが変わることがあるので以下をチェック

macからpaserverを起動
コマンドプロンプトから ip と入力して 数値を記録

delphi IDE プロジェクトマネージャーのターゲットプラットフォームでiOSシミュレーターを右クリックして、編集の接続をクリックホスト名に先ほど調べた数値を入力

24日目+64 iOS ファイルシステムを調べる

Delphi のサンプルによくあるのだが、プログラムから読み込む画像ファイルや音声ファイルを

StartUp\Documenys\

に配置するとリジェクトされてしまうことがわかる。

では、どこに配置するのか?調査を開始する。

配置マネージャーで wp0.png のリモートパスを
.\image\
に設定して

procedure TForm3.Button1Click(Sender: TObject);
var
tmpFileName: string;
begin
tmpFileName := GetHomePath + PathDelim +
ExtractFileName(ParamStr(0)) + ‘.app’ + PathDelim +
‘image’ + PathDelim +
‘wp0.png’;

Image1.Bitmap.LoadFromFile(tmpFileName);
end;

でOK。

 

 

<Application_Home>/Documents    ユーザーが生成した情報を置く。iTunes によってバックアップされる。

<Application_Home>/Library
ユーザーのデータファイル以外のファイルの最上位ディレクトリ。iTunesによってバックアップされる(ただし、Cachesサブディレクトリは除く)

<Application_Home>/Library/Caches
iTunesによってバックアップされない
<Application_Home>/tmp/
一時ファイルを書き込むために利用、アプリケーションが実行されていないとき、システムが削除する可能性がある。iTunesによってバックアップされない。

ファイルシステムプログラミングガイド

プログラミング雑記

取得した画像をDocumentsディレクトリに適当に格納しといたらappleにrejectされた!

iPhoneアプリ開発、その(230) お前もリジェクトしてやろうか

24日目+56 iTunes Connect に Reject された

Binary Rejected
2.23: Apps must follow the iOS Data Storage Guidelines or they will be rejected

In particular, we found that on launch and/or content download, your app stores 11MB in iCloud. To check how much data your app is storing:

だって。

もう一度、ガイダンスを読んで、規定に合うように書き直すとするか。