トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     SharedObjectの容量を0にした後のgetLocal()の挙動について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
iggyfool
Åê¹ÆNo.24462
投稿日時: 2006-3-24 19:25
新米
居住地: 東京
投稿: 6
使用環境:
Win2000,XP
FLASH MX2004Pro
ColdFusion7
SharedObjectの容量を0にした後のgetLocal()の挙動について
とっても困っているので誰か知っている方がいらっしゃったら教えてください。

swfの中に
テキストフィールド1:空欄
テキストフィールド2:空欄
保存ボタン
ロードボタン

があり、何かをテキストフィールド1に入力して保存ボタンを押したら、それをSharedObjectに保存します。

そのあと、ロードボタン(ここでgetLocalしてます)を押すと、テキストフィールド1を空欄に、テキストフィールド2にSharedObjectに保存した内容を表示します。

テキストフィールド1:あああ
で保存したら、ロードボタン押下時に
テキストフィールド1:
テキストフィールド2:あああ
で表示されているわけです。

ここで、右クリックで設定ダイアログを表示し、SharedObjectの容量を0にします。
すると、SharedObjectを削除する旨のメッセージが表示されます。
すると、確かにsolファイルが消えました。
このあと、ロードボタンをクリックすると、solファイルはないので、テキストフィールド2は空欄になってほしいわけですが、なぜかなくなったsolファイルの中身が表示されます。
getSize()をしても、値が返ってきます。

そして、このswfを終了し、再度起動してロードボタンを押したときには、getLocalをしてもsolファイルがないので表示されません。

swfを起動中にsolファイルが削除されたとき、getLocal()では消されたことを取れないのでしょうか?
もし、solファイルが消されたことを取れるようなやり方があったら、知りたいのですが・・・

よろしくお願いします。
rin-ko
Åê¹ÆNo.24467
投稿日時: 2006-3-24 21:03
職人
居住地: 東京
投稿: 397
使用環境:
MacOSX10.5/10.4
WinXP SP3
MX2004Pro/CS3
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
こんにちは。
iggyfoolさんが実際にどのようなスクリプトを書かれているのかわかりませんので、具体的なことはお答えできませんが、おそらくは、先のデータへの参照がどこかに残っているのではないでしょうか。
SharedObject.clear()を実行した後でしたら、getSize()でも0がかえりますし、getLocal()で値を取得することもできません。undefinedがかえります。
私も、SharedObjectを使ってデータのセーブ、ロード、クリアを行っていますが、Win、Macいずれの環境でも普通に動作しています。

と、書いてから勘違いしているぽいことに気づきました、すみません。
もしかして、Flash Playerの設定から記憶領域の容量をなくしてデータを消そうとなさっていますか?
これですと、他のSharedObjectにも影響が出てしまいますし、とくに仕様上の制限がないのでしたら、データ消去にはSharedObject.clear()を使われてはいかがでしょうか。
iggyfool
Åê¹ÆNo.24468
投稿日時: 2006-3-24 21:25
新米
居住地: 東京
投稿: 6
使用環境:
Win2000,XP
FLASH MX2004Pro
ColdFusion7
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
返信ありがとうございます。

その通りです。
Flash Playerの設定から記憶領域の容量をなくした場合です。

もちろん、スクリプトでsolの内容を消したい場合はclearで行っていますが、もし、ユーザがそのようなことをした場合に、どうやって「容量なし」になったことを取得すればいいのかがわからなくて、ということなのです。。。。

solがなくなったことを、getLocal()では取れないようなので、(それともとれる方法がありますかね?)取れる方法があれば、知りたいのです。
逆に、そんなものは取れないという情報でも、かまいません。

よろしくお願いします。
永井勝則
Åê¹ÆNo.24470
投稿日時: 2006-3-24 22:29
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
真意をつかんでいない && ポイントがずれている
かも知れません。
こんなスクリプトでは役に立ちませんか?

var a_txt:TextField;
var b_txt:TextField;
var save_btn:Button;
var load_btn:Button;
var resultObj:Object;
var mySO:SharedObject = SharedObject.getLocal("message");
//
save_btn.onRelease = function():Void  {
	mySO = SharedObject.getLocal("message");
	mySO.data.message = a_txt.text;
	resultObj = mySO.flush();
	trace("resultObj : "+resultObj);
};
load_btn.onRelease = function():Void  {
	mySO = SharedObject.getLocal("message");
	b_txt.text = mySO.data.message;
};
mySO.onStatus = function(infoObj:Object):Void  {
	trace("mySO_onStatus_level : "+infoObj.level);
	trace("mySO_onStatus_code : "+infoObj.code);
	if (infoObj.code == "SharedObject.Flush.Failed") {
		trace("ユーザーが拒否");
		var soSize:Number = mySO.getSize();
		trace(soSize);
	} else if (infoObj.code == "SharedObject.Flush.Success") {
		trace("ユーザーが許可");
		var soSize:Number = mySO.getSize();
		trace(soSize);
	}
};


----------------
永井勝則:
himco.jp :

rin-ko
Åê¹ÆNo.24471
投稿日時: 2006-3-24 23:08
職人
居住地: 東京
投稿: 397
使用環境:
MacOSX10.5/10.4
WinXP SP3
MX2004Pro/CS3
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
なるほど、的外れなレスをしちゃってごめんなさい。
それで永井さんのレスを拝見して思ったのですけれど、タイムライン変数などでSharedObjectを定義していませんか?
function内のローカル変数としてでしたら、参照が切れますから、記憶領域を0にした後のgetLocal()では、ちゃんとundefinedがかえると思います。
iggyfool
Åê¹ÆNo.24472
投稿日時: 2006-3-25 0:51
新米
居住地: 東京
投稿: 6
使用環境:
Win2000,XP
FLASH MX2004Pro
ColdFusion7
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
永井さん、rin-koさんありがとうございます。

永井さんのスクリプトで、最初のタイムライン変数をコメントにすると、記憶領域を0にしたあとのloadクリックでundefinedがとれました!
ひとまず、ローカル変数で設計してみます。

しかし、永井さんのスクリプトでいうと、タイムライン変数で宣言していても、一度saveしたあと、記憶領域を0にしてloadクリックすると、
load.onReleaseの中の
mySO = SharedObject.getLocal("message");
のあとmySOがundefinedになってほしい気がするんです。
なのに、そうならないのは不思議だと思うのは、おかしいでしょうか??
う?ん。
野中文雄
Åê¹ÆNo.24473
投稿日時: 2006-3-25 3:12
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
「おかしい」です。

SharedObject.getLocal()メソッドは、保存されたデータが存在しない場合には、新規のインスタンスを作成します。これがundefinedを返してしまうと、インスタンスが作成できなかったことを意味し、SharedObject.dataプロパティも当然存在しませんから、新規データは一切保存できないことになります。

データが保存できないことと、インスタンスが作成できないこととは別論です。インスタンスはRAM上に作成されます。たとえば、PC上のデータをうっかり書込み禁止メディア(たとえばCD-ROM)に保存しようとしたからといって、たちまちデータが(RAM上から)消えたとしたら、怒りませんか?
引用:
iggyfoolさんは書きました:
mySO = SharedObject.getLocal("message");
のあとmySOがundefinedになってほしい気がするんです。
なのに、そうならないのは不思議だと思うのは、おかしいでしょうか??

SharedObject.dataプロパティにフラグとなる変数を設定したのではダメなのですか? 記憶領域を0に設定すれば、その変数は保存されませんので、データをロードしたときの変数値はundefinedになると思いますけど。


----------------
 

iggyfool
Åê¹ÆNo.24474
投稿日時: 2006-3-25 10:56
新米
居住地: 東京
投稿: 6
使用環境:
Win2000,XP
FLASH MX2004Pro
ColdFusion7
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
野中さん、ありがとうございます!

えっと、ちょっと確認させてください。

まず、1つ、確認ですが、記憶領域を0にされたことを取得する方法(発生するイベントなど)はないのですよね。

2つめ
・永井さんのスクリプトで、まずsaveする
・その後、記憶領域を0にしてmessage.solを削除
・そのあとloadしたときに
mySO = SharedObject.getLocal("message");
が行われるが、message.solが存在しないので新規インスタンスを作成するのでundefinedは返らない
ということなのでしょうか?
もしそうなら、このときにmySO.getSize()は0であってほしいのですが、このmySO.dataにはなぜかsaveした直後のデータが入っているのです。
私的にはこれがすごく違和感なのですが・・・
message.solが削除されたあとにgetLocalしたんだから、mySO.dataはundefinedだろ!という風に思うのです。

どうでしょうか・・・なんかしつこくてすみません・・・
野中文雄
Åê¹ÆNo.24479
投稿日時: 2006-3-25 15:48
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
「記憶領域を0にされたことを取得する方法(発生するイベントなど)はない」と思います。
引用:
iggyfoolさんは書きました:
まず、1つ、確認ですが、記憶領域を0にされたことを取得する方法(発生するイベントなど)はないのですよね。

その時点で保存された情報は何も存在しなくても、後から情報を追加できるように「新規インスタンスを作成するのでundefinedは返」りません。もしインスタンスが存在しなければ(undefinedなら)、SharedObject.dataプロパティもSharedObject.getSize()メソッドも、一切操作できないことになります。
引用:
・そのあとloadしたときに
mySO = SharedObject.getLocal("message");
が行われるが、message.solが存在しないので新規インスタンスを作成するのでundefinedは返らない
ということなのでしょうか?

私の環境では、SharedObject.getSize()メソッドは、問題なく0を返します。
引用:
もしそうなら、このときにmySO.getSize()は0であってほしいのですが、このmySO.dataにはなぜかsaveした直後のデータが入っているのです。

「そのあとloadしたとき」といわれるのは、セッションを終了してコンテンツを再度開くか、ブラウザでリロードするかされていますか?

もしかすると、単にSharedObject.getLocal()メソッドを、再度呼出しているだけではありませんか? すでに指定されたShardObjectインスタンスが存在している場合には、SharedObject.getLocal()メソッドはそのインスタンスをそのまま返します。つまり、新規にインスタンスを作成して、データを読込み直すことはしません。

また、SharedObject.dataは、undefiendになることはありません。このプロパティは情報の容れ物です。たとえ容れ物が空でも、容れ物として存在しないことにはデータが入れられません。
引用:
message.solが削除されたあとにgetLocalしたんだから、mySO.dataはundefinedだろ!という風に思うのです。

SharedObject.flush()メソッドを呼出せば、データに対して記憶領域が不足しているとき、ユーザーに領域の拡張を求めるダイアログが表示されます。それに対してユーザーが[拒否]したときは、メソッドが"pending"を返します。これにより、ユーザーがデータの保存を望んでいないことは、間接的に推測できます。


----------------
 

iggyfool
Åê¹ÆNo.24481
投稿日時: 2006-3-25 16:20
新米
居住地: 東京
投稿: 6
使用環境:
Win2000,XP
FLASH MX2004Pro
ColdFusion7
Re: SharedObjectの容量を0にした後のgetLocal()の挙動について
さっそくのお返事ありがとうございます!

引用:

私の環境では、SharedObject.getSize()メソッドは、問題なく0を返します。

本当ですか?
おかしいなぁ。。。
こちらでももう一度実験してみます!
引用:

「そのあとloadしたとき」といわれるのは、セッションを終了してコンテンツを再度開くか、ブラウザでリロードするかされていますか?

いいえ、違います。swfにあるloadボタンを押しただけです。
永井さんのスクリプトのload.onRelease部分が走ります。
引用:

もしかすると、単にSharedObject.getLocal()メソッドを、再度呼出しているだけではありませんか? すでに指定されたShardObjectインスタンスが存在している場合には、SharedObject.getLocal()メソッドはそのインスタンスをそのまま返します。つまり、新規にインスタンスを作成して、データを読込み直すことはしません。

あ、それがまさに答えかもしれません。
そうです、最初に宣言したタイムライン変数mySOにgetLocal()しているだけです。
(mySO=SharedObject.getLocal();)
もうすでに存在するインスタンスなので、そのインスタンスをそのまま返すのですね。
しかし、
delete mySO;
mySO=SharedObject.getLocal();
とやっても、やっぱり
trace(mySO.getSize());
は0じゃなかったんですよ。
deleteではインスタンスを削除できないんですかね?

でも、とりあえず、getLocalを呼ぶだびにデータを読み込むことをしない、というのがわかっただけでも満足です。
アドバイスを元に、実験してみます。

みなさんありがとうございました。
またそこで疑問が生まれたら、質問させていただきます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops