[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 12/23 22:07 / Filesize : 101 KB / Number-of Response : 406
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれDelphi(超初心者用)その49



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 ]
「こんなクラス名は嫌だ」








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<101KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef