くだすれ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/? ごめん post-/sendmessageにはwm_closeみたいな表示するメッセージはなかった 独自のメッセージを定義して受け取った側でshowするか showwindow(async)を使うかだね >>199 TThread.Synchronizeで、メインスレッドに切り替えてから、引数で渡されたコールバックメソッド(手続き)でサブフォームを表示させるとか >>198 エラーが消えて無事に動きました。 ありがとうございます。 こういうのはIDEが教えてくれるのかと思って いましたが、有料版だとそういう機能は あるんでしょうかねー >>203 関数や手続きが定義されていないってエラーが出たときはその関数などのヘルプを見て そこに書いてあるユニット名が自分のプログラムのuses節に書かれているか調べるといいよ。 >>200 ,202 ありがとうございます。 教えてもらった方法を調べながらやってみます。 TShellCtrlコンポーネントって、デモに含まれるものなんだよね なんでVCLに含めなかった?? マルチスレッドが終了したかどうか確認するのに、フラグで確認してるんだけど、 なんかもっとスマートな方法ってありませんか? ググったらWaitForが出て来たのですが、hoge.WaitForとしてもハンドルエラーとか出て使えませんでした。 宜しくお願いします。 何があなたのスマートの基準なのか? フラグは別に悪くないと思うけど。 >>208 hogeってTThread? そんだったらTThread.FreeOnTerminateをTrueにしてるから、 スレッドが終了してFreeされてるから、ハンドルエラーと出てくるんだろう。 FreeOnTerminiateをFalseにすればOK(そのかわりTThreadの破棄は自分でやる必要がある)。 終了したか確認するのにWaitForしたら確認じゃなく待機しちゃってダメじゃないのかと思うけど。 FreeOnTerminiate:=true;で OnTerminateイベントでフラグ立てるので良くないかい? あとはメインフォームに終了通知としてメッセージ送るとか。 Win32API使うのOKなら FreeOnTerminiate:=false; にして スレッドハンドルに対して WaitForSingleObject (タイムアウトは0に設定)使い WAIT_OBJECT_0が返るかWAIT_TIMEOUTが返るか確認する。 もしくはGetExitCodeThread関数を使うとかかな。 そういやスレッドの終わり方の議論が2、3年前にあったな FreeOnTerminateが使えない?とかいう議論じゃなかったっけw FreeOnTerminiate:=true;で OnTerminateイベントでフラグ立てる に賛成。簡単確実。 ああOnTerminate 内はメインスレッドか。 なら簡単だわ。メンゴ。 昔はOnTerminateイベント無かった希ガス おはようございます。 皆さん、ありがとうございます。 フラグがやはり良さげなんですね。 もう1つ教えて下さい。 スレッドの中で try stringlist:=TStringList.Create; while not Terminete do begin 何かの処理 end; finally stringlist.free; End; とした時に、TermineteをTrueにして終了するとfinallyの処理をしてくれません。 異常終了した時はfinallyの処理をしてくれます。 stringlistの解放はOnTermineteでするのが普通なのでしょうか? >とした時に、TermineteをTrueにして終了するとfinallyの処理をしてくれません。 んなわけない。ちゃんとfinallyの処理するはずだからもっとしっかり確認しよう。 >フラグがやはり良さげなんですね。 もうちょっと具体的にスレッド終わった後何したいのかとか書いてくれんと答えようがねぇ。 >>220 ホントだtryはあった...でも 最近のdelphiは仕様が変わったのか... 念のため例外処理入れてみたら? list=:tstringlist.create; try try while not terminated do begin ...end; // ここで正常処理終了のフラグをセット except....end; finally list.free; end; >>218 >TermineteをTrueにして終了するとfinallyの処理をしてくれません。 どうやって確認したの? あとTThreadの派生クラスならTerminateはメソッドとTerminatedプロパティが使える。 >stringlistの解放はOnTermineteでするのが普通なのでしょうか? そんなことはない。 昔昔、QuadrupleDを使ってやってたサウンドの再生を最新のDelphiでやりたいんですが、使えるライブラリを探してます。 ・複数のwaveファイルをマルチチャネルで読み込んでそれぞれ別個に再生したい ・チャネル単位でループ再生、ピッチ変更、音量変更がしたい あるかな…(´・ω・`) ブレーク入れてね ステップで見るときブレーク入れないと 見かけ飛ばすから フラグの排他制御は簡単だと思うが。 boolean変数一個なら読み書きは1命令で、割り込まれることはないだろうし 書く前に消されちゃうようなコードを書かなければいいだけ。 >>226 きちんとした知識がある人にとっては簡単だよね フラグをグローバルやメインフォームなどに 持たせるのはなんか古臭いという気持ちはある 元号変わったらどうすっかな D7だと対応できんだろ >>229 元号とか使わないか 自力で変換 OSの機能を使ってるんだったら大丈夫か ただvistaも今春でサポート終了するけど Berlin試したみたけど以前ここで言った gifアニメのバグが解消されてないな string、ansichar、pansicharの型キャストってどうやるの? 暗黙の型キャストの警告を消したいんだけど、ググってstrpcopyとかのサンプルを実行しても消えない。 >>232 string(ansistring変数)とかで消えない? Konopkaコンポーネントのアンインストール方法を教えて下さい。 インストール中に異常終了したのでアンインストールしたいのですが、 アンインストールも途中終了してしまって、行き詰ってしまいました。 よろしくお願いします。 >>235 マイドキュメント\Embarcadero\Studio\18.0\CatalogRepositoryにあるKonopkaのフォルダと パブリックのドキュメント\Embarcadero\Studio\18.0\CatalogRepositoryにあるKonopkaの リポジトリデータを削除すればよかったと思う。(心配ならバックアップとっといてね) konopka、インストール失敗するとアンインストールもできなくなるんだよね。 >>236 ありがとうございます。 助かりました。 入力の支援機能で出て来た候補にカーソルを合わせて、 ピリオド打ったら選んだ候補が入力される設定ってどこにありますか? ベルリンのup2を入れたのですが、最初は良かったのにいつの間にかピリオドで選択されなくなってしまいました。 StringGridのセルをデータの合わせて塗りつぶすことをしています。 タイマーイベントで0.2秒毎にデータに変化がなくても一旦デフォルト色にしてから他の色を塗っています。 そのせいだと思うのですがセルの選択ができません。 セルをランダムに色を塗りつつ、セルの選択もできるようにするにはどうしたらいいでしょうか? TSringGridのOnDrawCellイベントの引数で渡されるTGridDrawStateで、選択されたかどうか判断できる。 選択されてないときだけ、色を変更するよろし。 >>240 .241 ありがとうございます。 まだ、試してませんがどういうコードを書けば良いか案が浮かびました。 タイマーで200ミリ秒ずつやってるところが壮絶にまぬけっぽい 小学生以下の知能 Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、もしくは 質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。 昨日はありがとうございました。 TSringGridの特定のセルに数値を書き込むのにDrawTextを使って右寄せで書き込んでいます。 この書き込んだ数値を後から取得することってできますか? セルにHintみたいに埋め込めたら簡単なんですけどググっても分かりませんでした。 >>243 シーケンサーの信号状態を監視するんで手っ取り早くタイマー使ってます。 その「数値」はどこにしまってあるの? それは自分で世話するしかない。 DrawTextは文字列を描画するだけで、何書いたかなんてどこにも覚えていないよ。 StringGridなんだから、Cellsプロパティを通して、文字列として各セルにでも入れときゃいいんでね?(ハナホジ >>245 格納するオブジェクトも実装したらいいんじゃ 整数ならcellのobjects(だったっけかな)に入れときゃ良いじゃん vs2015アンインスコしたらDel10.1でコンパイルできなくなった。 Del再インスコするしかない? >>251 ありがとうございます。 調べてみます。 スレッド1で変数aの値を読み書きしていてスレッド2では変数aを読み込みしかしない場合って干渉対策って必要? ありがとうございます。 干渉対策じゃなくて排他処理っていうんですね。 失礼しました。 各スレッドで共有する変数を集めたUnitに変数aを宣言して使っています。 この変数aを複数のスレッドからアクセスする場合、Synchronizeを使うのでしょうか? SynchronizeはスレッドからVCLを描画する場合に使うと書いてあったので、フラグを立てるとかして 排他処理をするのでしょうか? クリティカルセクションでも使えばいい、どっかで CS := TCricalSection.Create()で作っておいて、 同時にアクセスされたら困るところで CS.Enter(); try 共有リソースの変数Aにアクセスなど finally CS.Leave(); end; まぁ、他にもSyncObjs.pasにTInterlockedとかあるけど、 そこは自分で頑張ってくれ >>255 Synchronize内の処理はメインスレッドでの処理となるから 同時アクセスがありえなくなるということらしいよ 皆さん、ありがとうございます。 これから調べて確認しようと思うのですが、最後に1つ教えて下さい。 シンクロナイズを使い過ぎるとマルチスレッドの意味が無くなるとヘルプに書いてありました。 クリティカルセクション等は使い過ぎてもメインフォームの反応が悪くなるとかそういう事が無くなる、若しくは低減されるとかあるのでしょうか? もし、それならクリティカルセクション等を推奨すると思うので使い過ぎはやはりダメとは思いますがどうなんでそょう? >>259 ウインドウ描画などしているスレッドが「メインVCLスレッド」。 要するにメッセージループが動作しているスレッド。 Synchronizeはこのメッセージループに「渡したプロシージャの処理を任せる」ため Synchronizeを多用すると「メインフォームの反応が悪くなる」という状況を生む。 Synchronizeはあくまで変数のアクセスと言った軽い処理に限定すればいい。 この場合、メッセージループがウィンドウメッセージを処理する合間に変数へのアクセスを処理する程度なので その程度で「メインフォームの反応が悪くなる」ということはないだろう。 ただ、もし重たい処理を任せてしまうと、フォームのイベントで処理するのと同じになってしまう。 (フォームなどコンポーネントのイベントはメインVCLスレッドで動作している) この場合メインフォームの反応が悪くなる。 クリティカルセクションはメッセージループとか関係ないので、それによってメインフォームの反応が悪くなるということはない。 ただ例外として、メインVCLスレッドでクリティカルセクションを使うと、 他のスレッドが使用中はメインVCLスレッドは待機してしまうのでメインフォームの反応が悪くなることはある。 >>259 問題は「使い過ぎ」の定義だと思うけど 僕は1つ1つの処理の長さが長くなってしまった場合をいってるのではないかと思う。 同時処理といっても現実は短い処理が交互に行われるのをスレッドと称しているだけであって それを否定するようなプログラミングはもはやスレッドではないということではないかと。 あ、もしかしたら質問に答えてなかったかな? つまりsyncronizeだろうがcsだろうが 占有状態が長くなるようなロジックになるなら同じことだ >>262 今のcpuは普通にマルチコア、マルチスレッドじゃない? 同時に動いてんじゃない? >>264 そういう御仁が現れるだろうなとは思ってた。 申し訳ないがマルチコアなどの詳細な仕組みが現話題の結論に 影響を与えるものではないので無視させてもらいます。 OSのタスクスケジューリングやスレッド、Delphiのメインスレッドの話がごっちゃ混ぜになっててカオスカオス 細かい処理が交互にっていつの時代のタスク割り当ての話してるんだ >マルチコアなどの詳細な仕組みが現話題の結論に影響を与えるものではない 今の話題においてこれは正しいと思う。 >同時処理といっても現実は短い処理が交互に行われるのをスレッドと称しているだけであって この話も同じく、“現話題の結論に影響を与えるものではない” 中途半端に説明するからややこしくなる SynchronizeにしろCriticalSectionにしろDelphiのメインスレッドが処理待ちになる状況ができれば反応は悪化する くらいでイナフ >>269 メインに限らないっしょ。同期されたサブスレッド間でも片方が長い処理すれば片方は待ちになるわけだし。 >>271 メインスレッドを待機が発生するスレッドと置き換えて考えたら良いだけの話であってそのあたりは柔軟に考えてくだちい まー、サブスレッド同士が待機しあって停滞しててもメインスレッドがそこに巻き込まれてなければ(見かけ上は)レスポンスの悪化とかは無いけどね 結局「スレッド」という英単語が同いう意味かってだけだね。 あと例えば一度にたくさんのログインがあるサーバーなんかは スレッドたくさん作ることによるメモリの圧迫が指摘されてて メッセージ処理型に回帰してるよね。 つまり同時(的な)処理においてスレッドが万能ってわけじゃない ことも知ってたほうがよいよね。 で、そのメモリ圧迫とやらは今回の質問のどこにかすっているのかね? 10.2tokyo入れて見たんだけど、10.1でgetitから入れたコンパーネントが入れられなくてプロジェクト開けられない。 エンバカ何なんだ? >>278 よくある Getitじゃなくて配布元からダウンロードして入れたらOk StarterのBerlinをTokyoにするんだけど いったんBerlinをアンインストールするんだっけ? StarterのBerlinをインストールしたままTokyoをインストール出来ましたし、同時に起動出来ました。 公式ブログには逆の順番(Tokyo→Berlin)でのインストールは、 お勧めしませんって書いてました。 >>281 ありがとう 上書きインストールされないってことか... 2007からXEにあげるのに、いまさらながらユニコードに取り組むんですが、 ・フォーム上で入力されるのはUTF-16 ・UnicodeStringで保持するのはUTF-16 ・ソースはUTF-8 の違いがあるようなのですが、ソースでリテラルで記述したUFT-8の文字を コンポーネントのテキストやUnicodeStringに代入したりするとごちゃ混ぜに なってしまうんですか? 文字コードを確認してみたのですが var c: Char; begin c := 'あ'; ShowMessage(Format('%x',[(Ord(c))]); のソースで、ソースをバイナリエディタで見てみると、'あ'の部分 のコードはUTF-8ですが、Ord(c)はUTF-16のコードでした。 これは、勝手に文字コードの変換が掛かるのですか? こう言うとアレだけど 普通に使うときはユニコードとか 意識する必要ないんじゃない? >>285 例えば、 s := Edit1.Text + 'が入力文字列'; のような場合だと、sにUTF-8の文字コードとUTF-16の文字コードが混在して まずいような気がするのですが、プログラム動かしてみると、コンパイル時に ソースコードでの文字列はUTF-16に変換してるのかな?と思ったのですが。 便乗失礼します。 2009以降 ・ShowMessageの内部では、UnicodeStringとして表示する文字列を処理します。 ってことだったと思うのでUTF-16変換されてるのかと 異なるコード間では暗黙の変換される でよかったでしょうか? どこまで変換されるのかは確認してないのと、 Chr関数とか文字数、Byte数を数えるときに気をつけて考えておく、くらいでしか認識してないのですが https://edn.embarcadero.com/jp/article/38783 https://edn.embarcadero.com/jp/article/38791 >>287 リンク先を読んでみると、文字列の代入時に変換してるみたいですね。 ありがとうございます。 >>286 大丈夫 ソースファイルがutf8とか意識しないほうがいいよ 文字列リテラルもstring変数もunicodeだよ >>288 内部でどう処理してるのか知らないけど このケースだと代入時(実行時)に変換してるのかな? 実行ファイルの最後に定数が保存されてたと思うけど すでにunicodeになってたような気がする >>285 逆に、常に意識してないと嵌まることがあるよ。 >>288 リンク先を読んでみると、「すでにUnicodeとして扱われている」ってのが分かると思うんだが。 >Delphi 2009で、内部的に大きく変わっています。Delphi 2009では、Unicodeを標準文字列型として採用しているために、このコードで使われている文字列はすべてUnicodeです。 >Sに代入している ‘Hello, World.’ は、Unicodeです。 ソースの文字コードがなんであれ、リテラル文字列の扱いはUnicode。 C++Builderで扱う場合はLが付いているかいないかでリテラル文字列の扱いが変わると思う。 てか簡単なサンプル作って試せば済むことじゃん 昔のバージョンのdelphiで 文字コードを意識する必要があるケース以外 最近のバージョンのdelphiでも unicodeであることは考えなくていいんじゃない 真に気を付けないといけないのは1文字に複数文字が入ってるサロゲートペア 見た目が同じだからハマる 「ば」と「ば」が違う文字とかわっかんねーよ >>295 最後の行は「ば」? これってサロゲートペアなのか? それとも別の文字が化けた? それと 内部の文字列がunicodeになった話と unicode文字列を処理する話は 微妙に違う話だぞ? UTF16も実は可変長という落ちなんだからややこしくなっただけだと思う >>297 2chだと化ける可能性あるから両方サロゲートペアじゃないよ 入力ソフトによってはかな入力するとサロゲートペアになるんよ んでUTF16の入力を受け付けるもんだからそのままDBに格納したりしてあとで検索にひっかからないとか コードの仕様で言うならIF条件すり抜けたりとか おかげでEditのTextとか必ずUTF8Stringに代入する癖がついてしまった ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる