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
337 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 00:50:22 ] >>333 勿論できるぞ。種になるブックをどこかに作っておき、 それをコピーするんだ。実行自体にはExcelすら要らん。
338 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 01:05:32 ] >>336 削除と登録ができるのに、一時的に止められないってこたないだろ。 削除して、また登録すればいいんだから。 それはさておき、 Excel.AddIns['アドイン名'].Installed := false; Excel.AddIns['アドイン名'].Installed := true; あたりで出来ないか?
339 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 05:57:23 ] >>333 使ったことはないけど wiki.lazarus.freepascal.org/FPSpreadsheet
340 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 08:05:52 ] >>337 ,338,339 ありがとうございます。 >>337 >勿論できるぞ。種になるブックをどこかに作っておき、 このレス見たとき、昔こういうやりか足してた先輩がいたの思い出した。 今は会社辞めちゃったけど。 >>338 >Excel.AddIns['アドイン名'].Installed := false; >Excel.AddIns['アドイン名'].Installed := true; 作ったら人に渡すので削除とかは実際したくないってのがありました。 こういうのがあるんですね。 ヘルプを見てみます。 >>339 これコンポーネントですよね。 よさそうなんですが、ダウンロードするところがよくわからなかった。orz
341 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 10:51:59 ] ポインタについてなんですけど、 ある手続きで参照先のデータを解放した後に、 別の手続きでその場所にデータがあるかどうか調べるって事は出来るんでしょうか?
342 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 12:18:31 ] 出来ない。 メモリの内容見てそれがオブジェクトなのか、生きているのか死んでいるのかを厳密に判別する術はない。 procedure foo(var a: TObject); begin FreeAndNil(a); end; とかやって参照自体を潰して参照がnilかどうかで判断するのが定石だな。
343 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 20:06:14 ] メモリマネージャを差し替えればそれっぽいことができなくもないけど、激しくオススメしない
344 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 20:58:07 ] どんな手使っても、アプリケーションが全てと思うけどな。 やな手使って欲しくないけど…
345 名前:デフォルトの名無しさん [2009/04/24(金) 21:19:38 ] よーわからんけど ポインタが有効かどうかって Assignedすればエエだけなんじゃねえの? 外していたらメンゴ
346 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 21:23:40 ] Assignedはnilチェックだよ
347 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 03:27:42 ] EAccessViolationで囲むとか 動いたり動かなかったりだろうからオヌヌメしない
348 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 18:54:06 ] >>341 はたぶん一つのオブジェクトに複数の参照があってその管理で困ってると思うんだけど、 そういう場合は参照カウンタで管理すべきじゃないかと思う。別解としては、参照をさらに参照する。 type PObject = ^TObject; var p1: PObject; p2: PObject; p1^ := TObject.Create; p2 := p1; この状況下で、 p1^.Free; p1^ := nil; この時点で当たり前のこととしてp2^もnilになるから、p2を見る手続きからも実体が解放された事は分かる。 ただ、こういうのは小手先の話で、あまりそういう事をしなくてもいいのがよい設計だと思う。
349 名前:デフォルトの名無しさん [2009/04/25(土) 19:52:20 ] Delphi2009で、文字が半角か全角かを判断する方法が分からず困ってます。 これまでDelphi6でByteType関数を使ってたんだけど、挙動が変わってしまって・・・
350 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 20:18:50 ] leadbytesとかは使えないの?
351 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 21:11:09 ] WideStringなら 単純に文字コードを見ればわかるけど。 1バイトなら半角だし、2バイトなら半角カナかをチェックする
352 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 21:25:34 ] unicodeの事いってるんなら1バイトで全角幅もあるぞ
353 名前:348 mailto:sage [2009/04/26(日) 05:15:41 ] そういや>>348 でp1^のメモリを確保してないや。 最初にNew(p1);、最終的に完全にいらなくなったらDispose(p1);が必要だった。
354 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 08:38:57 ] >>349 シフトジスに変換した後にチェックすればいいじゃん。 ウンコードを呪え。
355 名前:DEKO [2009/04/26(日) 10:53:28 ] >>349 MECSUtils の MecsIsFullWidth() を使うといいと思います。 ttp://homepage1.nifty.com/ht_deko/tech021.html#MecsIsFullWidth
356 名前:デフォルトの名無しさん [2009/04/26(日) 11:26:42 ] みなさんありがとう。 一度Ansiに変換して判定することにしました。 function IsHankaku(c: char): boolean; begin result := ( ByteType(AnsiChar(c), 1) = mbSingleByte ); end; Delphi2009で文字を扱うときって、サロゲートとかエレメントとかコードポイントとかバイトとか、ややこしいですね(>_<)
357 名前:デフォルトの名無しさん [2009/04/26(日) 11:43:42 ] 訂正: function IsHankaku(c: char): boolean; begin result := ( ByteType(AnsiString(c), 1) = mbSingleByte ); end;
358 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 11:45:47 ] Cみたいな言語から移ってきたとみた
359 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 11:47:11 ] >>356 それがユニコード糞、っていわれるゆえんだよ
360 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 16:03:07 ] >elphi2009で文字を扱うときって、サロゲートとかエレメントとかコードポイントとかバイトとか、ややこしいですね(>_<) 煽っている人がいるだけで、大した問題はないよ。
361 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 16:31:00 ] 言語レベルで隠蔽されてしかるべき情報を考慮してコーディングしないといけないのは問題ではないの?
362 名前:デフォルトの名無しさん mailto:sage [2009/04/26(日) 20:03:45 ] ウンコードが半角全角の区別がメンドイという致命的な欠点を持っているのは確か
363 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 02:24:25 ] win2000で2009使ってる人います? デバッグの停止ボタン押した後再開出来なくないですか?
364 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 15:19:23 ] >>361 .NET も UTF-16 で全言語で同じていたらくだけど何を使えばいいの?
365 名前:デフォルトの名無しさん mailto:sage [2009/04/27(月) 18:38:55 ] .NETがどうかは別に関係なくね? Delphiの設計方針から言えば、隠蔽されててもおかしくない気はする 最近の開発にそこまで求める方が酷なのかもしらんが
366 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 08:52:33 ] TEditのOnChangeイベントでTEdit.Textを取り出すとき IMEを起動して日本語入力してると変換した最初の文字だけが TEdit.Textに入ってきたりしない? コーディングが悪いのかなあ…。 Turbo Delphi Explorerにて。
367 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 11:08:27 ] >>366 Caption:=Edit1.Text; これで最初の文字しか取得できてないってこと?
368 名前:デフォルトの名無しさん mailto:sage [2009/04/28(火) 13:05:57 ] そもそも、文字に幅があると思ってる考え方が間違ってるので、正すのはおまえらの思考。 幅をもってるのはあくまでグリフって誰かいってなかったっけ?
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 ] 「こんなクラス名は嫌だ」