5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Delphi相談室その5

1 :デフォルトの名無しさん:02/06/01 17:53
Delphi関連の Tips Q&A はこちら。

■前スレ
Delphi相談室その4
http://pc.2ch.net/test/read.cgi/tech/1018211735/

■気楽な雰囲気がよければこちら
モナーの *やさしい* Delphi質問スレ Ver.7
http://pc.2ch.net/test/read.cgi/tech/1021201697/

■C#も含む話題はこちらに
C# 仲良し Delphi Round 2
http://pc.2ch.net/test/read.cgi/tech/1022662451/

つづく >>2-3 あたり

2 :デフォルトの名無しさん:02/06/01 17:53
■Delphi関連スレ
ミ,,゚Д゚彡フサギコのフサフサDelphi談話室B
http://pc.2ch.net/test/read.cgi/tech/1021554929/
★クライアントサイド最強の Delphi に物申す★
http://pc.2ch.net/test/read.cgi/tech/1001442200/
Delphiで小さな実行ファイルを作ろう
http://pc.2ch.net/test/read.cgi/tech/1009080085/

■過去スレ
Delphi相談室その4
http://pc.2ch.net/test/read.cgi/tech/1018211735/
Delphi相談室その3
http://pc.2ch.net/test/read.cgi/tech/1010153466/
Delphi相談室その2
http://pc.2ch.net/tech/kako/995/995950803.html
Delphi相談室
http://piza.2ch.net/tech/kako/971/971261573.html


3 :デフォルトの名無しさん:02/06/01 18:00
不要なusesを探す簡単な方法として
uses 節から 1つづつ取り外してはコンパイルしてみてエラーが出るかどうかという方法を使おうと思います
標準出力を得る為に無名パイプが必要になるので、
検索した所、サンプルコードはみつけました。
そこで、無名パイプ クラスを作ろうかと思います。

 既に誰か作って公開してあるのなら無駄なので、ご存知なら教えて下さい

4 :デフォルトの名無しさん:02/06/01 20:24
>>3
だからその方法は駄目だって。
usesから必要なユニット外してもコンパイルエラーでないことがある。

5 :デフォルトの名無しさん:02/06/01 21:34
>>4
なんで出ないの?

6 :デフォルトの名無しさん:02/06/01 22:34
>>4
自分もこの方法をよく使うもんで、どういった状況でそうなるのか気になる。
よければ教えて欲しいかも。あと、再構築とかだったらどうだろ?

7 :デフォルトの名無しさん:02/06/01 23:11
ミ,,゚Д゚彡フサギコのフサフサDelphi談話室B
http://pc.2ch.net/test/read.cgi/tech/1021554929/

このスレに同じ話題がある

8 :デフォルトの名無しさん:02/06/01 23:20
>>7
そのスレの148だな。なるほど。

9 :6:02/06/02 00:11
そういえば、前に自分もVCL標準クラスと同名のクラスでラップさせてたっけ。
褒められたもんじゃないけど、バグ対策だったか何かで・・・。
この場合、usesからユニットはずしてもコンパイルが通るね。サンクス >>7-8

10 :デフォルトの名無しさん:02/06/02 06:20
>>4
再構築ぐらいせえよ

11 :デフォルトの名無しさん:02/06/02 14:05
>10
( ´,_ゝ`)プッ

12 :デフォルトの名無しさん:02/06/02 23:08
今エディタを作っているのですが、Undo・Redoを実装するために
先入れ後出し配列を使おうと思います。
で、Stringを格納するクラスを作ろうと思うのですが、Contnrユニットにあるクラスを継承させるか、
TStringsList周辺のクラスから継承させるべきか迷っています。
どちらから継承させるのがベストでしょうか?

13 :デフォルトの名無しさん:02/06/03 00:08
>>12

TObject から。マジレスだよ


14 :デフォルトの名無しさん:02/06/03 00:37
>>12 作る必要なし。*後入れ先出しなら* TObjectQueue でいいじゃん
Redoの実装には Queue を2本用意するか、
循環リストを用意する必要があると思われ。
循環リスト作るならTObjectListでリングバッファとかな。

15 :デフォルトの名無しさん:02/06/03 01:10
>>12>>14
>*後入れ先出しなら* TObjectQueue でいいじゃん
後入れ先出し(LIFO)はQueueじゃなくてStackですが・・・

16 :14:02/06/03 01:17
イヤン
吊ってくる。

17 :デフォルトの名無しさん:02/06/03 01:34
じゃ、TObjectStack使っとけ。

18 :デフォルトの名無しさん:02/06/03 01:41
やっぱりTObjectStackですか
ありがとうございます

循環リストと後出しリスト2本、どっちが実行効率が良いでしょうか?
後出し2本だとUndo・Redoするたびにリストに追加/消すを行うことになるから、
やっぱりリング作ったほうがいいですかねぇ…

19 :デフォルトの名無しさん:02/06/03 04:32
リストの伸長に伴う再割当てのコストを考えると循環リストかね。
TObjectStack って事前に割当量を設定できないっぽいから。
どうせなら循環リストクラスを作って公開しておくれ >>12
用途を考えるとどこかに公開されてそうだが、見た記憶がない、、
作るなら13の言う通り内部に動的配列を抱えた TObject 継承かね。
基底クラスはPointerで扱ってTObject用に継承したのを用意する、と。
利用中にリングサイズを変更できる仕様でタノム
あとTOrderedListクラスと使用感が近いと好感度が高いかも。

20 :デフォルトの名無しさん:02/06/03 11:27
>>19
>リストの伸長に伴う再割当てのコストを考えると循環リストかね。
>TObjectStack って事前に割当量を設定できないっぽいから。

TObjectStackやTObjectQueueは配列とは根本的に異なるデータ構造を
しています。だから割当量を設定できないのも当然、再割当てのコストは
どのような状況でもほぼ一定です。

あと循環リストならTObjectQueueで代用可能じゃないかな?


21 :3:02/06/03 13:40
無名パイプで標準出力を取る事は出来るようになりました。
(結構難しかったです。 最初取り出した後、スレッドが終了できなくて困った)

ただ、パイプで出力を拾わなくても、終了コードが 0か1かで判定出来る
という事が判ってガックリです。

22 :名無し~3.EXE:02/06/03 15:24
前スレでタスクバーから表示が消せないと書いたものです。
前スレ936さんに教えていただいた
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
この方法では、最小化時にスタートボタンの上にタイトルバーだけ残るといった症状が表れてしまいました。

ShowWindow(Application.Handle,SW_HIDE);
これでは全く変化が無く、

RichEdit1.Lines.Assign( Memo1.Lines);
これだと実行時にWindowまで現れません。

Delphi Personalだからなのか、
OSがWin2kということで起こるのでしょうか?
どうかタスクバーから表示を消す良い方法を教えてください・・

23 :デフォルトの名無しさん:02/06/03 16:05
>>22
TIconHideってコンポーネントがそのものズバリなものだからソース見てみたら?

24 :22:02/06/03 16:29
>>23
ソース内にTiconありませんでした・・

25 :Delフサギコ ◆zE1iiRdQ :02/06/03 16:54
program Project1;

uses
 Windows,
 Forms,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
 ShowWindow(Application.Handle,SW_SHOW);

 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.
              _____________
  ,,,,,,,,,,,,,,,,∧,,∧   /
〜′,,,,,,,,,,ミ,,゚Д゚彡 < ゴルァ?
  UU"""" U U    \_______________


26 :デフォルトの名無しさん:02/06/03 17:11
>>25
ぶらくら?

27 :22:02/06/03 17:22
すみません、書きミスってました。

RichEdit1.Lines.Assign( Memo1.Lines);

→ Application.ShowMainForm := False;

28 :デフォルトの名無しさん:02/06/03 20:30
>>25 ShowWindow(Application.Handle,SW_SHOW);

なんの意味があるの?

29 :デフォルトの名無しさん:02/06/03 20:45
>>22

Becky! みたいに最小化するとタスクバーから見えなくするには

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private 宣言 }
public
procedure AppMinimize(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AppMinimize(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_HIDE);
Timer1.Enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := AppMinimize;
Timer1.Enabled := false;
Timer1.Interval := 5000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
ShowWindow(Application.Handle,SW_SHOW);
Application.Restore;
end;


30 :22:02/06/03 21:49
>>29
ありがとうございます。
でもShowWindow(Application.Handle,SW_HIDE);
が利かないんですよね。
一体何故なんだろう・・

31 :ビル・デイツ:02/06/03 22:42
デルファイ5。
フォーム1のボタンをくりくするとフォーム2を呼び出す。
このとき、フォーム2が表示されている間、フォーム1は最小化若しくは操作不能状態にする。
フォーム2を終了させると、フォーム1を元のサイズに戻し、若しくは操作可能状態にする。

というのは、どうすればいいのですか?

ちなみに、フォーム1のボタンに

form2.show;
form1.enabled := false;

フォーム2のボタンに

form1.enabled := true;
form2.close;

とかやってみたけど、だめだった。

32 :デフォルトの名無しさん:02/06/03 22:43
>>31
フォーム2.ShowModal;

33 :デフォルトの名無しさん:02/06/03 22:51
>>31
↓が常套手段だと思う

// Form2を開くメソッド
TForm1.OpenForm2;
begin
 Form2:=TForm2.Create(Self);
 Minimize;
 Form2.Execute;
Normalize;
 Form2.Release;
end;

procedure TForm2.Execute; // publicメソッド
begin
 ShowModal;
end;

Form2は自動作成しないでおくこと

34 :デフォルトの名無しさん:02/06/03 22:53
×Normalize;
× Form2.Release;
○ Form2.Release;
○ Normalize;
だったかな

35 :デフォルトの名無しさん:02/06/04 00:47
>>30
いったい、どうしたいのかわからない。
タスクバーに表示しないようにして、さらに最小化時にアイコン化
しないようにしたら、完全に消えてしまうような気がするが・・・。
どうやって復帰させるの?

どういうアプリなのか、複数のフォームがあるのか、それとも
タスクトレイにアイコンがあるのかもわからんし。
そうやって情報を小出しにされると答える側も萎えると思うんだが。

36 :22:02/06/04 00:55
>>35
すみません。
ランチャーを作っていて、タスクトレイに常駐させたいのです。
タスクトレイにアイコンを表示してあって、
現在そこから最小化、元に戻すはできます。
そこでタスクバーにも表示されると邪魔なので消したいのですが、
上記の通り何故か表示されたり、
表示されなくても最小化時にタイトルバーだけ残ってしまったりと、
おかしな現象が起きているのです。

37 :デフォルトの名無しさん:02/06/04 00:56
>>35
22は「教えてクン養成マニュアル」の実践者なのでしょう
こういう場合、放置が正しい扱い方かと思われ

38 :37:02/06/04 00:58
>>36
分かったよ・・・ごめんね

39 :22:02/06/04 01:08
>>37
嫌がらせはやめてもらえませんか?
私は自分なりにかなり調べたつもりです。
前スレと本スレにも書いてある通り
一般にタスクバーから消去する方法は試しています。
あなたが分からなくて暇だからと余計なことを書き込まないで下さい。
私は真剣にプログラミングについて勉強したいのです。

これ以上は荒しと同等と思われては嫌なので、
私の質問に対して答えてくださる方へのレスしか書き込みません。

原因や解決策がわかる方、どうかよろしくお願いします。

40 :デフォルトの名無しさん:02/06/04 01:12
つーか、トリップ付けろ。もしくは諦めろ。

41 :デフォルトの名無しさん:02/06/04 01:13
>>22
これじゃだめなのか?

type
   TForm1 = class(TForm)
      ApplicationEvents1: TApplicationEvents;
      procedure ApplicationEvents1Minimize(Sender: TObject);
   private
      { Private 宣言 }
   public
      { Public 宣言 }
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
   Hide;
end;

end.

42 :41:02/06/04 01:32
タスクバーから消すのは

program Project1;

uses
   Forms, Windows,
   Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
   SetWindowLong(Application.Handle, GWL_EXSTYLE,
      GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
end.

43 :22:02/06/04 01:37
>>41
だめっぽいです。
タスクバーにもでてきます。
でも2日も経って似たような症状の人の書き込みも無いので、
私の環境だけの特殊な症状なのでしょうか?
一度OSごと再インストールした方がいいのかな・・

44 :22:02/06/04 01:44
>>42
これではタスクバーからは消えるんですが、
最小化時Windowのタイトルバーだけ残ってしまいます。

>>41さんありがとうございます。
どうしてうちだけムリなんでしょう・・・

45 :デフォルトの名無しさん:02/06/04 01:46
>>41>>42の両方やってる?

46 :41:02/06/04 01:54
>>43
>>44
TForm1.Hide; で消えてたタスクバーに現れるって事?
それともTForm1.Hide; でフォームが消えないって事?

どっちにしても謎だな。これ以上はわからん。スマンな。

47 :22:02/06/04 01:55
さっき気付いてやってみました。
どうもありがとうございます。
できました。
>>41さん、ほんとありがとうございます
ご迷惑をおかけしましたm(__)m

48 :デフォルトの名無しさん:02/06/04 02:10
なんでトリップ付けないの?荒し?>>22

49 :41:02/06/04 02:42
>>47
両方やってなかっただけなのか。
そう書いとくべきだったか。スマンな。
まあ、うまくいってなにより。

ちなみに>>36
> 表示されなくても最小化時にタイトルバーだけ残ってしまったりと、
> おかしな現象が起きているのです。
は、おかしな現象でもなんでもない正常な動作だよ。

Delphiはサイズ0のアプリケーションウィンドウ(タスクバーに表示されるのはコレ)
があって、すべてのフォームはそのアプリケーションウィンドウに所有された
ウィンドウであることを覚えとくといいかもね。

50 :22:02/06/04 03:13
>>41
ご教授どうもありがとうございます。
> Delphiはサイズ0のアプリケーションウィンドウがあって
これは知りませんでした。
まだまだ奥が深いですね。
もっと勉強してきます!
ホントにありがとうございました。

51 :デフォルトの名無しさん:02/06/04 20:14
>>50 まだまだ奥が深いですね。

アプリケーションウィンドウの存在は、奥が深い、というより
VCL 実装上の理由によるので、欠点だと思っている人の方が
多いのだよ。

52 :デフォルトの名無しさん:02/06/04 20:17
>>22 の問題は FAQ なので、だれかが書いていたように、たんにソースつきの
コンポーネントをDLして解析するだけでは? 22 の Application ウィンドウ
の動作はどこか変なので、それを解明した方が根本的な解決につながると思ふ



53 :ビル・デイツ:02/06/04 23:16
>32

あ、そうか〜。

さんきゅです。

54 :ビル・デイツ:02/06/04 23:18
>33

いまいちよく分からないんですけど、このコードは、正しいんですか?

minimizeとかnormalizeだけの行が、エラーになるんですけど。

55 :デフォルトの名無しさん:02/06/04 23:30
normalize -> restore
じゃないかなー

56 :デフォルトの名無しさん:02/06/04 23:42
今日、エーアイ出版の本を買った。
30ページに「ディスクトップ」の文字を発見して、愕然とする。
今の版では直ってるだろうか?

57 :デフォルトの名無しさん:02/06/04 23:44
30ページに「150円引き」の文字を発見して、ぶちきれる。

58 :デフォルトの名無しさん:02/06/05 00:08
えーと、MainFormを非表示にするとタスクバーの表示が
消えてしまうのって回避する方法ってありますか?

MainFormと別のフォームを、一度に片方しか表示しないで
切り替えたいんだけど、途中でタスクバーの表示が点滅してしまい、
他にタスクバーに表示があると一番右端に動いてしまいます。

procedure TForm1.Button1Click(Sender TObject);
begin
 Hide;
 Form2 := TForm2.Create(Application);
 try
  Form2.ShowModal;
 finally
  Form2.Release;
  Show;
 end;
end;

こんな感じです.

これテストしてて気が付いたけど、もともとFormのVisibleをプロパティエディタで
Trueにしとくと、ShowModalって使えなくなるんですね・・・


59 :もういないんじゃねーの? ◆gnutn99c :02/06/05 00:10
まぁ、トリップ付けないから、こーなるわな(藁

60 :デフォルトの名無しさん:02/06/05 00:44
>>58
   (゚д゚)  Form2のOnActivate(OnShowだとタスクバーがちらつく)でForm1を消して、
  ~(  )− Form2のOnCloseでForm1を表示しる!
  / >

61 :デフォルトの名無しさん:02/06/05 00:48
>>60
ネタは放置しる!

62 :デフォルトの名無しさん:02/06/05 00:50
ネタなの?

63 :Delフサギコ ◆zE1iiRdQ :02/06/05 00:54
           _____________
  ∧,,∧    /
  ミ,,゚Д゚彡 < VCLのForm挙動にこだわるのは
  ,;゙  ミ     \_茨の道だよ。
 ミ.  ミ
/゛゛゛゛

http://homepage1.nifty.com/wizman/component/neosdi/index.html
これを使うと、なかなか改善されて鬱が解消されるかも。

64 :デフォルトの名無しさん:02/06/05 01:04
>60
できたー!ものすごくありがとう!誰だネタって言ってるのは.
しかし、あっさりできてちょっと鬱・・・俺の2時間・・・

>63
頂いたので、研究してみます

65 :デフォルトの名無しさん:02/06/05 15:48
C,C++でいうdoxygenのような
ObjectPascalで使えるドキュメント自動生成ツールはないでしょうか?

66 :65:02/06/05 15:50
age忘れました。

67 :デフォルトの名無しさん:02/06/05 15:51
ML入れ

68 :デフォルトの名無しさん:02/06/05 16:36
>>65
無いです。Delphiなんて業務じゃ使えないので。

69 :デフォルトの名無しさん:02/06/05 18:19
>>68
上司が無能だとお互い苦労するね、VBで組んだ方がいいシステム組めるとかって
錯覚してる奴多いよね、自分の能力がVBにマッチしてるだけなのにさ。
しかも、効率効率と五月蝿い上司ほど、VBが好きなのは笑える、効率重視ならDelphi使う
のが普通だろうに。まぁC#って選択もこれからはあるかもしれないけど、まだ安定性とか
未知な部分が多いからDelphiを使いたいよね。


70 :69:02/06/05 18:21
読み直してみたら、なんか俺誤解してる?

68は煽りなのかな(?_?;

71 :デフォルトの名無しさん:02/06/05 18:26
別に業務で使うわけじゃなくても、
doxygenやjavadocみたいにクラス階層や依存関係をビジュアルに出力してくれるツールは
便利だと思うが。
特にしばらくほったらかしにしといたコードを読む場合や他人が書いたコードを読む場合とか。

72 :デフォルトの名無しさん:02/06/05 19:17
>>65 無料のものを探してるの? 
有料なら
"ドキュメント自動生成 Delphi"で検索すれば出るでしょ
日本でDelphiのみのものが2つ、幾つか対応してるのも

73 :デフォルトの名無しさん:02/06/05 19:29
>>72
無料の物を探しています。

74 :デフォルトの名無しさん:02/06/05 19:33
>>73
じゃあ国内はこの程度かな

http://www2.big.or.jp/~osamu/
Unit Reporter非営利目的の使用はフリー

http://www.cyberware.co.jp
フリーウェアのVer 1.2では、Word未対応、グローバル変数、関数対象外



75 :デフォルトの名無しさん:02/06/05 19:49
>>74
両方使ってみたのですが全く使い物になりませんでした。
Unit ReporterはBDEが初期化できないというエラーが出て動かない。
D/Scribeは印刷プレビューしようとするとメモリを食い尽くしてしまってプレビューできない。
国内じゃなくてもいいので有名どころのツールは何か無いでしょうか?

76 :デフォルトの名無しさん:02/06/05 19:57
それとD/Scribeは印刷専用のようだったので、
できればHTMLやRTF等で結果が出力できればいいのですが…

77 :デフォルトの名無しさん:02/06/05 20:07
DocBuilderというのを海外で見つけたので使ってみましたが、
HTML出力は出来ましたが依存関係やクラス階層等を出力してくれないのと、
出力するHTMLがdoxygenに比べて気が利いていない感じです。
doxygenのdelphi対応版とか誰か作っていればいいんですが…

78 :デフォルトの名無しさん:02/06/05 20:08
>>77
自分でやってみたら?

79 :デフォルトの名無しさん:02/06/05 20:09
>>78
私にはそういう高度な事はできそうにないので…

80 :デフォルトの名無しさん:02/06/05 20:13
>>75
 BDEが初期化出来ないって、もしかしてD6パーソナル?
D/Scribeも自分の所では問題無かったし

海外版は自分で試してみて・・評価は教えてね
http://www.torry.net/tools_documentation.htm

81 :デフォルトの名無しさん:02/06/05 20:18
>>65
http://www.google.com

82 :デフォルトの名無しさん:02/06/05 20:32
>>80
Del6パーソナルです。
D/Scribeはこちらの環境ではプレビュー時にいくら待っても
プレビューしてくれなくてメモリだけどんどん食っていって
400MB位持っていかれたところで強制終了しました。

それとページ紹介ありがとうございます。
フリーのものを2つとも試してみましたが、
DelphiDoc v.2.0 …見た目はそれなりに良いが
依存関係や呼び出し関係等が出力できない
dpd3…印刷専用
という感じでした。

>>81
もう調べました。
DocBuilderもgoogleでみつけたものですし。

83 :デフォルトの名無しさん:02/06/05 21:17
rjPasDocはダメ?
http://www.zeitungsjunge.de/delphi/rjPasDoc/Index.htm

84 :デフォルトの名無しさん:02/06/05 23:03
>>54
 minimize→WindowState:=wsMinimized;
 normalize→WindowState:=wsNormal;
と読み替えておくんなせい


85 :デフォルトの名無しさん:02/06/06 06:32
おい、Delphi相談室その4より下がってるぞ!!

86 :デフォルトの名無しさん:02/06/06 11:30
あげてみた

87 :Delフサギコ ◆zE1iiRdQ :02/06/06 13:51
質問してみた。
________
|          .|
|  教えて!   .|
|_______|
∧,,∧||
ミ*゚Д゚||
〃 ⊃||

教えてくださいませ。
今更なんですが、コンストラクタとか
オブジェクトの生成についての質問っす。

引数付きコンストラクタを実装して
その引数の条件によってはそのオブジェクトを生成したくない

というものを作りたいとします。

例えば、
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1021888173&res=10
ここのTShortcutFile

constructor TShortcutFile.Create(FileName: TFileName);
begin
if not FileExists(ChangeFileExt(FileName,'.lnk')) then
raise Exception.Create('ファイルが存在しません');

inherited Create;

ShellLink := CreateComObject(CLSID_ShellLink) As IShellLink;
try
OleCheck(ShellLink.QueryInterface(IPersistFile,PersistFile));
くコ:彡 イカ略

こんな実装をしてます。

88 :Delフサギコ ◆zE1iiRdQ :02/06/06 13:55
で、使うときには
ShortcutFile1 := TShortcutFile.Create('C:\無題.lnk');
 try
  処理
 finally
  ShortcutFile1.Free;
 end;

こんな風にしているのですが...
これって、ちゃんと正しく動作しているんでしょうか?

今ひとつ不安なんでございます。

コンストラクタをキャンセルする
正しい書き方があるのなら、教えてくださいな。

            ___________
    ∧,,∧    /
  _ ミ,,゚Д゚彡_< これで大丈夫なん?
.=| |=U=U=| |= \
 | | .ミ   ミ | |    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 | |ノ∪''∪. | |
 | |      | |

89 :デフォルトの名無しさん:02/06/06 13:59
>>83
コンパイルでエラー出まくって試す事さえできませんでした。

90 :デフォルトの名無しさん:02/06/06 14:02
>>88
大丈夫。例外がでたらtryにすら到達せず、外側に飛んでいきますな。

91 :デフォルトの名無しさん:02/06/06 14:44
コンストラクタ内でのエラーは例外投げるのが常套句。
なぜかDelではあまり見ないが。

92 :デフォルトの名無しさん:02/06/06 14:57
Delphi 6 の Personal/Professional に Excel みたいな表を表示できる
コンポーネントはありますか? フリーなコンポーネントでもかまいません。

で、もし、あるとした場合ですが…

セルにチェックボックスみたいなのをつけることはできますか?


よろしくお願いします。


93 :無責任だが:02/06/06 15:08
Delphiのヘルプでコンストラクタについて
>コンストラクタの実行中に例外が生成された場合,Destroy デストラクタが
>自動的に呼び出されて未完成のオブジェクトが廃棄されます。

とあります。では、例外を使わずに、自前で解放する方法は無いかという事ですが
残念ながら良い方法はありません。

コンストラクタ内で free してしまっても
帰り値はfreeする前に一時的に生成されたアドレスが帰ってしまいます。
ではそれを無理やりnilにする方法は無いかという事になります。
例えば self:=0; としてしまうとどうでしょう?
そうすると、AfterConstructionという仮想関数の呼び出しが失敗します

無理やりの方法として調べた範囲内では
procedure AfterConstruction;override;
 とコンストラクタ呼び出し後の処理を継承して、この中でfreeした上で
asm
 mov esi,0
end;
とやれば、なんとか誤魔化せそうですが・・・・・ とりあえず例外使いましょう

例外でIDEが止まるの嫌なら Abortを使うとよいでしょう

94 :無責任だが:02/06/06 15:19
ただ>>87のような例の場合は コンストラクタをpublicにしないで

function ShortcutFileCreater(FileName: TFileName):TShortcutFile;

と関数で作成させるという方法も考えられます。
帰り値が nil なら作成出来ないと判断する訳です

もし、このオブジェクト生成作業に多様性を持ち込みたい場合はクラスメソッドにする方法もあります


95 :Delフサギコ ◆zE1iiRdQ :02/06/06 15:31
            _____________
   ∧,,∧    /
  _ ミ,,゚Д゚彡 _< これでステップアップ!
.=| |=U===U=| |= \
 | | .ミ   ミ | |     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 | |ノ∪''∪. | |
 | |      | |

確認なんですが
begin
 処理A

 ShortcutFile1 := TShortcutFile.Create('C:\無題.lnk');
 try
  処理B
 finally
  ShortcutFile1.Free;
 end;

 処理C
end;

この状態でTShortcutFile.Createで例外が発生すると
処理Cは動作しないですよね。


96 :Delフサギコ ◆zE1iiRdQ :02/06/06 15:31
                _____
      ∧,,∧___   /
    /ミ,,゚Д゚ミ/\<  あってる?
  /| ̄∪∪ ̄|\/ \_____
    |____|/

コンストラクタで例外が発生しても
処理Cを動作せせるためには

begin
 処理A

 try
  ShortcutFile1 := TShortcutFile.Create('C:\無題.lnk');
  try
   処理B
  finally
   ShortcutFile1.Free;
  end;
 except
  on Exception do
 end;

 処理C
end;

こんなのや

begin
 処理A

 try
  ShortcutFile1 := TShortcutFile.Create('C:\無題.lnk');
  try
   処理B
  finally
   ShortcutFile1.Free;
  end;
 finally
  処理C
 end;

end;

こんな風にするのでいいのでしょうか。

97 :無責任だが:02/06/06 15:32
クラスメソッドにする場合、

TShortcutFile = class
private
constructor Create(FileName: TFileName); //ホントのコンストラクタ は隠してしまいます

public
class function CheckCreate(FileName: TFileName):TShortcutFile ;
begin
if not FileExists(ChangeFileExt(FileName,'.lnk')) then result:=nil
else Result:=Self.Create(FileName);

と作成出来ない場合は nil を返してしまいます。
使う時には

ShortcutFile1 := TShortcutFile.CheckCreate('C:\無題.lnk');
if ShortcutFile1<>nil then with ShortcutFile1 try
 処理
finally Free end;

と使うので、使う時の外見上は>>93で無理やりnilを返すコンストラクタと区別はつきません

98 :無責任だが:02/06/06 15:41
>>95-96
 もちろんそれも正解です。
 しかし、コンストラクタで例外を出さないですむ関数やクラスメソッドの実装も
 追加しておくとより親切かもしれません。

99 :デフォルトの名無しさん:02/06/06 16:08
if foo <> nil then ...
が嫌だから例外投げるんだし
一つの機能を複数の方法で提供するのは混乱の元だ。

100 :デフォルトの名無しさん:02/06/06 16:22
>一つの機能を複数の方法で提供するのは混乱の元だ。

 なぜ? 色々な切り口を提供出来る方が混乱が少ないと思う
 実際 VCLでも同じ機能を実現する方法を複数用意してるでしょ?
 たとえば ShowとVisibl とか フォーカスの設定とか

>>96の場合は例外をネストして判り難くするより、 条件判断で処理
 した方がスマートでしょう?


101 :デフォルトの名無しさん:02/06/06 16:22
>>99
はげどう
使う方も保守するほうも。

102 :Delフサギコ ◆zE1iiRdQ :02/06/06 17:27
             __________
   ∧,,∧      /
  ミ,,゚Д゚彡  < かしこくなりました。サンクスコ
  ミ つ且~~   \___________
〜ミ,,,,,, ,,ミ

>>98
そっすか、正解でよかったです。
親切というよりかは>>95-96のコードは
美しくなさすぎなんで、
なんとかきれいになる、関数&クラスメソッドの方を
フサは使おうと思いますです。

>>100に俺は同意っす。
>>96がもっとスマートに書けるならともかく
書くの面倒だから、代替手段があってもいいのではないかしら?

103 :無責任だが:02/06/06 17:28
>>99
それはまあ、混乱すると思うならそれでいいと思うよ。
ただ、メモリが足りなくてもコンストラクタで例外が投げられてしまう。
だから例外は出来るだけリソース不足に統一した方がいいとも思うよ

こういう方法を使うと、使う方では例外を場合別けしなければいけなくなるわけで
それは複雑さを増してしまうという見方もあるんじゃないの?

と書こいてたら >>102 のレス・・・

元のソースを見るとTShortcutFileのコンストラクタとしてファイル名を引数
に取るからこういう問題が出るわけで、
 コンストラクタでは CreateComObject までにしておいて
function LoadShortCut(ファイル名):boolean;
function SaveShortCut(ファイル名):boolean;
 とメソッドを別に用意したほうがいいんじゃないの?


104 :Delフサギコ ◆zE1iiRdQ :02/06/06 17:39

    ∧,,∧  
   ミ,,゚Д゚彡
    ミ つ旦)~~
  〜と,,,~),,~) 

>元のソースを見るとTShortcutFileのコンストラクタとしてファイル名を引数
>に取るからこういう問題が出るわけで、

TShortcutFileは一例としてなんですが、
そもそもCreateで例外発生させるコードは
よろしこないですかねー。

> とメソッドを別に用意したほうがいいんじゃないの?
そういえば、TIconとかTPictureとかTFileStreameもそんな感じかな。
でも、TIniFileはそんな感じじゃないかも?...

105 :無責任だが:02/06/06 18:00
TIniFile は Createでは ファイル名を保存してるだけですよ。

その真似をするなら、
constructor TShortcutFile.Create ではファイルがあれば読み込みまでして
そのファイルが無くても例外にしない戦略の方がいいんじゃないの?



106 :無責任だが:02/06/06 18:05
あ! Createで例外発生させるのがダメというんじゃなくて、
(それは言語の機能だから好きにしたらいいんだけど)

コンストラクタでの例外はリソース不足とかに絞った方が使い易い事が多いというだけです。


107 :デフォルトの名無しさん:02/06/06 18:25
>>92
コーディングが苦でなければ、StringGridで実現できます。

簡単な方法として、StringGridの該当セルの上にチェックボックスを乗せて、
セルの中にチェックボックスがあるかのように見せかけるのが一般的ではないでしょうか。


コーディングが苦でしたら、フリーなコンポを使うことになります。

http://home1.infonia.ne.jp/~delphian/delphi/
この中から希望する機能が実現できそうなのを探して下さい。

D6パソにはありませんが、DBと連携させるならDBGridを使うことである程度は貴方の望んだ結果が
得られるかもしれません。

108 :デフォルトの名無しさん:02/06/06 18:47
>>97
スマートなクラスメソッド版のエラー処理ってこんな感じ?
>>96のはユーザーへのある程度のエラー原因の通知処理も含まれてるんだけど
どこがスマートじゃないんだろ。

ShortcutFile1 := TShortcutFile.CheckCreate('C:\無題.lnk');
if not Assigned(ShortcutFile1) then
begin
 ShowMessage('ショートカットファイル(名前は失念)を開けませんでした、
  原因は不明です。なにしろお馬鹿なTShortcutFile.CheckCreateメソッド
  がエラーの原因やファイル名を全て捨ててしまったからです。一番考え
  られるのは指定したファイル(ファイル名はわかりますか?)が存在しない
  ことですが、他にもアクセス拒否やメモリ不足、内部エラーなどあらゆる
  原因が考えられますのでがんばって原因を究明して下さい(藁');
 Abone;
end;

109 :デフォルトの名無しさん:02/06/06 18:57
>>108 そのエラーメッセージは間違っているみたいだよ
CheckCreateはファイルが無い時にだけnilを返し、そうでない場合はCreateを呼ぶんでしょ?
という事はメモリ不足やCOM生成失敗は例外が出るんでしょ?

だから、ショートカットファイルがありません とだけメッセージを出すべし


110 :デフォルトの名無しさん:02/06/06 19:02
>>108 バーヤバーヤ

111 :デフォルトの名無しさん:02/06/06 19:24
>>108
そういう細かいエラーメッセージはShowMessageに直接書かずに、
例外使って Exception.Message で処理した方が綺麗だと思う。

try
 ShortcutFile1 := TShortcutFile.Create('C:\無題.lnk');
 try
  処理
 finally
  ShortcutFile1.Free;
 end;
except
 on E:Exception do ShowMessage(E.Message);
end;

try .. finally .. end と try .. except .. end は根本的に用途が異なるので
入れ子になっても特に汚い記述だとは感じないが。。

112 :デフォルトの名無しさん:02/06/06 19:29
>>108は皮肉ってあのメッセージにしたんだろ。
見当違いだったけどナー

113 :デフォルトの名無しさん:02/06/06 19:47
raise

114 :無責任だが:02/06/06 19:54
うーん・・・掲示板で真意を伝えるのは難しいね。

だから、別に例外で伝えても悪い訳じゃないって言ってるのに・・・

ただ今回は、Createの引数のファイルが無くても TShortCutFileの
機能に支障はないわけで、逆にSaveShortCutFileが無いのが不思議なくらい。

で、最初の書き込み付近では、それを細かく見ていなかったけど、
他のVCLの実装と比較しても、ファイルが無いから即例外にするのはマズイな
と思った。 
なぜかというと、そのファイルが無かったらXXしたいという事は多い筈。
そして、この場合、ファイルが無いという例外のほかに、COMが作成出来なかった
場合の例外とかメモリが足りないような例外も飛んで来るから、ここで例外を
捕捉したら、場合別けして例外を投げ直す必要がある。

というような趣旨ね


115 :デフォルトの名無しさん:02/06/06 20:10
>>114
TFileStreamはCreateでopenできないと例外が飛ぶし
ほかもいろいろVCLで例外が飛ぶコンストラクタを持つクラスあるような。

116 :よく解らなくなってきた:02/06/06 20:17
アンケートにご協力を
1.コンストラクタ内で例外を生成して失敗を伝える。
2.リソース不足以外で例外を生成する。
3.コンストラクタ(相当のメソッド)がnilを返す。
4.エラーの種別によってnilを返すまたは例外を生成する。
5.スマート>>>>>>>>>>>>シンプル

私は
◎、○、×、×、△?

117 :デフォルトの名無しさん:02/06/06 20:33
1. ○ つーかそれ以外の方法で例外を伝えられてもなぁ。
    コンストラクタに変数引数でも付けるのか?
    それでも使えないインスタンスをいちいちFreeするより、例外の方がいいのでわ。
2. ○ こんな例ならいくらでもある。
    リソース不足以外で例外を使うべきではない、という考えの方が不自然。
3,4. × コンストラクタがnilを返すなんて、ObjectPascalの仕様から外れすぎ。
    最初からそういう仕様ならともかく、今になってそういう異端なことをしないでほしい。
5.  質問の意図がわからない。

118 :無責任だが:02/06/06 20:43
私は
1.○コンストラクタ内で例外を生成して失敗を伝えるしかありません。
2.○リソース不足以外で例外を生成しても問題ありません。
3.×コンストラクタがnilを返してはダメです
4.?エラーの種別によってnilを返すまたは例外を生成するのは普通では?
5?.コードは出来るだけ簡単であるべきです



119 :無責任だが:02/06/06 20:50
そもそも >>93でミスリードしてしまったのかな

言いたかった事は、
1)コンストラクタで例外を投げたら必ずFreeされる事
2)コンストラクタでnilを返す方法は無い事
3)だからコンストラクタでエラーなら例外を投げるべき

その上で、
 例外を投げてしまうと都合の悪い場合もあるなら 使い易いように
 関数でラップしておく方法もあるよという意見を追加したつもり

120 :デフォルトの名無しさん:02/06/06 20:51
自分流は、コンストラクタで例外を投げる。
メモリ不足だろうがファイルが無い(とか作れない)からだろうが、
いずれにしろ実行を継続できないから処理を中断しなきゃならないわけで。
結局のところユーザにエラーメッセージを示すということに違いはない。
エラーの内容によって処理を分けることってあんまし無さそうだけどなぁ。
あるかもしれんけど、そんときは例外クラスによって補足し分けるしか。

>>108
ファイル名は例外オブジェクトに保存しとけばいいだろ・・・と思いつつも、
VCLの例外クラスはそんな付加情報は持ってない模様。わろし。

>>109
ファイルは存在するけど読み取りアクセス権がないとか、ファイル形式が違うとかかも知れない。
戻り値 nil だけじゃ原因がわからん。

>>114
場合分けして投げ直すというのは解らん。
例えば EFOpenError だけ補足すればいいんじゃ?

121 :120:02/06/06 20:52
そうそう、コンストラクタでファイル名を指定しようが
LoadFromFile メソッドを別に作ってロードしようがどっちでも構わんけど、
nil を返すより例外を投げる方が良いってのが自分の主張なんで。そこんとこよろしく。

122 :よく解らなくなってきた=116:02/06/06 20:54
補足です。つーか説明端折り過ぎました。スマヌ。
3.これはclass function TMyClass.GetObject: TMyClassなどで
間接的に生成する場合も含みます。
4.これは3に○をつけた人のへの質問で、一つのコンストラクタTMyClass.Createの内部で発生したエラーの種別によってnilを返したり例外を返したりするということです。
constructor TMyClassCreate;
begin
 if foo then Result := nil // このコードは嘘です
 else bar then raise EMyClass.Create;
 // 成功
end;
5.これはおまけの質問でVisible, Showのように
一つの機能を複数の手段でアクセスできるようにすることを
ここではスマートと呼んでいます。要するに字面の見栄えの話です。
perl vs pythonの価値観といえば通じるでしょうか。

123 :無責任だが:02/06/06 21:48
やっぱり判ってもらえないようだから、こう書くべきだったというのを書くね
元ソース
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1021888173&res=10

自分の考えた方のクラス定義

type
 TShowCommand = (scNormalWindow, scMinimize, scMaxmize, scUnknown);
 TShortcutFile = class(TObject)
 private
  ShellLink:IShellLinkA;
  function GetHotKey: Word;
  function GetLinkFileName: TFileName;
  function GetShowCommand: TShowCommand;
  function GetWorkFolder: TFileName;
  procedure PutLinkFileName(const Value: TFileName);
  procedure PutWorkFolder(const Value: TFileName);
  procedure SetHotKey(const Value: Word);
  procedure SetShowCommand(const Value: TShowCommand);
  function GetArguments: string;
  function GetDescription: string;
  function GetIconLocation: string;
  procedure SetArguments(const Value: string);
  procedure SetDescription(const Value: string);
  procedure SetIconLocation(const Value: string);
 protected
 public
  function LoadShortcutFile(FileName: WideString):boolean;
  function SaveShortcutFile(FileName: WideString):boolean;
  constructor Create;
  destructor Destroy; override;
 published
  property LinkFileName:TFileName read GetLinkFileName write PutLinkFileName;
  property WorkFolder: TFileName read GetWorkFolder write PutWorkFolder;
  property HotKey: Word read GetHotKey write SetHotKey;
  property ShowCommand: TShowCommand read GetShowCommand write SetShowCommand;
  property Arguments  :string read GetArguments  Write SetArguments;
  property Description :string read GetDescription Write SetDescription;
  property IconLocation:string read GetIconLocation Write SetIconLocation;
 end;


124 :無責任だが:02/06/06 21:55
constructor TShortcutFile.Create;
begin ShellLink := CreateComObject(CLSID_ShellLink) As IShellLinkA;
end;
function TShortcutFile.LoadShortcutFile(FileName: WideString): boolean;
begin
Result := FileExists(ChangeFileExt(FileName,'.lnk'));
if not Result then exit;
  with ShellLink as IPersistFile do
  OleCheck( Load(PWideChar(FileName),0));
end;
function TShortcutFile.SaveShortcutFile(FileName: WideString): boolean;
begin
with ShellLink as IPersistFile do
 Result:= 0=
 Save(PWChar(FileName),False);
end;
function  TShortcutFile.GetHotKey: Word;
begin OleCheck(ShellLink.GetHotKey(Result));
end;
procedure TShortcutFile.SetHotKey(const Value: Word);
begin OleCheck(ShellLink.SetHotKey(Value));
end;
function TShortcutFile.GetLinkFileName: TFileName;
var pfd:WIN32_FIND_DATA ;
begin
SetLength(Result,MAX_PATH);
 OleCheck(ShellLink.GetPath(PChar(Result),Length(Result),pfd,SLGP_SHORTPATH));
Result:=PChar(Result);
end;
procedure   TShortcutFile.PutLinkFileName(const Value: TFileName);
begin OleCheck( ShellLink.SetPath(PChar( Value )) );
end;
function TShortcutFile.GetShowCommand: TShowCommand;
var ShowCmd:Integer;
begin
  OleCheck(ShellLink.GetShowCmd(ShowCmd));
  case ShowCmd of
   1: Result := scNormalWindow;
   7: Result := scMinimize;
   3: Result := scMaxmize;
  else   Result := scUnknown;
  end;
end;
procedure TShortcutFile.SetShowCommand(const Value: TShowCommand);
var ShowCmd:Integer;
begin ShowCmd:=0;
case Value of
  scNormalWindow :ShowCmd:=1;
  scMinimize   :ShowCmd:=7;
  scMaxmize   :ShowCmd:=3;
 end;  OleCheck( ShellLink.SetShowCmd(ShowCmd) );
end;


125 :無責任だが:02/06/06 21:55
function TShortcutFile.GetWorkFolder: TFileName;
begin
SetLength(Result,MAX_PATH);
OleCheck(ShellLink.GetWorkingDirectory(PChar(Result),Length(Result)));
Result:=PChar(Result);
end;
procedure TShortcutFile.PutWorkFolder(const Value: TFileName);
begin OleCheck(ShellLink.SetWorkingDirectory(PChar(Value)) );
end;
function TShortcutFile.GetArguments: string;
begin
SetLength(Result,MAX_PATH);
OleCheck(ShellLink.GetArguments(PChar(Result),Length(Result)));
Result:=PChar(Result);
end;
procedure TShortcutFile.SetArguments(const Value: string);
begin OleCheck(ShellLink.SetArguments(PChar(Value)) );
end;
function TShortcutFile.GetDescription: string;
begin
SetLength(Result,MAX_PATH);
OleCheck(  ShellLink.GetDescription(PChar(Result),Length(Result)));
Result:=PChar(Result);
end;
procedure TShortcutFile.SetDescription(const Value: string);
begin OleCheck(ShellLink.SetDescription(PChar(Value)) );
end;
function TShortcutFile.GetIconLocation: string;
var idx:Integer;
begin
SetLength(Result,MAX_PATH);
OleCheck(ShellLink.GetIconLocation(PChar(Result),Length(Result),idx));
Result:=PChar(Result);
end;
procedure  TShortcutFile.SetIconLocation(const Value: string);
begin OleCheck(ShellLink.SetIconLocation(PChar(Value),0) );
end;

126 :無責任だが:02/06/06 22:33
>>120
つまり、そもそも >>87のコードは既に CreateComObject が失敗すれば例外を出す
それなのに、わざわざ FileExists でチェックして例外を出して良いのかと聞くと
いう事は、 FileExists を特別視しているということ、つまりファイルが無ければ特殊な
事をしたい様子。 それならこういう方法もあるという説明をしてきたつもりであって
例外を投げるなという事ではないのだと
 だから、
>ファイルは存在するけど読み取りアクセス権がないとか、ファイル形式が違うとかかも知れない。
>戻り値 nil だけじゃ原因がわからん
 FileExistsがfalseを返す時だけ nil を返すというコートを示したのであって
 それは失敗だという意味ではない。ファイル形式が違うとかアクセス権の問題とは別という事
つまり>>87
 成功、失敗のほかに、引数のファイルが無いという3つの状態を返したかったのだと考えたから
 nilを渡す方法で3つの状態を返せるよと解説してきたつもり。

で、どうしてコンストラクタで3つの状態を返したいような事になったのかというと、プロパティを
コンストラクタで全部読み出して、プロパティはその静的な値を読むだけになっているから、
つまりCreateShortcutFile という関数を作っているけど、ReadShortCutFileで全部読み出せば
いいわけで、クラスにする必要が無いというか、クラス設計を見直した方がいいと

127 :デフォルトの名無しさん:02/06/06 22:54
Σ(゚Д゚ )y-~~ ナンダコリャ

128 :Delフサギコ ◆zE1iiRdQ :02/06/06 22:58
  ∧,,∧
Σミ ゚Д゚ミy-~~ ヨクワカンネー

誰かショートカットファイルをもっと
楽に使えるようにラプしてクレ

129 :無責任だが:02/06/06 23:10
え? >>123-125 でダメ?

ショートカットを 作る時の例

with TShortcutFile.Create do begin
  LinkFileName:=Application.ExeName;
  SaveShortcutFile(path+'MyApp.lnk');
end;


ショートカットを読むのは
with TShortcutFile.Create do begin
 LoadShortcutFile(path+'MyApp.lnk');
  Caption:=LinkFileName
end;

これ以上どう簡単にしろと?

130 :デフォルトの名無しさん:02/06/06 23:22
長ソース×3ベタ貼り+長文のコンボくらって、読む以前に

Σ(゚Д゚ )y-~~
  ∧,,∧
Σミ ゚Д゚ミy-~~

ってなったんじゃねーの?

131 :無責任だが:02/06/06 23:57
>>130
 なるほどね。 でもコッチも
 http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1021888173&res=10
 このコード読ませられたんだからお互い様だと思うんだが?

やっと ShortCutFileExists がやってるらしい事が判ってきた
 たぶんTFileListがファイル一覧を取るのだろうと思うから

function ShortCutFileExists(FolderName, ExeFileName: String): String;
var F: TSearchRec;
begin
 ExeFileName:=ExpandFileName(ExeFileName);
 //フォルダ名の最後が\で無ければ追加
 if copy(FolderName,Length(FolderName),1)<>'\' then FolderName:=FolderName+'\';
 with TShortcutFile.Create do try
  if FindFirst(FolderName+'*.lnk',faAnyFile,F)=0 then repeat
   result:= FolderName+F.Name;
   try
    LoadShortcutFile(result);
    Writeln(LinkFileName);
   if AnsiSameText( ExpandFileName(LinkFileName),ExeFileName) then Exit;
   except end;
  until FindNext(F)<>0;
 finally Free; end;
 Result := '';
end;

こんな感じの事をやってるんだと思う。 

132 :デフォルトの名無しさん:02/06/07 00:04
どうでもいいけど、デバッグしてるときに例外が出ると毎回止まるから
例外を使うのを妙に避けたがる人が多いような気がするんだが。

確かにちゃんと例外処理も書いてるのに、 StrToInt とかで例外を出され
ると禿げしく面倒なんだよな。

できればコンパイラ指令とかで、
「もうここはデバッグは終了したから、この部分を実行中に発生した
例外をデバッガは捕捉しなくてもいいよ〜」
みたいな機能があればいいんだが、そういうのって難しいのかな。
おしえて、エラい人。

133 :エライ人:02/06/07 00:09
>>132
貴様は「VB以外使っちゃダメ〜の刑」に処す!
はい次!

134 :無責任だが:02/06/07 00:11
>>132
 確かにデバッガオプションを動的に変更出来たら便利だね
  けど今日は疲れたからもう調べるのはいいや・・・

あと確かに StrToIntとかだと自分も 例外を使わずにValで検出する
それは例外を使わない方が少しだけ高速かもしれないとか期待してるからかも

135 :デフォルトの名無しさん:02/06/07 00:29
>>134  自分も ユーザ入力のチェックみたいな場面では Valだな それはやっぱり
例外でデバッカが止まるのが嫌ってのが大きい

でValで検出して abort投げたりして


136 :無責任だが:02/06/07 00:38
>>131 で Writeln はデバックの為に入れたのが残ってるだけだから

それから、もし、TFileListがサブディレクトリも掘ってゆく仕様なら

ShortCutFileExists を再帰的に呼び出す必要がある
 最初のループが終った後、Result:=''の直前に

if FindFirst(FolderName+'*.*',faDirectory,F)=0 then repeat
    Result:=ShortCutFileExists(FolderName+F.name , ExeFileName);
   if Result<>'' then exit;
  until FindNext(F)<>0;
  result:='';
end;

と3行追加すればいい。

137 :デフォルトの名無しさん:02/06/07 01:20
>>134-135
例えば、正の整数をEditから受け取りたいときに、

try
 n := StrToIntDef(Edit1.Text,0);
 if n <= 0 then raise Exception.Create('正の整数を記入してください。');
 その後の処理
except
 on E:Exception do ShowMessage(E.Message);
end;

みたいに、かなり気軽に例外を使ってる人って、もしかして少数派?
「処理を中断するような場合は例外を使う」というポリシーでソース
書いてるんで・・・

138 :Delフサギコ ◆zE1iiRdQ :02/06/07 01:40
  ∧,,∧  ソース貼ってるの見えなかった...
Σミ ゚Д゚ミy-~~            疲れすぎだYO
  さんくすこ、明日でも検証してみる。

 死後吐agaりが12:00だと
 フサはストレス氏しそうだゴルァ

例外を消すコンパイラ指令はないはず。
ブレークポイントで前後を挟むとヨシ。

>>137
少数派だと重います。
デバッガでとまるとヤだもん。

139 :デフォルトの名無しさん:02/06/07 01:44
複数のファイルを1つにまとめたいのですがどうしたら良いのでしょうか?
フォーマットは以下の通りです。
(図解)
http://www68.dns.ne.jp/~bbs2/upload3/helen/OB00012183.zip

----------------------------------------------------
・ファイルヘッダ                  (8)
・含まれるファイル数               (4) ファイルの数分つづく
▼ファイル情報
・ファイル名                    (32) ファイルの数分つづく
・ファイルのサイズ                (4) ファイルの数分つづく
・結合ファイルの先頭から
 目的のファイルのデータまでのオフセット  (4) ファイルの数分つづく
・ファイルデータ そのものズバリのファイルの中身ナカミ (不定)
----------------------------------------------------
※含まれるファイルの数は固定じゃ無いです

140 :デフォルトの名無しさん:02/06/07 01:52
>>139
どうしろ、といわれてもな。
とりあえずTFileStream使うとよさげ、とだけ言っとく。
Seekとか駆使してガムバレ。

141 :デフォルトの名無しさん:02/06/07 02:08
>>139
全然わからないけどこんな感じじゃ無いのかな?


Var
  FS : TFileStream;
  Buf1 : Longint;
  Buf2 : Boolean;
  Buf3 : Array [ 0..255 ] Of Char;
Begin
  FS := TFileStream.Create( 'C:\Temp\Test.Bin' , FmOpenRead );  Test.Binを読み出しモードで開きます
  ShowMessage ( InttoStr ( Fs.Size ) );  ファイルサイズを表示します
  FS.Read (Buf1, SizeOf ( Longint ) );  Buf1にLongint型のサイズ分だけデータを読み出します
  FS.Read (Buf2, SizeOf ( Boolean) );  Buf2にBoolean型のサイズ分だけデータを読み出します
  FS.Read (Buf3[0], 256 );    Char型配列Buf3に256バイトのデータを読み出します
  FS.Free;    オブジェクトのインスタンスを解放します ( 同時にファイルは閉じられます )
End;

転載元
http://member.nifty.ne.jp/deepforest/delfromv.htm


142 :デフォルトの名無しさん:02/06/07 03:49
>>138
> 例外を消すコンパイラ指令はないはず。
> ブレークポイントで前後を挟むとヨシ。

ブレークポイントでこういう事もできるのですね。(既に「ブレーク」ポイントじゃ無い気が)
しかしブレークポイントが保存されず、プロジェクトを開き直すと水の泡。
デスクトップの保存設定をONにしたら保存されましたけど窓のサイズとかまで保存されるのが嫌。
デバッグ関連の設定だけ保存する方法は無いかな…。

コメントを読む限りDebugHook変数が近い気がしたのですが、
試しに0とか2とか代入しても何も変わりませんし、何でしょうこれ。

143 :デフォルトの名無しさん:02/06/07 03:59
>>142
 {$D-}
 i := StrToInt(s);
 {$D+}
とかやると、{$D-}から{$D+}の間をサブルーチンも含めて実行中に発生
した例外はデバッガは無視する、とかいう機能が欲しいです。
ちなみに{$D}はすでに別の用途で定義済みだけど・・・



144 :デフォルトの名無しさん:02/06/07 04:13
>>143
例えばこうネストすると、*で発生した例外の扱いはどうなります?

procedure A;
begin
 {$D-}
 i := StrToInt(s);
 {$D+}
 j := StrToInt(t) {*}
end;

begin
 {$D-}
 A
 {$D+}
end.

…指令が実行文として変数を増減させなければならなくなる気が。

145 :デフォルトの名無しさん:02/06/07 09:56
StrIntDefだと例外飛ばさない。
また、デバッガオプションでEConvertErrorとかで止まらないよう設定しとけばいい。

146 :デフォルトの名無しさん:02/06/07 09:56
StrToIntDefだ

147 :デフォルトの名無しさん:02/06/07 11:45
>>145
例外を出したくないんじゃなくて、例外が出ても許容範囲内なら
デバッガに感知されたくないんですけど。
で、いつもEConvertErrorを無視してもらっても困る。
明らかにデバッグ済みの部分だけ無視してもらいたい。

やっぱ無理そうですね・・・

148 :デフォルトの名無しさん:02/06/07 13:02
>>147
ここで議論してる時間で自分が気に入るような変換関数を
つくったほうがいいのではないかと。

149 :デフォルトの名無しさん:02/06/07 13:14
ガーン━━━━(゚Д゚)━━━━!!!!!!

StrToIntDef等という関数があったのか。

Del2→Del6だったので全然しらなんだ…。

150 :デフォルトの名無しさん:02/06/07 13:22
>>139
質問
ファイルのサイズ、4バイト ってそれで足りるのかな?
どんなファイル使うのか分からないけど。
ファイル名ももう少し多い方が。

151 :148:02/06/07 13:23
>>148は勘違いなので無視して。

152 :デフォルトの名無しさん:02/06/07 13:29
デスクトップの保存をONにして、なおかつ必要な情報(ブレークポイント等のデバッグ設定)だけ
保存させるという事はできないのでしょうか?OpenToolsAPIに詳しい人とかいませんか?
保存のタイミングとファイル名さえ分かれば、後は*.dskから不要な行を消すだけでいけそうなのですが…。

>>148
例外を出さない変換関数、ではなく、例外は駆使したいのですが
それでデバッガがいちいち停止するのは面倒なので、
デバッグ済みの部分に関してはデバッガが例外を検知するかどうかを動的にON/OFFしたい、
という事なのですけど。

153 :152:02/06/07 13:31
うわ、微妙なタイミング。>>148さんごめんなさい。(最近こういうすれ違いが多い気がする自分)

154 :デフォルトの名無しさん:02/06/07 13:31
>>151が無視されたな

155 :デフォルトの名無しさん:02/06/07 13:32
別のアプローチとして、デバッグ中は別の例外を飛ばすとか。
本番用例外はデバッガで止まらないようにして。

156 :148:02/06/07 13:38
>>153
こちらこそ、ごめんなさい。
他の話題と混同したものでいいかげんなことを言ってしまいました。

157 :無責任だが:02/06/07 14:14
ちょっと見た感じ、

1)実際の例外は systemユニットの procedure _RaiseExcept; が本体で
  構造化例外APIのRaiseExceptionが呼ばれる

2)構造化例外は全てデバッカで一度捕捉されてしまう
  デバッガオプションで EAbort等については無視

3)try は以下の5行のアセンブラ出力に変換される(思ったより例外のコストは低い)
 xor   eax,eax
 push  ebp
 push  exceptのアドレス
 push  dword ptr fs:[eax]
 mov   fs:[eax],esp

4) exceptのアドレスには
system._HandleOnException;
 がある。

だから、やろうと思えば、system.RaiseExcept で
グローバル変数、デバックマスクフラグを用意し
そのフラグ値によってAPIの構造化例外の代わりに自前で例外を処理する
( ebpとfs:[0] を戻してアドレスにジャンプする)

ようにすれば、デバック中に場所によってマスクするような事が可能かも

158 :デフォルトの名無しさん:02/06/07 14:36
>>157
あ…同じようなこと考えている(w

RaiseExceptionProcというポインタを通じて例外が発行されている
(System.pasの初期化部でRaiseException APIのアドレスに設定される)ため、
これを独自ルーチンに上書きして例外オブジェクト(ESP + 24)をEAbortインスタンスにすり替え、
無視させることが(手元の実験では)できました。

でもこれをやってしまうと on EXXX do で種類分けして補足できなくなるので157さんの方法に期待。

159 :無責任だが:02/06/07 15:43
>>158 そうですか こっちはまだ巧くゆきません
 書換え可能なのは DLL のポインタ部だけなんで

function DllProcChange(new,old:pointer):Pointer;
var p:^Integer;
begin
p:=Pointer(integer(old)+2); //FF25 [xxxxxxxx]
p:=pointer(p^);
Result:=pointer(p^);
p^:=Integer(new);
end;
として
DllProcChange(@NewExcept,@RaiseException);
とやると、 Windows.RaiseException が書き換わってしまうし

@RaiseExceptionから手繰ろうとしても、@が先頭についてるからダメだし
system.pas を書き換えるのは嫌だしで難しいですね

160 :デフォルトの名無しさん:02/06/07 17:23
なんか珍妙なことやってるな。
ユニット単位でデバッグする・しないが
簡単に指定できるんだからそれでいいじゃん。

161 :デフォルトの名無しさん:02/06/07 21:44
dcc32.exeのコマンドラインオプションで、
-DDEBUG;CUSTOMなどとやって条件定義を追加できますが、
逆に条件定義をコマンドラインオプションで外すにはどういう風にすれば良いのでしょうか?
教えて下さい。

162 :139:02/06/08 03:07
突然このような仕様を投げられたので、とまどってました。
>>139の横の数字の単位はバイトです。わかりにくくてすいません。

こんなの
http://www68.dns.ne.jp/~bbs2/upload3/helen/OB00012462.zip

一応読み込んで見たところファイルの容量とかまでは取得できました。

163 :デフォルトの名無しさん:02/06/08 04:06
>>139 >>162
いや、別に仕様がわかりにくくて・・・ということじゃなくて、
課題を丸投げしている点に問題があるんですが・・・

164 :デフォルトの名無しさん:02/06/08 12:54
>>159
Systemユニットの@付き手続きのアドレスはインラインアセンブラで取れませんか?

mov EAX, offset System.@RaiseExcept

無責任ですが期待してます

165 :デフォルトの名無しさん:02/06/08 15:53
SJIS文字列をCR+LF←→\nに変換するロジックを
作ろうとしてるんだけど、どっかに転がってない?
とりあえず↓は見つけたけどCR+LF→\nの際に\nが
入っていた場合の考慮が足りないのでダメだった。
ttp://www.nifty.ne.jp/forum/fdelphi/samples/00355.html

で、作るとしてテストケースは以下で足りてるかレビューキボン
変換前にAdjustLineBreaksを使う事で#10のみ,#13のみの
テストはナシの方向で考えてる。

#13#10 ←→ \n
abc#13#10def ←→ abc\ndef
abc\ndef ←→ abc\\ndef
abc#13#10\n#13#10def ←→ abc\n\\n\ndef
abc\#13#10\def ←→ abc\\\n\\def
#13#10abc ←→ \nabc
abc#13#10 ←→ abc\n
\nabc ←→ \\nabc
abc\n ←→ abc\\n
#13#10#13#10#13#10 ← #13#10\n#13#10

166 :デフォルトの名無しさん:02/06/08 15:56
>>165 前スレだったかでやってたよ

 もし見つからなかったら、ここにコード書いてた筈だから探してごらん
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html


167 :デフォルトの名無しさん:02/06/08 15:58
>>165
表n ←→ 表n
(表はSJISで2byte目が \ )

>abc\ndef ←→ abc\\ndef
abc\\ndef ←→ abc\\ndef
じゃないの?

168 :無責任だが:02/06/08 16:22
なんか 昔書いたコードで今見たら恥ずかしいんだけど
////////////////////
// \エンコードをする
// \n=$0d$0a
function EncodeStr(const s:string):string;
function IntToHex2(d:integer):string;
 const c:array [0..15] of char ='0123456789ABCDEF';
 begin
  Result:= c[d div 16]+c[ d and 15];
 end;
 var i:integer;
begin
Result:='';
i:=1;
 while i<=length(s) do
  begin
  case s[i]of
  #0..#8,#10..#12,#14..#31,'"','''',',','=':
      Result:=Result+'\x'+IntToHex2(ord(s[i]));
  #9: Result:=Result+'\t';
  #13: begin
    if (i+1 <= length(s)) and (s[i+1]=#10) then
     begin
      inc(i);
      Result:=Result+'\n';
     end else
     begin
      Result:=Result+'\x'+IntToHex2(ord(s[i]));
     end
    end;
  '\': Result:=Result+'\\';
  else begin
    Result:=Result+s[i];
    end;
  end;
   inc(i);
  end;
end;


169 :無責任だが:02/06/08 16:24
////////////////////
// \デコードをする
// \n=$0d$0a
function DecodeStr(const s:string):string;
var i:integer;
begin
Result:='';
i:=1;
 while i<=length(s) do
  begin
  if s[i]='\' then
   begin
   inc(i);
   case s[i] of
   'x':
     try
     Result:=Result+ char(StrToInt('$'+s[i+1]+s[i+2])) ;
     inc(i,2);
     except end;
   'b': Result:=Result+#$08;
   'a': Result:=Result+#$07;
   'f': Result:=Result+#$0C;
   'r': Result:=Result+#$0D;
   't': Result:=Result+#$09;
   'v': Result:=Result+#$0B;
   'n': Result:=Result+#13+#10;
   else Result:=Result+s[i];
   end;
   inc(i);
   end else begin
   Result:=Result+s[i];
   inc(i);
   end;
  end;
end;

170 :165:02/06/08 16:58
>>166-169
早い&的確な反応ありがとう。
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1015685238&rm=50
のコードと168-169の両方を検討して気に入った方を使ってみる事にするよ。

>>167
"表" は忘れてたよ、感謝。で、変換仕様の方なんだけど
>>165:abc\ndef ←→ abc\\ndef
>167:abc\\ndef ←→ abc\\ndef
165の変換仕様で良いと思う。で、167のはこうなるかな
abc\\ndef ←→ abc\\\\ndef
何か考慮漏れが漏れてるだろーか

171 :165:02/06/08 17:44
>ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1015685238&rm=50
↑は早とちり。相談室3の674で出たAdjustLineBreaks+αの
動きをするコードっぽいので目的とは違ってたよ。
前スレ探したかったけどdat落ちでした。

172 :Delフサギコ ◆zE1iiRdQ :02/06/08 22:51
>何か考慮漏れが漏れてるだろーか

まずはテストコードを書くことが漏れている

             __________
   ∧,,∧      /
  ミ,,゚Д゚彡  <  コードで仕様をあらわすといいです
  ミ つ且~~   \___________
〜ミ,,,,,, ,,ミ

173 :下手人:02/06/08 23:37
ミ,゚Д゚;;彡.。oO(何でkage.exe最新版だとタブで開こうとするのでしょーか?)


174 :デフォルトの名無しさん:02/06/08 23:48
>173
かちゅスレ逝け

175 :165:02/06/09 00:22
>>168-169 を2バイト文字対応して、テストコードひっつけてみました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1023549124
ところで >>168は何故 "=" も\xnn変換する対象なのでせう?
引用符とかカンマはまだ分かるんですが。

176 :デフォルトの名無しさん:02/06/09 05:20
【質問】
MP3ファイルを自作ソフトに関連付けして再生させたいのですが、
MP3をダブルクリックしてソフトが起動するとこまでは出来ました
でも再生されません。
ファイル関連付けコンポーネントのプロパティの、

コマンドラインで、あるソフトに対して、このファイルが
”ドラッグ&ドロップされたよ”と通知することは不可能でしょうか?

177 :デフォルトの名無しさん:02/06/09 05:23
【補足】
すいません、書き込みミスりました。

ファイル関連付けコンポーネントのプロパティの
”起動時に渡すパラメータ”の部分だと思うのですが…



178 :デフォルトの名無しさん:02/06/09 07:21
そのコンポーネントの名前ぐらい挙げなよ

とりあえず、渡された値はParamStr, ParamCountで取れるんじゃないの?
DDEとかその辺のことはしらんが。

179 :176:02/06/09 09:14
すいません、こちらのコンポーネントです。

http://home1.infonia.ne.jp/~delphian/delphi/compo/system.html#SY0084


180 :デフォルトの名無しさん:02/06/09 10:03
>>176
>MP3ファイルを自作ソフトに関連付けして再生させたいのですが

自作ソフトに関連付けることができたとする。
そのファイルをエクスプローラでダブルクリックする、または
ShellExecute() から関連付けられた実行プログラムを起動する

ということはできてるわけですよね。

でも、その関連づけられた自作ソフトがコマンドラインパラメータを
解釈しないと意味がありません。178 さんのコメントを考慮する必要が
あります。

181 :デフォルトの名無しさん:02/06/09 15:03
特定の数字に0付けで4桁固定表示にするにはどうしたら良いですか?

4の場合 0004
12の場合 0012
です。

182 :デフォルトの名無しさん:02/06/09 15:05
(1)
IntToStrした結果に
10より小さかったら"000"
100より小さかったら"00"
1000より小さかったら"0"を付ける

(2)
Formatを使う

183 :デフォルトの名無しさん:02/06/09 15:06
>>161なんですが分かる方いませんか?
IDEからコンパイルした時は定義有り。
MakeFileからMakeした時は定義無し。
にしたいのですが。
もしかしてDelphiでmake使うような方はおられないのでしょうか?

184 :デフォルトの名無しさん:02/06/09 15:11
Format('%.4d' 〜〜〜)
で良いんですかね。


185 :デフォルトの名無しさん:02/06/09 15:23
∋oノハヽo∈
 (# `D´)ノ<つかってたしかめろ! なのれす!
         いちいちきくな!なのれす!

186 :デフォルトの名無しさん:02/06/09 15:43
娘ヲタが暴れてるな。

187 :モーヲタうざい:02/06/09 15:48
モーヲタうざい

188 :デフォルトの名無しさん:02/06/09 15:52
∋oノハヽo∈
 (# `D´)ノ<うるせーはげ!

189 :デフォルトの名無しさん:02/06/09 17:09
>>183
$UNDEF

190 :デフォルトの名無しさん:02/06/09 17:31
>>184
Format('%4.4d' 〜〜〜)

>>185
同感だけど、形式文字列のHelpは難解なことで有名だし…


191 :デフォルトの名無しさん:02/06/09 17:33
>>189
-$UNDEF ABC
-$UNDEF=ABCと試してみましたが両方とも効果がありませんでした。

192 :デフォルトの名無しさん:02/06/09 17:36
>>191
何じゃそりゃ(笑)

IDEのほうのプロジェクトオプションで識別子追加するのは駄目なの?

193 :デフォルトの名無しさん:02/06/09 19:48
>>191
いやそうじゃなくて、ソースに
{$IFDEF NOIDE}
{$UNDEF ABC}
{$ENDIF}
て書いておいたら、-DNOIDE で、ABCが定義されなくなるだろ。

194 :デフォルトの名無しさん:02/06/09 20:32
質問なんですが、横書きしたテキストを横にスクロールさせるのは何とかできますが、
(新幹線の中で出る、読売新聞ニュース◆ みたいな奴)

横書きにした文字を縦方向にスクロールさせる良い方法ってありませんか?
一行の表示領域で、できるだけウザくない方法で複数行のStringsを出したいのです。
(数秒おきに一行ずつペロっとスクロールするようなのが(・∀・)イイ)


195 :デフォルトの名無しさん:02/06/09 21:00
例外を無視させる方法ですけど、
ExceptionClass 変数に代入されているクラス参照の派生クラスにしかIDEは反応しないようです。
従って、適当な例外クラスをでっち上げ代入してやることで無視させることができました。

インラインアセンブラを駆使した努力は何だったんだ…

参考文献: DELPHI IN A NUTSHELL

196 :デフォルトの名無しさん:02/06/09 21:08
>>193
そういう事だったのですか。
dcc32 -?で
-$<dir> = Compiler directive
って出てくるのでそういう方法が出来るのかと思いました。
全てのソースファイルに書かなければならないみたいなのが
多少気が進まないのですが、ありがとうございました。


197 :A:02/06/09 23:02
>>194
したいことのイメージがあまりよくわかってないんだけど、
一端、裏でイメージ作って、合成してから、描いて見るとかどう?

198 :デフォルトの名無しさん:02/06/09 23:36
>>197
スミマセヌ、上手く説明できてないですね・・・。
電車の行先幕みたいな、一行が上下にスライドするモノを実現させたいんです。

試しにいろいろ描画してみます。

199 :デフォルトの名無しさん:02/06/10 00:07
(´-`)。o ○ (関連づけて、exe起動させてるけど、読み込んで無かったりして…<MP3)

200 :デフォルトの名無しさん:02/06/10 01:01
MSXML4を使いたいんですけど、
ActiveXの取り込みで一覧に"Microsoft XML"らしきものが
出てきません。ひょっとして別の名前がついているとか
そういうことはないのでしょうか?

201 :A:02/06/10 01:04
>>198
こんなかんじかな?
フォントと同じ高さの Image1 置いて、ブラシやフォントの色を適当に設定。
Interval を 100 にしたタイマーのイベントに、

with Image1.Canvas do begin
 FillRect(ClientRect);
 TextOut(0,0-T,'1行目');
 TextOut(0,Abs(Font.Height)-T,'2行目');

 Inc(T);
 if T>Abs(Font.Height) then begin
  T := 0;
  Timer1.Enabled := False;
 end;
end;

とか書いてみた。T:Integer はどっか消えないところに置いといて(笑

202 :デフォルトの名無しさん:02/06/10 01:20
>>201
あ、TImageのTextoutか!ありがとう、使ってみます!

203 :デフォルトの名無しさん:02/06/10 10:15
かちゅ〜しゃエクステンダーって
どういう仕組みなのですか?
ソースが手元に無くてもあんなことできるの?

204 :デフォルトの名無しさん:02/06/10 11:29
エクステンダーはビルダー製だよ。
Delphiでも一緒の事出来るけど。

205 :デフォルトの名無しさん:02/06/10 11:45
>>203 想像だけど、>>159のようにDLLへのリンクポインタを検索してそこでフックしてるんじゃないかな



206 :デフォルトの名無しさん:02/06/10 11:56
VC製だろ

207 :デフォルトの名無しさん:02/06/10 23:27
ひまわり製だろ

208 :デフォルトの名無しさん:02/06/11 01:18
Delphi6のForm1のイベントで、
OnMouseWheelUP Down の処理内容を例えばButton1Clickとすると、
ボタン1を2回クリックしたことになってしまいます。
これを1回クリックというようにできないでしょうか?

209 :デフォルトの名無しさん:02/06/11 02:32
>>208
え?
1回だけど

210 :デフォルトの名無しさん:02/06/11 02:58
>>208はホイールを回すときに手が震えて
2回分になってしまうに50ペリカ

211 :208:02/06/11 03:41
え、うちだけ?
>>210
そんなわきゃない・・。

なんでなんだろう・・
マウスが悪いのか??

212 :208:02/06/11 03:47
自己解決しました。
いや、解決はしてないけど簡単なプログラム作って試してみたところ、
確かに1回でした。
一体何が悪いのかはまだ分かんないけど自分でなんとかしてみます。
スレ汚しすみません・・

213 :208:02/06/11 03:59
やっぱおかしいや。
ボタンとメモを用意して、
procedure TForm1.FormCreate(Sender: TObject);
begin
x:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=x+1;
memo1.text:=inttostr(x);
end;

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Button1Click(Sender);
end;

ってしてホイールまわすと2ずつ増える・・

214 :デフォルトの名無しさん:02/06/11 04:37
>>213
バグってるぞ。
ホイールを処理したときは Handled := True; しる!

215 :208:02/06/11 04:52
>>214
そんな処理が必要だったのか・・。
Button1Click(Sender);
の下に
Handled:=True;
で治りました!
ありがとうございます!!

216 :デフォルトの名無しさん:02/06/11 23:39
>そんな処理が必要だったのか・・。
ヘルプちゃんと読んでないだけ

217 :デフォルトの名無しさん:02/06/14 21:37
VBのプロジェクトをDelphiに移植中…
すんげぇめんどくせぇ。
せめて、フォーム情報だけでも自動コンバート
してくれるようなツールがあったりしない?

218 :デフォルトの名無しさん:02/06/14 22:52
むしろDelphiのフォームをBCBに‥‥

219 :デフォルトの名無しさん:02/06/14 23:09
>>217
VBやっとけ。

220 :デフォルトの名無しさん:02/06/15 01:18
>>217

VBで作ってみては?

221 :デフォルトの名無しさん:02/06/15 16:38
>>217
Visual Basic to Delphi conversion program
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=17064

222 :デフォルトの名無しさん:02/06/16 00:48
かれこれ15年くらい悩んでいるので、教えてくれ。

フォームからクイックレポートを呼び出す。クイックレポートのデータソースはSQL。
SQLにはパラメタがあり、フォームに配置したリストボックスなどの値をパラメタに渡し、印刷する。

つまり、フォームで「日本」を選択して印刷ボタンを押すと「日本のデータ」が、「韓国」を選択して印刷ボタンを押すと「韓国のデータ」が印刷される、というようなのをやりたいのじゃよ。



223 :デフォルトの名無しさん:02/06/16 01:31
>>222はハツカネズミか何かなのだろうか。

224 :デフォルトの名無しさん:02/06/16 01:51
222は肝心の質問を書き込む前に天寿が尽きたのか……?

ところで、Delphi6でフォームやフレームを編集すると
ソースのあるディレクトリに.ddpってファイルができちゃうよね。
ダイアグラムなんて使う気ないし、ソースのアーカイブ
作るときに激しく邪魔。
このファイルを作らせないようにするか、dcuみたいに
別のディレクトリに隔離することってできないかな?


225 :デフォルトの名無しさん:02/06/16 05:48
ミキサー付aviプレーヤー(のようなもの)を作っています。
 
・多チャンネル(最大4チャンネル程度)のサウンドを別ファイル(wav)から再生
・各チャンネルで独立してボリュームを制御できるようにする
 
必要な機能は以上2点です。いまのところ映像と音声の同期は無視してます。
(十分処理速度が速ければ、ずれが無視できる程度に収まっている?)
 
QuadrupleDの中にあるDDSDを使って実現しようとしているのですが、
「メモリに入りきらない長大なwavファイルの再生」がうまくいきません。
(チュートリアルが中途半端なのもあって・・・)
 
他のコンポーネントを利用する方法でも構いませんので、どなたかご教示お願いいたします。
Delphiのバージョンは5です。

226 :222:02/06/16 11:19
スマソ。質問が抜けた。

で、フォームから、クイックレポートのSQLにパラメータを渡す方法がわからないんです。

227 :デフォルトの名無しさん:02/06/16 11:25
>>225
 自分はそういうのやるときは低レベルオーディオAPIで
 0.1秒程度のバッファを3つくらい順に回して再生させてる

それでwav ファイルでもサンプリングレートの違いを吸収する為に
acmAPIを使ってる

228 :デフォルトの名無しさん:02/06/16 13:47
モナースレで教えてもらえなかったので流れてきました。
Delphiで株のチャート分析&予想をするソフトを作ろうとしています。

色々とネットを検索したらTeeChart?,Tchart等を使う方法やPaintBoxを
使っている人等がいて、何でトライしたら良いのかいまいち良く分かりません。

お薦めの方法、あるいは参考になるサイトやスレがありましたら教えてください。
各方法の利点欠点だけでも結構です。
今まで画像系の処理はした事ないので四苦八苦してます。
出来るだけ、簡単に出来る方法を選びたいです。
最初から高機能は求めてません。

開発環境はD6パソ(自宅)&エンプラ(会社)です。
どうかよろしくおながいします。

229 :デフォルトの名無しさん:02/06/16 13:49
>>228












































230 :デフォルトの名無しさん:02/06/16 14:23
アプリをXPのビジュアルスタイルに対応させたくて、Webで調べて
Manifestファイルを使うとわかり、とりあえず見た目は対応させれたんだけど.

ListViewが表示されるフォームではどこでもとにかくエラーが出るんです.
なんだか、Del6だとアップデートすればいいみたいだけど、Del5では
どうしようもないんでしょうか?

231 :デフォルトの名無しさん:02/06/16 14:28
>>230
取りあえず出てるパッチ適応すれば?

232 :デフォルトの名無しさん:02/06/16 14:31
>>225
ActiveXからWindowsMediaPlayer取り込むのは?

233 :デフォルトの名無しさん:02/06/16 22:23
>231

UpdatePack1はあててます・・・

234 :230:02/06/16 22:54
補足です.

エラーになるのはListViewのViewStyleをvsReportにしてるときです.
どうも、ヘッダ部分の描写をしようとしたときに落ちるっぽいんですけど・・・.

HeaderControlのほうは大丈夫みたいですねー.

235 :230:02/06/17 00:29
うーん、一応自己解決したようです.海外サイトで解決策を発見しますた.

ComCtrls内、UpdateColumnの中で

 if FImageIndex <> -1 then
  fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES;

というところを

 if FImageIndex <> -1 then
  fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES
 else
  mask := mask and not (LVCF_IMAGE);

とするといいようです.意味はまったくわかってません(;´Д`)

商用アプリでComCtrlsをローカルにコピーして使うのはまずいのかなあ?



236 :230:02/06/17 00:53
・・・と思ったら、そういえば実行時パッケージ使うときは
この方法じゃできないんだった.鬱・・・.

237 :デフォルトの名無しさん:02/06/17 04:41
>>228
マルチポストかよ、たまんねぇーなぁ、
モナースレで十分にレスが付いてるようだが、
他に何が聞きたいんだ?

238 :デフォルトの名無しさん:02/06/17 09:25
>>237
いや、こっちに書き込んだ時はあちらでは何も教えてもらえませんでした。

239 :デフォルトの名無しさん:02/06/17 19:41
>>238
ttp://www.nifty.ne.jp/forum/fdelphi/faq/00146.htm

240 :デフォルトの名無しさん:02/06/17 22:01
>>239
参考にします。ありがとう。

241 :デフォルトの名無しさん:02/06/18 14:51
TLabelとTTimerを使って、分と秒のみのストップウォッチらしき物を作りたいのですが、
TDateTimeを使うと時間の所も表示されてしまいます。
時間部分を隠す方法って無いんですか?
無理だとすると、どういう方法で作るのが一番良いのでしょうか?
教えてください。

242 :デフォルトの名無しさん:02/06/18 15:37
>241
DateToStr関数を使ってみたりするとか。

243 :241:02/06/18 15:42
すまぬ誤爆だった。

ストップウォッチだったら、
自分で時間計算するのがベストかと。

Timeのインターバルを100にしておくとして、
それまでのカウントを数える数値をCounter:integerとする。
OnTimerが呼ばれるとCounterに1を加算して

Label1.Caption:=Format('%d分:%d秒:%d',[Counter div 600, Counter div 10,Counter]);
みたいな感じで。


244 :243:02/06/18 15:43
>243のところ名前ミス242つーことで。
あぅひとりで動揺してしまった...

245 :241:02/06/18 16:10
ありがとうございます。
でも、その方法だと、位が上がる時(パラメータの配列の2つ目が60になった時・3つ目が10になった時)
にその位が一0にならないような・・・

246 :デフォルトの名無しさん:02/06/18 17:06
>245
はっ...そういえばそうでした。
その場合は、
Label1.Caption:=Format('%d分:%d秒:%d',[Counter div 600, Counter div 10 mod 60,Counter mod 10]);
こうしてみるといけるかも。


247 :デフォルトの名無しさん:02/06/18 17:32
FormatDateTime('nn:ss', hoge);

それにしてもDelphiはオブジェクト指向じゃないな。

248 :デフォルトの名無しさん:02/06/18 17:36
hoge.FormatString('nn:ss');

249 :248:02/06/18 17:47
     ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/< 先生!>>248は無視してください!
 _ / /   /   \___________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
    .||          ||

250 :241:02/06/18 18:10
>>246
いい感じっす!
でも分の所を常に2桁表示したかったので、以下の様に書いてみましたが、おかしいですよね?w

Inc(Counter);
if Length(IntToStr(Counter div 10 mod 60)) = 1 then
Label1.Caption := Format('%d分0%d秒%d', [Counter div 600, Counter div 10 mod 60, Counter mod 10])
else
Label1.Caption := Format('%d分%d秒%d', [Counter div 600, Counter div 10 mod 60, Counter mod 10]);


251 :デフォルトの名無しさん:02/06/18 18:27
%0dってしっとるけ?
Timerって正確じゃないよ。

252 :A:02/06/18 19:52
>>241,243
OnTimerって、たぶん、確実に呼び出される保証が無さそうな気がするから、
スタートした段階の時間を覚えておいて、それと現時刻との差で計った方が
いいかも。

253 :241:02/06/18 20:12
>>251
形式文字列っていうのは、時間以外はよくわかってないです。
今ヘルプ見たけど、精度指定子っていう物で2桁表示にするんですかね?

>>252
StartTime, StopTime, PassageTime: TDateTime;だとすると、
スタートの時に
StartTime := Time;
ストップの時に
StopTime := Time;
PassageTime := StopTime - StartTime;
Label1.Caption := TimeToStr(PassageTime);
みたいな感じでしょうか?
それだと途中経過が出ないような?
どこかのスレでTTimerは精度が低いからTimeGetTimeを使った方がいいという書き込みは見た記憶がありますが、よくわかりません。

254 :デフォルトの名無しさん:02/06/18 20:43
>253
GetTickTimeでもよさそうなきがする。
ところでストップウォッチって精度はいかほどを考えてるの?


255 :241:02/06/18 20:58
>>254
特に精度は気にしてないです。
>>241の様な質問や、>>250みたいなコードを書いてる時点で俺はドキュソケテーイなので、
簡単なことからゆっくりやってみたいと思っています。
結局、>>241の答えとしては、
Inc(Counter);//Counter: Integer;
Label1.Caption := Format('%d分%0d秒%d', [Counter div 600, Counter div 10 mod 60, Counter mod 10]);
が最強なんですかね?
秒以下を一桁しか表示しないなら、TDateTimeを使って、IncMilliSecond(Counter)とやってもできる気がしてきましたが・・・(^^;

256 :241:02/06/18 21:13
げっ、>>255じゃあ2桁にならないですね。^^;

257 :デフォルトの名無しさん:02/06/18 21:22
いいかげんTDateTimeとFormatDateTimeでやればいいじゃん。

258 :デフォルトの名無しさん:02/06/18 23:12
>>255

フォームにラベルとボタンを2つ貼って、以下ようにすればどーなのさ。
このまんまじゃ、不都合もあるけど、こんな感じでどーよ。


Button1でスタート Button2でストップ でも、一旦スタートすると終了させる前に button2を押さないと終われない罠


var
 StartDate:int64;

procedure TForm1.Button1Click(Sender: TObject);
  procedure timeLoop;
  var
    wStr:String;
    wTT:TTimeStamp;
  begin

    while StartDate<>0 do
    begin
      wTT.Time:=GetTickCount()-StartDate;
      wStr:=FormatDateTime('nn:ss.zzz',TimeStampToDateTime(wTT));
      Self.Label1.Caption:=wStr;
      Application.ProcessMessages;
    end;

  end;

begin
  
  StartDate:=GetTickCount();
  timeLoop;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  StartDate:=0;
end;


259 :241:02/06/19 08:13
>>257
できないっす!・゜・(ノД`)・゜・
var
PassTime: TDateTime;

procedure TForm.Timer1Timer(Sender: TObject); //Interval は 1
begin
IncMilliSecond(PassTime);
Label1.Caption := FormatDateTime('n:ss:zzz', PassTime);
end;

これじゃダメなんすか?

>>258
かなり凄くて感動しましたけど、理解不能です、すいません。
Timerを使わないでできる仕組みとか、ヘルプに載ってないGetTickCount、Button1Clickのヘッダーとbeginの間にまた手続きらしき物があるとか・・・
GetTickCountっていうのはAPI関数っていう物でしょうか?
わからんことだらけです。

260 :デフォルトの名無しさん:02/06/19 10:34
>259
GetTickTimeはWin32APIです。
Windowsの起動からの経過時間をmsecで取得するので
Timerのインターバルあたりで、差分を表示すれば
ストップウォッチらしいものができると思います。

私は、楽なので計算や表示の時間を計るときの目安としてこのAPIつかってます。

261 :デフォルトの名無しさん:02/06/19 13:18
>>259
>Button1Clickのヘッダーとbeginの間にまた手続きらしき物がある

procedure や function の中に、その手続きや関数内でだけ使える関数を書く事が出来る。

procedure aaaa(xxx);

 procedure aaaa1;
 begin
  処理
 end;

 procedure aaaa2;
 begin
  処理
 end;

var
 i:integer;
begin

 for i:=1 to 10 do aaaa1;
 for i:=1 to 20 do aaaa2;

end;

こんな書き方が出来るようになる。

慣れると便利、特に再帰処理書きやすくなるから絶対に慣れておくべき。

GetTickCountは、D6のヘルプには載ってますが?
経過時間を扱う場合には、引き算1つで差が算出できるので普通使うでしょ、
覚えておいて下さい。


262 :241:02/06/19 13:46
>>260
GetTickCountですよね。ありがとうございます。
これ、TDateTimeに代入しても、Integerに代入しても大丈夫なんですね。
具体的に使ってみたかったんですが、

procedure TForm1.Button1Click(Sender: TObject);
var
 T: TDateTime;
begin
 T := GetTickCount();
 ShowMessage(FormatDateTime('hh:nn:ss', T));
end;

これはどこがダメですか?00:00:00と出ます。

>>261
なるほど、ローカルな関数みたいな感じでしょうか、ありがとうございます。
ヘルプに載ってますか?
俺のには載ってないみたいですが・・・。
キーワードで調べても出てきません。

263 :デフォルトの名無しさん:02/06/19 15:10
>>262 ダメな理由は TDateTime型は浮動小数点で1日単位のデータだから

だから、割算が必要
例:
 Caption:= FormatDateTime('hh:nn:ss', GetTickCount/(1000*60*60*24) );

---------------------------------------------
 ついでに、それを使わないで整数演算でする場合は

var OldCnt:Cardinal;
procedure TForm1.Button1Click(Sender: TObject);
var NewCnt,dt:Cardinal;
begin
NewCnt:=GetTickCount;
dt:=NewCnt-OldCnt;
Caption:= format('%02d:%02d:%02d.%02d',
  [ dt div(60*60*1000)
  ,(dt div (60*1000)) mod 60
  ,(dt div (1000)) mod 60
  ,(dt div (10)) mod 100]);
OldCnt:=NewCnt;
end;


264 :デフォルトの名無しさん:02/06/19 16:37
>>262
あなた他人の話聞いてる(読んでる)?それとも、ちょっと読んで理解できなかったら
読まないようにしてるのかな?

判らない部分があったら Help -> MLログ -> google の順で調べて下さい、でないと、
永久に自分ではプログラム作れませんよ。

因みに、
ローカル宣言についてはヘルプにもマニュアルにも記載してあります。
ヘルプの目次->Object Pascal言語ガイド->手続きと関数->ローカル宣言 でどーぞ。

ヘルプはキーワード検索だけじゃなくて、暇なとき 目次の内容も読んでください、Pascalに
慣れていない人や我流な人(私もだが)にはとても有益な情報が密かに詰まってたりします。
(Delphiのヘルプは印刷物のマニュアルの内容と同じです。)

265 :241:02/06/19 16:42
>>263
おおお、できました!
ありがたや、ありがたや。
後半はストップウォッチみたいな物ですか?
やってみたら、2回目以降は、前に押してからの時間が出ます。
1回目は謎な時間が出てしまいますが・・・。^^;

>>259はどこがダメなんでしょうか?

266 :デフォルトの名無しさん:02/06/19 16:50
>>265
(n-1回目の時間)−(n回目の時間)

ってやってるだろ?n=0ならどうなる?
プログラム以前に・・・。

267 :デフォルトの名無しさん:02/06/19 19:37
プログラミングにも当然ながら、向き不向きがあるのよね


268 :225:02/06/19 20:13
亀レスすみません。
その後色々と試したのですが、>>232さんの方法で何とか実現できました。
ありがとうございます。

あまりにも取り込み→利用が簡単で驚きました・・・(;´Д`)

269 :デフォルトの名無しさん:02/06/19 22:09
今大学でDelphiを習ってるんですけど
全然分からないんですけど、
どうすれば 皆さんのように分かるようになりますか?

270 :デフォルトの名無しさん:02/06/19 22:13
>>269
ヘルプ片手に試行錯誤の連続。

271 :デフォルトの名無しさん:02/06/19 22:21
プログラムってさぁ、習うものじゃないよね

272 :デフォルトの名無しさん:02/06/19 22:23
>>271
言語(道具)やアルゴリズムやデータ構造(基礎となる部品)を習うことは否定しない。
でも、何を作るか、どう工夫するかは自分の頭で考え体で実行しないとダメでしょう。

273 :デフォルトの名無しさん:02/06/20 01:01
>>269
何かを作りたい!という目的を持つ、これ最強。

274 :素人:02/06/20 01:25
オレは「分かるように」なってるかどーかは知らんが、
1.○○するツールが作れないかなぁ?
2.そのツール作るにはどーすればいいのかなぁ?
3.ネットで検索してヒントから学ぶ
こーゆー形で理解してきたが…。
よーするに「必要」から、と。後は>>273に同意。

275 :デフォルトの名無しさん:02/06/20 02:30
>>何かを作りたい!という目的を持つ、これ最強。

おおむね同意。
ヒトによっては、熱意だけあって、激しいクレクレ君に変身する場合もあるので。

276 :241:02/06/20 05:34
>>264
他の人が教えてくれた物は、Helpで調べるとかして、できる限り理解する様に努めています。
手続き・関数のローカル宣言はよくわかりました、ありがとうございます。

>>266
>>263
Button1を一回押した時点では、OldCntには何も代入されていないから、
NewCntの値、つまりGetTickCountの戻り値がそのままCaptionになるということですよね。

277 :デフォルトの名無しさん:02/06/20 07:08
TraceRouteコンポーネントってどこかにありませんかね?
Delphi5 で動くフリーの奴


278 :デフォルトの名無しさん:02/06/20 08:42
>>259
IncMilliSecondは手続きではなく、関数ですよ。(Incは手続きだけど)

だから PassTime := IncMilliSecond(PassTime); にしなきゃダメだと思う。

どれくらいの誤差が出るのか、さきほどこの方法で自分でやってみましたけど、
MSecの百の位が秒を刻んでる様に見えるほどの誤差でした。(藁
こんなにTimerって誤差があるのか・・・

279 :デフォルトの名無しさん:02/06/20 10:44
>>277
Indy のデモプログラムじゃだめか?

280 :デフォルトの名無しさん:02/06/20 16:02
>>278 インターバルタイマは分解能せいぜい1/30秒しかないから

281 :デフォルトの名無しさん:02/06/20 17:12
>280
マルチメディアタイマー使えばいいんだと思うけど
やはりGetTickTimeを使うのがいいのかな...

282 :デフォルトの名無しさん:02/06/20 17:39
>>281
 GetTickTime って何?

GetTickCountの事なら ストップウオッチの応用なら Now を使えばいいと思うけど?
たしか精度同じ程度でしょ

マルチメディアタイマも単位は msだし、使い難いから
実行時間を計算するような場合はパフォーマンス カウンタを使う方がいいと思う
RDTSC命令を呼ぶか QueryPerformanceCounter を使うか

283 :デフォルトの名無しさん:02/06/20 19:51
ストップウォッチの計時にタイマを使うのは、精度を考慮するとダメです。
GetTickCount や Now など時刻を基準として差をとるべきです。

241の問題で残っているのは、単に表示の仕方だけ。

284 :デフォルトの名無しさん:02/06/20 20:01
>>283

計時関係の精度について

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q172338

によると

Several timers of differing accuracy are offered by the operating system:

Function Units Resolution
---------------------------------------------------------------------------
Now, Time, Timer seconds 1 second
GetTickCount milliseconds approx. 10 ms
TimeGetTime milliseconds approx. 10 ms
QueryPerformanceCounter QueryPerformanceFrequency same

したがって GetTickCount がもっとも手軽で精度も通常用途では十分だと
思われる。タイマなど時間間隔をつかった計時は、誤差が累積するので
時刻差を利用したほうがよいのは当然。

285 :デフォルトの名無しさん:02/06/20 21:33
>GetTickCount
NT系ではデフォルトの精度が10msecなので、
timeBeginPeriod(1);
を忘れるな。


286 :デフォルトの名無しさん:02/06/21 10:15
レビュー求ム!

カンタン!Delphiプログラミング―あなたにも作れるWindowsプログラム 日経BPパソコンベストムック
http://www.amazon.co.jp/exec/obidos/ASIN/4822216888/
Delphiパーソナルプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4839907161/
Delphi Graphic Secrets―Know‐how & Libraries
http://www.amazon.co.jp/exec/obidos/ASIN/4797319224/
Delphi 6 プログラミングバイブル
http://www.amazon.co.jp/exec/obidos/ASIN/4844316346/

287 :デフォルトの名無しさん:02/06/22 08:57
質問です。
時刻と時間の違いに関してですけど、時刻を扱う時はTDateTimeを使えばいいとして、
時間を扱う時はTDateTimeを使っていいのでしょうか?
それとも、カウンターとして整数型の変数を利用した方がいいのでしょうか?

288 :デフォルトの名無しさん:02/06/22 11:04
>>287
TDateTime を使ってもよいと思うが、時間間隔を TDateTime に変換する
コストや変換にともなう誤差を考慮すると、わざわざ TDateTime に変換する
意味はないと思うよ。
例えば、GetTickCount で時間差を計時すると、ミリ秒単位での数値が得られ
るわけですから、これを時間、分、秒に換算するのは簡単です。どこにも
TDateTime への変換を考慮する必要はありません。

289 :デフォルトの名無しさん:02/06/22 11:24
delphi5を使っているのですが、検索ダイアログや、エディタのタブなんかのフォントサイズが突然変わり、
一旦delphiを再起動すると治る。 ってな症状が出てるの俺だけですか?

290 :デフォルトの名無しさん:02/06/22 11:30
>>289
オレもD5sp1ユーザだが、そんな経験はしたことない

291 :デフォルトの名無しさん:02/06/22 12:43
テーブルの値を、ボタンを押したら一括して変更するようなのは、どうすればいいんですか?

例えば、ある項目値が全て0のとき、ボタンを押したら全て1にしたいとき、

SQLで
dataset.sql.add('update table1 set yn=1');
とやってみたり、
while not(table1.eof) do
table1.start;


292 :デフォルトの名無しさん:02/06/22 12:45
間違って送信しちまったぜ。

テーブルの値を、ボタンを押したら一括して変更するようなのは、どうすればいいんですか?

例えば、ある項目値が全て0のとき、ボタンを押したら全て1にしたいとき、

SQLで
dataset.sql.add('update table1 set yn=1');
とやってみたり、
while not(table1.eof) do
begin
table1.start;
table1.fieldbyname('yn').asinteger := 1;
table1.next;
end;

みたいなことをやってみても、エラーになってしまいます。

293 :デフォルトの名無しさん:02/06/22 12:47
table1.start;
table1.fieldbyname('yn').asinteger := 1;
table1.next;
table1.start;
table1.fieldbyname('yn').asinteger := 1;
table1.next;
table1.start;
table1.fieldbyname('yn').asinteger := 1;
table1.next;


294 :デフォルトの名無しさん:02/06/22 13:08
>>288
上の方を読んで、精度が必要な時はGetTickCountの差で求めるのかなと思ったのですが、
基本的に時間を使う時はGetTickCountの差で良いってことですかね。
教えてくれてアリガトです。

295 :デフォルトの名無しさん:02/06/22 13:14
>>294
GetTickCountが一周して0にもどってもいいように処理してね。

296 :デフォルトの名無しさん:02/06/22 13:19
>>289
リソース不足なんでは?
以前Win98で使ってて、リソース不足でフォントが異様に大きくなり、
その製でスクロールバーが馬鹿でかく膨らんだ経験あり。

解決策は、NT系に乗り換えること。
とはいえNT系でも無尽蔵なわけでもないが。

297 :デフォルトの名無しさん:02/06/22 13:26
>>294
googleで調べてみるとtimeGetTimeの方が精度いいみたいですね。

298 :デフォルトの名無しさん:02/06/22 13:40
>>292
Startなんてメソッドはないよ。Firstです。

Table1.First;
Table1.Edit;
while not Table1.EOF do
begin
Table1.FieldByName('field1').AsInteger := 1;
Table1.Next;
end;

299 :デフォルトの名無しさん:02/06/22 14:16
>298

あ、そうですね。うろ覚えでカキコしたもんで、間違えました。コードはちゃんとfirstとやってます。

300 :デフォルトの名無しさん:02/06/22 15:16
>>299
とりあえず、どういうエラーか書け。

301 :デフォルトの名無しさん:02/06/22 17:42
VCLの勉強をはじめようと思うのですが、
どこか参考になるようなサイト教えてください。


302 :デフォルトの名無しさん:02/06/22 18:00
>>301
http://www.ba.wakwak.com/~h-kova/

リンクページなら
http://www.alpha-net.ne.jp/users2/jj3fkc/1000link/main9.htm

303 :デフォルトの名無しさん:02/06/22 18:02
げ、リンクがほとんど切れてる。

304 :299:02/06/22 20:36
>300

大体こんな感じなんだけどな。

「プロジェクト○○がEDataBaseクラスの例外を生成しました。データセットが編集又は挿入モードではありません。」



305 :デフォルトの名無しさん:02/06/22 21:27
>>304
そのままやん。Table1 の宣言の方法などをさらせば識者のご加護が得ら
れるだろう。(俺は、Delphi 使いじゃねーから期待するなよ。)

306 :デフォルトの名無しさん:02/06/22 22:10
>299
一回ずつPostしなきゃだめだろ?

with Table1 do
begin
 First;

 while not Eof do
 begin
  Edit;

  FieldByName('Field1').AsInteger := 1;
  
  try
   Post;
  except
   Cancel;
  end;

  Next;
 end;  
 
 FlushBuffers;
end;

307 :299:02/06/22 22:28
306産休。すぐに試してみます。

参考のため、今作成中のヤツをあぷします。

まず、データモジュール「dm」にテーブル「tbl1」、データソース「ds1」がある。
ds1のデータセットはtbl1である。
別のフォームで、tbl1を利用する。usesなどはちゃんと処理している。

フォームに、DBControlGridを貼り付け、データソースは「dm.ds1」。AllowDeleteとAllowInsertはFalseにしている。
と、ココまでは問題ないはず。実際、このフォームを実行して、DBControlGridに貼り付けたDBEditなどは編集できる。
次に、フォームにコマンドボタン「btnUpdate」を貼る。で、そのクリック時のプロシージャ。

with dm.tbl1 do
begin
Open;
First;
Edit;
end;
while not(dm.tbl1i.EOF) do
begin
with dm.tbl1 do
begin
FieldByName('ID').AsInteger := 1;
Next;
end;
end;

なんだけど、これが、299のようなエラーになる。

308 :299:02/06/22 23:45
うまくいきました。

edit; は、書き込みの度にやらなければならないようですね。場所を変えたら、うまくいきました。

ども、皆さん、ありがとうございました。

309 :301:02/06/23 01:08
>>302
ありがとうございます。
参考にさせていただきます。

310 :デフォルトの名無しさん:02/06/23 07:10
ちょっとDB周りの処理で苦しんでいます。

UpdateSQLを使用した更新を行っているのですが
更新ボタンを押すと、Query1.ApplyUpdatesを実行するようになっています。
しかし、この時点でアプリを起動したままWindowsをシャットダウンすると
書き込んだはずのデータが消えてしまうんです。

ディレクトリ内に MBファイルが残っているところを見ると
正常に更新ができていないという事なのでしょうか?

ちなみにアプリケーションをきちんと終了した場合は
データはちゃんと書き込まれています。


311 :181:02/06/23 07:44
>>310
そもそも何で...
> この時点でアプリを起動したままWindowsをシャットダウンすると
と言う運用するんだ ?

312 :デフォルトの名無しさん:02/06/23 09:00
>>311
クライアントがむちゃな操作をするもので…


313 :デフォルトの名無しさん:02/06/23 09:42
>>311
まさか Commit してないとか?

 ヘルプより
>データセットを更新する方法としては,個々のデータセットの ApplyUpdates
> メソッドを呼び出すよりは,データベースコンポーネントの ApplyUpdates
>メソッドを呼び出すことをお勧めします。
>データベースコンポーネントの ApplyUpdates メソッドは,
>トランザクションのコミットおよびロールバックを処理するとともに,操作が成功したときにキャッシュをクリアします。


314 :...:02/06/23 11:09
Filter文字列に「あ行で始まる名前」をセットするにはどうすればいいのでしょうか?

Dataset.Filter := '''YOMI = '' + ''あ*' or 'YOMI = ''い*' .....以下同じ...''';

みたいなことをやろうとしているのですが、’の数とか訳分からなくなってしまう厨です。

もっといい方法ありますか?

315 :デフォルトの名無しさん:02/06/23 17:26
>>314
横一行に書くんじゃなくて段落分けしなされ。
orの部分で改行すべし。

316 :デフォルトの名無しさん:02/06/24 09:09
>>312
クライアントを教育しろ
そんな奴らならシャットダウンせずに電源切ってるやつもいるだろ?

317 :デフォルトの名無しさん:02/06/24 14:31
>314
 >315 の意見もいいが、漏れ的には配列と、for と、Formatを組み合わせるな。

 配列は 10(50音の行の数)×15(もっとも長くなる「は」行がは、ば、ぱの三種類
×5個)にして、それに50音表を用意しておく。

 あいうえお
 かきくけこがぎぐげご
 さしすせそざじずぜぞ
 たちつてとだぢづでど
 なにぬねの
 はひふへほばびぶべぼぱぴぷぺぽ
 まみむめも
 やゆよ
 らりるれろ
 わをん

 行を指定されたら、配列から一行分の列を順に読みつつ、Format 使って一文字分の
フィルターを作っては追加してく、と。配列の一行分の長さは別にもってりゃいいし。

318 :デフォルトの名無しさん:02/06/24 21:20
>315さん、三球!

Table1.Filter :=
'YOMI =' + #39 + 'あ*' + #39 + ' or ' +
'YOMI =' + #39 + 'い*' + #39 + ' or ' +
'YOMI =' + #39 + 'う*' + #39 + ' or ' +
'YOMI =' + #39 + 'え*' + #39 + ' or ' +
'YOMI =' + #39 + 'お*' + #39;

みたいにしたら、うまくいきました。
quotedstr()関数を使ったらもっと簡単みたいですね。

319 :デフォルトの名無しさん:02/06/24 21:22
>317さん、

filterは、濁音・半濁音は区別しないようですが、区別させるスイッチか何かあるんですか?

ワシの所では、'は*'だと「は〜」も「ば〜」も「ぱ〜」もヒットしますけど。できれば区別させたいです。


320 :TeamB/2ch ◆SE69s0c2 :02/06/25 10:40
ASCII ソートの Index を作成して有効にすればよかったかと。

321 :デフォルトの名無しさん:02/06/27 23:38
BMPを白黒ビットマップかどうか見分けるにはどうしたらよいですか?

322 :デフォルトの名無しさん:02/06/27 23:45
>321

Pixelformatでみたらどうすか?
それとも1bit以外のBmpで白と黒だけが使われているってことですか?

323 :デフォルトの名無しさん:02/06/27 23:48
>>322
あ、そうですね。PixelFormatで見ます。

324 :デフォルトの名無しさん:02/06/27 23:51
>>321
Image1.LoadFromFile('ファイル名');
if Application.MessageBox('白黒ですか?', '突然ですが質問です', MB_YESNO or MB_ICONQUESTION) = ID_YES then
//白黒
else
//カラー


325 :デフォルトの名無しさん:02/06/28 00:08
>324
文法エラー。

326 :デフォルトの名無しさん:02/06/28 18:05
関数とか宣言したあと、なにかショートカットキーを押すと
実際に処理する部分をすぐ書けるように出来たと記憶してるんですが、
なんでしたっけ? 3個ほど一緒に押してたような…。

327 :デフォルトの名無しさん:02/06/28 18:20
イヤン!そこは違うってば!

328 :デフォルトの名無しさん:02/06/28 18:30
クラス補完 か コード補完 でヘルプを検索して >>326

329 :デフォルトの名無しさん:02/06/28 18:44
>>328
さんきう。〔Ctrl〕+〔Shift〕+〔C〕 がそうらしいのだけど、
押しても何もならない。今日、delphi6 personal 入れたばかりで
設定とかはディフォルトのままのはずなのに…。

330 :デフォルトの名無しさん:02/06/28 18:52
personalにはないよ

331 :デフォルトの名無しさん:02/06/28 18:58
>>330
マジ? なんでこんなものを省略するわけ?
ぼうらんどさんよ、もうね、アフォかバ…(以下略

332 : ◆tare/k3c :02/06/28 20:11
もし初心者ならコード補完なぞ使っちゃいかんよ。
補完しなくてもソラで打てるようにならないと上達しないよ。

333 :デルファイの名無しさん:02/06/28 20:14
personalにコード補完まで入れてしまうと、professionalが売れないからでしょう…
データーベースよりもActiveXよりもVCLソースよりも何よりも、
コード補完と[Ctrl]+上下の移動がprofessional最大の価値と僕は思ってます。

334 :デフォルトの名無しさん:02/06/28 21:33
>>332
まぁ、初心者かな。N88-BASIC のころからサンデープログラマー(死語)もどきでは
あったんだけどね。つーか、あれでしょ、Delphi に限らないと思うんだけど、
覚える単語っていうかスペルっていうか多すぎ。
これで飯を食っていかなくちゃいけないのならともかく、休みの暇つぶしにやる程度なら、
絶対覚えれないって、、、たぶん (;´Д`)

>>333
なるほど…(w

335 :デフォルトの名無しさん:02/06/28 22:21
>休みの暇つぶしにやる程度

こんなもんは上達しようというのが無理。
趣味だって、一所懸命やらなくては物にならんよ。
単語覚えるのは、言語の文法を覚える以前の問題だと思う

336 :デフォルトの名無しさん:02/06/28 22:41
>>334
アルファベットの列と見るから覚えられない。
アレは意味のある英単語だ。

337 :デフォルトの名無しさん:02/06/28 23:24
>>335 >>336
言いたいことは分かるが、はっきり言って、補完が効くものを全て覚えようという気はない。
限られた時間のなかでの優先順位は 文法>単語 だな。単語をいちいち覚えるくらいなら、
自分の作りたい処理(アルゴリズム? ちょっと大げさか)を考るほうが楽しいし、やりたい。

338 :デフォルトの名無しさん:02/06/28 23:36
char 型の文字からAScIIコード得るにはどうすればいいんですか?
Cのような自由さがないからいいんだけど、
なさ過ぎてこまったり・

339 :デフォルトの名無しさん:02/06/28 23:43
>>331
買えよ。

340 :デフォルトの名無しさん:02/06/28 23:51
>>339
やだね。

341 :デフォルトの名無しさん:02/06/28 23:54
>>331
文句たれんなら買えっての。アホ。

342 :デフォルトの名無しさん:02/06/29 00:06
>>341
やだね。

343 :デフォルトの名無しさん:02/06/29 00:58
>>338
Ord でやんすね。 反対は Chr かな。
文字型は順序型に含まれると。

344 : ◆tare/k3c :02/06/29 01:24
>>338
もし16進数にするならFormatを加味するといいよ。
Format('%2.x', [Ord('a')]);

おまけ
Delphiで16進数は頭に$を付ける。「$1A」とか。
16進数をOrdに戻すには、StrToInt('$' + '1A'); みたいにする。
OrdをCharにするにはChr()を使う。

345 :デフォルトの名無しさん:02/06/29 08:13
憶えるも何も、俺は脊髄反射で書けるようになったよ。
考える前に手が動くので、コード補間などいらん。
むしろ勝手にprivate部に置いてくれたり、インデント幅が自分のスタイルと違う(かなり深刻)ので使えん。

346 :デフォルトの名無しさん:02/06/29 09:58
データベースについて。

項目がMEMO型の場合、dbgridを使うと、(MEMO)としか表示されませんが、DBMEMOコントロールを使わずに内容を表示する方法はありませんか?

グリッドにアクセスとかエクセルとかみたいに一覧表示をさせたいのです。

347 :TeamB/2ch ◆SE69s0c2 :02/06/29 10:37
メモ型のデータは長い文字列になることが多いですから、グリッドのセルに
うまく収まるかなど溢れた場合の対策をきちんと行う必要がありますが

Memo 形フィールドに対応する TMemoField を作成し、
OnGetText で

procedure TForm1.Table1NotesGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
Text := Sender.AsString;
end;

とすればメモの文字列が全部手に入ります。

348 :デフォルトの名無しさん:02/06/29 12:36
ファイルを検索中にWindowsについてるaviファイルをAnimationで動かして
'ファイル検索中です...'みたいにして待っててもらおうと思い
実行ファイルと同じフォルダにaviファイルを置いて、Animationにそのパスを
毎回知らせて使ってるのですが、このaviファイルは、実行ファイル内に
取り込むことはできないのでしょうか?宜しくお願いします

349 :デフォルトの名無しさん:02/06/29 12:39
>>348
Animate1のcommonAVIをaviFindじゃだめなの?

350 :デフォルトの名無しさん:02/06/29 13:01
>>338です。
>>343
 ナルホド。順序型と考えるなら、すごく納得できます。ありがとうございました。
>>334
 16進数の場合も教えてもらってありがとうございます。
 Pascalやってた時使わなかったから、その内またココで聞いてしまったかも!?


351 :348:02/06/29 13:01
>>349
!まったくそれで解決しました。有難うございました!

352 :デフォルトの名無しさん:02/06/29 16:22
Del6のTDownLoadURLでファイルをダウソしようとするときの
イベントOnDownloadProgressのStatusTextを取り込むには
どうしたらいいんだ?

353 :デフォルトの名無しさん:02/06/29 17:09
tEDITのキーボード入力モードについて質問
windows制御でctrl+英数 を押下することで半角カナモードにしている場合
それをdelphiで制御するのどうやるの?
IimeModeは単にIMEだけの制御みたいでできません。
ほとんどの領域はカナ入力である部分だけ英数にしたいのです。
ctrl+英数 なんて使うな!という回答がないよう祈っています。

354 :デフォルトの名無しさん:02/06/29 18:01
>>353
大文字小文字、全角半角の織り交ぜ方が素敵です。

355 :デフォルトの名無しさん:02/06/29 20:49
何がしたいのか意味がわからん.
ImeModeでなにが足りないの?

356 :デフォルトの名無しさん:02/06/29 21:08
最近、方々のBBSや掲示板を見てみると、プログラミングの前に、
日本語勉強しろや、と思ふことしばし。

357 :デルファイの名無しさん:02/06/29 23:01
どこでもそうだけどな。

358 :デフォルトの名無しさん:02/06/29 23:20
(´-`)。o ○ (>>352みたいな礼儀知らずに答えてあげる心優しい人はいるんかな…?)

359 :デフォルトの名無しさん:02/06/29 23:42
(´-`)。o ○ (>>答えてあげたいけど、DLEPHI歴5時間の俺には意味さえわかんない)

360 :デフォルトの名無しさん:02/06/30 02:29
>>352
取り込む?マジで意味わかんねーよ!?
オマエStatusTextが何なのかは知ってるか?
フォームにTMemoでも貼り付けて Memo1.Text:=StatusText; とでもしたらどーだ ゴルァ!

361 :352:02/06/30 06:21
>>360
ありがとう。TMemoに表示させたらURL(TDownLoadURL.URL)がでてきたよ。
でも、Helpにある「StatusText は,ダウンロードの状態をユーザーに表示」ってこんなものなのかなぁ(´-`)。o ○

362 :黒き風:02/06/30 06:22
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!




363 :デフォルトの名無しさん:02/06/30 11:16
で?

364 :デフォルトの名無しさん:02/06/30 12:13
あるか

365 :352:02/06/30 14:00
>>360
´▽`)解決したよ。Thanx

366 :346:02/06/30 23:07
>347

コメントありがとうございました。実験してみて、また結果等をうぷします。

367 :デフォルトの名無しさん:02/06/30 23:16
>>363-364
信長発見!            

368 :デフォルトの名無しさん:02/06/30 23:56
で、あるぱ

369 :デフォルトの名無しさん:02/07/03 06:22
7月あげ

370 : :02/07/03 16:16
昨日保存したファイル(*.pas, *.dfm)があるですが、
Delphi でまた続きからやろうとしても、
実行(F9)が無効になっていて実行できないんですが、
これは Borland の嫌がらせですか?それとも、
Personal では、保存したらもう二度と使えないという
罠ですか?マジレスお願いします。

371 :デフォルトの名無しさん:02/07/03 16:17
>>370
*.dpr開け

372 : :02/07/03 16:21
>>371
レスありがとうございます。
*.dpr はなくて、*.pas と *.dfm しかありません。
もしかして、昨日作ったぶんはあぼーんですか?

373 : :02/07/03 16:46
がんばってあぼーんは回避しました。

374 :デフォルトの名無しさん:02/07/03 16:49
>>372
保存してない可能性もあるけど、別の場所に保存した可能性もあるから
HDを *.dpr で検索してみたら?

それでもダメなら 新しいプロジェクト作って その *.pas を開いて
プロジェクトに追加するだけでいいと思うよ(普通は)

375 : :02/07/03 17:26
>>374
レスの入れ違いになりましたが、解決しました。
その後の方法でできました!
アドバイスありがとうございました!

376 :デフォルトの名無しさん:02/07/05 09:48
自動保存のチェック入れといた方がいいよ


377 :デフォルトの名無しさん:02/07/09 23:17
緊急age

378 :625:02/07/10 01:44
3日間以上もカキコがなかったのは、376 読んで脱力したからだと。

379 :デフォルトの名無しさん:02/07/10 01:46
>>378

625 は Delフサスレからのです。

380 :age man:02/07/10 22:10
別に脱力してないので age

381 :デフォルトの名無しさん:02/07/11 23:38
なんか変なスレになってきたねぇ…

382 :デフォルトの名無しさん:02/07/12 12:27
あついからねぇ...


383 :Delフサギコ ◆zE1iiRdQ :02/07/12 13:07
            __________
          /
    ∧,,∧ <  暑苦しいと?おっしゃる?
    ミロ゜ ,彡  \  
    U  ミ    \
    ミ  @       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     U''U
    ̄ ̄ ̄ ̄

384 :デフォルトの名無しさん:02/07/12 19:22
            __________
          /
    ∧,,∧ <  暑いので、毛、刈られますた
   ミロ゜ ,|   \
    U  |     \
    |  p       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     U-U
    ̄ ̄ ̄ ̄

385 :天下統一:02/07/13 19:47
このスレで日本を統一!!
で、あるな。

386 :デフォルトの名無しさん:02/07/13 21:05
質問させてください。
ディレクトリ内のファイルを列挙するために
procedure Tekitou(DirPath:string);
var
SearchRec: TSearchRec;
begin
if 0=FindFirst(DirPath+'*.*', faAnyFile, SearchRec) then try
  ・
  ・
  ・
 finally
FindClose(SearchRec);
end;

でいままで列挙してたのですが、今日急に
"cardinalとTSearchRecには互換性がありません" >FindClose(SearchRec)

とでるようになりました 原因は何が考えれるでしょうか?

387 :デフォルトの名無しさん:02/07/13 23:04
>if 0=FindFirst(DirPath+'*.*', faAnyFile, SearchRec) then try
「0=FindFirst」?
「0=FindFirst」???

388 :デフォルトの名無しさん:02/07/13 23:16
>>386
新しいプロジェクトで最小限のコードでも再現する?

389 :デフォルトの名無しさん:02/07/13 23:18
>>386

同名の API と混同されている。
uses 節の Windows と SysUtils の順番に注意

390 :デフォルトの名無しさん:02/07/13 23:45
>>387
左辺定数の評価式は基本だろ?知らないのか?

391 :387:02/07/13 23:49
>>390
で、あるか。

392 :デフォルトの名無しさん:02/07/13 23:52
>>397=387
よかったな。賢くなったぞ。
友達に自慢しれ。

393 :デフォルトの名無しさん:02/07/13 23:54
基本なわけねーだろこのアフォ!異端児!

394 :デフォルトの名無しさん:02/07/13 23:54
>>390
左辺定数キライ……

395 :デフォルトの名無しさん:02/07/13 23:55
Delphiでははじめて見た。

396 :デフォルトの名無しさん:02/07/13 23:57
↓=387らしい

397 :デフォルトの名無しさん:02/07/13 23:58
>>392
タイムスリッパー発見!397誰?

398 :397:02/07/13 23:59
オレだ(藁

399 :386:02/07/14 00:58
>>389
同名の API と混同されている。
uses 節の Windows と SysUtils の順番に注意

SysUtil,・・・,Windows になってました
Windowsを先頭に持ってきたら見事直りました。有難うございます

usesにも順番ってあるんですね、まったく知らなかったです
ところで同名の API と混同されている。というのはどういう
意味なのでしょうか?

>>387 左辺定数には特に意味無くつかってます。というかコピペさせてもらったのを
使ってるだけですので..

400 :デフォルトの名無しさん:02/07/14 01:18
389ではないが
>>399
SysUtilsで宣言されているDelphiの関数FindFirst, FindCloseと同じ名前のWindowsAPI
がある。これの関数宣言はWindowsユニットにある。

同じ名前の場合は、usesでは後から宣言したほうが有効になったはず(確か)
だから入れ替えたらSysUtilsのほうが使われるようになる。

明示的にユニットを指定して関数を呼ぶこともできる。SysUtils.FindCloseとかWindows.FindCloseというふうに。

間違ってたらスマソ。

401 :デフォルトの名無しさん:02/07/14 01:28
へー。初めて知ったよ。ふーん。ちょっと感動。有意義!

402 :389:02/07/14 02:27
>>399=386

400 さんの説明どおりです。解決してよかったですね。

ちょっとつけ加えると、

VCLの SysUtils ユニットの FindFirst()、FindNext()、FindClose() は
Windows に宣言されている FindFirstFile()、FindNextFile()、FindClose() API の
ラッパーなんですね。そして、FindClose() だけが名前が同じなんです。コンパイラ
は関数名や変数名、定数名などの識別子を見つけるために、最初に、そのコードが書
かれているユニットの前方を探します。そこで見つからないと、直前の uses 節の
うしろの方のユニットから順番に探します。ですから、uses 節の並びの順番は重要
なんです。Delphi の Object Pascal に名前空間の概念がありませんが、このように
して、各ユニット間での参照の優先順位を設けることによって識別子を解決します。
ほかにも TControl.GetClientRect と GetClientRect API のようにメソッドで同名
のものもあります。400さんが指摘されているように、優先順位が低いユニットの
識別子を使うときは、ユニット名を参照します。

403 :386:02/07/14 03:10
なるほど、uses節は全く考えずにどんどん追加してたのですが、いろいろ法則が
あるのですね、問題解決以外にも知らなかったことを教えていただき
非常にためになりました(説明文にも分からない単語がいくつか...w
調べてきます)。有難うございます。

404 :デフォルトの名無しさん:02/07/14 09:47
フレーム内のEditのExitイベントに処理を記述して、
そのフレームを貼り付けたフォームの中の同じEditのExitイベントに別の記述を行った場合、
フレーム側で記述してあったイベントの処理が流れないのですが、
これは仕様なのでしょうか?
(あれ?と思いinheritedも書いて見ましたが駄目でした。)


405 :404:02/07/14 09:49
ごめんなさい、勘違いしてました。
Frame21.Edit1Exit(Sender);
ってな感じでかくんですね(汗)

406 :デフォルトの名無しさん:02/07/14 10:04
Delphi初心者なのですが、>>404-405さんの文面を拝見して思ったのですが、Delphiのフレームを利用する場合に
フレーム自体は、貼り付けたフォームに対してクラスとして扱われないのでしょうか?
クラス内クラス的に定義出来れば、フレーム元を継承してinherited等ですっきり爽やかに書けそうなのですが
Delphiのクラスはクラス内に多段階的にクラス定義(継承?)できないのですか?

# クラス・クラスと書いてますが、まだ勉強始めたばかりでよくクラスについても分っていないのですが・・・。

407 :デルファイの名無しさん:02/07/14 10:08
フレームもクラスですよ。
でも、フレームとフレームを貼ったフォームは所有関係になるので継承は関係ないですね。
それと、イベントを上書きした時元が呼ばれないのは、
イベントは(仮想関数では無くて)メソッドポインタ型のプロパティにすぎないからです。

408 :デフォルトの名無しさん:02/07/14 10:12
フレーム使わないので知らなかったけど
確かに>>405で書いてるような使い方じゃちょっと使いづらいね。
あ、フレーム内にコード書かないような作りにしちゃえばいいだけか。

409 :406:02/07/14 10:15
>>407
なるほど・・・。マジで初心者なんで私にはまだよくわかりませんが(^^; でもなんとなく、イメージできました。


410 :デフォルトの名無しさん:02/07/14 10:25
>>407
でもコンパイル時にイベントが上書き定義されてる!って
警告でも出して欲しいとか思ったりするけど。

411 :takuo:02/07/14 11:41
かとちんうざい

412 :デフォルトの名無しさん:02/07/14 17:33
>>411
2chと勘違いしてる香具師もアレだが、それに反応するのもウザイさね

413 :デフォルトの名無しさん:02/07/14 18:43
>>411-412 ん?マ版の方でよろしく


414 :デフォルトの名無しさん:02/07/15 14:59
ものすごく基本的なことを聞くようですが、教えてください。
Chr(i) で文字コード i の文字が得られますが、2 バイト文字の文字コードから文字を取得
するにはどのようにすればよいのでしょうか? いろいろ試したり調べたりしたのですが
お手上げです。

415 :デフォルトの名無しさん:02/07/15 15:16
function Chr2(lo, hi: Byte): String;
begin
SetLength(Result, 2);
Result[1] := Chr(hi);
Result[2] := Chr(lo);
end;

416 :414:02/07/15 15:29
>>415
できました。ありがとうございました。
今までできなかったのはエンディアンを逆にしていたからだったなんて
恥ずかしくて言えません……。

417 :デフォルトの名無しさん:02/07/15 18:28
えーと、質問です。
普通オブジェクトのインスタンスをつくるときは、

myobj := TMyObject.Create;
try
//いろいろ
finally
myobj.Free;
end;

って try .. finally を使いますよね。
もし、

for i := 0 to MAX do
myobj[i] := TMyObject.Create;
// いろいろ
for i := 0 to MAX do
myobj[i] := TMyObject.Free;

みたいにオブジェクト配列を作りたい場合、どのタイミングで
try .. finally を使えば良いんでしょうか?

418 :デフォルトの名無しさん:02/07/15 18:45
オブジェクトの数が1か多で
生成・廃棄のタイミングは変わらないのでは。


419 :デフォルトの名無しさん:02/07/15 22:56
try も finaly もいらないよーん

420 :Delphi好き ◆0YAPhEjk :02/07/16 01:21
>>417
こんな手はメンドクサイかもしれませんけど、単純に安心したいやりかたとしては、
for i:=0 to MAX do
 myobj[i]:=nil;
try
 for i:=0 to MAX do
  myobj[i]:=TMyObject.Create;

 // いろいろ
finally
 for i:=0 to MAX do
  if Assigned(myobj[i]) then myobj[i].Free;
end;
とかやっちゃうかもしれません。私の場合。
でも、もっと楽な方法とかありそう?


421 :Delフサギコ ◆zE1iiRdQ :02/07/16 02:04
 ミ,,゚Д゚ミつ

 TDateTimeを二つ用意して
 その差分の分を求めるには
 どしたらいいでしょうか?

"+30"分とか"-180"分とかで
表示してみたいのです。
 
 

422 :デフォルトの名無しさん:02/07/16 02:29
T1 := Now;
T2 := Now;
TDiff := (T2 - T1);
Label1.Caption := Format( '%d分', [TDiff * MinsPerDay]);

でどお?


423 :デルファイの名無しさん:02/07/16 05:49
nilが入っている変数へのFreeは何も起こらないので、if文をひとつ省略できます。

424 :デフォルトの名無しさん:02/07/16 05:51
>>423
FreeAndNilを使っても良いのでは?
nilをつっこむ手間もはぶけるはずです。(うろ覚えですが…

425 :Delphi好きッ◇0YAPhEjk:02/07/16 08:26
>>424
便利なものを教わりました。有難う御座います。

426 :デフォルトの名無しさん:02/07/16 09:11
StringGridのスクロールバーの幅などを、普通のもののようにデータ量に
応じた幅にしたいのですが、良い方法はないでしょうか?

427 :デフォルトの名無しさん:02/07/16 10:15
TBitmap.SaveToFileを使ってbmp形式で画像を保存…と、何気なく利用していた
のですがどうやらこの方法で生成されたbmpファイルはPhotoShop等に嫌われる
(ヘッダが解析できない、とエラーが出る)ようです。
で、疑問なのが皆さんはどうやってこれを回避しているのでしょうか。
…やっぱり手作業でbmpファイルを生成ですか?

428 :デフォルトの名無しさん:02/07/16 10:42
起動時に [Ctrl]キーが押されているか判定して起動後の動作を変更したいのですが、
どのように実現すれば宜しいでしょうか?
フォームのKeyDownイベントだと常に効いてしまいますし・・・。

429 :Delphi好きッ ◆0YAPhEjk :02/07/16 11:04
まぁ、私個人の意見で適当かもしれませんが…。
>>426
ColWidthsプロパティとOnDrawCellイベントを利用して出来そうですがどうでしょう。
面倒かなという気もしますけど…。
>>427
私も先日同様の問題に直面いたしまして。各所ホームページを参照しながら作成しま
した。折角ですし、TBitmapを継承したクラスで実装しては如何でしょう?
>>428
プロジェクトソースでGetKeyStateを利用すれば簡単に実装できますよ。

430 :427:02/07/16 11:53
>>429
あぁ…そう言えばそうですね。早速作っておきます。
それがその、回りくどいことにTJEPGImageのbmp版?を作ってました(笑
いやいや、あまり笑えません。ありがとうございます。

431 :428 :02/07/16 11:59
>>429
ありがとう!試してみます。
プロジェクトソース側で書けば良かったのかぁ・・・勉強になりました!

432 :427:02/07/16 13:18
自己フォローです。
何故に変な形式なのかなぁと久々にTBitmapが吐いたbmpファイルを眺めていた
のですが、よくよく見ると32bit/pixな形式になってました(気付けよ)。
どうやら画面モードが32bitになっているのにつられてそうなったようです。
で、試しに
bitmap.PixelFormat := pf24bit;
とやってみたところ24bit/pixなbitmapが生成されました。
これだとPhotoShop他でも問題なく読めました。
32bit/pixなスタイルがいけないのかどうなのか不明ですが、これでひとまず
大丈夫なようです(いいのかなぁ)。
今後はもう少し熟考してから質問します。失礼しました。

433 :デフォルトの名無しさん:02/07/16 17:59
 正直、未だにinterface型が分かりません。
GUID?何じゃそりゃ?って感じです。
 どなたか教えてください・・・。

434 :デフォルトの名無しさん:02/07/16 19:28
複数のフォームを静的に生成するアプリなのですが
表示させるフォームが常に一つだけという形にしなくてはなりません
メインフォームを非表示にし、他のフォームだけを表示させたいのですが
SubForm1.Visible := True;
MainForm.Visible := False;
ではだめですし。。。
SubForm1.ShouModal;
だと メインフォームが可視状態ですし。。。


435 :デフォルトの名無しさん:02/07/16 19:30
>>434
 .dprファイルで、CreateFormする前に
Application.ShowMainForm := False;
 とすれば?

436 :デフォルトの名無しさん:02/07/16 19:34
>>435
ご回答ありがとうございます

起動時はそれで解決できたのですが、
その後、メインフォームを一度表示させてから、
メインフォームが受け取るイベントによって>>434で記述したように
他のフォームと表示・非表示を切り替えたいのです


437 :デフォルトの名無しさん:02/07/16 19:39
>>434
 Hide, Showとか使っても・・・同じか

438 :デフォルトの名無しさん:02/07/16 19:42
>>436
 ていうか普通に出来るぞ。
どういうイベントで、どういう状況?

439 :デフォルトの名無しさん:02/07/16 19:43
>>437
あ!
これ やってみたらできますぃた!!!
Hideじゃだめかと思っていたんですが
Visible := False;
と同じだとばかり思っていましたが、違うみたい。。。
ありがとうございます

参考までに他の手段をご存知でしたら、お教えください

440 :デフォルトの名無しさん:02/07/16 19:46
>>438
起動時に
Apprication.ShowMainForm := False;
として メインフォームではないフォームを表示させて、
タイマーきって そのフォームを閉じて、メインフォームを表示させます
その後 メインフォームにあるボタン等のOnClickメソッドで、
他のフォームを表示させて、メインフォームは非表示にする。。。
という部分ができなくて
メインフォームが残ってしまったりして。

145 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)