ドゥアイネットのプログラマー、湯川が開発日記を綴ります。

CALENDAR
S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< March 2019 >>
ARCHIVES
CATEGORIES
commitPropertiesについて
 過去の記事で、DataGridのheaderrendererを設定するときに
commitPropertiesを使ったらうまくいったと書きました。

確かにこれはうまくいくのですが、問題がありました。

commitPropertiesは、DataGridの変数が変わるたびに呼び出されるのです。
それは、コードで変数をセットしたときだけでなく
さまざまなタイミングで呼び出されているようです。

以下のようにすると

/**
 * commitProperties(ヘッダーの制御のために追加)
 *
 */
override protected function commitProperties():void
{
  trace("commitProperties");
  super.commitProperties();

  for (var i:int=0; i<this.columns.length; i++) {
    DataGridColumn(this.columns[i]).headerRenderer= _header;          
  }

}

DataGridがある画面でダイアログを表示したときなどに
ガンガン呼びされてしまいます。


なので、DataGridのヘッダーのように
一度だけセットするものは、フラグをもって以下のようにしたほうがいいようです。


/**
 * commitProperties(ヘッダーの制御のために追加)
 *
 */
override protected function commitProperties():void
{
  super.commitProperties();
 
  if (this.headerCreated){
    return;
  }
 
  for (var i:int=0; i<this.columns.length; i++) {
    DataGridColumn(this.columns[i]).headerRenderer= _header;          
  }
 
  this.headerCreated = true;
 
}

commitPropertiesはいつ呼ばれるのかはっきりわかりませんが
重い処理を書くのはよくないようです。
| Flex | 09:18 | comments(1) | - |
Flexでの両面印刷
 Flexで作成した印刷処理が、通常の印刷ではうまくいくのに
プリンタの設定で両面印刷にするとうまく出力がされませんでした。

一枚目に印刷されたものが出力されて二枚目は印刷されないで出てきます。

作成したオブジェクトをprintJobに「addObject」しているだけなので
とくに問題はなさそうだったのですが、調べてみると「addObject」のときに
引数を指定できることがわかりました。

//このような感じで指定します。
p_printJob.addObject(v_outarea, FlexPrintJobScaleType.SHOW_ALL);

FlexPrintJobScaleTypeには以下の4つがあります。

FILL_PAGE : 少なくとも 1 ページに完全に収まるようにオブジェクトを拡大および縮小します。

MATCH_HEIGHT : 使用可能なページの高さ領域に合わせてオブジェクトを拡大および縮小します。

MATCH_WIDTH : 使用可能なページの幅に合わせてオブジェクトを拡大および縮小します。

NONE : 出力は拡大および縮小されません。

SHOW_ALL : 1 ページに収まるように、1 つのサイズに合わせてオブジェクトを拡大および縮小します。
           つまり、MATCH_WIDTH または MATCH_HEIGHT のいずれか大きい方のタイプが選択されます。

SHOW_ALL」にしてやると両面印刷することができました。
片面印刷の場合も問題ないようなのでこれを指定したほうがよさそうです。
| Flex | 17:34 | comments(0) | - |
FlexPrintJobのprintAsBitmap
 FlexPrintJobに「printAsBitmap」プロパティがあります。

「ジョブコンテンツをビットマップとして印刷するか(true)、
ベクター形式で印刷するか(false)を指定します。」

trueだとビットマップ化されるので容量が大きくなります。
ベクター形式だと容量が小さくなります。

印刷対象が半透明など使っていなかったら、
「false」に設定したほうが良いです。

pdf化したときの容量の差はこれくらいあります。

「printAsBitmap」「true」の場合(131MB)
画像

「printAsBitmap」「false」の場合(192KB)
画像

これならデフォルト「false」のほうが良さそうな感じがしますね。
| Flex | 14:45 | comments(0) | - |
Treeコントロールの矢印
 Flexのツリーコントロールでは、
子のノードがある場合、矢印が表示されます。

画像

子の有無がわかって便利なのですが、
システムによっては不要なときもあります。

これを表示しない方法を調べました。

以下の二つのスタイルを「null」にしてやればいいようです。

this.setStyle("disclosureClosedIcon", null);
this.setStyle("disclosureOpenIcon", null);

これで実行すると以下のように矢印を非表示にすることができます。

画像
| Flex | 17:52 | comments(0) | - |
sendToURL
Flexに「 sendToURL」というメソッドがあるのを知りました。

「navigateToURL」とは違い結果を実行中のブラウザに表示しません。
サーバ側に処理だけ依頼したい場合に使えそうです。

Flex側
        var v_url:URLRequest = new URLRequest();
        var v_param:URLVariables = new URLVariables();

        v_url.method = URLRequestMethod.POST;

        v_url.url = "http://xxxxxx/test.php5";
        v_param.postvalue = "テストPOSTデータ";
        v_url.data = v_param;

        sendToURL(v_url);

PHP側

        $fp = fopen("./sample.txt", "w");
        fwrite($fp, $_POST['postvalue']);
        fclose($fp);

        exit();

sample.txtには「テストPOSTデータ」が出力されます。
うまく使えば便利そうな機能です。


| Flex | 16:31 | comments(0) | - |
swcにcssファイルを含める

システムをいくつかに分けて開発することになり、
共通部品をswcにして使用するようにしています。

問題になったのは共通部品で使用しているスタイルシートです。
プロジェクトでcssファイルを読み込めばよいのですが、
できればswcにまとめられないかと調べました。

Adobe Flexヘルプで見つけました。

まず、swcのソースフォルダに「defaults.css」を作成します。

画像

これにスタイルを定義すると、swcの中と、swcを追加したプロジェクトで参照できます。


次にswcプロジェクトの追加コンパイル引数に以下を追加します。
「-include-file defaults.css defaults.css」
画像
これで、swcにスタイルが含まれるようになります。

この機能は、共通部品とプロジェクトの部分をキッチリと分けることができるのでとてもよいと思います。
| Flex | 10:25 | comments(0) | - |
AIRでローカルプログラム実行
 AIRでローカルプログラム実行を試してみました。

Flex Builder3を使っているので、まずはSDK4.1のダウンロードをしました。

プロジェクトを作成して、SDKを設定します。
引数にもtargetplayer=10.1を追加します。
画像

ソースはこんな感じです。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  <mx:Script>
    <![CDATA[

      private function test1():void
      {
          var appFile:File = new File("c:/test.text");
          appFile.openWithDefaultApplication();

      }

      private function test2():void
      {
        var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
        var file:File = File.applicationDirectory.resolvePath("C:/WINDOWS/system32/calc.exe");
        info.executable = file;

        var process:NativeProcess = new NativeProcess();
        process.start(info);
      }

    ]]>
  </mx:Script>
  <mx:VBox width="100%" height="100%" horizontalAlign="center" verticalAlign="middle">
    <mx:Button click="test1()" label="テキストファイル表示"/>
    <mx:Button click="test2()" label="電卓起動"/>

  </mx:VBox>

</mx:WindowedApplication>


上のボタンでテキストファイルを開いて、
下のボタンで電卓を起動します。

NativeProcessでの電卓の起動がうまくいきませんでした。
アプリケーションのxml(プロジェクトをつくるとできるやつ)に
以下の記述がないとNativeProcessが使えないそうです。

<supportedProfiles>extendedDesktop</supportedProfiles>

これを追加して実行するとうまくいきました。

画像

なんかボタンが違いますね、SDKが4だからですかね。
そろそろFlash Builderへバージョンアップしてみても良さそうですね。

| Flex | 18:14 | comments(0) | - |
SWCの作成
SWCは共通部品などをまとめておいて、
プロジェクトに取り込んで使用します。

共通部品を別々のプロジェクトで使うと、
共通部品のソースを編集してしまって、だんだん共通でなくなってしまうことがあります。


共通部品をSWCで配布していれば、ソースを書き換えることができないので、
上記のようなことは起こらなくなります。

※ 共通部品のクラスを継承して、そのプロジェクト用にするといったことはできます。

SWCをつくるときは、「ファイル」→「新規」→「Flexライブラリプロジェクト」を選択します。

画像

ダイアログがでるので、「クラス」タブのライブラリに含めるクラスにチェックを入れておきます。

画像

※ここにチェックをいれておかないと、クラスがSWCに含まれません。

あとは「src」フォルダに共通化したいファイルを置いて編集することで、
SWCが作成されます(自動的にビルドの場合)。

次は、使いたいFlexプロジェクトのプロパティで
「Flexビルドパス」→「ライブラリパス」→「SWCの追加」で追加してやります。

画像

なかなか便利な機能です。

| Flex | 15:00 | comments(0) | - |
Flex3.2と3.5の違い
 Flex3.2と3.5で動作が違うところがありました。

Imageのクリックのところです。

以下のコードを実行すると

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  <mx:Script>
    <![CDATA[
      import mx.controls.Alert;

      private function testClick():void
      {
        Alert.show("click");
      }

    ]]>
  </mx:Script>
  <mx:Image id="testimg" source="btnalertok_on.png" click = "testClick()" enabled="false" y="50" x="50"/>
  <mx:Button id="testbtn" click="testClick()" enabled="false" label="テストボタン" y="150" x="50"/>
</mx:WindowedApplication>

Flex3.2では、Imageのenabledがfalseでもクリックイベントが発生します。
画像
Flex3.5では、Imageのenabledがfalseの場合はクリックイベントは発生しません。

Buttonは、3.2でも3.5でもenabledがfalseの場合クリックイベントは発生しません。

mouseDownだとenabledがfalseでもイベントが発生します。

やはりSDKは新しいものをつかうのがいいですね。
| Flex | 09:21 | comments(0) | - |
ラベルなどのtooltipを非表示にする
ラベルで、幅を超える文字をセットすると、
表示が「○○○...」になって、onmouseでtooltipが表示されるようになっています。
便利ではあるのですが、いらないときがあります。

今回は自前で表示しているtooltipと重なってしまうので無効にしないとみづらいです。

画像

調べると、tooltipそのものを無効にする方法しか見つかりませんでした。

ToolTipManager.enabled = false;

これだと、別の部分でtooltipを出したい場合、困ってしまいます。

なので対象のラベルにイベントを追加して対応しました。

//tooltipが表示されたときのイベント
this.addEventListener(ToolTipEvent.TOOL_TIP_SHOWN,this.shownToolTip);

private function shownToolTip(event:ToolTipEvent):void
{
  //ここで非表示にする
  event.toolTip.visible = false;
}


これで、ラベルのtooltipは表示されなくなりました。

画像

もうちょっと簡単に制御できたらいいんですけどね。

| Flex | 17:10 | comments(0) | - |
<< | 2/14PAGES | >>