くだすれDelphi(超初心者用)その55at TECH
くだすれDelphi(超初心者用)その55 - 暇つぶし2ch500:フOnCustomDrawSubItemを使って 各行のSubItemに図形を描いています。 これ自体は正常に描けているんですが、 本来、Windowsに任せているハズのCaptionが マウスを上に持ってくると文字背景が黒くなり テキストを判別できなくなります。 で、Captionも自力で描こうとOnCustomDrawItemを使うと、 こんどはOnCustomDrawSubItemがまったく機能しなくなります。 OnCustomDraw...って、どうやって使うんでしょうか?



501:478
13/11/02 08:45:01.40 .net
>>478で質問した者です

ここに回答がありました
URLリンク(stackoverflow.com)

で、イベントの最後に
SetBkMode(Sender.Canvas.Handle, TRANSPARENT)
を追加すると上手く行きました

502:デフォルトの名無しさん
13/11/06 19:26:53.35 .net
DelphiのTFormのLeftとかWidthって実際の値とは違うの?

Windows 7で2つのFormをピッタリ並べたいんだけど
LeftとWidthだけ使うと、Form同士が微妙に重なってる

実際に画面キャプチャして調べると、LeftもWidthも
設定した値と違ってるんだけど...
(外枠相当が数値に反映されてない?)

Formの位置やサイズを正確に調べる方法ってありますか?

503:デフォルトの名無しさん
13/11/06 19:31:56.33 .net
left,top
width,height

504:デフォルトの名無しさん
13/11/06 19:48:02.82 .net
>>480
重なってると思ってる部分は単なる影だろ
Aero切るかクラシック表示にして試してから言え

505:デフォルトの名無しさん
13/11/06 19:59:11.78 .net
>>480
フォームを一つだけ最大化して、その値を半分にしてはどうかな。

506:デフォルトの名無しさん
13/11/06 20:02:08.09 .net
Win32APIのAdjustWindowRectExが現実とは異なる値を返している(かパラメータが正しくない)んじゃないかな。

507:デフォルトの名無しさん
13/11/06 20:39:52.11 .net
>>480
ここにVista以降のウィンドウサイズについて詳しく書いてある
URLリンク(mrxray.on.coocan.jp)

ここに出てる2つのAPI使って枠のサイズを計算する
確かWindows 7で5ピクセルだと思った(うろ覚え)

ウィンドウを並べるんだったら右側のウィンドウ位置を
左のウィンドウのLeft+Width+10とする

508:480
13/11/06 21:08:02.18 .net
すばやい回答ありがとうございます。

>>485
試しに10足してみると2つのFormがピッタリ並んだ
APIとかまだ使ったことないけど挑戦してみる

ありがとう

509:デフォルトの名無しさん
13/11/07 10:06:13.17 .net
Form.Widthはクライアント領域の幅で、枠は考慮しない これは常識だけど・・・?

510:デフォルトの名無しさん
13/11/07 10:09:14.72 .net
常識だったのか…?

511:デフォルトの名無しさん
13/11/07 10:12:43.14 .net
クライアント領域の幅ってForm.ClientWidthじゃなかったっけ?

512:デフォルトの名無しさん
13/11/07 16:10:24.72 .net
そうだね。そっちが常識。>>487は…(笑)

513:デフォルトの名無しさん
13/11/08 01:54:51.72 .net
そういえばScreenSnapをtrueにしてると
Formがスクリーン端に吸着するとき
枠が外にはみ出すんだよな

それ以来ScreenSnapは使わなくなった

514:デフォルトの名無しさん
13/11/08 14:39:53.52 .net
Delphiの「Windows○○対応」は表面上だけだからな
本来はOSや状態による差をVCL内部で考慮するのが当然なんだが

515:デフォルトの名無しさん
13/11/09 02:02:37.76 .net
>本来はOSや状態による差をVCL内部で考慮する
もう何年も前に、そういった思想は破棄されている
ただまぁ昔話は止めておけ

516:デフォルトの名無しさん
13/11/09 14:40:32.88 .net
は?

517:デフォルトの名無しさん
2013/11/10(


518:日) 13:18:16.26 .net



519:デフォルトの名無しさん
13/11/11 02:42:49.00 .net
簡単
WM_WINDOWPOSCHANGING
とかでぐぐれば、いくらでも例が出てくるだろう

520:デフォルトの名無しさん
13/11/11 05:34:05.14 .net
>>495 汚いソースで恥ずかしいけど、Del7のを参考にしてみた
uses DWMAPI;
FSnapBuffer: integer FScreenSnap: boolean; FFrameSize: integer;
procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;

function GetWindowFrame(Handle: THandle): integer;
var R1, R2: TRect;
begin
result := 0; try
if Win32MajorVersion >= 6 then begin
DwmGetWindowAttribute(Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @R2, SizeOf(TRect));
GetWindowRect(Handle, R1);
result := Abs(R2.Left - R1.Left);
end; except end; end;

procedure TForm.FormCreate(Sender: TObject);
begin
FSnapBuffer := 20; FScreenSnap := true; FFrameSize := GetWindowFrame(Handle);
end;

procedure TForm.WMWindowPosChanging(var Message: TWMWindowPosChanging);
procedure HandleEdge(var Edge: Integer; SnapToEdge: Integer; SnapDistance: Integer = 0);
begin if (Abs(Edge + SnapDistance - SnapToEdge) < FSnapBuffer) then Edge := SnapToEdge - SnapDistance; end;
var fx, fy, fwidth, fheight: integer;
begin
if FScreenSnap and ((Message.WindowPos^.X <> 0) or (Message.WindowPos^.Y <> 0)) then
with Message.WindowPos^, Monitor.WorkareaRect do begin
fx := x - FFrameSize; fy := y - FFrameSize; fwidth := Width + FFrameSize + FFrameSize; fheight := Height + FFrameSize + FFrameSize;
HandleEdge(fx, Left, Monitor.WorkareaRect.Left); HandleEdge(fy, Top, Monitor.WorkareaRect.Top);
HandleEdge(fx, Right, fWidth); HandleEdge(fy, Bottom, fHeight);
x := fx + FFrameSize; y := fy + FFrameSize;
end; inherited; end;

521:497
13/11/11 05:41:55.66 .net
>>497のを誰か添削してくれない?
Win7上でちょっと動きがぎこちないんだけど

522:デフォルトの名無しさん
13/11/12 06:24:41.56 .net
4月に画像ビュアーで質問したものです。
立て込んでいた仕事が一段落したので
作っていたソフトの改良をしたいと考えています。

DirectoryListBoxでダブルクリックしないと
FilelistBoxにファイルが表示されません。
シングルクリックにする方法はありますか?
イベントにOnClickがあるのでできそうな気がしますが、
何を書いたらいいのか分かりません。

コンパイラはDelphi XE4です。
よろしくお願いいたします。

523:デフォルトの名無しさん
13/11/12 14:11:19.69 .net
>>499
オブジェクトインスペクタで DirectoryListBox1.FileList:=FileListBox1 を設定してる
ということですか? 前提条件を書いてくださいね。
特にDirectoryListBoxやFileListBoxはWin3.1時代のコンポーネントみたいだから、
使ってる人がほとんどいないと思うので、なおさら。。。。

細かいこと言わないなら、OnClickに DirectoryListBox1.OpenCurrent(); でどうですか。

あと画像ファイルを開くなら、TOpenPictureDialogというのもありますよ。

524:デフォルトの名無しさん
13/11/12 19:50:15.30 .net
シングルクリック時にダブルクリックイベントを呼べばいいんでわ

525:デフォルトの名無しさん
13/11/13 18:41:24.62 .net
>>500-501
ありがとうございます。
DirectoryListBox1.FileList:=FileListBox1
は設定してあります。

インターフェースはListboxで十分で、
選択したjpg,pngファイルをImageに渡しているだけのソフトです。
wavとmp3のサポートしています。

元々はVecterにあるListというソフトを見本にして
勉強のためにDelphiで作っていました。
4月に発生していた原因不明のmp3が再�


526:カできないというエラーは 作り直していたら出なくなりました。 ロダにあげたので、もし良かったらアドバイスをいただけないでしょうか? http://www1.axfc.net/u/3087170.rar よろしくお願いいたします。



527:デフォルトの名無しさん
13/11/13 20:34:10.84 .net
以前もレスしたお人好しだが今回は時間がないので
ReadMeとUnit1_01.pasだけ目を通した

他の人も書かれたように「DirectryListBox」「FileListBox」は Windows3.1時代のもの
その当時はシングルクリックでフォルダ(ディレクトリ)を開くという考え自体がなかった
敢えてするなら
procedure TForm1.DirectoryListBox1Click(Sender: TObject);
begin
(Sender as TDirectoryListBox).OpenCurrent;
end;
もし他の人にも使ってもらうなら「シングルクリックで開く」と設定で選べるようにするべきだ

>mp3のタグ
「Delphi ID3Tag」でググれ
俺は自分用なので「AudioInfo」というコンポーネントを使ってる

「Delphi 関連づけ」でググれ

>次のファイルを自動で演奏
TMediaPlayer.OnNotify をヘルプで読むなりググるなり


以前も書いたけど人にソースを読んでもらうなら読みやすいように
filelistbox1.FileName→ FileListbox1.FileName;
コード補完機能を使ってちゃんと書いてくれ
TMediaPlayerだけMPlayに名前を変えてるけどw
TButton何個も載せるならわかりやすい名前を付けよう
ZoomButton とか UpdateButton とか
格段に読みやすくなる

528:デフォルトの名無しさん
13/11/13 21:15:19.15 .net
>>503
ありがとうございます。
以前お世話になりました。

大文字の問題は教えていただいた後に
拡張子のエラーなどの問題を解決するため
3~4回作り直しています。全部作り直ししました。

知人にインターフェースがわかりにくい
と指摘され作り直していたらコンパイルすらできなくなって
消しちゃったので教えていただいた頃のソースです。

ゴールについてですが、私がソフトに盛り込みたい内容で
私の宿題だったので、この点についても教えていただき
ありがとうございました。

タグについても、全部手打ちしなければならないと思っていたので
AudioInfoの情報ありがとうございます。早速調べてみます。

関連づけについては、コマンドラインオプションの実装と
フォルダー内のファイルを全て検出して読み出す必要があると考えています。

529:デフォルトの名無しさん
13/11/14 16:24:14.77 .net
>>503
ただいま確認できました。
onClickを選択してもonChangeになって
原因が分かるまで時間がかりました。

>TButton何個も載せるならわかりやすい名前を付けよう
コード補完と併せて勉強させていただきました。
ありがとうございました。

必要な機能を実装できるよう更に勉強いたします。

530:デフォルトの名無しさん
13/11/17 19:36:38.02 .net
十数年前までVB6で業務アプリを作っていました。
その頃delphiも少しやっていました。
最近になってまた業務アプリ(windows)を定期的に作ることになりました。
delphi、vb.net、python、java、c#、rubyなど、どれを使おうか悩んでいます。
皆さんのお考えをお聞かせください。
ちなみにvb6ではスパゲティープログラムを作ってしまう程度のスキルです

531:デフォルトの名無しさん
13/11/17 20:01:18.63 .net
>>506
業務アプリがどのようなものかによります。
社内で使うものでコマンドラインでいいなら適当なスクリプト言語を。
スクリプトでは都合が悪いなら Delphi がコンパイルも動作も速くてお薦めです。
売り物として作るなら GUI が必要になってくると思うので C# が一番。VB でも可。
.net を嫌う向きには VC++ のアンマネージドコードか Delphi の二択になります。
プラットフォームが Windows 限定ならわざわざ Java を選ぶことはありません。
私なら Perl と Delphi と VC# を適宜使�


532:「分けます。 スキルなんて少しでもやる気があればいくらでも伸びるので気にせず選びましょう。



533:デフォルトの名無しさん
13/11/18 11:05:40.05 .net
業務アプリ向けでこだわりが無いなら今ならC#一択でしょ?

534:デフォルトの名無しさん
13/11/18 18:06:28.92 .net
>>507,508
ありがとうございます。
C#はMS社の新技術にこれからどんどん付いていく自信がありません。
.net frameworkにも抵抗があります。
その点delphiはwinアプリは枯れているような印象があります。
oleオートメーションでwordやexcelを操作する予定です。
delphiはすべてのoleオートメーションの機能を使えるでしょうか?
また近年マイナーになっているのが気になります。

535:507
13/11/18 19:10:01.10 .net
>>509
お使いの Delphi がどこまで ole オートメーションに対応しているのかは存じませんが、そういう業務ならば Delphi でやってみれば良いと思います。
しかし MS 純正ソフト同士の方が色々と都合が良いのではないかと思うので、少しずつ C# にも触れて慣れていってはいかがでしょうか。
.net は近頃のマシンパワーならもたつきは気になりませんよ。

536:デフォルトの名無しさん
13/11/18 21:04:59.02 .net
>>510
ありがとうございます
その線で行きたいと思います
ただMS社のC#研修を受けたときにチンプンカンプンだったので苦労してもおぼえられるかなと思っています
また、.netは新しいWindowsが出るたびに.netのバージョンを上げないといけないようなイメージがあります
ところで今後のモバイル開発を考えた場合delphiがまた人気が出るような気もしますがFireMonkeyの完成度が高くないようであまりメジャーにはなっていないようですね
人気が出そうですかねぇ?

537:507
13/11/19 00:45:16.67 .net
>>511
うちの Delphi は 5Pro なので最近のことはわかりません。
ウェブ用にはメモ帳で Perl で CGI を書くくらいですね。

538:デフォルトの名無しさん
13/11/21 23:54:06.72 .net
>506
迷わずC#と言っておく。業務ソフトは性能よりも生産性重視すべきだから
OLEオートメーションとの相性も良好

VCLをある程度知ってるなら.NET Frameworkはすぐに身につく
…事情知らない奴はパクリにしか見えない位そっくり
Delphiがマイナーになっていくのも同じ事情

>.netは新しいWindowsが出るたびに.netのバージョンを上げないといけないようなイメージがあります
むしろそれはやらない方がいい。VS2005であと15年は戦える

539:デフォルトの名無しさん
13/11/22 01:48:34.30 .net
>>513
以前C#でexcel操作するサンプルコード見たことあるんだけど
オブジェクトの階層たどっていくのにいちいち
try{・・・}finary のネストが必要でこりゃ面倒だなと思ったんだけど
その辺は解消されてるの?もしくはそれがあってもC#のほうがいいの?
excelとか扱うならVBのほうがいいんじゃねえのと思ったりもするんだけど。

540:デフォルトの名無しさん
13/11/22 11:18:13.53 .net
C#ならusing?
VB.netはやめとけ

541:デフォルトの名無しさん
13/11/22 15:14:14.34 .net
>>514
C#は自身が持つGCとOLEの参照カウントは全く別物だから、
実質的に自分で参照カウントを操作する必要があって激しく面倒。
URLリンク(blogs.msdn.com)

VB(.netではない)やDelphiで自動化されてる部分をいちいち自前でやる必要があるから、
これら二つに比べたら圧倒的に使いづらく、これを相性がいいと言ってる人間がいたら頭がおかしい。

542:デフォルトの名無しさん
13/11/24 21:09:25.11 .net
>>503
レスありがとうございます。
wa


543:v再生系統を分離してちまちま作っていました。 TMediaPlayer.OnNotifyですが、 MediaPlayerに対して何かのイベントを起こして そのイベントが正常に終わったときに NotifyValueに成功の値が設定されるという 理解でよろしいでしょうか。 正常に終わったときにFileListBox内の 上下方向への移動をソフト内部でできるでしょうか? 無理矢理キー入力されたことにして動かす引かないのでしょうか? ファイルをあげています。 http://www1.axfc.net/u/3097406 DLkey:delphi またアドバイスをいただけないでしょうか。 よろしくお願いいたします。



544:デフォルトの名無しさん
13/11/25 13:40:33.02 .net
Notifyイベントで再生終了を知るためには、再生前にMediaPlayer1.Notify := false; しておく
Playの後でNotify := trueにすればいい そうじゃないとPlayイベントも受け取ってしまうから

with MediaPlayer1 do
begin
 FileName := FileListBox1.FileName;
 Notify := false;
 Open;
 Play;
 Notify := true;
end;

で、Notifyイベント側で次の曲をFileNameにセットすればいい

545:デフォルトの名無しさん
13/11/26 10:09:49.01 .net
>>518
ありがとうございます。
海外のNotifyの使い方を説明しているところを見ても
今ひとつ分からなかったのですが
解説していただいのでよくわかりました。

これが分かったので、今まで今ひとつだった
TMediaPlayerのプレイリストの意味が分かりました。
あらかじめカレントフォルダ内のファイルをプレイリストとして
読み込んでおいてトラックが終了したらNotifyを検出して
Nextすると言うことでいいでしょうか。

546:デフォルトの名無しさん
13/12/01 11:11:13.96 .net
>>518
ずっと次に渡すファイルを取得する方法を考えていましたが、
Notifyイベントを取得したらTMediaPlayerからFileListBoxの
カーソルを下にずらすようにすればいいのでしょうか?

ヘルプ見ても半分くらい空白なので困ってます。

547:デフォルトの名無しさん
13/12/01 18:27:47.51 .net
新規のテスト用のプロジェクトを作っておいて
新しいことを試すときはそちらでやってみるんだ
procedure TForm1.Button1Click(Sender: TObject);
begin
 if FileListBox1.ItemIndex=FileListBox1.Items.Count-1 then
  FileListBox1.ItemIndex:=0 else FileListBox1.ItemIndex:=FileListBox1.ItemIndex+1;
end;

548:デフォルトの名無しさん
13/12/01 19:10:08.93 .net
>>521
ありがとうございます。
ボタンの前曲、次曲の操作を実装することができました。

上下キーでFileListBox内のカーソルを動かす機能を
入れたときに何かから-1(+1)すればいいことは分かっていましたが、
ItemIndexはヘルプになかったので分かりませんでした。
このプロパティは一般的な命令なんでしょうか?

549:デフォルトの名無しさん
13/12/02 21:56:43.31 .net
TComboBox、TListBox、RadioGroup に共通のプロパティだ
Delphi5 か Delphi6 あたりのヘルプなら調べやすいんだけどね、どこかで手に入らんかな
で↑のヘルプなら「TFileListBox プロパティ」を開くと「TCustomListBox からの継承」で分類されて「ItemIndex」がある

「TFileListBox」でググると一番上に docwiki.embarcadero の「Vcl.FileCtrl.TFileListBox - XE2 API Documentation」がでる
そこのプロパティを見ても TFileListBox 固有のものしか書かれていないがコンポーネントってのは継承元のプロパティも使えるので
最初の Vcl.FileCtrl.TFileListBox ページの継承元のひとつである「TCustomListControl」を開いてみる
Vcl.Controls.TCustomListControl のプロパティにぽつんと一つだけ ItemIndex が出てくる

まぁこれじゃあ探せんわなぁw

550:デフォルトの名無しさん
13/12/03 08:34:52.71 .net
リストビューのコンポーネントにもあるよ つかリストにインデクスがあるのは当然の話で
インデクスのプロパティがあるはずだって探していくのがまっとうな手順

551:デフォルトの名無しさん
13/12/03 21:12:50.35 .net
オブジェクトの継承についてわかりやすいのがあった
URLリンク(codezine.jp)
これの 3 あたり

552:デフォルトの名無しさん
13/12/04 12:06:25.93 .net
初心者に当然とか言われましても…

553:デフォルトの名無しさん
13/12/04 21:20:57.51 .net
とあるリストのの禁書目録

554:デフォルトの名無しさん
13/12/15 10:34:36.44 .net
>>523
遅くなってすみません
>>522を投稿した後にRadioGroupにもItemIndexあったよなと思い
しばらくいじっていました。
意味は分かりますが理解するには時間が掛かりそうです。
若い頃に比べてやっぱり頭が固くなっているのを実感しています。

>>522で分かりましたと言ってから、そのファイルがなく
昨日までFileListBoxのカーソルが移動し続けて
タスクマネージャからソフトを止めないと終了できなくなったり
MCIのエラーが出てたりして途方に暮れていました。

ずっと4月の頃のログと最近のログを見ながら
いじり回してやっと>>239の意味が理解できました。

本題なんですが、いろいろいじってやっとボリュームコントロールが
実装できるところまで行きましたが、mp3だとボリュームコントロールが
できますがwavだとできません。
たぶんmp3で出ていたエラーの逆のことが起きているのではないかと思いますが
絞り切れていません。
もう一度ロダにあげます。ご指導いただけないでしょうか?
URLリンク(www1.axfc.net)
passはdelphiです。
よろしくお願いします。

555:デフォルトの名無しさん
13/12/15 10:41:18.68 .net
続き
delphi4からdelphi2010でもかなりインターフェースが変わって戸惑いましたが、
XE4になって更に分かりにくくなりました。

>>525
書き込みしていただいたときに見ました。
ほかの本だと結構苦労している部分でしたが
シンプルに書いてあるので分かりました。
理解するには自分でVCLを作らないと分からないんだろうなとは思います。

556:デフォルトの名無しさん
13/12/15 13:37:04.11 .net
Delphiってなんて読むんですか?

557:デフォルトの名無しさん
13/12/15 14:00:51.62 .net
>>530
「でるふぁい」。エンバカの人は「る」のとこにアクセントがくる読み方をしてる。

558:デフォルトの名無しさん
13/12/15 20:44:31.55 .net
Google 翻訳で発音してみる

559:デフォルトの名無しさん
13/12/15 21:09:08.87 .net
すまん、Delphi は ~Delphi5、2005、2007、2009 しか持っていないから
そのプロジェクトは開けない
sound.pas
Unit1.pas
をサラッと観たけど sound.pas はそのまま流用してる?
以前書いた「AudioInfo」はタグ表示くらいにしか使っていないがそこに入っていたのかな?

んで Wave の音量調節も最低限動くソース
(Vista 以前と以降ではちょっと条件が違うから XP ではダメかも知れない、いけるかも知れない)
・行数制限があるから二つに分ける
・半角空白二つを全角一つに置換してるので了承してくれ

  MediaPlayer: TMediaPlayer;
  TrackBar: TTrackBar;
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
  procedure TrackBarChange(Sender: TObject);
---------------------------------------------
implementation

{$R *.DFM}

uses MMSystem{waveOutSetVolume に必要};

560:デフォルトの名無しさん
13/12/15 21:09:52.33 .net
//続き
var
 WaveDevID: Word;

//実際にVolumeをセットする手続き
function VolumeChange(Pos: Integer):Boolean; //Posはパーセント
var
 LV,RV: Word;
 dwVolume: DWORD;
begin
 LV := ($FFFF*Pos ) div 100;
 RV := ($FFFF*Pos ) div 100;
 dwVolume := (DWORD(LV) shl 16) Or RV;  {LとRの値を代入}
 Result:=waveOutSetVolume(WaveDevID, dwVolume)=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with MediaPlayer do
 begin
  FileName:='E:\DATA\wave\KAYOWAI.WAV';//実際に存在するファイル
  Open;
  Play;
 end;
end;

procedure TForm1.TrackBarChange(Sender: TObject);
begin
 VolumeChange((Sender as TTrackBar).Position);
end;

561:デフォルトの名無しさん
13/12/15 21:54:07.91 .net
>>533
何度もお伺いして申し訳ありません。
hUnit1.pasはいつの間にか勝手に作ったファイルです。

本体はsound.pasです。
このファイルは以前見ていただいたソースから
3~4回作り替えています。
MCIのエラーやスキップするとカーソルが
勝手に動くようになったりしてま�


562:オた。 Delphi2010からXE4に移行したときにUsesが全部書き変わっていて 互換性がない(ように見える)とヘルプがVCLとFMXが混在していて VCLが異常に少ない感じです。 エラーの発生が新しく作り直すと出なくなったり。 ソースありがとうございます。 早速試してみます。 AudioInfoはしつこく探しましたがないようです。 ttp://yakki.digi2.jp/vobaudioinfo/でしょうか? タグに関しては、record型で作るという方法もありますが、 一回ソースを見ましたが途方に暮れています。



563:デフォルトの名無しさん
13/12/16 21:21:32.26 .net
>>535
AudioInfo はドメインもなくなってるみたいだから
「Delphi MP3ファイルのIDタグ」でググって出てきた
URLリンク(drang.s4.xrea.com)
URLリンク(drang.s4.xrea.com)
ここらへんで

564:デフォルトの名無しさん
13/12/17 22:29:08.65 .net
複数のユニットからインスタンスを共有したいときって
そのインスタンスをグローバルで生成してusesで参照するだけでも良い?
それともどこか基準になるユニットで生成してそれぞれのユニットに渡すほうが良い?

565:デフォルトの名無しさん
13/12/17 23:35:14.88 .net
好きなようにすればええ

566:デフォルトの名無しさん
13/12/18 12:01:44.89 .net
グローバルで作ったインスタンスは
他から参照する場合それっていう保証はないんじゃまいか

567:デフォルトの名無しさん
13/12/18 15:26:27.57 .net
お、おう

568:デフォルトの名無しさん
13/12/18 20:33:37.51 .net
LogList:TStringList
みたいなのなら普通にグローバル

569:デフォルトの名無しさん
13/12/19 08:50:32.92 .net
そのLogListを他unitから参照したときに、生成されたものだという保証があるのか知りたい

570:デフォルトの名無しさん
13/12/19 11:51:14.71 .net
ご冗談を(笑)

571:デフォルトの名無しさん
13/12/19 13:11:45.92 .net
initialization ?

572:デフォルトの名無しさん
13/12/19 13:50:39.91 .net
ALogList: TStringList;

function LogList: TStringList;
begin
if not Assigned(ALogList) then ALogList:= TstringList.Create;
Result:= ALogList;
end;

573:デフォルトの名無しさん
13/12/19 14:56:44.83 .net
インスタンスが生成されたかってのはAssignedでいいけど
例えば”何枚も同時表示することがあるForm2”のグローバルでLogList作ったら
どのLogListを指してるか分からないよね?

574:デフォルトの名無しさん
13/12/19 15:11:02.41 .net
それは設計がおかしい、という話にはならないの?

575:デフォルトの名無しさん
13/12/19 15:24:34.50 .net
それぞれのForm2のアドレスを保持しておいてTForm2(SaveP).LogListとかって
アクセスする。

576:デフォルトの名無しさん
13/12/19 15:41:44.44 .net
そもそも特定クラスの下にある変数をグローバル変数とは呼ばない

577:デフォルトの名無しさん
13/12/19 16:00:45.92 .net
>>546
それ、ただのメモリリーク

578:デフォルトの名無しさん
13/12/19 17:41:23.48 .net
1個のTStringListを使いまわすなら簡単な話だけど、「インスタンスを共有」の意味がわからない
継承とか参照はオブジェクト指向の用語だけど共有なんて聞き覚えがないぞw

579:デフォルトの名無しさん
13/12/19 22:29:31.58 .net
>>551
普通にある、君に知識がないだけだ。

「インスタンスを共有」と聞いたら
SingletonパターンやFlyweightパターンなど
少し知識がある人なら思い浮かべると思うが。

>>546
>インスタンスが生成されたかってのはAssignedでいいけど
クラスを生成したものがインスタンス。
インスタンスを生成することはない。

580:デフォルトの名無しさん
13/12/19 22:40:59.71 .net
なら最初からパターン名で伝えればいいじゃん
少し知識があるならそっちの方が伝わるでしょ
あとインスタンスが生成されたなんてのは逆に普通の言い回しで、そこに突っ込んでる意味が分からないけど?
ひょっとして馬鹿なの?

581:デフォルトの名無しさん
13/12/19 23:26:31.69 .net
>クラスを生成
これ、意味違わね?

582:デフォルトの名無しさん
13/12/20 00:37:16.19 .net
『クラスから(クラスの)インスタンスを生成』とは言うが、『クラスを生成』とは言わんな

583:デフォルトの名無しさん
13/12/20 00:59:26.00 .net
クラスのインスタンスを生成
インスタンスの生成
かと

クラスの生成
は変

584:デフォルトの名無しさん
13/12/20 04:13:22.53 .net
>>552
君の知識は少し足りなかったようだね^^;

585:デフォルトの名無しさん
13/12/20 15:17:06.4


586:2 .net



587:デフォルトの名無しさん
13/12/20 16:32:18.32 .net
>>552 はいいとして
>>546 みたいなことが想定されるなら
グローバルで共有はやめておけってことでおk?

588:デフォルトの名無しさん
13/12/20 16:57:39.38 .net
というか似たようなソフトのソース見つけてコピペってポンだろ。速攻できそう

589:デフォルトの名無しさん
13/12/20 19:13:17.81 .net
>>559
そんなことが想定されるようでは設計の段階でおかしい

590:デフォルトの名無しさん
13/12/20 19:33:23.67 .net
>>559はそう言ってるように思うんだがw

591:デフォルトの名無しさん
13/12/20 22:26:42.20 .net
>>556
日本語が変だぞw

592:デフォルトの名無しさん
13/12/20 22:54:38.34 .net
>>562
お前は日本語の読解力を身につけろw

593:デフォルトの名無しさん
13/12/20 23:00:56.43 .net
>>563
おまえの頭が悪すぎるだけかと

594:デフォルトの名無しさん
13/12/20 23:35:31.65 .net
あ、うん…
なんか触れちゃいけないところに触れちゃったみたいでごめん…

595:デフォルトの名無しさん
13/12/21 01:09:42.54 .net
バーーーーーカ

596:デフォルトの名無しさん
13/12/21 03:02:01.00 .net
そうですね

597:デフォルトの名無しさん
13/12/21 09:26:25.64 .net
頭の悪いレスって引くわw

一人で何を興奮してるんだ?

598:デフォルトの名無しさん
13/12/21 10:35:59.34 .net
>>569
お前は自分のレスにも引いてるってことか
大変だな

599:デフォルトの名無しさん
13/12/21 10:59:30.67 .net
>お前は自分のレスにも引いてるってことか
"にも"って、「自分も頭の悪い」という自覚はあるのか?

600:デフォルトの名無しさん
13/12/21 11:22:58.87 .net
的外れな質問を書き込む初心者の方が数段ましだよな。
概念とか定義とかいいから具体的にどうコードを書くのかと言う話をしようぜ。

601:デフォルトの名無しさん
13/12/21 15:53:12.48 .net
>>571
興奮しすぎて日本語が変だぞw

602:デフォルトの名無しさん
13/12/21 16:16:19.75 .net
ALogList: TStringList;

function LogList: TStringList;
begin
if not Assigned(ALogList) then ALogList:= TstringList.Create;
Result:= ALogList;
end;

603:デフォルトの名無しさん
13/12/21 19:17:21.95 .net
>>574
VCLがやっちゃってるからこういう書き方する人多いけど、実はLogList.Freeとされてしまった場合、
その確認もできない、インスタンスの再生成もできない、欠陥コードなんだよね
implementation内でTStringListを継承して、そのDestroyでALogListをクリアするように直せば多少はましになるよ

604:デフォルトの名無しさん
13/12/22 07:45:36.93 .net
>>VCLがやっちゃってるからこういう書き方する人多いけど、実はLogList.Freeとされてしまった場合、
>>その確認もできない、インスタンスの再生成もできない、欠陥コード
そんな事みんな気付いてるだろ。現状、そこまで厳密にやらなくてもいいと思ってるから、
上のコードですましてるだけで。

605:デフォルトの名無しさん
13/12/22 11:01:50.69 .net
listの使い回しとか持ち主がわからない作り方が欠陥

606:デフォルトの名無しさん
13/12/22 12:06:00.92 .net
CreateやFreeした相手が知りたければそういうクラスを作れば済む話

607:デフォルトの名無しさん
13/12/22 12:28:16.20 .net
何事も適材適所だよ。
1つのコードが全てのニーズに答えられるということはまずないし、
全てのニーズに答えられないからといって悪いコードというわけでもない。

608:デフォルトの名無しさん
13/12/22 15:42:43.85 .net
>>572
スイマセン。確かにそうなので

609:デフォルトの名無しさん
13/12/22 19:05:24.59 .net
ちょっと教えてください。

ポインタの有効/無効を判定する関数にAssignedってありますけど
これって (P <> nil) と同じですよね。

ポインタ変数自体が有効なデータを指しているかどうかを
判定する方法ってあります?

610:デフォルトの名無しさん
13/12/22 23:52:00.27 .net
通常のポインタであればAssignedと<> nilは同じ。
でもポインタが示している場所が有効かどうかを知る方法は一般的には存在しない。
Delphiならバッファオーバフローとかでポインタ変数の中身を吹っ飛ばしてしまったりしない限り
無効な場所を指すことはないしな。解放済のメモリへのアクセスはFastMMで検出できるかもしれん。

611:デフォルトの名無しさん
13/12/23 00:59:01.89 .net
>>575
これいいな
基本生成しちゃったらアプリケーション終了までメモリを占有されるけど、
これなら好きな時に


612:解放してもいいまた必要になれば使えるし



613:デフォルトの名無しさん
13/12/23 01:01:16.21 .net
>>581
そんな判定が必要になる方がおかしいので、
判定方法より設計を見直すことの方が大事

614:デフォルトの名無しさん
13/12/23 07:46:05.85 .net
Delphi6を使っているのですが、最新版のものがどれほど進化しているのか
気になっています。
(購入検討中)

1.VCLは充実してきていますか?
2.オンラインヘルプは親切になっていますか?
3.開発環境(IDE)はサクサク動きますか?

知っている方おりましたら教えてください。

615:デフォルトの名無しさん
13/12/23 08:34:52.83 .net
>>581
有効なデータとは何かをまずは定義してくれ。

616:デフォルトの名無しさん
13/12/23 08:35:07.43 .net
>>585
30日間フル機能のトライアル版があるから試してみたらいいじゃん

617:デフォルトの名無しさん
13/12/23 12:50:48.34 .net
そうですね。そうします。

618:デフォルトの名無しさん
13/12/24 14:21:09.90 .net
>>582
そうですか、やっぱり方法はないですよね。

>>584
おっしゃるとおりです。

619:デフォルトの名無しさん
13/12/26 07:00:48.71 .net
最新版はAndroidのネイティヴコード(ARM)が吐けるっていうからすごい進歩だと思う
ようつべにプレゼンの様子がある

620:デフォルトの名無しさん
13/12/26 14:44:09.25 .net
ただ動くのと実用的に使えるかは大違い。

621:デフォルトの名無しさん
13/12/26 16:40:12.52 .net
おっと、Xamarinの悪口はそこまでだ

622:デフォルトの名無しさん
13/12/29 22:17:38.31 .net
てか、オレなんか高くてProさえ買えない
いまだXE Starterでフリーソフト作ってる

Androidアプリを作るにはPro+アルファだろ
とても手が出せない

623:デフォルトの名無しさん
13/12/30 03:33:32.10 .net
>>593
来年末までの辛抱

624:デフォルトの名無しさん
13/12/30 21:57:20.31 .net
え?なんか出んの?

625:デフォルトの名無しさん
13/12/31 06:50:34.96 .net
オレなんか高くてXE Starterさえ買えない
Lazarus(FPC)でフリーソフト作ってる。
オレのやりたいレベルでは、機能的にほぼ不足はない。
パフォーマンスにはやや不満があるが。

626:デフォルトの名無しさん
13/12/31 19:01:08.90 .net
>>596
Lazarusはどのバージョン使うのがおすすめ?
うちで1.0.14とか1.2.0RC1使おうとするとまともにデバッグできんのよ。

627:喪中の名無しさん
14/01/01 02:44:09.95 .net
>>597
デバッグって、Andoroidのデバッグ?
ならAndoroid用の開発はしてないんで、わかりませんが。

こちらのいまのWin32用の開発環境は1.0.6(FPC2.6.0)です。Lazarus自体も安定してます。
別にこのバージョンにこだわってるわけじゃなくて、特に不具合もないので使ってるだけですが。
Win7に移行したあと、J++ランタイムとか入れるのが嫌だったのでTurbo Delから乗り換えて、
0.9.30辺りから常用していますが、私用であれば十分使いものになると思いますよ。

628:デフォルトの名無しさん
14/01/05 08:56:10.57 .net
すごいなこれ

629:デフォルトの名無しさん
14/01/05 16:33:51.89 .net
Delphi使いです。

Win32のGUIアプリを作る場合、Lazarusに対するDelphiのアドバンテージは何?

Wikiで調べる限り、Lazarusで十分でありDelphiのアドバンテージは無いように
思えるのですが・・・

630:デフォルトの名無しさん
14/01/05 17:43:05.75 .net
じゃあ実際に作ってみればいいんじゃない?

631:デフォルトの名無しさん
14/01/05 19:51:10.08 .net
インストールして学習して作成するのが大変なので、
識者にお聞きしているんですよ、クソガキ君。

632:デフォルトの名無しさん
14/01/05 19:53:26.25 .net
>>600
思ったとおりだよ

633:デフォルトの名無しさん
14/01/05 19:54:18.98 .net
Delphiのアドバンテージは日本語の情報が多いということぐらいかな

634:デフォルトの名無しさん
14/01/06 01:38:33.54 .net
>インストールして学習して作成するのが大変なので、
答え自分で出してるじゃん
自分の考えてることが自分で分からないとか病院行った方がいいんじゃないかな?

635:デフォルトの名無しさん
14/01/06 06:14:05.28 .net
>>603, 604 レスありがとう。 Webで拾ったソース付きのDelphi用コンポーネントをLazarusに インストールすることはできるのでしょうか?



637:デフォルトの名無しさん
14/01/06 07:49:06.09 .net
>>606
そのままではほぼできないと思って良いよ。
移植して腕を磨くのが吉。

638:デフォルトの名無しさん
14/01/06 18:43:00.61 .net
>>605
ここでは誰でもなりすまし出来るから

639:デフォルトの名無しさん
14/01/06 19:18:38.60 .net
>>607
そうですか。
移植したのがどっかのサイトに集まっていれば良いのにね。

640:デフォルトの名無しさん
14/01/27 14:00:12.68 .net
XE3 を買ってみました。
7 からの移行なので戸惑ってますが、
コードウインドウとフォームのウインドウは並べて表示って、出来無くなったんでしょうか?

641:デフォルトの名無しさん
14/01/27 14:45:07.87 .net
フローティングデザイナでググれ
それよりなんでわざわざ2世代も前のXE3なんかを買ったのかが知りたい

642:デフォルトの名無しさん
14/01/27 15:01:03.58 .net
単にXE5のtypoでしょう
XE3ってまだ買えるの?

643:デフォルトの名無しさん
14/01/27 16:43:44.64 .net
パッケージならまだ普通にあるんだが
Amazonでも売ってるし

644:デフォルトの名無しさん
14/01/28 00:37:22.78 .net
>611
どもども。
何とかなりました。

XE3 は ずいぶん前にヤフオクで、安かったので買いました。
Por が 4万弱でした。

645:デフォルトの名無しさん
14/01/28 20:47:12.12 .net
ぽぅっ!

646:デフォルトの名無しさん
14/01/29 01:10:57.60 .net
4万が安いとかいう金銭感覚

647:デフォルトの名無しさん
14/01/29 02:20:45.21 .net
貧乏人はMSの無料環境でも使ってればいいんじゃないすかね?(鼻ほじ

648:デフォルトの名無しさん
14/01/29 17:46:47.39 .net
ちょっとTPageControlのTTabSheetの色について教えてください。

TTabSheetの色って、昔はclBtnFaceだったと思うんですが
今は白色ですよね(Windowsのテーマに依存してる?)

TPanelなどのほとんどのコントロールは上に配置しても透過されて
背景が同じ色になるんですが、一部のもの(TLinkLabelとか)は
背景がclBtnFaceのままで、かなり違和感があります。

で、今はテーマのOn/Offを調べてColorプロパティを適当に
設定してますが、その時点でのTTabSheetの本当の色って
どこかから取得できます?

649:デフォルトの名無しさん
14/02/05 12:05:53.54 .net
質問です。
VB6のソースコードをDelphiのソースに変換してくれるいいツールをご存じな方はおられないでしょうか?
有料でもかまいません。
もちろん変換後に作業がたくさん発生することはわかっています。
VBto Converterを使ってみましたが、文字コードの影響か、ソースが途中で切れてしまいます。
書き直した方が早いというのももっともだと思いますが・・・

650:デフォルトの名無しさん
14/02/05 14:33:13.89 .net
書き直したほうが早い

651:デフォルトの名無しさん
14/02/06 01:43:18.94 .net
そういうツールをVBで作ればええやん

652:デフォルトの名無しさん
14/02/06 02:01:46.81 .net
>>619
有料で請け負うよ

653:デフォルトの名無しさん
14/02/06 07:44:34.44 .net
>>622
有料で請け負う場合は書き直すの?

654:デフォルトの名無しさん
14/02/06 07:48:35.80 .net
>>621
VB6で?
スレ的にはDelphiでなのでは?
っていうか、コンバーターは誰も使ったことないの?

655:デフォルトの名無しさん
14/02/06 12:16:20.90 .net
…馬鹿なの?

656:デフォルトの名無しさん
14/02/06 12:48:23.16 .net
>>619
コンバーターを利用するのもなかなか捨てたもんではないぞ。
VBto Converterの以前のバージョンは途中で切れていたが、最新版は途中で切れたりしなくてなかなかよい。
トライアル版は600行までっていう制限があるが、VB6のソースファイルを分割して別々に変換して後で連結すれば問題なし。
もちろん後で作業がいくつもあるのだが、スクラッチから始めるよりも楽だと思う。

657:デフォルトの名無しさん
14/02/06 13:55:02.39 .net
まさかの自演

658:デフォルトの名無しさん
14/02/06 14:40:25.82 .net
規模は?

659:デフォルトの名無しさん
14/02/06 18:39:06.45 .net
ロジックが長いプログラムだったら、コンバーター�


660:gう意味もあるかもな



661:デフォルトの名無しさん
14/02/06 20:41:46.64 .net
delphi to vb は有るが
bv to delphi 無い
今時ベンダーが依頼しない
個人の趣味はあるかもしれないが

662:デフォルトの名無しさん
14/02/07 04:40:09.93 .net
>>630
VB6だったらVBへの移行がベスト?

663:デフォルトの名無しさん
14/02/07 08:12:10.56 .net
死ねゴミ

664:デフォルトの名無しさん
14/02/07 13:04:25.23 .net
>>631
VBに移行するにしても普通書き直した方が早いな。
移行しないという選択肢があるならそのままVB6にしておけば?

665:デフォルトの名無しさん
14/02/07 13:20:13.00 .net
つうかVBスレで聞けよ

666:デフォルトの名無しさん
14/02/11 20:32:16.32 .net
プログラムなんてTK-80 BS BASIC以来なんで、今時の言語見てもじぇんじぇん分かりません。

そんな俺の野望はNゲージの電車をPCで動かすことなんですが、(DCモーターを
チョッパ制御するだけです)、DELPHIでUSBを制御するのはどうしたらいいんでしょ?

667:デフォルトの名無しさん
14/02/11 22:18:39.07 .net
単にUSBで通信するなら

WinUSB Interface for Delphi
URLリンク(sourceforge.net)

TWINUSB BULK通信コンポーネント
URLリンク(www.csd.co.jp)

このあたりかな。

668:デフォルトの名無しさん
14/02/12 17:33:58.54 .net
>>630
Delphi10年以上前にやってた者だけどDelphiってそんなに厄介者になってるのか…
VB.NETなんかデプロイがたいへんそうなんだけどな

669:635
14/02/12 18:32:23.49 .net
>>636
ありがとうございます。
でも、なんだか難しそうですね。上のは英語だし、下のは有料かぁ。。。
僕の想像では、Cの fprint の書式をうにゃうにゃするみたいな感じで、テキトーにI/Oにアクセス
できるのかなと思っていたのですが、ドライバを別に用意しないといけないのですか。
ハードル高いです。

>>637
delphiかっこいいと思うんですけどねぇ。なんで流行らないんだろ。

670:デフォルトの名無しさん
14/02/12 20:36:07.37 .net
CSDさんのは使うだけならただですが…(ソースは有償)。

VB6はどっちに行くにも変換じゃ済まないので不良資産化してますな。
Delphiはバージョンアップだけで基本的にそのまま動くけど。

671:デフォルトの名無しさん
14/02/13 00:18:30.15 .net
>>637
いいか悪いかという問題ではなく、VBを使える人間はいるがDelを使える奴がいないからVBに変換したいって会社があるってことだな

672:デフォルトの名無しさん
14/02/13 00:35:29.93 .net
>>638
Delphiが流行らないのは値段が高いし、迷走したし、知名度低いし、VB6ほど気軽に使えないし、コードの見た目良くないし。

673:デフォルトの名無しさん
14/02/13 00:57:59.42 .net
>>641
お前馬鹿? Delphi ほど美しいコードは他にないだろ?

674:デフォルトの名無しさん
14/02/13 02:58:40.54 .net
いまさらVB6とか老害すぎて乾いた笑いしか出ない

675:デフォルトの名無しさん
14/02/13 07:36:30.72 .net
>>642
どんなところが?

676:デフォルトの名無しさん
14/02/13 07:47:08.48 .net
とりあえずCの
i =2;
で代入はおかしい

677:デフォルトの名無しさん
14/02/13 10:42:04.59 .net
キチガイアンチは頼むからエンバカスレに引きこもってろよ
お前がいくら屑でも、最低限のルールくらい守れるだろ?
それともスレ違いかどうかも理解できないほど判断力が低下してるのか?

678:デフォルトの名無しさん
14/02/13 13:35:33.89 .net
>>646
なぜ流行っていないかということは超初心者の疑問だから扱ってもいいんじゃない?

679:デフォルトの名無しさん
14/02/13 14:32:50.10 .net
質問です
FireMonkeyのTFlowLayoutは横に並べるのはわかったんですが、
縦に順に並べるにはどうしたらいい�


680:ナしょうか? バージョンはXE5です



681:デフォルトの名無しさん
14/02/13 17:47:23.67 .net
というか流行る必要ってなくね?
むしろ流行ってほしくない

682:デフォルトの名無しさん
14/02/13 18:05:53.05 .net
流行りものをありがたがる男の人って…

683:635
14/02/13 18:59:12.40 .net
>>639
そうでしたか。じゃぁ、それを使ってみることにします。

>>641
素人さんなんで、CもPASCALも似たようなもんと思えてしまう^^;
プロから見れば違うんだろうけど。
とりあえず、Cの { } がヤなんですね。ミミズののたくったみたい。

684:デフォルトの名無しさん
14/02/13 20:20:41.03 .net
>>649
初心者としては個人や企業で使っている人が余りにも少ないと他の言語を覚えた方がいいのではないかと不安になります

685:デフォルトの名無しさん
14/02/13 21:21:10.59 .net
杞憂でしょう

686:デフォルトの名無しさん
14/02/13 21:25:39.88 .net
そうですか、安心しました

687:デフォルトの名無しさん
14/02/13 23:01:43.84 .net
利用者が少ないから使わないってくだらん
知名度を理由に貶す奴は頭弱そう

688:デフォルトの名無しさん
14/02/13 23:19:17.08 .net
>>652
その感覚は重要
使われてないのにはそれなりに理由があるからね

□産み出されたばかりで知名度が低くて使われていな場合
ドキュメントが少ない

□それそのものが糞だから使われていない場合


他にもあるだろうけど、良いものならみんなが使ってるよ

689:デフォルトの名無しさん
14/02/14 00:03:49.33 .net
なるほどね
じゃあ間違いなくこのスレのみんなが使ってるDelphiは良いものってことか

690:デフォルトの名無しさん
14/02/14 00:08:12.08 .net
Delphiは良いもの。はっきりわかんだね。

691:デフォルトの名無しさん
14/02/14 00:16:40.58 .net
そうですか、安心しました

692:デフォルトの名無しさん
14/02/14 00:19:07.86 .net
みんなが使ってるものだから安心感がある
理由なんてそれ以外全部後付け

693:デフォルトの名無しさん
14/02/14 00:19:47.57 .net
DelphiってWindows向けのソフトウェアしか開発できないんですよね?
これからはマルチプラットフォームの時代だと思うので、他の言語を覚えた方がいいのではないかと不安になります

694:デフォルトの名無しさん
14/02/14 00:23:42.50 .net
>>661
その感覚は重要
でも今はWindows以外にMac OS XやiOSにAndroidと、複数の環境へのクロスコンパイルに対応しているからね

□各OSで用意されている言語を使う場合
それぞれの言語を習得する必要あり、OSごとにアプリケーションを作り直さなくてはならない

□Delphiを使う場合
FireMonkeyというマルチプラットフォームに対応したフレームワークのおかげでワンソースでOK

他にもあるだろうけど、良いものだからみんなが使ってるよ

695:デフォルトの名無しさん
14/02/14 00:24:34.17 .net
マルチプラットフォーム対応=もっさりアプリだから使いたくない

696:デフォルトの名無しさん
14/02/14 00:25:20.98 .net
Javaのことですねわかります

697:デフォルトの名無しさん
14/02/14 00:39:22.48 .net
Cのソースきったなすぎて目が腐る
あの構文に何の疑問も感じない人間は美意識どうかしてる

698:デフォルトの名無しさん
14/02/14 00:52:39.86 .net
>>663
JVMはダメだよね
やっぱりネイティブじゃないと♪

699:デフォルトの名無しさん
14/02/14 05:00:38.64 .net
>>662
> 良いものだからみんなが使ってるよ
「良いもの」には同意だが、「みんなが使ってる」にははげしく同意できない。

700:デフォルトの名無しさん
14/02/14 05:03:38.96 .net
>>655
仕事で使うとなると、自分が異動した後のことを考えて、マイナーな言語は上司が避ける傾向にありますので不安です。

701:デフォルトの名無しさん
14/02/14 05:04:40.22 .net
>>656
Delphiはどういうことが原因で使われていないのですか?

702:デフォルトの名無しさん
14/02/14 05:16:46.85 .net
結局、Microsoft、Sun、IBMのように、開発ツール以外もビジネスをやっている会社が、
C#、VB、javaを推奨するものだから、総合力でDelphiはビジネス的に不利になったということですか?

703:デフォルトの名無しさん
14/02/14 08:04:25.76 .net
ヘジルスバーグ引き抜き

704:デフォルトの名無しさん
14/02/14 08:12:54.74 .net
Standard Pascal は糞だけど Object Pascal は最強

705:デフォルトの名無しさん
14/02/14 08:18:57.12 .net
プログラマにとって重要なものは言語ではなくセンスだ。

706:デフォルトの名無しさん
14/02/14 09:05:51.61 .net
Delphiが


707:使われていないのは良さを理解できない世の中が悪い



708:デフォルトの名無しさん
14/02/14 09:24:08.60 .net
また変な人が痛いDel厨を演じてるようですな

709:デフォルトの名無しさん
14/02/14 10:15:42.79 .net
C言語厨よりマシ

710:デフォルトの名無しさん
14/02/14 11:01:16.56 .net
Microsoftの資本が入ったときに落ちぶれていく施策を採用させられたからですか?

711:デフォルトの名無しさん
14/02/14 11:03:54.79 .net
ネイティブアプリは業務アプリには危険という認識が広まったというのも一因かな。

712:デフォルトの名無しさん
14/02/14 11:31:37.50 .net
iOS/Androidの同一ソース開発が安定するようになると、もう少しメジャーになるのでしょうか?
今のところ、モバイル開発者がDelphiをやり出したという話はほとんど聞きません。

713:デフォルトの名無しさん
14/02/14 13:15:08.47 .net
やっぱり会社が変わりすぎたのが敗因かな
多プラットフォーム対応も方針が変わりすぎた
MSが.NET以降に手間取ってる隙がチャンスだったんだけど、
.NET版Pascalとか出しちゃうしチャンスを逃してる

714:デフォルトの名無しさん
14/02/14 14:51:04.95 .net
いい加減そういうのはエンバカデロスレでやってくれ
ここは言語やライブラリの使い方に関する質問スレだ
そういう質問をする気も答える気もないなら消えてくれ

>>648
TFlowLayoutには縦に並べる機能はないが、TFlowLayoutをTFlowLayoutの中に横に並べて、
1つずつTFlowLayoutBreakをすれば擬似的に縦に並ぶようにはなる
あとはこちらでは試してないけど、こういったのを作ってる人もいるから参考に
URLリンク(delphihaven.wordpress.com)

715:デフォルトの名無しさん
14/02/14 15:06:07.62 .net
複数のPCに導入する予定のプログラムで、
自作フォーム上にPDFを表示したいのですが、何か方法はありますでしょうか?
わかる方がいましたらご教示願います。

716:デフォルトの名無しさん
14/02/14 15:23:59.49 .net
>>682
adobe readerインスコしてTWebBrowser(もしくはTEmbeddedWebBrowser)

717:デフォルトの名無しさん
14/02/14 16:47:30.43 .net
>>682
PDFの操作をしたかったり、Adobe Readerに依存したくなければ、
Active PDFのようなフリーのコンポーネントを使う手もあります。

718:デフォルトの名無しさん
14/02/14 19:59:13.01 .net
ありがとうございます。683さんの方法で何とか実現できそうです。
もうひとつ質問なのですが、PDFの1ページ目のサムネイルを得る方法はないでしょうか?
Acrobatや有料コンポーネントなどを買えば可能なようですが、
予算的に厳しいため、できれば無料か、高くても数千円で済むようだとありがたいです。

719:デフォルトの名無しさん
14/02/14 21:13:23.26 .net
TWebBrowerに一度表示させてスクショを取るとか(キャプチャはWinAPIで出来る)

720:635
14/02/16 22:44:03.94 .net
素人な質問でごめんなさい。

あの Type というのは一体どういうものなんでしょう?
Var とかぶってるところもあるし、なんかイマイチ分からないですね。

721:デフォルトの名無しさん
14/02/16 23:00:35.65 .net
型宣言と変数宣言

722:635
14/02/16 23:03:36.67 .net
>>688
ありがとうございます。
でも、その 型宣言 というのがイメージが湧かないんですよ。
解説本見てもちゃんとした説明がないですし。

723:デフォルトの名無しさん
14/02/16 23:09:47.31 .net
Varが 変数を宣言するのに使う。

Typeが、型を宣言するのに使う。
構造体や配列、レコード型など
ユーザーが型を作ることが出来る。

724:デフォルトの名無しさん
14/02/16 23:16:15.37 .net
>>689
6のマニュアル 
URLリンク(www.dotup.org)

725:デフォルトの名無しさん
14/02/17 22:19:19.71 .net
Delphiって関数を使うときにその関数の記述部分が前にないといけないと聞いたのですが本当ですか?

726:デフォルトの名無しさん
14/02/17 22:59:23.87 .net
定義か宣言のいずれかが必要です。Cのように暗黙に関数を仮定することはできませんが、
(Cのプロトタイプ宣言に相当する)前方宣言を用意しておけばOKです。

727:デフォルトの名無しさん
14/02/18 09:53:18.79 .net
Cでいうところのヘッダーファイルがひとつにくっついてる感じ

728:デフォルトの名無しさん
14/02/18 11:14:18.03 .net
forward宣言はpascal本来の文法にもある
unitのinterface部のところはDelphi/Turbo Pascalの拡張じゃなかったかな

729:デフォルトの名無しさん
14/02/18 15:31:54.07 .net
>>692
宣言が前方にある必要があるだけで、実装の記述が前方にある必要はないよ
ついでに言えば、実装の方は下記のように引数や戻り値を全部省略して書いてもいい

function Test(A, B: Integer; C: string = 'test'): string; forward;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(Test(1, 2, '3'));
end;

function Test;
begin
 Result := 'hoge';
end;

730:デフォルトの名無しさん
14/02/18 16:23:26.69 .net
>>696
誰もhoge荒らしにきいてないんだからさっさと消えろよ

731:635
14/02/18 19:51:53.15 .net
>>690
うーん。なんだか分かったようなわかんないような(←ほとんど分かってない)
ま、構造体も配列もまだ使う予定ないから、わかんなくても良しとしよう!
それにしても、みんな何であんなの簡単に使いこなせるんですかねぇ。

>>691
これは良いモノを教えていただきました。ブックマークしときますね^^

732:デフォルトの名無しさん
14/02/19 12:00:39.71 .net
消えるのはお前だな > 697

733:デフォルトの名無しさん
14/02/19 14:36:03.86 .net
はい…

734:デフォルトの名無しさん
14/02/20 15:55:16.23 .net
C#のusingみたいな機能ってありませんか?

735:デフォルトの名無しさん
14/02/20 17:45:42.75 .net
つ try...finally

736:デフォルトの名無しさん
14/02/20 17:49:50.70 .net
C#使いが今頃Delphi触り始めるっていうのは、モバイル向けか?
悪い事言わんから、やめといた方が良いと思う

737:デフォルトの名無しさん
14/02/20 21:28:00.12 .net
>>702
C#のtry-finallyとusingは等価ではないんですが、Delphiでは同じなんですか?

738:デフォルトの名無しさん
14/02/20 21:35:18.01 .net
>>703
そうなんですか?
資料は少ないですが、例えばHello wordlを作ってデプロイして起動するまでは
他の環境よりかなり楽だったので、普及して本とか増えてくれたら結構いいとこいくと思います

739:デフォルトの名無しさん
14/02/20 21:37:41.71 .net
>>704
usingそのものはないよ。

740:デフォルトの名無しさん
14/02/21 16:16:05.13 .net
>>703
なぜ?

741:デフォルトの名無しさん
14/02/21 16:36:56.94 .net
エンバカと一部ユーザー?が喧伝してる夢物語が実現するとは到底思えないから
Delphi,VCL,C++Builderは本当に素晴らしい物だと思うが、エンバカになってからの
状況見てると何も明るい材料が無い
俺はVCL,C++Bulder使いだから知らないだけかもしれないが、Delphiの方はそんなに良い状況なのか?

742:デフォルトの名無しさん
14/02/21 16:40:52.51 .net
エンバカスレは別にあるからそっち行ってくれ

743:デフォルトの名無しさん
14/02/21 16:42:59.99 .net
WindowsとLinuxで同じ事が出来なかった人達に、
iなんたらとAndroidなら同じ事が出来ると思うのか?
今のIDEの出来も、もうEclipseには置いて行かれている

744:デフォルトの名無しさん
14/02/21 18:55:34.45 .net
>>708>>710
関係ない話題を繰り返したいのであれば出て行ってください
あなたがどう思うかはこのスレには関係ありませんのでチラ裏か以下のスレでどうぞ
スレリンク(tech板)

745:デフォルトの名無しさん
14/02/21 22:10:23.17 .net
ウザい自治体の>>711はスルー�


746:ナ



747:デフォルトの名無しさん
14/02/21 22:15:19.02 .net
適材適所。

748:デフォルトの名無しさん
14/02/21 23:02:57.95 .net
>>711=自治体

749:デフォルトの名無しさん
14/02/24 16:21:29.26 .net
荒らしが何か言ってる

750:デフォルトの名無しさん
14/03/14 23:02:45.98 SeBq1h8L.net
初歩的な質問で申し訳ないですが...

スレッドの Create や Destroy はもしかして
メインスレッドで実行されるんですか?

751:デフォルトの名無しさん
14/03/15 16:30:17.49 +WFsYmz/.net
スレッドが、TThreadクラスの実装で使われてるOSのスレッドの事を意味するなら、
ソースを見るとスレッドの生成はTThreadのCreateコンストラクタで作成されているよーな。
つまり、君がTThreadのCreateを呼ぶタイミングで・・

752:デフォルトの名無しさん
14/03/15 18:14:43.10 1abxrNZC.net
>>717
ちょっと疑問に思ったのは、TThreadのconstructorなどで
メインスレッドの要素(VCLオブジェクトなど)へ直接アクセス
してもいいのか、それもとSynchronizeを使うべきかってことです。

それで、メインスレッドからTThreadをCreateする段階で
constructorもメインスレッドで実行されるのであれば、
constructor内でVCLオブジェクトに直接アクセスしても
問題ないですよね。

753:デフォルトの名無しさん
14/03/15 18:34:42.01 l3tZ6mor.net
逆に呼ぶだけで別スレッドで実行されるコンストラクタの作り方を知ってるなら教えて欲しい

754:デフォルトの名無しさん
14/03/15 19:22:59.24 +WFsYmz/.net
>メインスレッドからTThreadをCreateする段階で
>constructorもメインスレッドで実行されるのであれば、
>constructor内でVCLオブジェクトに直接アクセスしても
>問題ないですよね。
だ。問題ない。
別スレッドで実行されるのはoverrideするexecuteメソッド。
デストラクタはFreeOnTerminateの設定しだい

755:デフォルトの名無しさん
14/03/16 14:13:47.85 s2v9Bhoy.net
>>720
ありがとうございます。

以前より疑問に思ってたことで
これでスッキリしました。

>デストラクタはFreeOnTerminateの設定しだい

メインスレッドから明示的に解放する場合は
メインスレッドでdestructorが実行されるってこと?

756:デフォルトの名無しさん
14/03/17 07:51:51.15 QpwZfi7l.net
FreeOnTerminate=trueは実質的に使い道がないからあまり悩むな

757:デフォルトの名無しさん
14/03/17 14:28:39.76 NiSgUcDM.net
使い道かなりあるだろ
お前が使いこなせてないだけ

758:デフォルトの名無しさん
14/03/18 06:53:32.63 ZB+Vqles


759:.net



760:デフォルトの名無しさん
14/03/18 06:56:53.03 ZB+Vqles.net
>>723
「かなり」はないな。
「わずか」に完全非同期のスレッドに使えるけどそれほど必要じゃないし
仮に必要としてもexe別にした方がいい事のほうが多い。

761:デフォルトの名無しさん
14/03/18 15:34:47.95 Qsk0Z8cy.net
必死の自演もむなしく…

762:デフォルトの名無しさん
14/03/18 19:17:52.57 ZB+Vqles.net
自演なら時間空けた上ID変えるはw

763:デフォルトの名無しさん
14/03/19 01:10:13.81 YMTMO1GO.net
>FreeOnTerminate=trueは実質的に使い道がないからあまり悩むな
プログラムで書くならFreeOnTerminate := true;なんだが。

>>724
>マジで行ってるならバグの元だからやめたほうがいいぞw
バグというよりコンパイルが通らないが...

764:デフォルトの名無しさん
14/03/19 01:46:57.53 X5Pm8TEB.net
:のあるなしとかそんなくだらない部分にしか反論できなければ無理してレスしなくていいんじゃ?見ててしらける。

765:デフォルトの名無しさん
14/03/19 07:21:28.20 2cESFier.net
例えばここ URLリンク(wiki.lazarus.freepascal.org)
のサンプルの中でFreeOnTerminate=trueにもかかわらず

procedure TForm1.FormDestroy(Sender: TObject);
begin
MyThread.Terminate;

// FreeOnTerminate が true であれば、以下の記述は必要ありません。
// MyThread.Free;
inherited;
end;

などと平気でやっている。
MyThread が先に終了してたらMyThread.Terminateはアクセスバイオレーションだ!
つまりFreeOnTerminate=trueの時はメインスレッドからサブスレッドを制御するのは
サブスレッドの実体をメインスレッドに持っているだけではできないのだ。
そしてFreeOnTerminate=trueの唯�


766:黷フメリットは「処理が終わったら余分なメモリが空くこと」だが それはFreeOnTerminate=falseでもスレッドリストを作りガベージコレクトを適切に行うことで解決できる。 これらのことからするとFreeOnTerminate=trueは実質いらない子なのである。



767:デフォルトの名無しさん
14/03/19 07:30:16.83 2cESFier.net
ちなみに「スレッドリストを作りガベージコレクト」とは
単に、適当なタイミング(新しいスレッドを作るときとかタイマで10分毎とか、どうするかはプログラマの自由)で
if MyThread.finished then MyThread.Free;
とするだけのことである。
サブスレッドが複数なら
for i:= 0 to thredlist.count-1 do
if thredlist[i].finished then thredlist[i].Free;
とかね。

768:デフォルトの名無しさん
14/03/19 07:42:15.76 2cESFier.net
初心者スレなのでさらに正確に書くと
if Assigned(MyThread) and MyThread.finished then begin
MyThread.Free;
MyThread:= nil;
end;
か。
なお以前は
MyThread.Free;
MyThread:= nil;

FreeAndNil(MyThread);
にするとなぜかうまく行かなかったが今はどうか知らない。

769:デフォルトの名無しさん
14/03/19 08:22:24.10 2cESFier.net
なお、もちろん「少量のメモリ使用なんて気にしない」という
ならガベージコレクトは不要だ。
仮にサブスレッドが大量のメモリを使うとしても、executeの
最後でそれらを開放してやればいいだけの話なので
眠ってるスレッドが消費するメモリなんてたかが知れている。

770:デフォルトの名無しさん
14/03/19 10:31:13.07 Wx0a5I3W.net
まぁ初心者スレなのでFreeOnTerminateは普通Falseだろ、といわれりゃそうだけど、
>FreeOnTerminate=trueは実質的に使い道がないからあまり悩むな
は乱暴すぎるな。せめて"わからないうちはFalseで十分"くらいにしとけ。

771:デフォルトの名無しさん
14/03/19 14:33:07.91 NwQr/+gL.net
自論を守ることに必死になって本来使われるべき場面すら否定してるだけでしょ
バカはほっとけ

772:デフォルトの名無しさん
14/03/19 16:01:20.43 T8UZmlef.net
子スレッドを使う基本 = やらせて放置、終わったら「終わったよ」報告(1)をさせる

メインから終わらせたければ「終わってくださいお願いします」フラグを立てる =
  AThread,Terminate; を呼ぶなど。

(1)の旗はメイン側の場所に作っておく、旗が立ったら次へ。
インスタンスの破棄は子スレッドに任す


TThread のつくりがこういう使い方を想定して作られてるので、それに従うのが紛れがなくていいぞ。

773:デフォルトの名無しさん
14/03/19 19:46:18.29 2cESFier.net
>>735
「本来使われるべき場面」とは?
ちなみに私がバカというのはあたってますが、
ガベージコレクトを標準搭載している言語ではごく普通の手法なので「自論」ではないです。

>>736
それだとメインの旗を立てる際にsyncronizeしないと
いけないので私の提示したた手法より複雑になります。
そして「TThread のつくりがこういう使い方を想定して作られてる」というのは誤解と思われます。

774:デフォルトの名無しさん
14/03/19 22:17:04.02 VkMj3BIA.net
ちょっと教えてください

Delphi7で作成した32ビットアプリケーションをx64のWOW64環境で動かすのですが
プログラムからProgram Files(64ビット用),SYSTEM32のリソース用EXE,DLLをロードする必要があり

SYSTEM32の方は"%WinDir%\Sysnative"でいけるのですが
Program FilesはProgram Files (x86)にリダイレクトされてしまします
Wow64DisableWow64FsRedirectionやリンクを使わない方法ってありますか?

動作環境の方はNT系のx86(NT4以降),x64(XP以降)サーバーOSも含みます

775:デフォルトの名無しさん
14/03/19 23:45:37.42 YMTMO1GO.net
>>729
だったら無視すればいいのにw

>>731-732 >MyThread.Free; >MyThread:= nil; Freeしてnilする間に呼ばれたらどうするの? こんな馬鹿の為にFreeOnTerminateは必要なのかなw



777:デフォルトの名無しさん
14/03/20 01:54:02.08 vqexB7VW.net
>738
64のプログラムがProgram Filesに、
32のプログラムはProgram Files(x86)、
で良いのでは?

778:デフォルトの名無しさん
14/03/20 07:01:48.61 6vGw0ZTO.net
>>739
Freeにはスレッドが終了するまで待つ処理が入ってますから問題無いですよ。
調べずに書く人はバカな私よりバカだと思います。

779:デフォルトの名無しさん
14/03/20 07:22:58.71 aCZWTFRX.net
そういうこと考えないでいいのが FreeOnTerminate

780:デフォルトの名無しさん
14/03/20 08:45:40.83 6vGw0ZTO.net
>>742
まあそうですが、その代わり>>736さんが適切に指摘されているような機能を実装する必要がありますから
結局面倒ですよね。

781:デフォルトの名無しさん
14/03/20 09:09:09.35 6vGw0ZTO.net
あと、考えるのが面倒、調べるのも面倒、でも心配というのなら
mythread.WaitFor;
mythread.Free;
mythread:= nil;
とすればよいだけの話です。

782:デフォルトの名無しさん
14/03/20 14:27:34.60 O3H8Rb0w.net
それスレッド使う意味なくね?トンデモすぎてもう本末転倒だよ…
お前の糞コードには文句言わないから、せめて何も知らない初心者は巻き込まないで

783:デフォルトの名無しさん
14/03/21 00:36:10.17 pbbcuVJV.net
>>741
>Freeにはスレッドが終了するまで待つ処理が入ってますから問題無いですよ。
えっ?本当に馬鹿なんだw
マルチスレッドの意味が分からないのかな?

Freeとnilの間と言う意味が分かってないんだね、こんな馬鹿が作ると
タイミングによって出たり出なかったりするバグを作りだして非常に迷惑するんだよな。

784:デフォルトの名無しさん
14/03/21 02:02:48.57 PlAj+MNn.net
そもそも初心者がマルチスレッドなんてやるの? そんなのできたら中級以上だよ

785:デフォルトの名無しさん
14/03/21 11:14:31.18 UsfjXS01.net
なんかあれだな   基本的に親スレから子スレをいじるのはご法度だよ

さわらぬスレにたたりなしって、知らんのか?

786:デフォルトの名無しさん
14/03/21 12:12:00.72 dYaCWWLA.net
ところで、>>741が言ってる

「Freeにはスレッドが終了するまで
待つ処理が入ってます」って本当なの?

787:デフォルトの名無しさん
14/03/21 14:07:24.14 aCiCqmdu.net
>>749
本当

788:デフォルトの名無しさん
14/03/21 21:20:49.05 dYaCWWLA.net
>>750
なるほど

ほとんどTThreadとか使わないんだけど
改めてHelpを見ると書いてあるね

てか、自分でFreeするんだったら
MyThread.Terminateなんか不要じゃん

789:デフォルトの名無しさん
14/03/21 22:15:52.10 aCiCqmdu.net
いや、それはまた別。Terminateのヘルプに書いてあるけど、
途中で処理をキャンセルしたい場合に使う。

790:デフォルトの名無しさん
14/03/22 20:11:57.19 458foGzL.net
でも途中キャンセルしたらほとんどの場合はそのままFreeするからやっぱりいらないよね

791:デフォルトの名無しさん
14/03/23 08:33:53.01 ZLskKlYl.net
いちどWinAPIだけでスレッド書いてみれば良い
意味がよく分かる

792:デフォルトの名無しさん
14/03/24 07:36:57.69 Eiiayiu7.net
>>746
終了したスレッドが勝手に動き出すとかないですから問題無いですよ。
あなたスレッドの動作や意味を間違えたますよね完全に。
多分Delphiしかできない人なんでしょうけど他言語も触ってみると良いですよ。

793:デフォルトの名無しさん
14/03/24 08:03:56.24 Eiiayiu7.net
>>748
それで顧客が納得してくれれば苦労はしないのです。
あなたが親子という概念を既に導入していることからも分かる通り
親側でクローズボタンが押されても子が終了するまで待つという
ようなプログラムではダメ出しされるのが通常だからです。
そこで
Mythread.terminate;

Mythread.free;
が必要になるわけですが
FreeOnTerminate=trueだとMythreadが終了してたらアクセスバイオレーションになるから
工夫が必要だよさあどうするというのがメインの論点です。

794:デフォルトの名無しさん
14/03/24 08:09:51.06 osm7C2MP.net
まさ


795:か仕事でマルチスレッドプログラム書いてて 同期オブジェクトやスレッド間通信用のメッセージングの仕組みを 用意してないとか言わないよな?



796:デフォルトの名無しさん
14/03/24 08:15:34.47 Eiiayiu7.net
ひとつの解決方法は >>736さんの提示された
FreeOnTerminate=trueのまま工夫する方法です。
もうひとつは私が提示したFreeOnTerminate=falseにして
必要ならガベージコレクト機能を組み込むという方法です。
あとは具体的解決方法も示さずバカだのアホだ
のいうだけの人が約1名いるという状況です。

797:デフォルトの名無しさん
14/03/24 08:22:55.85 Eiiayiu7.net
>>757
スレッド間通信もひとつの手ですね。
ただそこまで必要ないことのほうが多いです。
DelphiのThreadクラスの優秀さはスレッド間通信を使用しなくても簡単に
マルチスレッドアプリができるというところにあると思います。

なお、758は756の続きでありあなたへのレスではありません。

798:デフォルトの名無しさん
14/03/24 08:52:25.38 Eiiayiu7.net
>>757を受けてここまでの状況をまとめ直しました。

Q 親子型スレッドを作るにはどうればいいの?

A1 >>736さんのようにFreeOnTerminate=trueでサブスレッド側からメイン側のフラグを操作する。
A2 >>757さんのようにFreeOnTerminate=trueで同期オブジェクトやスレッド間通信で処理する。
A3 FreeOnTerminate=falseにして、必要ならスレッドマネージャ(≒ガベージコレクト)機能を組み込む。
番外 具体的解決方法も示さずバカだのアホだのいうだけの人が約1名。

799:デフォルトの名無しさん
14/03/24 15:50:15.88 TTLwjTKi.net
Delphiハックで有名な人らがFreeOnTerminateはTrueのほうがよく使うと発言してる件

800:デフォルトの名無しさん
14/03/25 08:44:40.07 5thxtN7r.net
>>761
730で示したとおりLazarusのWikiでさえ間違ってますから
FreeOnTerminate=trueの方が多数派の可能性は十分あるでしょうね。
私も最初はFreeOnTerminate=trueから始め、A1やA2を採用しておりました
(なお、同期オブジェクトやスレッド間通信は今でも必要に応じて他の目的のために使うことがあります)。
スレッドマネージャ型に気づいたのは、他のガベージコレクション標準搭載言語でのスレッド処理や
ゲームプログラミング(擬似マルチスレッドですが)で最近?流行のオブジェクト管理方法に触れた時です。
眼から鱗でした。
初心者の方は、A1~A3型すべての親子型スレッドのサンプルを作ってみると勉強になると思います。

801:デフォルトの名無しさん
14/03/25 16:06:46.24 JWqzamQX.net
Delphiと関係ないLazarusのwikiを持ち出して間違ってると言われましても…
それ以外に自分の意見を補強できる資料が無かったんだろうけどw

802:デフォルトの名無しさん
14/03/26 00:02:18.41 3vOQuU/w.net
>>755
>終了したスレッドが勝手に動き出すとかないですから問題無いですよ。
誰もそんなことを問題にしていない。
Freeしてnilする間に使われたらどうするんだと言っている。
そんなプログラムを組んでいたらAccess Violationになるぞ。
こいつ本当にマルチスレッドのプログラムを作ったことがあるのか疑問だ?

803:デフォルトの名無しさん
14/03/26 00:17:56.35 PxlFEF9w.net
複数スレッドから読まれることを前提としてたら普通は一時変数に取ってnil入れてそれから解放するわな(FreeAndNilの実装)

804:デフォルトの名無しさん
14/03/26 00:47:26.59 qmu2UESc.net
まぁ、技術レベルが低くて代入演算子に:がないからコンパイルできないとか
本題と関係のない事にしか突っ込むしかできな奴が「マルチスレッドのプログラムを作ったことがあるの?」
と言ってもジョークにしか聞こえないけど。

805:デフォルトの名無しさん
14/03/26 08:11:38.29 r65XrFp2.net
>>764
「使われる」とはどういう意味ですか?
例えば以下のプログラムで誰がFreeしてnilする間に使うのですか?

TForm1=class
button1: TButton;
timer1: TTimer;
private
mythread: TMythread;
end;

TForm1.Button1click;
begin
if Assigned(mythread) then mythread.Free;
mythread:= TMyThread.create;
end;

TForm1.Timer1Timer;
begin
if Assigned(mythread) and mythread.finished then begin
mythread.Free;
mythread:= nil;
end;

TForm1.FormDestroy;
begin
if Assigned(Mythread) then mythread.Free;
end;

こいつ本当にマルチスレッドのプログラムを作ったことがあるのか疑問だ?

806:デフォルトの名無しさん
14/03/26 08:32:03.41 r65XrFp2.net
ちなみに上のプログラムは端折って書いているのでコンパイルできません。
初心者の方には申し訳ないですが是非自分でプログラムしてみてください。
なお、既に述べたとおり、ガベージコレクト部分(上のプログラムのTForm1.Timer1Timerメソッドの部分)
は必ずしも実装する必要はありません。

807:デフォルトの名無しさん
14/03/26 10:57:22.97 MFJ22iPr.net
だからさあ  メイン側で余計なことする必要なんぞない
タイマー持ち出すとか正気の沙汰じゃない

サブスレッドは仕事終わったら結果残して (残す必要もない場合だってある) 
ひっそりと自ら消えていけばいいだけだよ。

808:デフォルトの名無しさん
14/03/26 11:58:16.25 r65XrFp2.net
>>769
今後必要になった時に「そういえばあんな議論があったな」と思い出して
いただければ結構ですよ。A1~A3どれもやる必要がないのであれば
用いる必要がないのは当然です。
(あまりにも当然過ぎてあなたを除き誰もそこには疑問を持っておりません)

また、上のプログラムはあなたを含めた初心者宛ではなく
「本当にマルチスレッドのプログラムを作ったことがある」764さん宛のものですので
参考にしないでください。
なお、ガベージコレクトは必須ではないですし、タイマーでやらなければいけないという
ものでもありません(既に書きました)。ですから「タイマー持ち出すとか正気の沙汰じゃない」
という感想も全くマトハズレです。

809:デフォルトの名無しさん
14/03/26 12:04:58.57 r65XrFp2.net
>>763
出所(ソース)不明なだけでなく「Delphiハックで有名」という威光をバックに
自分の意見を補強するよりはだいぶマシかとw

810:デフォルトの名無しさん
14/03/26 14:58:18.26 zZlUGj+i.net
つまりどっちもどっちってことか
2chに書くような屑の言葉を信用するなってことだなw

811:デフォルトの名無しさん
14/03/26 18:00:37.20 r65XrFp2.net
>>763
あと、よく読めば分かると思いますが
自分の意見の補強ではなくむしろ相手の意見の補強に使ってるのですが・・・

812:デフォルトの名無しさん
14/03/26 19:34:57.44 BF9ctGYU.net
自分の望み通りの動作でバグ無く動きゃいいんだよ

813:デフォルトの名無しさん
14/03/26 19:56:45.56 KA6gGFh4.net
ていうかスレッドの質問って初歩的な質問なんですね。
私は業務でDelphiのプログラムを作ってますが、マルチスレッドの
プログラムなんぞ作ったことがありません。
最近の初心者のみなさんは素晴らしい技術をお持ちですね。

814:デフォルトの名無しさん
14/03/27 07:19:19.10 ArBm9NmN.net
そうですね!

815:デフォルトの名無しさん
14/03/27 14:13:11.20 5hMYU59G.net
自分は初心者だけど、ネット関連のアプリ作ってて
スレッドは多用するな

ちなみに、スレッドの解放にFreeは使わない
理由は、解放中、メインスレッドが停止するから

最悪でも1、2秒の停止時間に文句を言う利用者がいるからね

816:デフォルトの名無しさん
14/03/27 15:07:12.77 6x5K07pQ.net
>>775
それで質問はなんですか?
どうでもいい感想はチラシの裏にお願いします。

817:デフォルトの名無しさん
14/03/27 18:24:52.12 LkX3HMZn.net
>>778
お前を消す方法は?

818:デフォルトの名無しさん
14/03/27 19:31:29.40 6x5K07pQ.net
>>779
あなたが死ねば、色々まとめて消えます。

819:デフォルトの名無しさん
14/03/27 19:34:08.09 loEnDXuM.net
バグと共ににっちもさっちも往かず
沈みます
さようなら

820:デフォルトの名無しさん
14/03/27 19:45:12.28 c5YDAWUv.net
このスレには質問と回答以外は書いちゃダメらしいぞ。

821:デフォルトの名無しさん
14/03/27 19:51:43.82 ArBm9NmN.net
>>777
ネット系はスレッド必須っすよね。初心者で対応できるとはさすがです。
でもどこかでTerminate使うなら結局一緒では?
Free内部でTerminate呼んでるとこでその停止は生じてると思うんで。
Terminate使う必要のないプログラムならFreeも使う必要ないし。

822:デフォルトの名無しさん
14/03/28 01:28:31.10 wmf34mqq.net
>>767
764さん


823:が言っているのは、mythread.Free;とmythread:= nil;の間に別のスレットがmythreadを使うとAccess Violationになるということだと思います。



824:777
14/03/28 02:40:29.80 sGxVzfHB.net
>>783
自分のTThreadの理解が不十分なのかもしれないけど
明示的にFreeすると、メインスレッドでTThreadの解放まで
待たくちゃならないでしょ

たとえば、Terminateを実行したとき、たまたまアクセス中で
さらにサーバの状況が悪くてIndyがタイムアウトを消化中だと
ワーカスレッド内でTerminatedを評価するまで、かなり時間が
かかるケースとかない?

それがイヤで、明示的にFreeで解放はしないんだけど、
自分の理解不足かな?

825:デフォルトの名無しさん
14/03/28 06:56:10.22 d6QGntWj.net
>>785
いやおそらく理解は十分だと思いますよ。
おそらくA3型を前提とした質問だと思うのでそうとして答えますね。
(もしそうでなかったら無視してください)
まず 767 の
TForm1.FormDestroy;
begin
if Assigned(Mythread) then mythread.Free;
end;
というFreeは、「親が子より先には死んではいけない」という親子型の基本理念を実現するものですので
ここでウェイトが生じうることは我慢して下さい。
逆に言えば FreeOnTerminate=true だとその理念が無いために A1型やA2型ではいろいろ苦労されてい
るはずです。
子が親の予想より早く死んでしまったためアクセスバイオレーションとなることは既に書きましたが
親が子の予想より早く死んでしまったためアクセスバイオレーションとなることもあるというわけです。

826:デフォルトの名無しさん
14/03/28 06:58:04.75 d6QGntWj.net
次に 767 の
TForm1.Timer1Timer;
begin
if Assigned(mythread) and mythread.finished then begin
mythread.Free;
mythread:= nil;
end;
という部分での Free ですがここはmythreadが処理を完了していますので
Freeでウエイトが生じることはないはずです。

827:デフォルトの名無しさん
14/03/28 07:07:12.92 d6QGntWj.net
最後に 767 の
TForm1.Button1click;
begin
if Assigned(mythread) then mythread.Free;
mythread:= TMyThread.create;
end;
という部分でのウェイトですがここはサブスレッドを1つだけに制限しているため
Freeして使いまわしているだけです。複数のサブスレッドを作るようにすればここでのFreeは不要です。
例えば、HTTPサーバーでリッスンするスレッドに接続要求があった時は接続可能な数まで
サブスレッドを作成するだけでいちいちFreeはしないと思います。

828:デフォルトの名無しさん
14/03/28 07:13:34.20 d6QGntWj.net
>>784
「別のスレットがmythreadを使う」というプログラムがよくわからないので
具体例を示していただけると幸いです。
FreeOnTerminate=trueだとそういうプログラムでも問題が生じないという
ところまで示していただけると多分今後スムーズに話が進みます。

829:デフォルトの名無しさん
14/03/28 07:24:05.61 d6QGntWj.net
>>784
なお、「別のスレットがmythreadを使う」がもし「子スレッドが複数いて子同士での通信」を意味するなら
mythreadを使うのではなくsyncronizeや同期オブジェクトやスレッド間通信を使ったほうがよいと思います。
それはFreeOnTerminate=trueでも同じのはずです。

830:デフォルトの名無しさん
14/03/28 07:56:07.60 oYluIFxT.net
うん、なんかファイト。

831:デフォルトの名無しさん
14/03/28 07:57:53.78 Dgxgcg2X.net
スレッドの管理は、スレッドリストっていう便利なものが用意されてるから使えばいい
問題の大半はこれで解決

832:デフォルトの名無しさん
14/03/28 10:41:40.30 MhBcNb1x.net
こんなの見つけた
URLリンク(homepage2.nifty.com)
ここはスレッドの事が書いてある

833:デフォルトの名無しさん
14/03/29 00:30:35.70 MLfxEq3F.net
>>767
TForm2 = class(TForm1)
private
function Gatmythread: TMythread;
public
property mythreadA: TMythread read Gatmythread;
end;
function TForm2.Gatmythread: TMythread;
begin
Result := mythread;
end;
これで理解できるか、それとも意味がわからないか?
しかし、いきなりスレッドをprivateフィールドにるすろとは必死すぎるだろう。

オブジェクト指向は継承されても大丈夫なように作るのがわかっていないようだ。
オブジェクト指向のプログラムもろくに理解出来ないとは。
あとフィールドは頭文字はFだ、Delphiの常識的なルールもしらないとは。

834:デフォルトの名無しさん
14/03/29 00:31:24.90 MLfxEq3F.net
>768
>なお、既に述べたとおり、ガベージコレクト部分(上のプログラムのTForm1.Timer1Timerメソッドの部分)
自慢げにガベージコレクト、ガベージコレクトとうるさいが、その仕様は
ガベージコレクションじゃないと分かっていないのが痛いほど�


835:゚しい過ぎる。 >756 >それで顧客が納得してくれれば苦労はしないのです。 >親側でクローズボタンが押されても子が終了するまで待つという >ようなプログラムではダメ出しされるのが通常だからです。 お前が顧客に信用されていないだけだと思わないのか? 顧客も馬鹿じゃないんだから、必要なら待つ。 まっ普段から駄目な技術者は本当に必要なことをいっても信用してもらえないからな。 つまりお前は ・マルチスレッドのプログラムが作れない。 ・オブジェクト指向が理解出来ていない。 ・Delphi の基本的なルールもわからない。 ・客に信用されていない。 と言うことの、駄目駄目の三流技術者でいいんかな。



836:デフォルトの名無しさん
14/03/29 08:43:24.44 ss1xGzqs.net
>>794
>>795
えーはい、適当なプログラム、適当な命名、申し訳ありませんでした。
今後気をつけたいと思います。
「Freeしてnilする間に使われるからおかしい!」という主張は撤回された
ものと受け止めさせていただきます。

837:デフォルトの名無しさん
14/03/29 08:44:25.64 OI7JjiZi.net
どうでもいいがここは初心者の質問スレじゃなかったのかね?
まあ、今更Delphiやろうって奴も少ないだろうけどな。

838:デフォルトの名無しさん
14/03/29 08:58:08.53 ss1xGzqs.net
あ、それから、別に承継しなくても同じUnit内ならprivate内の項目でも自由に使えますよ。
釈迦に説法でしょうけど。

839:デフォルトの名無しさん
14/03/29 09:18:19.16 ss1xGzqs.net
>>797
質問者のレベルが高いと話のレベルも高くなるので難しそうに感じるかもしれませんが、
(質問者のレベルが低くすぎてもポイントがずれまくって難しそうに感じるか)
スレをたどってもらえればわかるように根っこはTThread初めの一歩!みたいな話ですから
初心者向けの話だと思いますよ。
ようは、「FreeOnTerminate=trueが便利そう!」と思ってそこからスタートするとはまるよ、
大したメリットもないんだからFreeOnTerminate=falseで十分だよ、という話です。
多分この話題はもう秋田という感じなのでしょうけど、
初心者を助けたいと思っているだけで自説を押し付けるとかそういう意図ではないので
質問等が消えれば消えますので少しだけ我慢を

840:デフォルトの名無しさん
14/03/29 10:02:01.17 UJJa62hD.net
善意でやってくれてるのは了解した。
ただこの先スレッドの話題がずっと続いたら本当に初歩の初歩の質問がしづらいかなと思っただけ。

841:デフォルトの名無しさん
14/03/29 10:17:55.10 CFiKeRo+.net
昔は質問スレが複数に分かれてたが、現在はスレタイの「超初心者用」に意味はない

842:デフォルトの名無しさん
14/03/29 10:35:32.59 4Djj1jA3.net
>ただこの先スレッドの話題がずっと続いたら本当に初歩の初歩の質問がしづらいかなと思っただけ。
>>795みたいに一人だけ煽ってる奴はいるが、これぐらいで質問できなくなるって、
そんなんじゃ世の中生きていけねぇだろ。配慮の仕方が間違ってるわ。

843:デフォルトの名無しさん
14/03/29 14:33:06.82 6fdBLR4+.net
>>786
>親が子の予想より早く死んでしまったためアクセスバイオレーションとなる

レベルの低い初心者の質問者で申し訳ないけど
このエラーって、どんな感じのエラー?

子が親をアクセスしたときのエラー?
子が親をアクセスしないでもエラーが出る?

844:デフォルトの名無しさん
14/03/29 19:49:54.14 ss1xGzqs.net
>>803
いえいえ「分かる人にはこれだけでわかるだろうけどわからない人も多いかもな・・・」
と思いながら書いた部分を指摘された的確な質問です。
例えばA1型で行こうと決めて(また適当なプログラムですみません)、
procedure TMyThread.execute
begin
Form1.MyThreadFinish:=false;
try

finally
Form1.MyThreadFinish:=true; (1)
end;
end;
とかやっただけだと(1)の部分でご指摘のエラーが発生する可能性があります。
そこでこれを避けようと、真っ先に気づくのは既出のように
procedure TForm1.destroy
begin
Mythread.terminate;
end;
とかやることですが、これだけではダメなことは既に指摘したとおりであり、
もうどうしていいかわからなくなりパニクる(私だけかもしれません)と
いうわけです。

845:803
14/03/30 00:49:20.37 wYL9BvPj.net
>>804
説明、ありがとうございます



846:タは、このスレッドの話題の発端となった>>716の質問者でもあります 実は初心者なのにネット関連のアプリを公開してしまって 今頃になって基本が分かってないことに気づき慌ててる... アプリ内でFreeOnTerminate := Trueで作ったワーカスレッドが 10近く常時動いてます 終了ボタンをクリックすると、終了を示すグローバル変数をセットし それ以降はワーカスレッドからメインスレッドへアクセスすることはない で、聞きたかったのは、親(メインスレッド)が子(ワーカスレッド)よりも 早く終了した場合(もしそんなことが内部的にあるのなら)、 やっぱマズイことがあるのかなってこと 今んとこ終了時にエラーが出たとか聞かないけど、ただ運が 良かっただけってこともあるし...



847:デフォルトの名無しさん
14/03/30 07:16:18.49 8jWWG5Ib.net
>>805
おそらく Form1、mythread などというDelphiレベルの話ではなく OS レベルでの話ということですよね。
私は調べたことがないので、直感でしかありませんが多分メインスレッドが先に終了することなどない
のではないでしょうか。有識者の解答をお待ちください。
いずれにせよそういう疑問を生じさせてしまうのは、死期がはっきりしないという
FreeOnTerminate := Trueの功罪だと私は思います。

848:デフォルトの名無しさん
14/03/30 12:50:46.18 B4XYVLF4.net
URLリンク(msdn.microsoft.com)

少なくとも >>805 で問題になることはない。ただグローバル変数ではなく同期オブジェクトを使うのが
望ましい。

>>806
FreeOnTerminateの功罪って意味不明。FalseならどこかでFreeしなきゃいけないし、Trueなら
勝手にFreeされるので止めた後はアクセスしちゃいけない、それだけ。それにプロセスの終了時は
Windowsがリソースの回収を行うので実際はFalseでもFreeする必要がない(好みじゃないけど)。

849:デフォルトの名無しさん
14/03/30 16:53:22.21 8jWWG5Ib.net
>>807
意味は・・・また話がこじれそうなのでやめときます。

850:デフォルトの名無しさん
14/03/31 14:32:49.41 rltgWKkD.net
この話まだ引っ張ってたのか
頭の固いキチ○イがいると大変だな…

851:デフォルトの名無しさん
14/04/02 23:46:20.07 /gW5Cj+p.net
ちょっとお知恵をお貸しください

アプリで二重起動防止とか、よくありますが
たとえば自分のPC(開発環境)だけは
二重起動を可能にする方法とかあります?

できれば、まったく同じ実行ファイルで実現したい

852:デフォルトの名無しさん
14/04/02 23:49:00.27 8b9j8yIQ.net
>>810
適当にテキストファイルでも何でもいいからファイルかフォルダを用意してそれがあれば二重起動可能にするとか
どうとでもなる

853:デフォルトの名無しさん
14/04/02 23:58:18.35 /gW5Cj+p.net
>>811
すばやいレス、ありがとうございます

その方向ですよね

あとは起動オプションを使うかですかね

854:デフォルトの名無しさん
14/04/03 00:49:18.37 HsT1tdMS.net
ミューテックス

855:デフォルトの名無しさん
14/04/03 01:38:25.85 CHv47MJA.net
DebugHook URLリンク(docwiki.embarcadero.com)

856:デフォルトの名無しさん
14/04/03 13:58:35.25 hMZDUBRj.net
>>814
ありがとうございます

ちょっと事情があって、開発環境のあるPCでは
Delphi IDE内で実行するときだけでなく
そのPC上で実行するすべての場合で
アプリの二重起動を可能にしたいので...

857:デフォルトの名無しさん
14/04/03 17:37:29.19 +zs34Az8.net
最近のDelphiはドットネットというのに乗せないと動かないとききました。

現状 Windows8.1 64bit の上でD6がいちおう動くようなのでとりあえず使ってるん


858:ですが、 やっぱり新しいのにしないとまずいことがあるのですかね? 機能的にはD6で十分なのです



859:デフォルトの名無しさん
14/04/03 20:36:01.67 Ug9VViSs.net
>>816
2004年くらいからタイムスリップしてきましたか?

860:デフォルトの名無しさん
14/04/03 21:14:58.98 e0k67vMi.net
おれもRAD XE2まで持ってるがDelphi7,CBuilder6ばっかり使ってるな

861:デフォルトの名無しさん
14/04/04 14:45:50.82 RM+Iq64G.net
6ではUnicodeにしかない文字を含むパスを渡されるとデフォルトでは読み込めないから
わざわざUnicodeに対応した処理を自分で実装しないといけないってのは面倒
自分専用ならパス側を書き換えて対処すればいいけど、外に出すアプリでそれは強要できないし6は正直無い
あと言語の拡張を考えると6と2009以降では生産性が倍以上は違うと思う
ただIDEの出来は6の方がよかった

862:デフォルトの名無しさん
14/04/04 15:30:05.33 YgvVnaBl.net
すみません、Delphi側でフォームを用意し、そこに入力した文字列を、ボタンを押す事によりFirefoxなどのブラウザの、例えば通販での個人情報入力フォームに反映させるようにしたいのですがどんなメソッドが必要でしょうか?

質問が下手で申し訳ありません
ちなみにDelphi7をWindows7で使っています
よろしくお願いします

863:デフォルトの名無しさん
14/04/04 16:00:36.20 Lb1wU2ET.net
>>819
倍も違うほど何が変わった?

864:デフォルトの名無しさん
14/04/04 16:18:07.61 ebHBrSE5.net
>>820
FireFoxのことは知らないけど
TWebBrowserを使って、Formなどの要素に書き込んだり
ボタンを押す動作を制御することはできる

検索すれば、いろいろと出てくると思う

865:デフォルトの名無しさん
14/04/04 19:32:30.17 Io3jP59G.net
>6ではUnicodeにしかない文字を含むパスを渡されるとデフォルトでは読み込めないから
>わざわざUnicodeに対応した処理を自分で実装しないといけない
一発変換かますだけだろ
自分で実装する必要はないわな

866:デフォルトの名無しさん
14/04/04 23:54:12.31 HNmjO1Jh.net
え?「c:\☑\☒.txt」っていうファイルを D6 の TMemo に読み込むのに「一発変換」という
簡単な方法があるんですか?

867:デフォルトの名無しさん
14/04/05 07:09:19.43 Jx7qT/sh.net
そういうわながあるのか。。   しかしまあ困るというほどではないかも。

868:デフォルトの名無しさん
14/04/09 16:31:22.56 PRO2eP0Z.net
>>823
一発変換って何?
SJISに変換できない文字があったらVCLのLoadFromFileじゃ絶対読めないけど。
例えば自分で実装せずにTStringList.LoadFromFileする一発変換ってどうやるの?
仮にファイル名に使われている文字がSJISの仕様内におさまっても、
ファイルの中身がSJISに変換できないUnicodeテキストだったらどうやって表示するの?
これも一発変換で表示できるの?

869:デフォルトの名無しさん
14/04/09 16:58:18.78 5wEyC0tG.net
すでにツッコミが入ってるだろーが

870:デフォルトの名無しさん
14/04/09 18:09:07.64 LeGZTXio.net
おまいらマジに
GetShortPathName
で変換することを知らんのか
ってかここは超初心者用だったな

871:デフォルトの名無しさん
14/04/09 18:25:26.16 Kpy3Opz4.net
なんであんなに必死なんだ

872:デフォルトの名無しさん
14/04/09 18:30:35.62 PRO2eP0Z.net
>>828
もしかして今は短いパス名をサポートしない環境があるのを知らない?
ってここは超初心者用だったな、すまん

873:デフォルトの名無しさん
14/04/09 19:08:57.91 2PCUc7IP.net
とりあえずそんなおかしな名前付けるな で済む

874:デフォルトの名無しさん
14/04/09 21:31:16.62 XdnhU9kU.net
他国とのやりとりをしていると平気で出てくるんだよ
ファイル名もテキスト内容も>うにこ

875:デフォルトの名無しさん
14/04/09 23:34:49.77 klWzwYGP.net
ファイル名はWideStringに入れて、Create


876:FileWでファイルをオープンして、THandleStreamで扱う、ってことになるわな。



877:デフォルトの名無しさん
14/04/11 14:55:10.26 UXPfM29I.net
831にとってはおかしな名前でも、その国の人にとっては常用する普通の文字だしな
まさに井の中の蛙だねぇ…

878:デフォルトの名無しさん
14/04/15 21:00:02.58 y7/bYr71.net
>>835
すべてoffという特性は、TRadioButtonには適していないと思う。

複数のTSpeedButtonのGroupIndexを同一にし、かつAllowAllUpをTrueにしたほうが良い気がする。

879:デフォルトの名無しさん
14/04/15 21:00:35.52 pnw/AVzK.net
procedure TForm1.Button1Click(Sender: TObject);
begin
RadioButton1.Checked:=not RadioButton1.Checked;
end;

TRadioGroup も考えてみて
procedure TForm1.Button2Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex<0 then
RadioGroup1.ItemIndex:=0 else
RadioGroup1.ItemIndex:=-1;
end;


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch