1 名前:デフォルトの名無しさん [2009/02/22(日) 22:10:29 ] Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を 勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが お礼はDelphiの布教と初心者の救済をお願いします。 <前スレ> くだすれDelphi(超初心者用)その48 pc11.2ch.net/test/read.cgi/tech/1225641040/ <過去スレ> DelWiki避難所(Delphi 関連の過去スレッド) delwiki.info/?%E3%83%AA%E3%83%B3%E3%82%AF%2F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%2FDelphi%20%E9%96%A2%E9%80%A3%E3%81%AE%E9%81%8E%E5%8E%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89
369 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 14:20:46 ] >>367 Captionじゃないけどそんなかんじです。 FirefoxやiTunesみたいなインクリメンタルな検索を実装してるのだけど たとえば「饅頭」と打ったときTEdit.Onchange内では「饅」しか入っていないので 打った「頭」を検索クエリに入れられず困ってるという話。 (ここまで書くと丸投げっぽいな…)
370 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 14:28:08 ] >>369 頭が入力された時にもう一度OnChangeイベントが発生してるだろ。
371 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 14:33:20 ] >>369 自分のはTurboじゃなくてDEL7なんだけど、 単純なコード書いて試した? OnChangeにCaption:=Edit1.Textて書いて実行すると、確定するたびに 「まんじゅう」と入れて「まん」だけ確定すると「饅」表示、次に「じゅう」を 確定すると「饅頭」がちゃんと表示されるけど。
372 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 14:34:23 ] >>371 X OnChangeにCaption:=Edit1.Textて書いて実行すると、確定するたびに 「まんじゅう」と入れて「まん」だけ確定すると「饅」表示、次に「じゅう」を ○ OnChangeにCaption:=Edit1.Textて書いて実行すると、「まんじゅう」と 入れて「まん」だけ確定すると「饅」表示、次に「じゅう」を
373 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:00:33 ] >>369 変換を伴うインクリメンタルサーチやるときは、IMEのメッセージ捕まえた方が色々とやりやすい
374 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:33:14 ] コンソールアプリで出力に色つけるのってどうやるの? 無理やりドライバ入れてエスケープシーケンスでじゃなく正式なやり方で。
375 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 15:58:47 ] >>374 コンソールAPIを使う。 これをラップしてTurbo Pascalを模したcrt32っていうユニットが www.kobira.co.jp/sakura/d_Con_Cgi.htm にあるから こういうのを使うと簡単。
376 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 21:14:17 ] >>368 学者の詭弁乙
377 名前:369 mailto:sage [2009/04/28(火) 23:52:39 ] いろいろレスどもです。 確かにCaption変えるだけだと問題ないっすね。 イイワケにならんけど入れてまだ一週間くらいなんで ヘンな記述してる可能性も捨て切れません。 OnChangeのたびにSQLiteぶん回すのがキツイのか 単純な記述ミスがあるのか、もう一度じっくり眺めてみて どうしようもなかったらIMEのメッセージ(ってのも初めて見る世界) の線でぐぐってみます。
378 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 05:14:54 ] IEやFireFoxから画像をドラッグ&ドロップされたのを受け取るには、どうしたらいいもんでしょうか・・。
379 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 07:33:26 ] OLEを使う どっかにそういうコンポがあったからそれ使うと簡単にできると思う
380 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 21:04:08 ] procedure ahya; begin ahya; end;
381 名前:デフォルトの名無しさん mailto:sage [2009/04/29(水) 22:06:42 ] stack overflow
382 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 08:39:33 ] >>377 > OnChangeのたびにSQLiteぶん回すのがキツイのか
383 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 13:01:08 ] Cのsystem()関数ってないの
384 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 16:04:09 ] つWinExec
385 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 10:30:37 ] VirtualListViewに256x256のサムネイル画像を並べているのですが、StretchBlt で 縦横比を変えずに縮小するために JpegをTPictureで読み込んでBMP.Assignするときに凄く時間がかかってしまいます 最初は中村氏のBitmapUtils.Stretchを使ってからStretchBltしていましたからもっと時間がかかっていました TVirtualExplorerEasyListviewなどはエクスプローラ並みのスピードで表示されるので方法次第だと思うのですが ソースがないので手法が分かりません どの方向で考えたらいいでしょうか?御指南ください
386 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 13:43:04 ] >>385 TJpegImageのScale使うか、 写真ならExifのサムネイルを読み込むか。
387 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 14:21:28 ] ありがとうございまし、そんなのもあるのですね D2009のJpeg,GIFImg,pngimageを使っているので型によって縮小方法を変えるんですね ググったら ttp://jane.s89.xrea.com/test/read.cgi/kakolog/1119916964/170-188 がでました。サンプルソ−スも生きていて落とせましたので読んでみます でも、usesするだけでTImageとかでpngとか読めるんだから(これが凄いけど) TImageListとTListViewも対応してくれるのが一番嬉しいんですよね
388 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 14:23:12 ] ソースだと思ったらJane本体だったorz これだけがヒントですね 188 :Jane使いの名無しさん:05/07/27 00:00:41 ID:6kBZoROZ >>174 ・TJpegImage.Scale //←基本的にこれ ・TbitmapはDIBにする ・Jpeg.pasとiijのライブラリ改造 TApiBitmapとTBitmapで検索して掛かったとこちょっと 変えてみただけ
389 名前:デフォルトの名無しさん mailto:sage [2009/05/01(金) 18:24:11 ] つGDI+
390 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 14:22:24 ] >>385 ちなみにサムネイル生成処理はちゃんと別スレッドでやってる? 画像ファイルが1000超えるような場合のエクスプローラの挙動見れば分かるけど、 非同期でやらないとどれだけ高速化しても厳しいと思うよ
391 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 19:20:06 ] そうですね、10個表示されてたらいくつも平行してサムネイルが描画されていってますものね 私もスレッドはやってみようとしかけたのですが、結局ImageListに登録する所あたりで挫けてしまいました スレッドCreateでFileName、サムネイルの大きさを渡してBitMapを返してもらうのか(どうやって?) スレッドの中でImageListにAddするのか ListView.OnDataHintとスレッドがどんなお付き合いにしたらいいのかが分からないのです あ、ちなみに>>389 さんのGDI+は試したらずいぶんと速くなりました
392 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 20:16:40 ] CなどのコードをDelphiへ移植する時、Delphiで使えない識別子があった場合はみなさんどうしてますか?
393 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 21:58:43 ] comboboxのitemを右クリックしたらポップアップメニューを出したいんだけど、 どうしたら良いですか? ContextPopupにPopupmenu1.Popup(X,Y)ってやっても何も起こらないです。
394 名前:393 mailto:sage [2009/05/02(土) 22:27:06 ] 事故レスです。 レジマネジャーって言うフリーのコンポの バグみたいです。 新規でテストプログラムかいたら出来ました。
395 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 19:27:46 ] >>391 実際にスレッド内部からImageList.Add呼んだら問題が起きた?そこまでやったの? とりあえずぐちゃぐちゃになってもいいからやってみないことには問題点も分からないじゃない
396 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 22:11:13 ] やってみました。 何度も暴走させながらも(スレッドってまともに動かしたことがないもので)出来ました 目に見えるItemが同時に読み込まれている感がないのでまだまともに出来ている ワケではないのでしょうが取り敢えず正確に表示できて明らかに今までより 表示速度は速くなりました(4000Filesほど読み込ませても数秒でした) ありがとうございました
397 名前:デフォルトの名無しさん mailto:sage [2009/05/03(日) 23:11:33 ] マルチスレッド歴1ヶ月のおいらがわかる事はとりあえず、 ImageList.Addメソッドの呼び出しは最低限、クリティカルセクションなりを用いて排他制御 しなきゃいけなさそうと言う事だけ。 後はわかんない。ぷぎゃ。 CriticalSection.Accuire; try ImageList.Add finally CriticalSection.Release; end;
398 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 00:36:07 ] いや、いらないからw
399 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:01:10 ] >>397 だけど、今、具体的にImageListのAddメソッド追ってみたけど、 内部でHandleNeededが呼ばれて、そのHandleNeededでフィールドのFHandleを参照しているから、 下手すると、 procedure TCustomImageList.HandleNeeded; begin if FHandle = 0 then CreateImageList; end; で、CreateImageListに複数のスレッドが同時に突入すると、イメージリストのハンドル が複数作成され、迷子になっちゃわない? ハンドルリークだから、まぁ、そこまで被害拡大しないと思うけど。
400 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:12:08 ] ああ、というか、そもそも前提がお互い違うのかもね。 おいらの場合は、サムネイル作成するサブスレッドでImageListのAddメソッド 呼ぶ事を前提にしてた(それで出来るか分からないけど、ぷぎゃ)。 メインスレッドだけで、ImageList.Addメソッド呼ぶなら必要ないと思う。
401 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:42:09 ] 勉強のため、勝手にちょっと作ってみたけど、今のおいらのレベルで作るとこんな感じかな。 TThumnailEvent = procedure (Sender: TObject; ABitmap: TBitmap) of object; TThumnailer = class(TThread) private FFileName: string; FSize: TSize; FBitmap: TBitmap; private FOnThumnail: TThumnailEvent; private procedure CallOnThumnailEvent; protected procedure Execute; override; public constructor Create(CreateSuspended: Boolean; AFileName: string; ASize: TSize); public property OnThumnail: TThumnailEvent read FOnThumnail write FOnThumnail; end;
402 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:43:02 ] で、実装は { TThumnailer } constructor TThumnailer.Create(CreateSuspended: Boolean; AFileName: string; ASize: TSize); begin FFileName := AFileName; FSize := ASize; FBitmap := TBitmap.Create; inherited Create(CreateSuspended); end; procedure TThumnailer.CallOnThumnailEvent; begin if Assigned(FOnThumnail) then FOnThumnail(Self, FBitmap); end; procedure TThumnailer.Execute; begin // サムネイル作成処理 // ごにょごにょ if Assigned(FOnThumnail) then Synchronize(CallOnThumnailEvent); // VCLのメインスレッドど同期を取る FBitmap.Free; end;
403 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:46:47 ] メインのVCLスレッドでは、 procedure TMainForm.Button1Click(Sender: TObject); var Thumnailer: TThumnailer; begin Thumnailer := TThumnailer.Create(True, FileName, Size, Bitmap); Thumnailer.FreeOnTerminate := True; // 自動破棄 Thumnailer.OnThumnail := OnThumnail; Thumnailer.Resume; end; procedure TMainForm.OnThumnail(Sender: TObject; ABitmap: TBitmap); begin if ABitmap <> nil then ImageList.Add(ABitmap); end; とか。ListView.OnDataHintとかは良くわかってないので省略。
404 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:47:39 ] Thumnailer := TThumnailer.Create(True, FileName, Size, Bitmap); は Thumnailer := TThumnailer.Create(True, FileName, Size); だった。orz
405 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 01:51:34 ] 「こんなクラス名は嫌だ」