SQLの窓

2017年07月25日


VBA : 挿入した『テキストボックス』にアクセスする



テキストボックスを挿入して、『オブジェクトと選択の表示』で一番下へ持って行って、コレクションの先頭に来るようにします( コレクションを For Each してもいいですが、ストレートに )

処理
Sub ボタン3_Click()


    MsgBox ActiveSheet.Shapes(1).TextFrame2.TextRange.Text
    
    Dim json As String
    
    json = "{" & vbCrLf
    json = json & vbTab & """link"": ""https://www.google.co.jp/""," & vbCrLf
    json = json & vbTab & """name"": ""Google""" & vbCrLf
    json = json & "}"
 
    ActiveSheet.Shapes(1).TextFrame2.TextRange.Text = json
  
  
End Sub

Form を使うのは面倒ですし、今時 Form でも無いだろうし、セルとこの方法でたいていの入力はまかなえると思います。

Shape オブジェクト (Excel)





タグ:VB VBA EXCEL
posted by lightbox at 2017-07-25 02:08 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月24日


VBA : InternetExplorer.Application 経由で JSON.parse を使用する方法

InternetExplorer.Application は終了処理が面倒で、Visible を True にすると解りますが、処理がエラーで途中で終わってしまうとメモリ上に残ってしまって後の InternetExplorer.Application の処理に悪い影響が出ます。なので、毎回作成して解放するという処理方法で利用します。

InternetExplorer.Application から直接は JSON オブジェクトにアクセスできなかったので、以下のような形でアクセスしています。( Window オブジェクトは、Document.parentWindow で取得できます )

Json オブジェクトのプロパティに予約語(たとえばこの場合、text というプロパティ)を使用したら、VB のエディタが .Text と強制変換して実行時にエラーとなりました。なので、textdata というプロパティに変更してテストしました。

Sub ボタン1_Click()

    Dim doc As Object, result As Object

    Set Ie = CreateObject("InternetExplorer.Application")
    'Ie.Visible = True
    Ie.Navigate ("about:blank")
    
    Do While Ie.Busy
        ' 100 ミリ秒
        Wscript.Sleep 100
    Loop
    
    Set doc = Ie.document
    
    doc.write "<script>document.JSON_Parse=function(s) {return JSON.parse(s);}</script>"
    
    Dim str As String
    
    str = Cells(1, 1).Value
    
    Set result = doc.JSON_Parse(str)
    
    MsgBox (str)
    
    MsgBox (result.option.textdata)
    
    Ie.Quit
    
    Set Ie = Nothing

End Sub






タグ:VBA VB EXCEL
posted by lightbox at 2017-07-24 17:56 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月23日


VBA : FileSystemObject でテキストファイル(CSV) を読み込んでセルにセットする

この記事は、『VBA : 一ヶ月の予定リストの作成』の続きです。
テンプレートシートをコピーして作業シートを作成する関数 "対象" という名前のシートがあればそれを使い、無ければ "テンプレート" シートをコピーして、"対象" と言う名前に変更します。
Function LoadSheet()
    
    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' "対象" Sheet の取得
    ' ********************
    On Error Resume Next
    Set sheet = Worksheets("対象")
    On Error GoTo 0
    
    ' "対象" Sheet が無い場合は テンプレート をコピーして作成
    If sheet Is Nothing Then
        Call Worksheets("テンプレート").Copy(, Worksheets("年月入力"))
        ' コピーした Sheet の名前を変更
        Application.ActiveSheet.Name = "対象"
        ' 変数にコピーした Sheet をセット
        Set sheet = Application.ActiveSheet
    End If
    
    Set LoadSheet = sheet

End Function


※ 戻り値は、Worksheet オブジェクトです。

FileSystemObject は、ThisWorkbook に定義

Workbook_Open イベントで一度だけ実行して作成し、ブックを閉じるまでずっとそれを使います。

Public Fs As Object

Private Sub Workbook_Open()

    Set Fs = CreateObject("Scripting.FileSystemObject")

End Sub


※ Open から Line Input を使わないのは、FileSystemObject ならば 他の VB 系でも使用可能で汎用性が高いからです。

処理

※ Fs は、ThisWorkbook に定義されているので、ThisWorkbook.Fs と参照します
Sub ボタン2_Click()

    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' 戻り値を取得
    ' ********************
    Set sheet = LoadSheet

    ' ********************
    ' ファイルを開く
    ' ********************
    Dim Path As String
    Path = Application.GetOpenFilename("CSV,*.csv,全て,*.*", , "CSVファイルを選択して下さい")
    If Path = "False" Then
        Exit Sub
    End If
    
    ' ********************
    ' オープン
    ' ********************
    On Error Resume Next
    Set InObj = ThisWorkbook.Fs.OpenTextFile(Path, 1)
    If Err.Number <> 0 Then
        MsgBox (Err.Description)
        Exit Sub
    End If
    On Error GoTo 0
    
    Dim Buffer As String
    Dim row As Integer: row = 0
    Dim Data() As String
    ' ********************
    ' CSV ファイルより
    ' データを読み込み
    ' ********************
    Do While Not InObj.AtEndOfStream
        Buffer = InObj.ReadLine
        
        row = row + 1
        
        Data = Split(Buffer, ",")
        
        sheet.Cells(row, 3).Value = Data(0)
        sheet.Cells(row, 4).Value = Data(1)
    Loop

    ' ********************
    ' ファイルクローズ
    ' ********************
    InObj.Close

End Sub


Application.GetOpenFilename の第二引数(FilterIndex)は省略しています。その代わり、第三引数を指定しています( タイトル文字列の指定 )

Split 関数
OpenTextFile メソッド
ReadLine メソッド






タグ:EXCEL VB VBA
posted by lightbox at 2017-07-23 20:57 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月21日


VBA : 一ヶ月の予定リストの作成

概要

"対象" という名前のシートがあればそれを使い、無ければ "テンプレート" シートをコピーして、"対象" と言う名前に変更します。

そのシートに対して、指定した年月の 1日から 末日までの年月表示を縦に作成し、その横に曜日を表示します

▼ ここからボタンをクリックすると


▼ こうなります


ソース
Sub ボタン1_Click()

    ' データ処理をする Sheet
    Dim sheet As Worksheet
    
    ' "対象" Sheet の取得
    On Error Resume Next
    Set sheet = Worksheets("対象")
    On Error GoTo 0
    
    ' "対象" Sheet が無い場合は テンプレート をコピーして作成
    If sheet Is Nothing Then
        Call Worksheets("テンプレート").Copy(, Worksheets("年月入力"))
        ' コピーした Sheet の名前を変更
        Application.ActiveSheet.Name = "対象"
        ' 変数にコピーした Sheet をセット
        Set sheet = Application.ActiveSheet
    End If
    
    ' 曜日文字列の用意
    Dim Youbi(8) As String
    Youbi(1) = "日曜"
    Youbi(2) = "月曜"
    Youbi(3) = "火曜"
    Youbi(4) = "水曜"
    Youbi(5) = "木曜"
    Youbi(6) = "金曜"
    Youbi(7) = "土曜"

    Dim dtValue As Date
    Dim startDate As Date
    Dim endDate As Date
    
    ' 入力値から日付データの作成
    Dim s1 As String
    Dim s2 As String
    s1 = CStr(Worksheets("年月入力").Cells(2, 1).Value)
    s2 = CStr(Worksheets("年月入力").Cells(2, 2).Value)
    dtValue = CDate(s1 & "/" & s2 & "/1")
    
    ' 月のはじめ
    startDate = DateSerial(year(dtValue), month(dtValue), 1)
    ' 月末
    endDate = DateSerial(year(dtValue), month(dtValue) + 1, 0)
    
    ' ひと月ぶんの初期化
    For I = 1 To 31
        
        sheet.Cells(I, 1).Value = ""
        sheet.Cells(I, 2).Value = ""
        
    Next
    
    ' ひと月ぶんのデータの作成
    Dim row As Integer: row = 0
    For dtValue = startDate To endDate

        row = row + 1
        sheet.Cells(row, 1).Value = CStr(dtValue)
        sheet.Cells(row, 2).Value = Youbi(Weekday(dtValue))

    Next

End Sub

On Error Resume Next

VB と名の付く処理では伝統的なエラーの対処方法です。指定した名前のシートを取得する方法としては、シートのコレクションのループ内で一致する名前を探すのが VBA 界隈では一般的なようですが、VB アプリケーションとしてはこのほうが汎用性があります。

Call でシートのコピー

VBA のマクロが作成するコードは、これとは違うものだと思いますが、VB アプリケーションでメソッドの実行は Call で呼び出します。戻り値のある場合は Call を使わずに左辺に変数を置きます。

引数が一つの場合は、Call を使わずに実行でき、その際引数をかっこでは囲いません。しかし、引数が二つ以上の場合は Call を使って引数をかっこで囲います。ここでは、expression.Copy(Before, After) の文法にのっとって、第一引数を省略して、第二引数を指定してコピーしています。





タグ:VBA VB EXCEL
posted by lightbox at 2017-07-21 23:51 | VBA | このブログの読者になる | 更新情報をチェックする

2017年07月10日


Okhttp を使用した、GET、POST、ファイルアップロードを楽に実装できる HttpAccess クラス

▼ HttpAccess パッケージのダウンロード


( 解凍して、main\java フォルダの中に コピーして下さい )
※ OkHttp より 最新の Gradle の記述を取得して build.gradle の dependencies の最後に貼り付けて下さい
例) compile 'com.squareup.okhttp3:okhttp:3.8.1'

OkHttp
okio

厳密に言うと、GET 時に渡す URL の QueryString 部分はクラス外部で作成するようになっています。仮にデータ部分を日本語で指定しても、UTF8 であれば自動的にエンコードしてくれます。また、set メソッドで URL の変更も可能です。

コンストラクタで渡す URL は、GET では必ず使用されますが、POST では実行時に指定した url KEY を使う事ができます(省略すると、コンストラクタ作成時の url を使用します)

url に関しては、Getter と Setter があります。

ファイルアップロードは1件のみの処理を想定しています。入力データとして InputStream を使い、内部で ByteArray に変換しています。Okhttp のメソッドが InputStream には対応していないので、複数ファイルアップロードは、一度にひとつのファイルになるよう外部でコントロールが必要になるでしょう。
import android.os.AsyncTask;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;

public class HttpAccess {

	private OkHttpClient okHttpClient;
	private String url;

	public interface OnAsyncTaskListener {
		abstract public void onAsyncTaskListener(String s);
	}

	// url の Getter と Setter
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}

	// *******************************
	// コンストラクタ
	// *******************************
	public HttpAccess(String url) {
		this.okHttpClient = new OkHttpClient();
		this.url = url;
	}

	// *******************************
	// GET
	// *******************************
	public void sendGet(final OnAsyncTaskListener listener ) {

		new AsyncTask<Void,Void,String>(){
			@Override
			protected String doInBackground(Void... params) {
				String result = "[\"error\"]";

				Request.Builder builder = new Request.Builder();
				builder.url(HttpAccess.this.url);
				Request request = builder.build();

				Response response = null;
				try {
					response = HttpAccess.this.okHttpClient.newCall(request).execute();
					result = response.body().string();
				}
				catch (IOException e) {
					e.printStackTrace();
				}

				return result;
			}

			// UI スレッド処理
			@Override
			protected void onPostExecute(String s) {
				super.onPostExecute(s);

				listener.onAsyncTaskListener(s);

			}
		}.execute();

	}

	// *******************************
	// POST
	// *******************************
	public void sendPost(HashMap<String,String> postData, final OnAsyncTaskListener listener ) {

		new AsyncTask<HashMap,Void,String>(){
			@Override
			protected String doInBackground(HashMap... params) {
				String result = "[\"error\"]";

				HashMap<String,String> postData = (HashMap<String,String>)params[0];

				// POST 用 FormBody の内容の作成
				FormBody.Builder formbodyBuilder = new FormBody.Builder();
				for(Map.Entry<String, String> e : postData.entrySet()) {
					if (  !(e.getKey()).equals("url") ) {
						formbodyBuilder.add(e.getKey(), e.getValue());
					}
				}

				// 送信用ユニットの作成
				FormBody formbody = formbodyBuilder.build();
				Request.Builder builder = new Request.Builder();

				// 引数の Map に url が無い場合は、コンストラクタの url を使用する
				if ( postData.get("url") == null ) {
					builder.url(HttpAccess.this.url) ;
				}
				else {
					builder.url( postData.get("url") );
				}

				builder.post(formbody);
				Request request = builder.build();

				Response response = null;
				try {
					response = HttpAccess.this.okHttpClient.newCall(request).execute();
					result = response.body().string();
				}
				catch (IOException e) {
					e.printStackTrace();
				}

				return result;
			}

			// UI スレッド処理
			@Override
			protected void onPostExecute(String s) {

				listener.onAsyncTaskListener(s);

			}
		}.execute(postData);

	}

	// *******************************
	// 1ファイルのアップロード(  Byte 配列使うので一つ )
	// *******************************
	public void sendUpload(String url, String field, String name, InputStream inputStream, String mime, final OnAsyncTaskListener listener ) {

		// 引数は、専用クラス
		UploadParam uploadParam = new UploadParam(url,field,name,inputStream,mime);
		new AsyncTask<UploadParam,Void,String>(){
			@Override
			protected String doInBackground(UploadParam... params) {
				String result = "[\"error\"]";

				UploadParam uploadParam = params[0];
				InputStream inputStream = uploadParam.getInputStream();
				Source source = Okio.source(inputStream);
				ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
				BufferedSink bufferedSink = Okio.buffer(Okio.sink(byteArrayOutputStream));
				try {
					bufferedSink.writeAll(source);
					bufferedSink.close();
					source.close();
				} catch (IOException e) {
					e.printStackTrace();
				}

				MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
				multipartBodyBuilder.setType(MultipartBody.FORM);
				multipartBodyBuilder.addFormDataPart(
						uploadParam.getField(),
						uploadParam.getName(),
						RequestBody.create(MediaType.parse(uploadParam.getMime()),byteArrayOutputStream.toByteArray())
				);
				RequestBody requestBody = multipartBodyBuilder.build();

				// 送信用のデータを作成
				Request.Builder requestBuilder = new Request.Builder();
				requestBuilder.url(uploadParam.getUrl());
				requestBuilder.post(requestBody);
				Request request = requestBuilder.build();

				// 受信用のオブジェクトの準備
				Call call = HttpAccess.this.okHttpClient.newCall(request);

				// 送信と受信
				try {

					Response response = call.execute();
					result = response.body().string();

				} catch (Exception ex) {
					ex.printStackTrace();
				}

				return result;

			}

			@Override
			protected void onPostExecute(String s) {

				listener.onAsyncTaskListener(s);

			}

		}.execute(uploadParam);


	}

	private class UploadParam {
		private String url;
		private String mime;
		private String field;
		private String name;
		private InputStream inputStream;

		public UploadParam(String url, String field, String name, InputStream inputStream, String mime) {
			this.url = url;
			this.mime = mime;
			this.field = field;
			this.name = name;
			this.inputStream = inputStream;
		}

		public String getUrl() {
			return url;
		}

		public String getMime() {
			return mime;
		}

		public String getField() {
			return field;
		}

		public String getName() {
			return name;
		}

		public InputStream getInputStream() {
			return inputStream;
		}
	}

}


ファイルアップロード呼び出しサンプル
				try {
					InputStream inputStream = assetManager.open("sample.jpg");
					httpAccess.sendUpload(
						"http://10.0.2.2/r101/php_upload/file_upload.php",
						"target",
						"sample.jpg",
						inputStream,
						"image/jpeg",
						new HttpAccess.OnAsyncTaskListener() {
							@Override
							public void onAsyncTaskListener(String s) {

								Log.i("lightbox", s);

							}
						}
					);
				} catch (IOException e) {
					e.printStackTrace();
				}

Post 呼び出しサンプル
					HashMap<String,String> postData = new HashMap<String,String>();
					// localhost の 環境
					postData.put("url", "http://10.0.2.2/r101/login-action/syain/syain_update.php");
					postData.put("fld_code", syain_base.code );
					postData.put("fld_simei", syain_base.name );

					httpAccess.sendPost(postData,new HttpAccess.OnAsyncTaskListener() {
						@Override
						public void onAsyncTaskListener(String s) {

							Log.i("lightbox",s);

							if ( !s.equals("[\"error\"]") ) {
								// 再表示
								listView.setAdapter(arrayAdapter);
							}
							else {
								Toast.makeText(MainActivity.this,"インターネットアクセスに失敗しました",Toast.LENGTH_LONG).show();
							}

						}
					});






posted by lightbox at 2017-07-10 12:04 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

2017年07月04日


Android の assets フォルダーに保存した 400x320 の画像ファイルの扱い

『Android の drawable フォルダーに保存した 400x320 の画像ファイルの6種類の扱いと Density』では、ファイルでは無く『表示用のリソース』という扱いでした。

それに対して assets フォルダーに保存するファイルは画像である必要も無く、単純に InputStream としてアクセスできます。(但し、assets からは読み込む事のみ可能です)

そこで、直接画像として扱う方法と、一旦別の場所に保存してから画像として扱う方法を試してみました。

前提条件

1) エミュレータとして Nexus 4 ( 768x1280 : xhdpi : 320 ) を使用しています。
2) 画像サイズは 400x320 です。
3) 画像は、assets フォルダに保存しました。
4) ImageView に表示します
5) 以下の3つの画像です(いずれも 400x320 jpeg)
  

drawable との違い

1) 画像をファイルとして扱えるので、基本的には Bitmap として扱います。

2) ファイルのコピーには okio を使用して InputStream から OutputStream にコピーします。
	// *************************
	// ファイルコピー
	// *************************
	private void streamCopy(InputStream inputStream, OutputStream outputStream) throws Exception {

		Source source = Okio.source(inputStream);
		BufferedSink bufferedSink = Okio.buffer(Okio.sink(outputStream));
		bufferedSink.writeAll(source);

		bufferedSink.close();
		source.close();

	}


Drawable で表示 (27行〜)

ファイルからの読み込みであっても、リソースとして Drawable に読み込む場合はやはり、幅が 200 に設定されて表示は小さくなりました。



Drawable から Bitmap に変換して大きく表示 (47行〜)

Drawable から Bitmap に変換すると本来の横幅(400) になり、Density も 320 でこのまま表示すると正しい大きさで表示されるので、setDensity(160) で大きく表示するようにしました。



Bitmap で表示 (74行〜)

普通に Bitmap として読み込んで、Bitmap として表示します。サイズも密度も思った通りの状態となります。



いったんコピーしてBitmap で表示 (95行〜)

コピー後は書き込み可能なフォルダに環境が変わる事を除いて、assets から読み込むのと変わり無く普通に表示されます。



コピー後のファイルを Bitmap で大きく表示 (123行〜)

setDensity(160) で大きく表示します



コピー後のファイルを Bitmap で小さく表示 (154行〜)

setDensity(640) で小さく表示します



public class MainActivity extends AppCompatActivity {

	AssetManager assetManager;
	ImageView imageView;
	ImageView imageViewSaved;
	Drawable drawable;
	Bitmap bitmap;
	InputStream inputStream;
	OutputStream outputStream;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		assetManager = MainActivity.this.getResources().getAssets();

		imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView);
		imageViewSaved = (ImageView) MainActivity.this.findViewById(R.id.imageViewSaved);

		// カラー(Drawable)
		MainActivity.this.findViewById(R.id.buttonAsset1).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					inputStream = assetManager.open("sample.jpg");
					drawable = new BitmapDrawable(MainActivity.this.getResources(), inputStream);
					inputStream.close();

					Log.i("lightbox", drawable.getIntrinsicWidth()+"");		// Nexus 4 : 200, Nexus S : 267

				} catch (IOException e) {
					e.printStackTrace();
				}
				imageView.setImageDrawable(drawable);

			}
		});

		// モノクロ最大(Drawable > Bitmap > DENSITY_DEFAULT)
		MainActivity.this.findViewById(R.id.buttonAsset2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					inputStream = assetManager.open("sample_mono.jpg");
					drawable = new BitmapDrawable(MainActivity.this.getResources(), inputStream);
					inputStream.close();

					Log.i("lightbox", drawable.getIntrinsicWidth()+"");		// Nexus 4 : 200, Nexus S : 267

					bitmap = ((BitmapDrawable) drawable).getBitmap();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

					// 大きく
					bitmap.setDensity(160);

				} catch (IOException e) {
					e.printStackTrace();
				}
				imageView.setImageBitmap(bitmap);

			}
		});

		// スケッチ、そのまま(Bitmap)
		MainActivity.this.findViewById(R.id.buttonAsset3).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					inputStream = assetManager.open("sample_sketch.jpg");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

				} catch (IOException e) {
					e.printStackTrace();
				}
				imageView.setImageBitmap(bitmap);

			}
		});

		// カラーを保存して表示
		MainActivity.this.findViewById(R.id.buttonSave1).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					// 読み込むファイル
					inputStream = assetManager.open("sample.jpg");
					// 書き込むファイル
					outputStream = MainActivity.this.openFileOutput("sample.jpg", MODE_PRIVATE);
					streamCopy(inputStream,outputStream);

					// コピーしたファイルを読み込む
					inputStream = MainActivity.this.openFileInput("sample.jpg");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

				} catch (Exception e) {
					e.printStackTrace();
				}

				imageViewSaved.setImageBitmap(bitmap);

			}
		});

		// モノクロを保存して表示
		MainActivity.this.findViewById(R.id.buttonSave2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					// 読み込むファイル
					inputStream = assetManager.open("sample_mono.jpg");
					// 書き込むファイル
					outputStream = MainActivity.this.openFileOutput("sample_mono.jpg", MODE_PRIVATE);
					streamCopy(inputStream,outputStream);

					// コピーしたファイルを読み込む
					inputStream = MainActivity.this.openFileInput("sample_mono.jpg");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

					// 大きく
					bitmap.setDensity(160);

				} catch (Exception e) {
					e.printStackTrace();
				}

				imageViewSaved.setImageBitmap(bitmap);

			}
		});

		// スケッチ
		MainActivity.this.findViewById(R.id.buttonSave3).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				try {
					// 読み込むファイル
					inputStream = assetManager.open("sample_sketch.jpg");
					// 書き込むファイル
					outputStream = MainActivity.this.openFileOutput("sample_sketch.jpg", MODE_PRIVATE);
					streamCopy(inputStream,outputStream);

					// コピーしたファイルを読み込む
					inputStream = MainActivity.this.openFileInput("sample_sketch.jpg");
					bitmap = BitmapFactory.decodeStream(inputStream);
					inputStream.close();
					Log.i("lightbox", bitmap.getWidth()+"");		// 400
					Log.i("lightbox", bitmap.getDensity()+"");	// Nexus 4 : 320, Nexus S : 240

					// 小さく
					bitmap.setDensity(640);

				} catch (Exception e) {
					e.printStackTrace();
				}

				imageViewSaved.setImageBitmap(bitmap);

			}
		});
	}

}





posted by lightbox at 2017-07-04 20:21 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり