くだすれDelphi(超初心者用)その57 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、もしくは 質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。 ■Delphi XE6 Professional/Enterprise/Ultimate/Architect エディション(トライアル版有) 64bit Windows、Mac OS XからiOS、Androidのアプリも開発可能。ライブラリのソースコード付き。アカデミックライセンス有り。 旧バージョン(XE6/5/4/3/2/XE/2010/2009/2007/Delphi 7)のライセンス取得とダウンロードが可能。(アカデミック不可) ttp://www.embarcadero.com/jp/products/delphi ■Delphi XE6 Starter エディション 個人/5人以下の企業・組織向け。年間売上1000US$以内の商用開発可。 (※)Delphi、Visual Studio等の有償/無償の開発ツールユーザーが対象。インストール確認は特に行わない。 ttp://www.embarcadero.com/jp/products/delphi/starter ■Embarcadero RAD Studio XE6 (Delphi、C++Builder、HTML5 Builder等を含むビジュアル開発スイート) ttp://www.embarcadero.com/jp/products/rad-studio <前スレ> くだすれDelphi(超初心者用)その56 http://echo.2ch.net/test/read.cgi/tech/1405783063/ <過去スレ> DelWiki (Delphi 関連の過去スレッド)※行方不明 ttp://delwiki.info/? >>316 ファイアーモンキーならTScaleLayout使って無理やり対応した事もあります メモリーリークの場所ってdelphiに標準で入ってるリークを監視するやつのフルバージョン入れないと分からない? Delphi10.1でのフル機能のfastmm4の使い方を教えてください。 メモリーリークのメッセージは出るのですが、テキストファイルが作成されないです。 よろしくお願いします。 DatetimetostringとFormatDateTimeの違いって procedureであるか、Functionであるか、だけですか? (引数は異りますが) >>325 すみません、質問をはしおりすぎでした。 procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime); function FormatDateTime(const Format: string; DateTime: TDateTime): string; 上記2つ、使用目的はいっしょですよね。 なぜに同じような目的の手続きと関数が用意されているのか? と思った次第です。 FormatDateTimeだと、 showmessage(FormatDateTime(....));とできますが、 DateTimeToStringだと、 var DTstr :String; Begin DateTimeToString(DTstr, .....); Showmessage(DTstr); となるので、DTstr分手間がかかるなと思ってました。 何かとの互換性でどうしてもDT2strが欲しかったんじゃないかね >>326 ソースコード見てみると FormatDateTimeはDateTimeToStringを呼び出しているだけ。 たぶん利便性(使い分けできるように)の問題だと思う。 ちなみに以下の関数が内部的にDateTimeToStringを呼び出すだけで実装されている。 function DateToStr(const DateTime: TDateTime): string; function TimeToStr(const DateTime: TDateTime): string; function DateTimeToStr(const DateTime: TDateTime): string; function FormatDateTime(const Format: string; DateTime: TDateTime): string; また同名の関数で引数の最後にTFormatSettings型が追加されたバージョンも 内部的にTFormatSettings型を引数に持つDateTimeToStringを呼び出しているだけ。 >>329 なるほど、参考になりました。ありがとうございます。 >>328 FastMM4のデモで試した結果、ソースの所のFastMM4 in 'FastMM4.pas'をSharememに変えたらリークの場所がわかる余裕になりました。 Sharememが何かはわかりません。w 円バカのサイトに載ってたのでやって見たらなんとか動作したって感じです。 delphi10.1までは問題なかったのにdelphi10.2にしてから stylebookで指定したstyleが一部反映されなくなりました。 tabcontrolのタブがandroid実機で実行すると styleが反映されずデフォルトのタブになってますorz 対処方法とか分かる方いらっしゃいますか? 暫くは10.1を使い続けるしかないですかね・・・ >>332 Android用のスタイルを一旦削除してマージ >>333 アドバイスありがとうございます。 Android用スタイルを削除してマージしてみましたが結果は同じでしたorz もう少し詳細に書くとIDE上ではタブにもスタイルが反映されているが ビルドしてAndroid実機で動かすとアクティブなタブだけが デフォルトになってしまう状態です。 同じプロジェクトをDelphi10.1でビルドし直してAndroid実機で動かすと アクティブなタブも含めてに正常にスタイルが反映されてます。 また、スタイルに使用しているファイルは「AquaGraphite.style」を 使用していますが他のスタイルファイルを使っても同様の結果でした。 実機はXperia Z3ですが他に持っていないので他機種でどうなるかは未検証です。 >>333 すいませんTabControlのみしかない最小限のプロジェクトで試したら 正常にスタイルが反映されているのが確認できました。 変な設定がどこかで生きているのだと思います。 失礼しましたm(_ _)m メッセージダイアログやショーメッセージで改行を 使うとメモリリークが出るけどなんで? delphiがバグってる? 新規作成でシンプルな状態でやってもメモリーリークのメッセージが出るんだけど、どうすりゃ良いんだろう。 俺だけ? メモリーリークを調べているのですが MessageDlg(IntToStr(123),mtConfirmation, [mbOK, mbCancel], 0); IntToStr(123)が原因でメモリーリークが起きるみたいです。 Delphiのバグ?コードがダメ? 336ではないけどソースコード見てみた ポイントになりそうなところがアセンブリで書かれてた 1. MessageDlg と同じ引数を持つ、そのユニット内にローカルな関数を書いて、MessageDlg のせいかどうか調べる。 2. IntToStr と同じ引数を持ち、適当な文字列を返す関数を同様に書いてみる。 3. コンソールアプリケーションのプロジェクトを作成して、1.を行って調べてみる。 4. 同様に IntToStr も行ってみる。 どのバージョンで発生したのかしら? こちらのTurbo Delphiは ReportMemoryLeaksOnShutdown := True; で再現せず。 昔の経験 マルチスレッド内で間違った呼びし、クリティカルセクションの間違った実装 「IntToStr(123)が原因でメモリーリークが起きる」 と判断した理由を開示せよ 32biでも64bitでもinteger型は32bitですか? Pointer型(とPtrInt型)だけが変化すると考えてよいのでしょうか? -1 を代入する pointer を求める pointer + 0 と pointer + 3 と pointer + 7 あたりを見る 0 を代入する pointer を求める pointer + 0 と pointer + 3 と pointer + 7 あたりを見る Integer は 32 だけど LongInt は 32 とは限らない >>349 そんなことどこにも書いてないけどホント? ttp://docwiki.embarcadero.com/RADStudio/Berlin/ja/32_%E3%83%93%E3%83%83%E3%83%88_Delphi_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE_64_%E3%83%93%E3%83%83%E3%83%88_Windows_%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B >>351 iOSだけ特殊な感じ?変なの。 LongIntとLongWordは使わないほうがよさげですね。何でこんな変な仕様にしたんだろ。 あ、iOSにはLinux系も含まれるんですか? その辺のあやふやさも嫌な感じですね。 シンエディットでプロシージャの名前とファンクションの名前を色分けするような使い方をしたいのですが、 シンジェネラルに設定するキーワードの種類を増やす事はでききませんか? 継承してシンジェネラルも自分で作らないと無理でしょうか? SynEditのことらしい これをカタカナで書く感覚が分からん すまん。 あんまり、キーボードとかスマフォの画面とか触れないから音声のやつで入力した。 昔MCIをいじっていた者です。覚えている人いるかな? 4年くらいメソッドを書いてなくて、送るでwavを聞きたいなって思って久しぶりにコンパイラを触りました。 何をするソフトなのかというとフォームに対してD&DしてTListにD&D元のファイルのフォルダの ファイル名を取得するソフトなんですが、なぜうまくいかないかわからなくて…。 指摘していただければ幸いです。 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,ShellAPI, Vcl.StdCtrls; type TForm1 = class(TForm) Label1: TLabel; ListBox1: TListBox; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private function SearchFile(SearchDir: string):integer; //SearchDir 検索対象のフォルダ { Private 宣言 } protected procedure FilesDropped(var Msg1:TWMDropFiles); message WM_DROPFILES; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var FileCount :integer; begin ListBox1.Clear; //実行ファイルのあるディレクトリのファイルを列挙 FileCount :=SearchFile(ExtractFilePath(Application.ExeName)); ShowMessageFmt('%d個のファイルが見つかりました。',[FileCount]); end; procedure TForm1.FormCreate(Sender: TObject); begin DragAcceptFiles(Handle, TRUE); end; procedure TForm1.FormDestroy(Sender: TObject); begin DragAcceptFiles(Handle, FALSE); end; procedure TForm1.FilesDropped(var Msg1:TWMDropFiles); var FNameSize: UINT; Count : UINT; FileName : array[0..255] of Char; FileName1: string; begin FileName1 := ''; try Count := DragQueryFile(Msg1.Drop, $FFFFFFFF, nil, 0 );// A if Count > 1 then Abort; // B FNameSize := DragQueryFile(Msg1.Drop, 0, nil, 0) + 1; // C DragQueryFile(Msg1.Drop, 0, FileName, FNameSize); // D Filename1 := StrPas(FileName); // E finally DragFinish(Msg1.Drop); // F end; if FileName1 = '' then Exit; label1.Caption := Filename1; end; end. とこでfmxアプリをタスクトレイに収める方法はないですか? 探すとロシアのサイトにコンポーネントがあったけど 他に方法はないでしょうか? >>366 ええもちろん 例えばバックグラウンドでネットにアクセスして 通知したりポップアップしたりする感じ Androidだとserviceを使うんでしょうが Windowsデスクトップだとタスクトレイに 常駐させるくらいしか思いつかない こういうWindowsアプリをfmxで作る場合 どうするんでしょうか? >>367 WinAPI.WindowsをUSESしてタスクバーから消したいアプリケーションのHWND取得してShowWindow(HWND,SW_HIDE);をぶちかます タスクトレイにアイコン表示させたりする場合はコード記述でもできるけど面倒だからMonkeyMixerか何か使ってVCLを混在させてTTrayIcon使う >>368 ありがとう MonkeyMixerを調べて見ます TTrayIconはVCL依存がほとんどないから、切り出して使った方が余計なユニットがリンクされなくていいと思う 自分はそうしてる 教えてください。 fmxで矩形以外の多角形領域を Bitmap(.Canvas)間でコピーするには どうしたらいいでしょう? Helpを探したんですが見つけられませんでした 苦肉の策で矩形領域を別のBitmapにコピーし 対象の多角形領域外を完全透過に塗りつぶして それを最終的に目的のBitmapにコピーしてます よろしくお願いします fmxねぇ... 実行ファイルのサイズが vclの倍以上になるのはビックリ でもvirustotalなんかでの誤検知は 確実に減るな DBCtrlのKeyPressメソッドで出てくる ^H ^V ^X とかって何を指してるんですか?それぞれ16進で、8,16,18の値なんですが。 ポインタの逆参照以外で ”^” の使い方はヘルプにも無いのですが。 H 48h V 56h X 58h ctrl+H で 08h ctrl+V で 16h ctrl+X で 18h >>374 コントロールキーを押しながら…の記述に ”^” を使うということですか。 ありがとうございます。 ちょっと教えてください ジェネリクスなTListにレコード型を格納しておいて 後でレコード内の一部のフィールドを修正したい場合 どうすればいいんでしょうか やっぱレコード全体を取り出して、修正後に全体を書き戻す? うまくいくかはわからないが、 lst: TList<THoge>なリストがあるとして、 for i :=0 to lst.Count-1 do begin lst.List[i].SomeField := v; end; のように、レコードのコピーが発生しないようにすればもしや。 デフォルトプロパティ List[i] に相当する List.Items[i] の read関数 function TList<T>.GetItem(Index: Integer): T; は、戻り値が 左辺値ではないので、どうしても一時変数が必要です。 >>378 Itemsプロパティではなく、内部で管理している配列を直接返すListプロパティを介してもテンポラリーのコピー発生するんだっけ? ちょっとうろ覚え。 Delphi 10.2 Update 1で実行しています。 log.d('error だめぽ'); 上記コードをiPhone実機で実行して Xcode -> Window -> Devicesに表示されている実機のログを確認すると 以下のように全角文字が文字化けします。 2017/09/23 14:35:21 Project1[7478]: error \M-c\M^A\240\M-c\M^B\M^A\M-c\M^A\M-= 解決策をご存知の方がいらっしゃいましたらお助けくださいませm(_ _)m エスケープ文字をデコードすると e3 81 a0 e3 82 81 e3 81 bd なので、UTF-8 ですかね。 エスケープ文字への変換がログの前後かは切り分けてみましょう。od -x で16進表示すると、 \M-c のところが、e3 なのか 5c 5d 2d 63 なのかでわかるでしょう。 前者なら、ログを出力するツールの性格(ASCII以外は変換とか)、 後者ならコンソールへ出力するツールの変換ですかね。 前者なら、デコードツールでも作ってみれば。 \Mは、0x80を or するメタキーを併用したキー入力の名残りで、Emacs/GNU系の方言です。 \M-c は 0x80 + 'c' = 0xe3 、\M^A は 0x80 + 0x01 (Control-A) = 0x81、\240は8進表記なので 0xa0 >>381 詳細に解説いただきありがとうございます! >\M-c のところが、e3 なのか 5c 5d 2d 63 なのかでわかるでしょう。 od -xのやり方が分からなかったのでログをテキストで保存して バイナリエディタで確認したところ5c 4d 2d 63でした。 これは表示する側の問題ということですよね? あの後、XCodeでNSLogでデバッグログを出力する簡単なプログラムを書いて確認したところ XCode上のデバッグコンソールには日本語が文字化けしないで出力されますが Xcode -> Window -> Devicesに表示されている実機のログでは日本語が文字化けしたので 表示側の問題なのかなと思います。 日本語が表示できないのは不便なので解決できるとうれしいですが こういう場合、難しいのでしょうか。 >>382 面倒だから試してないけど NSstr使うとかAnsiStringに一旦格納して出力するとか しまった。前後逆でした。e3 のままなら無変換。 で、ちょっと古いけどXcode6.3.2+ios8.3では日本語表示できてます。 >>383 ご回答ありがとうございます! NSstrを使ってlog.dで出力しようとするとコンパイラに怒られてしまいましたorz AnsiStringを試したところ出力文字は変化しましたが文字化けは改善されませんでした。 >>384 ご回答ありがとうございます! なるほど。 現在の環境がXCode8.3 + iOS8.3なので少し古いXCodeを使って試してみようと思います。 iOSってTBannerAdを使ってAdmob表示できないんですか? docWiki見たらiOSはiAdを使う前提の説明しかなくて・・・ Delphi10.2ってxcode9.0に対応してる? すみません。どうしたりいいのか分からずに書き込みさせてください。 お伺いします。 https://www.axfc.net/u/3858375?key=delphi アーカイブpass=123456 ですが、AというフォルダにB.zipC.zipD.zip・・・というファイルが入っています。 これにB.zipというファイルをフォームにD&Dで落とすと 1:q:\A\B.zip 2:q:\a 3:q:\a\ と表示されます。 そして、Button1を押すとバイナリがあるフォルダのファイルの数を報告します。 欲しい機能はB.zipをフォームにD&DをしたときにC.zip,D..zip のAフォルダ内のファイルのすべてをListBox表示に表示させるにはどうしたらよいでしょうか? 最近いろいろやっているのですが、今ひとつ解決できないため、 教えていただけないでしょうか? >>392 TDirectory.GetFilesとExtractFilePath すみません。エロい方教えてください。 s := 'ABC'#13#10; という文字列を、SJISの16進文字列に変換して、 '4142430D0A' にしたいのですが、やり方がわかりません。 どう書けばよいのでしょうか? D5でよければこんな感じでできるかな procedure TForm1.FormCreate(Sender: TObject); var s, s2: string; i: Integer; begin s := 'ABC'#13#10; s2 := ''; for i := 1 to Length(s) do begin s2 := s2 + IntToHex(Ord(s[i]), 2); end; ShowMessage(s2); end; >>396 Delphi6でできました。ありがとう。 これ、XE5でも動くのかな? >>397 自分で試すこともしないのか 試すことができないなら気にしなくてよくないか すみません。 気にしなきゃいけない状況です。 で、XE5は今環境がないのです。。。 (仕事場が2つあり、いまXE5がない方に常駐しているので) firemonkeyって一度置いたコンポーネントって削除できないの? .┌┐ / / ./ / i | ( ゜Д゜) |(ノi |) | i i \_ヽ_,ゝ U" U imagelistを使うと削除できないみたいです。 選択範囲には継承されたコンポーネント ImageList1 が含まれているため削除できません。. これって返品で金返してくれないかな >>406 うちではそんな現象出ないけどバージョンは? >>406 お前それTFrameの中にあるやつを継承先から削除しようとしてんじゃねーの 皆さ、レスありがとうございます。 バージョンは10.2です。 試した感じではボタンだけの貼り付け、削除はできる。 ImageListはListに画像を追加すると削除できなくなります。 その状態になるとボタンの削除もできなくなります。 ImageListの画像リストを削除してもダメです。 Delphiはそんなに触ってないので設定は初期値のままです。 何か最近ヘルプ表示したままdelphi終了しようとすると ヘルプの終了処理に手間取ってdelphiがなかなか終了しない 心当たりはFCUへのアップデートとMS VisualStudioの再インストールだが... ググったけどdelphiの正規表現しか出てこないです。 サイトとか教えてください。 >>414 System.RegularExpressions TRegistryをもちいて、 レジストリの情報を拾いたいのですが、 レジストリ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanesers\Eras ひろいたい情報 名前、データ 1868 01 01, 明治_明_Meiji_M 1912 07 30,大正_大_Taisho_T const AppKey='\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanesers\Eras'; var Reg:TRegistry; begin Reg:=TRegistry.Create; try Reg.RootKey:=HKEY_LOCAL_MACHINE; if Reg.OpenKey(AppKey,False) then begin この後どうすればいいんでしょう? Reg.GetValueNames(MEMO.Lines); としてもMEMOには何もかえってこないのです。 キーが違うようです。 AppKey='\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras'; >>418 その通りでした。 Reg.OpenKey で戻りを気にしていなかったので、悩み続けてしまいました。 ありがとうございます。感謝です。 Calender、Japaneseもわかってない人は論外 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる