Firemonkeyで1)テキストファイルを操作し、2)そのテキストをメールに送るコードについて
私は心理学の研究者です。
心理学の研究に使うために、Rad Studio XE 10.2のFiremonkeyを使って、AndroidとiOSのアプリを作っています。
もともとはDelphi6、Lazarus ver 1.0.12を使ってWindows用に作っていたアプリを移植して、さらに機能を付け加えたいと思っているところです。
Windows版では、ある課題をやってもらいその反応時間を取得し、テキストファイル(.txt)でその結果を出力するように作っていました。
今回の質問は、1)Firemonkeyを使ってAndroidとiOSで同じように課題の結果をテキストファイルで出力する方法、2)そのテキストファイルをメールアドレスに送る方法を教えていただきたいのです。
Windows用に作っていたコードを以下に載せます。
1)このコードをどう修正するとAndroidとiOSの端末内にテキストファイルを作成し、実験結果を記録できるようになりますでしょうか?
2)このコードにさらにどう追加すると、その実験結果のテキストファイルを、私のメールアドレスに送ることができるでしょうか?
ネットや書籍を調べているのですが、自力では探しきれませんでした。
ヤフー知恵袋でま質問しましたが、私が理解できる回答ではありませんでした(コードがC++)。
こうしてみなさまのお力をお借りしたいと思っているところです。
以下はwindows版のコードです。
// 終わりボタンを押したあとの操作
procedure TFTraining.EndButtonClick(Sender: TObject);
var x : TextFile;
h: Integer;
str : string;
begin
// 「vsdata.txt」が存在しているか確認する
str := 'vsdata.txt'; // 「str」にファイル名を記録する
If FileExists(str) then
ShowMessage('実験データをテキストファイル「vsdata.txt」に上書きします') // メッセージを表示する
else
begin
ShowMessage('テキストファイル「vsdata.txt」を作成し実験データを書き込みます');
end;
AssignFile(x, 'vsdata.txt'); // 「x」に「vsdata」を割り当てる
Rewrite(x); // データを書き込むファイル「vsdata」を作成する
Append(x); // ファイルを使えるようにする
Writeln(x, '実験結果一覧');
Writeln(x, 'trial', ' ', 'reaction');
for h := 1 To NumberOfTrial do
// 各試行(h)の反応時間(ReactionTimeArrayに格納されている)を出力する
Writeln(x, IntToStr(h), ' ', FloatToStr(ReactionTimeArray[h]));
CloseFile(x); // テキストファイルを閉じる
end;
回答ではないですが、
> ヤフー知恵袋でま質問しましたが、私が理解できる回答ではありませんでした(コードがC++)。
と書く場合、その質問のリンク先を記入すれば、回答する側もすぐ参照できて、親切かもしれませんね。
Firemonkeyで1)テキストファイルを操作し、2)そのテキストをメールに送るコードについて
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10189612220
>igyさん
ご指摘いただきありがとうございます。
URLまで貼っていただき感謝です。
今後気をつけます。
DelphiでAndroidとiOSのアプリからメール送信ってちょっと考えても大変な作業量になりそうです。
メール送信クラスIndyがWindowsしか対応していないわけですし
各プラットフォームが用意していると思われるSocketクラスを使ってメール送信プログラムを書けばあるいはと思いましたが数年かかりそうです。
HTTPはFireMonkeyから扱えるのでデータをPostしてサーバー側でサーバー側で処理・・・
って思ったら、そもそもこれをWebアプリとしてPHPとかで組んだほうが早いのでは?
>takeさん
アドバイスをありがとうございます。
>各プラットフォームが用意していると思われるSocketクラスを使ってメール送信プログラムを書けばあるいはと思いましたが数年かかりそうです。
そんなに大変な作業なのですね。
以前デベロッパーキャンプで営業の方に話した際は、そこまで大変な雰囲気ではなかったので、甘く考えていました。
大事な点は、実験に参加して下さった方のデータが、実験者の私に、何らかの形で届くことです。
webアプリやPHPの経験はありません。
delphiで作ったアプリから、メールという形式にこだわらずにデータを送って貰える方法が知りたいです。
こうした業界のルールが分かっておらず、気付かず失礼なことをしていましたら、申し訳ありません。
スマホ内にテキストファイルを置く方法も教えていただきたいです。
IDをそこに記憶させて個人を識別する機能をつけるためでもあります。
引き続きどうぞよろしくお願いいたします。
発想を変えてみました。
FiremonkeyからURL指定でブラウザやメールソフト、電話を開けそうなので
【参考】
https://www.gesource.jp/weblog/?p=6952
こんな感じでスマホからメールを送れるかもしれません。
const
URL = 'mailto:メールアドレス';
begin
SharedApplication.openURL(StrToNSUrl(URL));
end;
mailtoの構文は下記を参照
http://www.tagindex.com/html_tag/link/a_mailto_sub.html
アドレス、タイトルと本分を指定してやれば使用者がメールソフトの「送信」を押す必要がありますが
もっともシンプルかもしれません。
TIdSMTPはAndroid/iOSでも使えますよね?
編集 削除IndyコンポーネントはWindowsプラットフォームでのみ使用可能です。
使っているAPIが Winsock だからこればかりは互換性ないかと思います。
んじゃ
http://support.embarcadero.com/jp/article/43825
これはなんなんだと
失礼しました。見ていた情報が古すぎました。
XE5から使えて、XE7からはOpenSSLに対応しているみたいですね。
TIdSMTPは使ったことがないので詳しい人に聞いて下さい。
>takeさん
>こんな感じでスマホからメールを送れるかもしれません。
早速ありがとうございます。
明日職場のPCで試して見ます。
>通りすがりさん
新しい情報をありがとうございます。
確認してみます。
>明太子さん
テキストファイル保存の情報をありがとうございます。
明日早速試してみます。
ということで。
メールはTIdSMTPを使うことで送ることができます。TIdSAS...とTIdUserPassProviderも必要ですが。
テキストファイルはメールに添付されるべきですか?それともいままでテキストファイルに出力していた内容を
メールの本文にできればいいですか?本文でよければファイルのことは忘れてその内容をTIdMessage.Bodyに
格納するだけです。
Indy 10 を使って GMail を送受信するには? (Delphi 2009 以降)
https://ht-deko.com/tech040.html#tech076
も参考になります。
メールという送信方法に拘らなければ、テザリングを使用するという手もあります。
※ TTetheringManager&TTetheringAppProfileコンポーネント
但し、
①通信端末同士が同じネットワーク内に限られる。
②通信端末同士が起動されている必要がある。
という条件が付きますが…。
グループやプロファイルの定義など、前準備が少々面倒ですが、
一旦構築してしまえば、文字列や画像データなどがいとも簡単に送受信できる様になります。
>通りすがりさん
>メールはTIdSMTPを使うことで送ることができます。
アドバイスをありがとうございます。
今日はここまでたどり着けませんでした。
Indy10は入っているようなので明日チャレンジします。
>KONNOYAさん
ご助言をありがとうございます。
テザリングでもできるのですね。
今のところ実験参加者の方には自宅で課題をやっていただく予定なのですが、学内でやっていただくときには使えそうなので勉強します。
>明太子さん
>この辺の関数を使えば何とかなるかもしれません。
見させていただきました。
本業ではないのでどれを選んでいいのか分からず仕舞いでした。
TPathから始まる関数ということで、以下のURLに書いてある「ファイルの読み込みと配置」の記事は関係ありますでしょうか?
記事にあるTPath.GetDocumentsPath関数を使ったのですが上手くいきませんでした。
http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Android_アプリケーションの作成#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E8.AA.AD.E3.81.BF.E8.BE.BC.E3.81.BF.E3.81.A8.E9.85.8D.E7.BD.AE
>今のところ実験参加者の方には自宅で課題をやっていただく予定なのですが、学内でやっていただくときには使えそうなので勉強します。
参考までにテザリングについて、とても親切丁寧に解説して下さっている方のサイトがありましたので貼って置きますね。
https://www.gesource.jp/programming/delphi/xe6/apptethering/manual.html
>以下のURLに書いてある「ファイルの読み込みと配置」の記事は関係ありますでしょうか?
>http://docwiki.embarcadero.com/RADStudio/Berlin/ja/Android_アプリケーションの作成.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.81.AE.E8.AA.AD.E3.81.BF.E8.BE.BC.E3.81.BF.E3.81.A8.E9.85.8D.E7.BD.AE
ファイルの読み込みと配置は、Delphiがターゲット端末にプログラムを配置する時に
一緒にデータ等を配置するのであって、自分の作成したプログラムが書く訳ではありません。
音楽ファイルや画像ファイル等の外部リソースという感じでしょうか。
またコンフィグファイル等の初期データを置く為に使用する物だと思っています。
認識が間違っていたら先輩方、指摘して下さいね(汗
>この辺の関数を使えば何とかなるかもしれません。
明太子様のリンクは、各プラットフォームに対応したパスをDelphiに聞いて下さいね。という事です。
WindowsやAndroid、iPhoneそれぞれディレクトリの構造が異なりますし、
区切り文字( デリミタ:Windowsなら\、Android等では/ )も異なったりします。
コード上でパスを文字列で書いてしまうと、ほぼエラーになります。
取得するパスは、置くデータによって適切なパスを選択する必要があります。
ミロ様のお話を伺う限り、GetDocumentsPathで良いのではないかと思います。
※ 何が適切なのかは私もあいまいな所があります(汗
取得できるのはディレクトリパスだけなので、自分が決めたファイル名と合体させる必要があります。
例:
uses
…System.IOUtils;
var
FilePath : String;
begin
FilePath := TPath.Combine( GetDocumentsPath, 'vsdata.txt' );
end;
このファイルパスを利用して、TStringListのSaveToFileメソッドで
ファイルを書き込んでやれば、とてもシンプルにファイルを作成する事ができます。
例:
uses
…System.SysUtils, System.Classes, System.IOUtils;
var
FilePath : String;
SaveList : TStringList;
begin
FilePath := TPath.Combine( GetDocumentsPath, 'vsdata.txt' );
SaveList := TStringList.Create;
try
SaveList.Add( '実験結果1' );
SaveList.Add( '実験結果2' );
SaveList.Add( '実験結果3' );
…
SaveList.SaveToFile( FilePath, TEncoding.Unicode );
finally
SaveList.DisposeOf;
end;
end;
ちなみに、ディレクトリパスの存在チェックは、TDirectory.Existsで、
ファイルパスの存在チェックは、TFile.Existsで行った方が良いかも知れません。
例:
if TDirectory.Exists( DirPath ) then …
if TFile.Exists( FilePath ) then …
私もまだまだ勉強中ですが頑張りましょう!
コード中に「TPath.」が抜けておりました。
× GetDocumentsPath
○ TPath.GetDocumentsPath
申し訳ありません。
>KONNOYAさん
>参考までにテザリングについて、とても親切丁寧に解説して下さっている方のサイトがありましたので貼って置きますね。
拝見しました。20台まで接続できるのですね。使えそうなシーンをいくつかイメージできました。情報をありがとうございます。
>明太子様のリンクは、各プラットフォームに対応したパスをDelphiに聞いて下さいね。という事です。
解説をありがとうございます。
マルチプラットホーム開発が初めてなので、困惑していましたが、説明していただき意味が分かってきた気がします。
>GetDocumentsPathで良いのではないかと思います。
> FilePath := TPath.Combine( GetDocumentsPath, 'vsdata.txt' );
>SaveList.SaveToFile( FilePath, TEncoding.Unicode );
このように書けばいいのですね。
TPath.Combine(GetDocumentsPath,'')で保存場所を取得して、取得した保存場所にSaveList.SaveToFile関数でデータを保存する流れになっているのでしょうか。
ここまで丁寧に書いて下さり、イメージがつきました。
感謝です。
>ちなみに、ディレクトリパスの存在チェックは、TDirectory.Existsで、
>ファイルパスの存在チェックは、TFile.Existsで行った方が良いかも知れません。
承知しました。明日早速チャレンジしてみます。
>みなさま
私が自分の技術力に対して無謀なことをしているにも関わらず、このように助けて下さる方々がいらっしゃり、とても励まされています。
上手くいかず不安な日々を過ごしておりましたが、克服して形にできるようにがんばります。
引き続きよろしくお願いします。
ヲサヒマホホマルチさん
ヲサヌトミで良いのではないかと思います。ヲサ
教えていただいた方法で、テキストファイルが作成できました。
一歩前進しました。
ありがとうございます。
次はメールにチャレンジします。
スススススススススススススススススススススススススススススススススススススススス
ニコ ミロ
トコ イーアクッーオッイオィ金ゥ イイコウーコアカ シ スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」、マァ「ヘ、フ ナ
サキカエ ン
ヲサ通りすがりさん
ヲサメールはヤノモヘヤミを使うことで送ることができます。
ヲサノヲサアーヲサを使ってヲサヌヘヲサを送受信するには?ヲサィトヲサイーーケヲサ以降ゥヲサ
ヲサコッッュョッーエーョ」ーキカヲサ
も参考になります。ヲサ
このアドバイスをどう生かすと良いのか分からずにいます。
このソースコードは、フォームのボタンをタップするとヌを開いてくれるものなのでしょうか?
それともヌを開かず、宛先にメールを送ってくれるものなのでしょうか?
試しにヒマホホマルチさんの書いて下さったソースコードの、
モフョトマサヲサ
ヲサヲササ
のあとに教えていただいたリンク先のソースコードを貼ってみました。
メールアドレスは自分のものに変更しました。
その上で2つのスマホで走らせました。
ネットにつながっているモネューアは「モモフライブラリが読み込めませんでした。」のエラーが出ました。
ネットにつながっていないモネューエは、「アドレスョョの解決時にエラーが発生しました:ィキゥ」とのメッセージでした。
機種が違うためにエラーが違うのか、ネット接続の有無で違うのか判断がつきません。
ここからデータをどうやってメールに貼って送るのか立ち往生しているところです。
自分で調べながらどうにかしていきたいところですが、どこから手をつけていいのかが分かりません。
当初の実験のデータをメールの本文に貼って送信するところまでたどり着くのにどのような作業が必要でしょうか。
ヲサメールの本文にできればいいですか?本文でよければファイルのことは忘れてその内容をヤノヘョツに格納するだけです。ヲサ
ここら辺にヒントがありそうだと思うのですが、何をしたらいいのか見当がつかない状況です。
週末のお休みのところ恐縮ですが、アドバイスがありましたら、お教え下さい。
スススススススススススススススススススススススススススススススススススススススス
ニコ ミロ
トコ イーアクッーオッイオィ金ゥ イウコーカコーー シ スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 」、マァ「ヘ、フ ナ
サキカエ ン
ヲサヒマホホマルチさん
教えていただいたモフョチィゥを使い、一行にデータアつを書き込むテキストファイルは作成できました。
ありがとうございます。
ところで実験は、同じ作業を条件ィ刺激ゥを変えて数十回やっていただくようになっています。
そのためイ次元配列の中にデータが格納されており、それを以下のような形でテキストファイルに吐き出したいのです。
試行ヲサ反応時間ィゥヲサ刺激ヲサ正誤
アヲサアイキウヲサリンゴヲサー
イヲサアクオカヲサミカンヲサア
ウヲサアウエケヲサメロンヲサー
版では表の項目の部分を関数で以下のように書いて上手くいっていました。
ィャヲサァ試行ァャヲサァヲサァャヲサァ反応時間ィゥァャヲサァヲサァャヲサァ刺激ァャヲサァヲサァャヲサァ正誤ァゥサ
各試行は以下の通りでした。
ヲサヲサコスヲサアヲサヲサホマヤヲサ
ィャヲサィゥャヲサァヲサァャヲサヲサィゥャヲサァヲサァャヲサィゥャヲサァヲサァャヲサィゥゥサ
ところが、モフョチィァ試行ァャヲサァヲサァャヲサァ反応時間ィゥァャヲサァヲサァャヲサァ刺激ァャヲサァヲサァャヲサァ正誤ァゥサ
とするとコンパイルのときに実パラメーターが多すぎます、のエラーが出てしまいました。
もしかしたら、二次元配列だと最初に言えよ、という話しだったのかもしれないと、自分の迂闊さにうち震えています。
もしくは、通りすがりさんが言うように、テキストファイルに吐き出すのにこだわらず、二次元配列から直接メールの本文に貼り付けた方が良いのでしょうか?
手際が悪くて申し訳ありません。
いずれにしましてもテキストファイルは、実験参加者のノトなどを記録する用途がありまして、このアプリに必要な機能で大切に使わせていただきます。
スススススススススススススススススススススススススススススススススススススススス
ニコ ミロ
トコ イーアクッーオッイクィ月ゥ イアコウケコオク シ スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 「・「 。 ン
ヲサ通りすがりさんヲサヲサみなさん
ヲサメールはヤノモヘヤミを使うことで送ることができます。ヲサ
ヲサノヲサアーヲサを使ってヲサヌヘヲサを送受信するには?ヲサィトヲサイーーケヲサ以降ゥ
おかげさまで、ューエのスマホからメールを送る機能も実装できたようです。
一歩前進です。ありがとうございます。
ただューアでは、「モモフライブラリが読み込めません。」のエラーが出てしまいます。
もう少し悩んでみようと思います。
アドバイスがありましたら、引き続きよろしくお願い致します。
スススススススススススススススススススススススススススススススススススススススス
ニコ ミロ
トコ イーアクッーオッイクィ月ゥ イアコエウコイカ シ スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 「・「 。 ン
ヲサヒマホホマルチさん
おかげさまで、モフョチを使って一行の中に複数のデータを書き出すコードも実装出来ました。
ありがとうございます。
スススススススススススススススススススススススススススススススススススススススス
ニコ ミロ
トコ イーアクッーオッイケィ火ゥ ーオコイケコイキ シ スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ 「・「 。 ン
モコ
ヲサみなさま
テキストファイルとメールの機能をアプリにつけることが出来ました。
一人ではここまで来られませんでした。
こちらのコミュニティのみなさまに感謝しております。
こちらの質問は標題の件は解決しましたので一旦閉じます。
モモフライブラリが読み込めないエラーが出る件につきましては、新たに質問を立てるように致します。
そちらも引き続きよろしくお願い致します。