1 :
デフォルトの名無しさん :
02/06/01 17:53
2 :
デフォルトの名無しさん :02/06/01 17:53
不要なusesを探す簡単な方法として uses 節から 1つづつ取り外してはコンパイルしてみてエラーが出るかどうかという方法を使おうと思います 標準出力を得る為に無名パイプが必要になるので、 検索した所、サンプルコードはみつけました。 そこで、無名パイプ クラスを作ろうかと思います。 既に誰か作って公開してあるのなら無駄なので、ご存知なら教えて下さい
>>3 だからその方法は駄目だって。
usesから必要なユニット外してもコンパイルエラーでないことがある。
>>4 自分もこの方法をよく使うもんで、どういった状況でそうなるのか気になる。
よければ教えて欲しいかも。あと、再構築とかだったらどうだろ?
そういえば、前に自分もVCL標準クラスと同名のクラスでラップさせてたっけ。
褒められたもんじゃないけど、バグ対策だったか何かで・・・。
この場合、usesからユニットはずしてもコンパイルが通るね。サンクス
>>7-8
>10 ( ´,_ゝ`)プッ
今エディタを作っているのですが、Undo・Redoを実装するために 先入れ後出し配列を使おうと思います。 で、Stringを格納するクラスを作ろうと思うのですが、Contnrユニットにあるクラスを継承させるか、 TStringsList周辺のクラスから継承させるべきか迷っています。 どちらから継承させるのがベストでしょうか?
>>12 作る必要なし。*後入れ先出しなら* TObjectQueue でいいじゃん
Redoの実装には Queue を2本用意するか、
循環リストを用意する必要があると思われ。
循環リスト作るならTObjectListでリングバッファとかな。
15 :
デフォルトの名無しさん :02/06/03 01:10
>>12 >>14 >*後入れ先出しなら* TObjectQueue でいいじゃん
後入れ先出し(LIFO)はQueueじゃなくてStackですが・・・
イヤン 吊ってくる。
17 :
デフォルトの名無しさん :02/06/03 01:34
じゃ、TObjectStack使っとけ。
やっぱりTObjectStackですか ありがとうございます 循環リストと後出しリスト2本、どっちが実行効率が良いでしょうか? 後出し2本だとUndo・Redoするたびにリストに追加/消すを行うことになるから、 やっぱりリング作ったほうがいいですかねぇ…
リストの伸長に伴う再割当てのコストを考えると循環リストかね。
TObjectStack って事前に割当量を設定できないっぽいから。
どうせなら循環リストクラスを作って公開しておくれ
>>12 用途を考えるとどこかに公開されてそうだが、見た記憶がない、、
作るなら13の言う通り内部に動的配列を抱えた TObject 継承かね。
基底クラスはPointerで扱ってTObject用に継承したのを用意する、と。
利用中にリングサイズを変更できる仕様でタノム
あとTOrderedListクラスと使用感が近いと好感度が高いかも。
>>19 >リストの伸長に伴う再割当てのコストを考えると循環リストかね。
>TObjectStack って事前に割当量を設定できないっぽいから。
TObjectStackやTObjectQueueは配列とは根本的に異なるデータ構造を
しています。だから割当量を設定できないのも当然、再割当てのコストは
どのような状況でもほぼ一定です。
あと循環リストならTObjectQueueで代用可能じゃないかな?
無名パイプで標準出力を取る事は出来るようになりました。 (結構難しかったです。 最初取り出した後、スレッドが終了できなくて困った) ただ、パイプで出力を拾わなくても、終了コードが 0か1かで判定出来る という事が判ってガックリです。
前スレでタスクバーから表示が消せないと書いたものです。 前スレ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ということで起こるのでしょうか? どうかタスクバーから表示を消す良い方法を教えてください・・
>>22 TIconHideってコンポーネントがそのものズバリなものだからソース見てみたら?
>>23 ソース内にTiconありませんでした・・
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 \_______________
すみません、書きミスってました。 RichEdit1.Lines.Assign( Memo1.Lines); → Application.ShowMainForm := False;
>>25 ShowWindow(Application.Handle,SW_SHOW);
なんの意味があるの?
>>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;
>>29 ありがとうございます。
でもShowWindow(Application.Handle,SW_HIDE);
が利かないんですよね。
一体何故なんだろう・・
デルファイ5。 フォーム1のボタンをくりくするとフォーム2を呼び出す。 このとき、フォーム2が表示されている間、フォーム1は最小化若しくは操作不能状態にする。 フォーム2を終了させると、フォーム1を元のサイズに戻し、若しくは操作可能状態にする。 というのは、どうすればいいのですか? ちなみに、フォーム1のボタンに form2.show; form1.enabled := false; フォーム2のボタンに form1.enabled := true; form2.close; とかやってみたけど、だめだった。
>>31 ↓が常套手段だと思う
// Form2を開くメソッド
TForm1.OpenForm2;
begin
Form2:=TForm2.Create(Self);
Minimize;
Form2.Execute;
Normalize;
Form2.Release;
end;
procedure TForm2.Execute; // publicメソッド
begin
ShowModal;
end;
Form2は自動作成しないでおくこと
×Normalize; × Form2.Release; ○ Form2.Release; ○ Normalize; だったかな
>>30 いったい、どうしたいのかわからない。
タスクバーに表示しないようにして、さらに最小化時にアイコン化
しないようにしたら、完全に消えてしまうような気がするが・・・。
どうやって復帰させるの?
どういうアプリなのか、複数のフォームがあるのか、それとも
タスクトレイにアイコンがあるのかもわからんし。
そうやって情報を小出しにされると答える側も萎えると思うんだが。
>>35 すみません。
ランチャーを作っていて、タスクトレイに常駐させたいのです。
タスクトレイにアイコンを表示してあって、
現在そこから最小化、元に戻すはできます。
そこでタスクバーにも表示されると邪魔なので消したいのですが、
上記の通り何故か表示されたり、
表示されなくても最小化時にタイトルバーだけ残ってしまったりと、
おかしな現象が起きているのです。
>>35 22は「教えてクン養成マニュアル」の実践者なのでしょう
こういう場合、放置が正しい扱い方かと思われ
>>37 嫌がらせはやめてもらえませんか?
私は自分なりにかなり調べたつもりです。
前スレと本スレにも書いてある通り
一般にタスクバーから消去する方法は試しています。
あなたが分からなくて暇だからと余計なことを書き込まないで下さい。
私は真剣にプログラミングについて勉強したいのです。
これ以上は荒しと同等と思われては嫌なので、
私の質問に対して答えてくださる方へのレスしか書き込みません。
原因や解決策がわかる方、どうかよろしくお願いします。
つーか、トリップ付けろ。もしくは諦めろ。
>>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.
タスクバーから消すのは 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.
>>41 だめっぽいです。
タスクバーにもでてきます。
でも2日も経って似たような症状の人の書き込みも無いので、
私の環境だけの特殊な症状なのでしょうか?
一度OSごと再インストールした方がいいのかな・・
>>42 これではタスクバーからは消えるんですが、
最小化時Windowのタイトルバーだけ残ってしまいます。
>>41 さんありがとうございます。
どうしてうちだけムリなんでしょう・・・
>>43 >>44 TForm1.Hide; で消えてたタスクバーに現れるって事?
それともTForm1.Hide; でフォームが消えないって事?
どっちにしても謎だな。これ以上はわからん。スマンな。
さっき気付いてやってみました。
どうもありがとうございます。
できました。
>>41 さん、ほんとありがとうございます
ご迷惑をおかけしましたm(__)m
>>47 両方やってなかっただけなのか。
そう書いとくべきだったか。スマンな。
まあ、うまくいってなにより。
ちなみに
>>36 の
> 表示されなくても最小化時にタイトルバーだけ残ってしまったりと、
> おかしな現象が起きているのです。
は、おかしな現象でもなんでもない正常な動作だよ。
Delphiはサイズ0のアプリケーションウィンドウ(タスクバーに表示されるのはコレ)
があって、すべてのフォームはそのアプリケーションウィンドウに所有された
ウィンドウであることを覚えとくといいかもね。
>>41 ご教授どうもありがとうございます。
> Delphiはサイズ0のアプリケーションウィンドウがあって
これは知りませんでした。
まだまだ奥が深いですね。
もっと勉強してきます!
ホントにありがとうございました。
>>50 まだまだ奥が深いですね。
アプリケーションウィンドウの存在は、奥が深い、というより
VCL 実装上の理由によるので、欠点だと思っている人の方が
多いのだよ。
>>22 の問題は FAQ なので、だれかが書いていたように、たんにソースつきの
コンポーネントをDLして解析するだけでは? 22 の Application ウィンドウ
の動作はどこか変なので、それを解明した方が根本的な解決につながると思ふ
>32 あ、そうか〜。 さんきゅです。
54 :
ビル・デイツ :02/06/04 23:18
>33 いまいちよく分からないんですけど、このコードは、正しいんですか? minimizeとかnormalizeだけの行が、エラーになるんですけど。
normalize -> restore じゃないかなー
56 :
デフォルトの名無しさん :02/06/04 23:42
今日、エーアイ出版の本を買った。 30ページに「ディスクトップ」の文字を発見して、愕然とする。 今の版では直ってるだろうか?
30ページに「150円引き」の文字を発見して、ぶちきれる。
えーと、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
まぁ、トリップ付けないから、こーなるわな(藁
>>58 (゚д゚) Form2のOnActivate(OnShowだとタスクバーがちらつく)でForm1を消して、
~( )− Form2のOnCloseでForm1を表示しる!
/ >
ネタなの?
64 :
デフォルトの名無しさん :02/06/05 01:04
>60 できたー!ものすごくありがとう!誰だネタって言ってるのは. しかし、あっさりできてちょっと鬱・・・俺の2時間・・・ >63 頂いたので、研究してみます
C,C++でいうdoxygenのような ObjectPascalで使えるドキュメント自動生成ツールはないでしょうか?
age忘れました。
ML入れ
>>65 無いです。Delphiなんて業務じゃ使えないので。
>>68 上司が無能だとお互い苦労するね、VBで組んだ方がいいシステム組めるとかって
錯覚してる奴多いよね、自分の能力がVBにマッチしてるだけなのにさ。
しかも、効率効率と五月蝿い上司ほど、VBが好きなのは笑える、効率重視ならDelphi使う
のが普通だろうに。まぁC#って選択もこれからはあるかもしれないけど、まだ安定性とか
未知な部分が多いからDelphiを使いたいよね。
読み直してみたら、なんか俺誤解してる? 68は煽りなのかな(?_?;
別に業務で使うわけじゃなくても、 doxygenやjavadocみたいにクラス階層や依存関係をビジュアルに出力してくれるツールは 便利だと思うが。 特にしばらくほったらかしにしといたコードを読む場合や他人が書いたコードを読む場合とか。
>>65 無料のものを探してるの?
有料なら
"ドキュメント自動生成 Delphi"で検索すれば出るでしょ
日本でDelphiのみのものが2つ、幾つか対応してるのも
>>74 両方使ってみたのですが全く使い物になりませんでした。
Unit ReporterはBDEが初期化できないというエラーが出て動かない。
D/Scribeは印刷プレビューしようとするとメモリを食い尽くしてしまってプレビューできない。
国内じゃなくてもいいので有名どころのツールは何か無いでしょうか?
それとD/Scribeは印刷専用のようだったので、 できればHTMLやRTF等で結果が出力できればいいのですが…
DocBuilderというのを海外で見つけたので使ってみましたが、 HTML出力は出来ましたが依存関係やクラス階層等を出力してくれないのと、 出力するHTMLがdoxygenに比べて気が利いていない感じです。 doxygenのdelphi対応版とか誰か作っていればいいんですが…
>>78 私にはそういう高度な事はできそうにないので…
>>80 Del6パーソナルです。
D/Scribeはこちらの環境ではプレビュー時にいくら待っても
プレビューしてくれなくてメモリだけどんどん食っていって
400MB位持っていかれたところで強制終了しました。
それとページ紹介ありがとうございます。
フリーのものを2つとも試してみましたが、
DelphiDoc v.2.0 …見た目はそれなりに良いが
依存関係や呼び出し関係等が出力できない
dpd3…印刷専用
という感じでした。
>>81 もう調べました。
DocBuilderもgoogleでみつけたものですし。
>>54 minimize→WindowState:=wsMinimized;
normalize→WindowState:=wsNormal;
と読み替えておくんなせい
85 :
デフォルトの名無しさん :02/06/06 06:32
おい、Delphi相談室その4より下がってるぞ!!
86 :
デフォルトの名無しさん :02/06/06 11:30
あげてみた
質問してみた。
________
| .|
| 教えて! .|
|_______|
∧,,∧||
ミ*゚Д゚||
〃 ⊃||
教えてくださいませ。
今更なんですが、コンストラクタとか
オブジェクトの生成についての質問っす。
引数付きコンストラクタを実装して
その引数の条件によってはそのオブジェクトを生成したくない
というものを作りたいとします。
例えば、
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=| |= \ | | .ミ ミ | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | |ノ∪''∪. | | | | | |
>>83 コンパイルでエラー出まくって試す事さえできませんでした。
>>88 大丈夫。例外がでたらtryにすら到達せず、外側に飛んでいきますな。
コンストラクタ内でのエラーは例外投げるのが常套句。 なぜかDelではあまり見ないが。
Delphi 6 の Personal/Professional に Excel みたいな表を表示できる コンポーネントはありますか? フリーなコンポーネントでもかまいません。 で、もし、あるとした場合ですが… セルにチェックボックスみたいなのをつけることはできますか? よろしくお願いします。
Delphiのヘルプでコンストラクタについて >コンストラクタの実行中に例外が生成された場合,Destroy デストラクタが >自動的に呼び出されて未完成のオブジェクトが廃棄されます。 とあります。では、例外を使わずに、自前で解放する方法は無いかという事ですが 残念ながら良い方法はありません。 コンストラクタ内で free してしまっても 帰り値はfreeする前に一時的に生成されたアドレスが帰ってしまいます。 ではそれを無理やりnilにする方法は無いかという事になります。 例えば self:=0; としてしまうとどうでしょう? そうすると、AfterConstructionという仮想関数の呼び出しが失敗します 無理やりの方法として調べた範囲内では procedure AfterConstruction;override; とコンストラクタ呼び出し後の処理を継承して、この中でfreeした上で asm mov esi,0 end; とやれば、なんとか誤魔化せそうですが・・・・・ とりあえず例外使いましょう 例外でIDEが止まるの嫌なら Abortを使うとよいでしょう
ただ
>>87 のような例の場合は コンストラクタをpublicにしないで
function ShortcutFileCreater(FileName: TFileName):TShortcutFile;
と関数で作成させるという方法も考えられます。
帰り値が nil なら作成出来ないと判断する訳です
もし、このオブジェクト生成作業に多様性を持ち込みたい場合はクラスメソッドにする方法もあります
_____________ ∧,,∧ / _ ミ,,゚Д゚彡 _< これでステップアップ! .=| |=U===U=| |= \ | | .ミ ミ | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | |ノ∪''∪. | | | | | | 確認なんですが begin 処理A ShortcutFile1 := TShortcutFile.Create('C:\無題.lnk'); try 処理B finally ShortcutFile1.Free; end; 処理C end; この状態でTShortcutFile.Createで例外が発生すると 処理Cは動作しないですよね。
_____ ∧,,∧___ / /ミ,,゚Д゚ミ/\< あってる? /| ̄∪∪ ̄|\/ \_____ |____|/ コンストラクタで例外が発生しても 処理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; こんな風にするのでいいのでしょうか。
クラスメソッドにする場合、
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を返すコンストラクタと区別はつきません
>>95-96 もちろんそれも正解です。
しかし、コンストラクタで例外を出さないですむ関数やクラスメソッドの実装も
追加しておくとより親切かもしれません。
if foo <> nil then ... が嫌だから例外投げるんだし 一つの機能を複数の方法で提供するのは混乱の元だ。
>一つの機能を複数の方法で提供するのは混乱の元だ。
なぜ? 色々な切り口を提供出来る方が混乱が少ないと思う
実際 VCLでも同じ機能を実現する方法を複数用意してるでしょ?
たとえば ShowとVisibl とか フォーカスの設定とか
>>96 の場合は例外をネストして判り難くするより、 条件判断で処理
した方がスマートでしょう?
__________
∧,,∧ /
ミ,,゚Д゚彡 < かしこくなりました。サンクスコ
ミ つ且~~ \___________
〜ミ,,,,,, ,,ミ
>>98 そっすか、正解でよかったです。
親切というよりかは
>>95-96 のコードは
美しくなさすぎなんで、
なんとかきれいになる、関数&クラスメソッドの方を
フサは使おうと思いますです。
>>100 に俺は同意っす。
>>96 がもっとスマートに書けるならともかく
書くの面倒だから、代替手段があってもいいのではないかしら?
>>99 それはまあ、混乱すると思うならそれでいいと思うよ。
ただ、メモリが足りなくてもコンストラクタで例外が投げられてしまう。
だから例外は出来るだけリソース不足に統一した方がいいとも思うよ
こういう方法を使うと、使う方では例外を場合別けしなければいけなくなるわけで
それは複雑さを増してしまうという見方もあるんじゃないの?
と書こいてたら
>>102 のレス・・・
元のソースを見るとTShortcutFileのコンストラクタとしてファイル名を引数
に取るからこういう問題が出るわけで、
コンストラクタでは CreateComObject までにしておいて
function LoadShortCut(ファイル名):boolean;
function SaveShortCut(ファイル名):boolean;
とメソッドを別に用意したほうがいいんじゃないの?
∧,,∧ ミ,,゚Д゚彡 ミ つ旦)~~ 〜と,,,~),,~) >元のソースを見るとTShortcutFileのコンストラクタとしてファイル名を引数 >に取るからこういう問題が出るわけで、 TShortcutFileは一例としてなんですが、 そもそもCreateで例外発生させるコードは よろしこないですかねー。 > とメソッドを別に用意したほうがいいんじゃないの? そういえば、TIconとかTPictureとかTFileStreameもそんな感じかな。 でも、TIniFileはそんな感じじゃないかも?...
TIniFile は Createでは ファイル名を保存してるだけですよ。 その真似をするなら、 constructor TShortcutFile.Create ではファイルがあれば読み込みまでして そのファイルが無くても例外にしない戦略の方がいいんじゃないの?
あ! Createで例外発生させるのがダメというんじゃなくて、 (それは言語の機能だから好きにしたらいいんだけど) コンストラクタでの例外はリソース不足とかに絞った方が使い易い事が多いというだけです。
>>92 コーディングが苦でなければ、StringGridで実現できます。
簡単な方法として、StringGridの該当セルの上にチェックボックスを乗せて、
セルの中にチェックボックスがあるかのように見せかけるのが一般的ではないでしょうか。
コーディングが苦でしたら、フリーなコンポを使うことになります。
http://home1.infonia.ne.jp/~delphian/delphi/ この中から希望する機能が実現できそうなのを探して下さい。
D6パソにはありませんが、DBと連携させるならDBGridを使うことである程度は貴方の望んだ結果が
得られるかもしれません。
>>97 スマートなクラスメソッド版のエラー処理ってこんな感じ?
>>96 のはユーザーへのある程度のエラー原因の通知処理も含まれてるんだけど
どこがスマートじゃないんだろ。
ShortcutFile1 := TShortcutFile.CheckCreate('C:\無題.lnk');
if not Assigned(ShortcutFile1) then
begin
ShowMessage('ショートカットファイル(名前は失念)を開けませんでした、
原因は不明です。なにしろお馬鹿なTShortcutFile.CheckCreateメソッド
がエラーの原因やファイル名を全て捨ててしまったからです。一番考え
られるのは指定したファイル(ファイル名はわかりますか?)が存在しない
ことですが、他にもアクセス拒否やメモリ不足、内部エラーなどあらゆる
原因が考えられますのでがんばって原因を究明して下さい(藁');
Abone;
end;
>>108 そのエラーメッセージは間違っているみたいだよ
CheckCreateはファイルが無い時にだけnilを返し、そうでない場合はCreateを呼ぶんでしょ?
という事はメモリ不足やCOM生成失敗は例外が出るんでしょ?
だから、ショートカットファイルがありません とだけメッセージを出すべし
>>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 は根本的に用途が異なるので
入れ子になっても特に汚い記述だとは感じないが。。
>>108 は皮肉ってあのメッセージにしたんだろ。
見当違いだったけどナー
113 :
デフォルトの名無しさん :02/06/06 19:47
raise
うーん・・・掲示板で真意を伝えるのは難しいね。 だから、別に例外で伝えても悪い訳じゃないって言ってるのに・・・ ただ今回は、Createの引数のファイルが無くても TShortCutFileの 機能に支障はないわけで、逆にSaveShortCutFileが無いのが不思議なくらい。 で、最初の書き込み付近では、それを細かく見ていなかったけど、 他のVCLの実装と比較しても、ファイルが無いから即例外にするのはマズイな と思った。 なぜかというと、そのファイルが無かったらXXしたいという事は多い筈。 そして、この場合、ファイルが無いという例外のほかに、COMが作成出来なかった 場合の例外とかメモリが足りないような例外も飛んで来るから、ここで例外を 捕捉したら、場合別けして例外を投げ直す必要がある。 というような趣旨ね
>>114 TFileStreamはCreateでopenできないと例外が飛ぶし
ほかもいろいろVCLで例外が飛ぶコンストラクタを持つクラスあるような。
アンケートにご協力を 1.コンストラクタ内で例外を生成して失敗を伝える。 2.リソース不足以外で例外を生成する。 3.コンストラクタ(相当のメソッド)がnilを返す。 4.エラーの種別によってnilを返すまたは例外を生成する。 5.スマート>>>>>>>>>>>>シンプル 私は ◎、○、×、×、△?
1. ○ つーかそれ以外の方法で例外を伝えられてもなぁ。 コンストラクタに変数引数でも付けるのか? それでも使えないインスタンスをいちいちFreeするより、例外の方がいいのでわ。 2. ○ こんな例ならいくらでもある。 リソース不足以外で例外を使うべきではない、という考えの方が不自然。 3,4. × コンストラクタがnilを返すなんて、ObjectPascalの仕様から外れすぎ。 最初からそういう仕様ならともかく、今になってそういう異端なことをしないでほしい。 5. 質問の意図がわからない。
私は 1.○コンストラクタ内で例外を生成して失敗を伝えるしかありません。 2.○リソース不足以外で例外を生成しても問題ありません。 3.×コンストラクタがnilを返してはダメです 4.?エラーの種別によってnilを返すまたは例外を生成するのは普通では? 5?.コードは出来るだけ簡単であるべきです
そもそも
>>93 でミスリードしてしまったのかな
言いたかった事は、
1)コンストラクタで例外を投げたら必ずFreeされる事
2)コンストラクタでnilを返す方法は無い事
3)だからコンストラクタでエラーなら例外を投げるべき
その上で、
例外を投げてしまうと都合の悪い場合もあるなら 使い易いように
関数でラップしておく方法もあるよという意見を追加したつもり
自分流は、コンストラクタで例外を投げる。
メモリ不足だろうがファイルが無い(とか作れない)からだろうが、
いずれにしろ実行を継続できないから処理を中断しなきゃならないわけで。
結局のところユーザにエラーメッセージを示すということに違いはない。
エラーの内容によって処理を分けることってあんまし無さそうだけどなぁ。
あるかもしれんけど、そんときは例外クラスによって補足し分けるしか。
>>108 ファイル名は例外オブジェクトに保存しとけばいいだろ・・・と思いつつも、
VCLの例外クラスはそんな付加情報は持ってない模様。わろし。
>>109 ファイルは存在するけど読み取りアクセス権がないとか、ファイル形式が違うとかかも知れない。
戻り値 nil だけじゃ原因がわからん。
>>114 場合分けして投げ直すというのは解らん。
例えば EFOpenError だけ補足すればいいんじゃ?
そうそう、コンストラクタでファイル名を指定しようが LoadFromFile メソッドを別に作ってロードしようがどっちでも構わんけど、 nil を返すより例外を投げる方が良いってのが自分の主張なんで。そこんとこよろしく。
補足です。つーか説明端折り過ぎました。スマヌ。 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の価値観といえば通じるでしょうか。
やっぱり判ってもらえないようだから、こう書くべきだったというのを書くね
元ソース
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;
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;
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;
>>120 つまり、そもそも
>>87 のコードは既に CreateComObject が失敗すれば例外を出す
それなのに、わざわざ FileExists でチェックして例外を出して良いのかと聞くと
いう事は、 FileExists を特別視しているということ、つまりファイルが無ければ特殊な
事をしたい様子。 それならこういう方法もあるという説明をしてきたつもりであって
例外を投げるなという事ではないのだと
だから、
>ファイルは存在するけど読み取りアクセス権がないとか、ファイル形式が違うとかかも知れない。
>戻り値 nil だけじゃ原因がわからん
FileExistsがfalseを返す時だけ nil を返すというコートを示したのであって
それは失敗だという意味ではない。ファイル形式が違うとかアクセス権の問題とは別という事
つまり
>>87 は
成功、失敗のほかに、引数のファイルが無いという3つの状態を返したかったのだと考えたから
nilを渡す方法で3つの状態を返せるよと解説してきたつもり。
で、どうしてコンストラクタで3つの状態を返したいような事になったのかというと、プロパティを
コンストラクタで全部読み出して、プロパティはその静的な値を読むだけになっているから、
つまりCreateShortcutFile という関数を作っているけど、ReadShortCutFileで全部読み出せば
いいわけで、クラスにする必要が無いというか、クラス設計を見直した方がいいと
Σ(゚Д゚ )y-~~ ナンダコリャ
∧,,∧ Σミ ゚Д゚ミy-~~ ヨクワカンネー 誰かショートカットファイルをもっと 楽に使えるようにラプしてクレ
え?
>>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;
これ以上どう簡単にしろと?
長ソース×3ベタ貼り+長文のコンボくらって、読む以前に Σ(゚Д゚ )y-~~ ∧,,∧ Σミ ゚Д゚ミy-~~ ってなったんじゃねーの?
>>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;
こんな感じの事をやってるんだと思う。
どうでもいいけど、デバッグしてるときに例外が出ると毎回止まるから 例外を使うのを妙に避けたがる人が多いような気がするんだが。 確かにちゃんと例外処理も書いてるのに、 StrToInt とかで例外を出され ると禿げしく面倒なんだよな。 できればコンパイラ指令とかで、 「もうここはデバッグは終了したから、この部分を実行中に発生した 例外をデバッガは捕捉しなくてもいいよ〜」 みたいな機能があればいいんだが、そういうのって難しいのかな。 おしえて、エラい人。
>>132 貴様は「VB以外使っちゃダメ〜の刑」に処す!
はい次!
>>132 確かにデバッガオプションを動的に変更出来たら便利だね
けど今日は疲れたからもう調べるのはいいや・・・
あと確かに StrToIntとかだと自分も 例外を使わずにValで検出する
それは例外を使わない方が少しだけ高速かもしれないとか期待してるからかも
>>134 自分も ユーザ入力のチェックみたいな場面では Valだな それはやっぱり
例外でデバッカが止まるのが嫌ってのが大きい
でValで検出して abort投げたりして
あ
>>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行追加すればいい。
>>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;
みたいに、かなり気軽に例外を使ってる人って、もしかして少数派?
「処理を中断するような場合は例外を使う」というポリシーでソース
書いてるんで・・・
∧,,∧ ソース貼ってるの見えなかった...
Σミ ゚Д゚ミ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) ファイルの数分つづく
・ファイルデータ そのものズバリのファイルの中身ナカミ (不定)
----------------------------------------------------
※含まれるファイルの数は固定じゃ無いです
>>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
>>138 > 例外を消すコンパイラ指令はないはず。
> ブレークポイントで前後を挟むとヨシ。
ブレークポイントでこういう事もできるのですね。(既に「ブレーク」ポイントじゃ無い気が)
しかしブレークポイントが保存されず、プロジェクトを開き直すと水の泡。
デスクトップの保存設定をONにしたら保存されましたけど窓のサイズとかまで保存されるのが嫌。
デバッグ関連の設定だけ保存する方法は無いかな…。
コメントを読む限りDebugHook変数が近い気がしたのですが、
試しに0とか2とか代入しても何も変わりませんし、何でしょうこれ。
>>142 {$D-}
i := StrToInt(s);
{$D+}
とかやると、{$D-}から{$D+}の間をサブルーチンも含めて実行中に発生
した例外はデバッガは無視する、とかいう機能が欲しいです。
ちなみに{$D}はすでに別の用途で定義済みだけど・・・
>>143 例えばこうネストすると、*で発生した例外の扱いはどうなります?
procedure A;
begin
{$D-}
i := StrToInt(s);
{$D+}
j := StrToInt(t) {*}
end;
begin
{$D-}
A
{$D+}
end.
…指令が実行文として変数を増減させなければならなくなる気が。
StrIntDefだと例外飛ばさない。 また、デバッガオプションでEConvertErrorとかで止まらないよう設定しとけばいい。
StrToIntDefだ
>>145 例外を出したくないんじゃなくて、例外が出ても許容範囲内なら
デバッガに感知されたくないんですけど。
で、いつもEConvertErrorを無視してもらっても困る。
明らかにデバッグ済みの部分だけ無視してもらいたい。
やっぱ無理そうですね・・・
>>147 ここで議論してる時間で自分が気に入るような変換関数を
つくったほうがいいのではないかと。
ガーン━━━━(゚Д゚)━━━━!!!!!! StrToIntDef等という関数があったのか。 Del2→Del6だったので全然しらなんだ…。
150 :
デフォルトの名無しさん :02/06/07 13:22
>>139 質問
ファイルのサイズ、4バイト ってそれで足りるのかな?
どんなファイル使うのか分からないけど。
ファイル名ももう少し多い方が。
デスクトップの保存をONにして、なおかつ必要な情報(ブレークポイント等のデバッグ設定)だけ
保存させるという事はできないのでしょうか?OpenToolsAPIに詳しい人とかいませんか?
保存のタイミングとファイル名さえ分かれば、後は*.dskから不要な行を消すだけでいけそうなのですが…。
>>148 例外を出さない変換関数、ではなく、例外は駆使したいのですが
それでデバッガがいちいち停止するのは面倒なので、
デバッグ済みの部分に関してはデバッガが例外を検知するかどうかを動的にON/OFFしたい、
という事なのですけど。
うわ、微妙なタイミング。
>>148 さんごめんなさい。(最近こういうすれ違いが多い気がする自分)
別のアプローチとして、デバッグ中は別の例外を飛ばすとか。 本番用例外はデバッガで止まらないようにして。
>>153 こちらこそ、ごめんなさい。
他の話題と混同したものでいいかげんなことを言ってしまいました。
ちょっと見た感じ、 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] を戻してアドレスにジャンプする) ようにすれば、デバック中に場所によってマスクするような事が可能かも
>>157 あ…同じようなこと考えている(w
RaiseExceptionProcというポインタを通じて例外が発行されている
(System.pasの初期化部でRaiseException APIのアドレスに設定される)ため、
これを独自ルーチンに上書きして例外オブジェクト(ESP + 24)をEAbortインスタンスにすり替え、
無視させることが(手元の実験では)できました。
でもこれをやってしまうと on EXXX do で種類分けして補足できなくなるので157さんの方法に期待。
>>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 を書き換えるのは嫌だしで難しいですね
なんか珍妙なことやってるな。 ユニット単位でデバッグする・しないが 簡単に指定できるんだからそれでいいじゃん。
dcc32.exeのコマンドラインオプションで、 -DDEBUG;CUSTOMなどとやって条件定義を追加できますが、 逆に条件定義をコマンドラインオプションで外すにはどういう風にすれば良いのでしょうか? 教えて下さい。
>>139 >>162 いや、別に仕様がわかりにくくて・・・ということじゃなくて、
課題を丸投げしている点に問題があるんですが・・・
>>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
>>165 表n ←→ 表n
(表はSJISで2byte目が \ )
>abc\ndef ←→ abc\\ndef
abc\\ndef ←→ abc\\ndef
じゃないの?
なんか 昔書いたコードで今見たら恥ずかしいんだけど //////////////////// // \エンコードをする // \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;
//////////////////// // \デコードをする // \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;
>何か考慮漏れが漏れてるだろーか まずはテストコードを書くことが漏れている __________ ∧,,∧ / ミ,,゚Д゚彡 < コードで仕様をあらわすといいです ミ つ且~~ \___________ 〜ミ,,,,,, ,,ミ
ミ,゚Д゚;;彡.。oO(何でkage.exe最新版だとタブで開こうとするのでしょーか?)
>173 かちゅスレ逝け
176 :
デフォルトの名無しさん :02/06/09 05:20
【質問】 MP3ファイルを自作ソフトに関連付けして再生させたいのですが、 MP3をダブルクリックしてソフトが起動するとこまでは出来ました でも再生されません。 ファイル関連付けコンポーネントのプロパティの、 コマンドラインで、あるソフトに対して、このファイルが ”ドラッグ&ドロップされたよ”と通知することは不可能でしょうか?
177 :
デフォルトの名無しさん :02/06/09 05:23
【補足】 すいません、書き込みミスりました。 ファイル関連付けコンポーネントのプロパティの ”起動時に渡すパラメータ”の部分だと思うのですが…
178 :
デフォルトの名無しさん :02/06/09 07:21
そのコンポーネントの名前ぐらい挙げなよ とりあえず、渡された値はParamStr, ParamCountで取れるんじゃないの? DDEとかその辺のことはしらんが。
>>176 >MP3ファイルを自作ソフトに関連付けして再生させたいのですが
自作ソフトに関連付けることができたとする。
そのファイルをエクスプローラでダブルクリックする、または
ShellExecute() から関連付けられた実行プログラムを起動する
ということはできてるわけですよね。
でも、その関連づけられた自作ソフトがコマンドラインパラメータを
解釈しないと意味がありません。178 さんのコメントを考慮する必要が
あります。
181 :
デフォルトの名無しさん :02/06/09 15:03
特定の数字に0付けで4桁固定表示にするにはどうしたら良いですか? 4の場合 0004 12の場合 0012 です。
(1) IntToStrした結果に 10より小さかったら"000" 100より小さかったら"00" 1000より小さかったら"0"を付ける (2) Formatを使う
>>161 なんですが分かる方いませんか?
IDEからコンパイルした時は定義有り。
MakeFileからMakeした時は定義無し。
にしたいのですが。
もしかしてDelphiでmake使うような方はおられないのでしょうか?
Format('%.4d' 〜〜〜) で良いんですかね。
185 :
デフォルトの名無しさん :02/06/09 15:23
∋oノハヽo∈ (# `D´)ノ<つかってたしかめろ! なのれす! いちいちきくな!なのれす!
娘ヲタが暴れてるな。
モーヲタうざい
188 :
デフォルトの名無しさん :02/06/09 15:52
∋oノハヽo∈ (# `D´)ノ<うるせーはげ!
>>184 Format('%4.4d' 〜〜〜)
>>185 同感だけど、形式文字列のHelpは難解なことで有名だし…
>>189 -$UNDEF ABC
-$UNDEF=ABCと試してみましたが両方とも効果がありませんでした。
>>191 何じゃそりゃ(笑)
IDEのほうのプロジェクトオプションで識別子追加するのは駄目なの?
>>191 いやそうじゃなくて、ソースに
{$IFDEF NOIDE}
{$UNDEF ABC}
{$ENDIF}
て書いておいたら、-DNOIDE で、ABCが定義されなくなるだろ。
194 :
デフォルトの名無しさん :02/06/09 20:32
質問なんですが、横書きしたテキストを横にスクロールさせるのは何とかできますが、 (新幹線の中で出る、読売新聞ニュース◆ みたいな奴) 横書きにした文字を縦方向にスクロールさせる良い方法ってありませんか? 一行の表示領域で、できるだけウザくない方法で複数行のStringsを出したいのです。 (数秒おきに一行ずつペロっとスクロールするようなのが(・∀・)イイ)
例外を無視させる方法ですけど、 ExceptionClass 変数に代入されているクラス参照の派生クラスにしかIDEは反応しないようです。 従って、適当な例外クラスをでっち上げ代入してやることで無視させることができました。 インラインアセンブラを駆使した努力は何だったんだ… 参考文献: DELPHI IN A NUTSHELL
>>193 そういう事だったのですか。
dcc32 -?で
-$<dir> = Compiler directive
って出てくるのでそういう方法が出来るのかと思いました。
全てのソースファイルに書かなければならないみたいなのが
多少気が進まないのですが、ありがとうございました。
>>194 したいことのイメージがあまりよくわかってないんだけど、
一端、裏でイメージ作って、合成してから、描いて見るとかどう?
>>197 スミマセヌ、上手く説明できてないですね・・・。
電車の行先幕みたいな、一行が上下にスライドするモノを実現させたいんです。
試しにいろいろ描画してみます。
199 :
デフォルトの名無しさん :02/06/10 00:07
(´-`)。o ○ (関連づけて、exe起動させてるけど、読み込んで無かったりして…<MP3)
200 :
デフォルトの名無しさん :02/06/10 01:01
MSXML4を使いたいんですけど、 ActiveXの取り込みで一覧に"Microsoft XML"らしきものが 出てきません。ひょっとして別の名前がついているとか そういうことはないのでしょうか?
>>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 はどっか消えないところに置いといて(笑
>>201 あ、TImageのTextoutか!ありがとう、使ってみます!
203 :
デフォルトの名無しさん :02/06/10 10:15
かちゅ〜しゃエクステンダーって どういう仕組みなのですか? ソースが手元に無くてもあんなことできるの?
エクステンダーはビルダー製だよ。 Delphiでも一緒の事出来るけど。
>>203 想像だけど、
>>159 のようにDLLへのリンクポインタを検索してそこでフックしてるんじゃないかな
VC製だろ
207 :
デフォルトの名無しさん :02/06/10 23:27
ひまわり製だろ
Delphi6のForm1のイベントで、 OnMouseWheelUP Down の処理内容を例えばButton1Clickとすると、 ボタン1を2回クリックしたことになってしまいます。 これを1回クリックというようにできないでしょうか?
>>208 はホイールを回すときに手が震えて
2回分になってしまうに50ペリカ
え、うちだけ?
>>210 そんなわきゃない・・。
なんでなんだろう・・
マウスが悪いのか??
自己解決しました。 いや、解決はしてないけど簡単なプログラム作って試してみたところ、 確かに1回でした。 一体何が悪いのかはまだ分かんないけど自分でなんとかしてみます。 スレ汚しすみません・・
やっぱおかしいや。 ボタンとメモを用意して、 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ずつ増える・・
>>213 バグってるぞ。
ホイールを処理したときは Handled := True; しる!
>>214 そんな処理が必要だったのか・・。
Button1Click(Sender);
の下に
Handled:=True;
で治りました!
ありがとうございます!!
>そんな処理が必要だったのか・・。 ヘルプちゃんと読んでないだけ
217 :
デフォルトの名無しさん :02/06/14 21:37
VBのプロジェクトをDelphiに移植中… すんげぇめんどくせぇ。 せめて、フォーム情報だけでも自動コンバート してくれるようなツールがあったりしない?
むしろDelphiのフォームをBCBに‥‥
219 :
デフォルトの名無しさん :02/06/14 23:09
222 :
デフォルトの名無しさん :02/06/16 00:48
かれこれ15年くらい悩んでいるので、教えてくれ。 フォームからクイックレポートを呼び出す。クイックレポートのデータソースはSQL。 SQLにはパラメタがあり、フォームに配置したリストボックスなどの値をパラメタに渡し、印刷する。 つまり、フォームで「日本」を選択して印刷ボタンを押すと「日本のデータ」が、「韓国」を選択して印刷ボタンを押すと「韓国のデータ」が印刷される、というようなのをやりたいのじゃよ。
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です。
スマソ。質問が抜けた。 で、フォームから、クイックレポートのSQLにパラメータを渡す方法がわからないんです。
>>225 自分はそういうのやるときは低レベルオーディオAPIで
0.1秒程度のバッファを3つくらい順に回して再生させてる
それでwav ファイルでもサンプリングレートの違いを吸収する為に
acmAPIを使ってる
228 :
デフォルトの名無しさん :02/06/16 13:47
モナースレで教えてもらえなかったので流れてきました。 Delphiで株のチャート分析&予想をするソフトを作ろうとしています。 色々とネットを検索したらTeeChart?,Tchart等を使う方法やPaintBoxを 使っている人等がいて、何でトライしたら良いのかいまいち良く分かりません。 お薦めの方法、あるいは参考になるサイトやスレがありましたら教えてください。 各方法の利点欠点だけでも結構です。 今まで画像系の処理はした事ないので四苦八苦してます。 出来るだけ、簡単に出来る方法を選びたいです。 最初から高機能は求めてません。 開発環境はD6パソ(自宅)&エンプラ(会社)です。 どうかよろしくおながいします。
アプリをXPのビジュアルスタイルに対応させたくて、Webで調べて Manifestファイルを使うとわかり、とりあえず見た目は対応させれたんだけど. ListViewが表示されるフォームではどこでもとにかくエラーが出るんです. なんだか、Del6だとアップデートすればいいみたいだけど、Del5では どうしようもないんでしょうか?
>>225 ActiveXからWindowsMediaPlayer取り込むのは?
233 :
デフォルトの名無しさん :02/06/16 22:23
>231 UpdatePack1はあててます・・・
補足です. エラーになるのはListViewのViewStyleをvsReportにしてるときです. どうも、ヘッダ部分の描写をしようとしたときに落ちるっぽいんですけど・・・. HeaderControlのほうは大丈夫みたいですねー.
うーん、一応自己解決したようです.海外サイトで解決策を発見しますた. 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をローカルにコピーして使うのはまずいのかなあ?
・・・と思ったら、そういえば実行時パッケージ使うときは この方法じゃできないんだった.鬱・・・.
>>228 マルチポストかよ、たまんねぇーなぁ、
モナースレで十分にレスが付いてるようだが、
他に何が聞きたいんだ?
238 :
デフォルトの名無しさん :02/06/17 09:25
>>237 いや、こっちに書き込んだ時はあちらでは何も教えてもらえませんでした。
241 :
デフォルトの名無しさん :02/06/18 14:51
TLabelとTTimerを使って、分と秒のみのストップウォッチらしき物を作りたいのですが、 TDateTimeを使うと時間の所も表示されてしまいます。 時間部分を隠す方法って無いんですか? 無理だとすると、どういう方法で作るのが一番良いのでしょうか? 教えてください。
>241 DateToStr関数を使ってみたりするとか。
すまぬ誤爆だった。 ストップウォッチだったら、 自分で時間計算するのがベストかと。 Timeのインターバルを100にしておくとして、 それまでのカウントを数える数値をCounter:integerとする。 OnTimerが呼ばれるとCounterに1を加算して Label1.Caption:=Format('%d分:%d秒:%d',[Counter div 600, Counter div 10,Counter]); みたいな感じで。
>243のところ名前ミス242つーことで。 あぅひとりで動揺してしまった...
ありがとうございます。 でも、その方法だと、位が上がる時(パラメータの配列の2つ目が60になった時・3つ目が10になった時) にその位が一0にならないような・・・
>245 はっ...そういえばそうでした。 その場合は、 Label1.Caption:=Format('%d分:%d秒:%d',[Counter div 600, Counter div 10 mod 60,Counter mod 10]); こうしてみるといけるかも。
FormatDateTime('nn:ss', hoge); それにしてもDelphiはオブジェクト指向じゃないな。
hoge.FormatString('nn:ss');
∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´∀`)/< 先生!
>>248 は無視してください!
_ / / / \___________
\⊂ノ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄||
|| || ̄ ̄ ̄ ̄ ̄||
.|| ||
>>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]);
%0dってしっとるけ? Timerって正確じゃないよ。
>>241 ,243
OnTimerって、たぶん、確実に呼び出される保証が無さそうな気がするから、
スタートした段階の時間を覚えておいて、それと現時刻との差で計った方が
いいかも。
>>251 形式文字列っていうのは、時間以外はよくわかってないです。
今ヘルプ見たけど、精度指定子っていう物で2桁表示にするんですかね?
>>252 StartTime, StopTime, PassageTime: TDateTime;だとすると、
スタートの時に
StartTime := Time;
ストップの時に
StopTime := Time;
PassageTime := StopTime - StartTime;
Label1.Caption := TimeToStr(PassageTime);
みたいな感じでしょうか?
それだと途中経過が出ないような?
どこかのスレでTTimerは精度が低いからTimeGetTimeを使った方がいいという書き込みは見た記憶がありますが、よくわかりません。
>253 GetTickTimeでもよさそうなきがする。 ところでストップウォッチって精度はいかほどを考えてるの?
>>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)とやってもできる気がしてきましたが・・・(^^;
げっ、
>>255 じゃあ2桁にならないですね。^^;
いいかげんTDateTimeとFormatDateTimeでやればいいじゃん。
>>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;
>>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関数っていう物でしょうか?
わからんことだらけです。
>259 GetTickTimeはWin32APIです。 Windowsの起動からの経過時間をmsecで取得するので Timerのインターバルあたりで、差分を表示すれば ストップウォッチらしいものができると思います。 私は、楽なので計算や表示の時間を計るときの目安としてこのAPIつかってます。
>>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つで差が算出できるので普通使うでしょ、
覚えておいて下さい。
>>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 なるほど、ローカルな関数みたいな感じでしょうか、ありがとうございます。
ヘルプに載ってますか?
俺のには載ってないみたいですが・・・。
キーワードで調べても出てきません。
>>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;
>>262 あなた他人の話聞いてる(読んでる)?それとも、ちょっと読んで理解できなかったら
読まないようにしてるのかな?
判らない部分があったら Help -> MLログ -> google の順で調べて下さい、でないと、
永久に自分ではプログラム作れませんよ。
因みに、
ローカル宣言についてはヘルプにもマニュアルにも記載してあります。
ヘルプの目次->Object Pascal言語ガイド->手続きと関数->ローカル宣言 でどーぞ。
ヘルプはキーワード検索だけじゃなくて、暇なとき 目次の内容も読んでください、Pascalに
慣れていない人や我流な人(私もだが)にはとても有益な情報が密かに詰まってたりします。
(Delphiのヘルプは印刷物のマニュアルの内容と同じです。)
>>263 おおお、できました!
ありがたや、ありがたや。
後半はストップウォッチみたいな物ですか?
やってみたら、2回目以降は、前に押してからの時間が出ます。
1回目は謎な時間が出てしまいますが・・・。^^;
>>259 はどこがダメなんでしょうか?
>>265 (n-1回目の時間)−(n回目の時間)
ってやってるだろ?n=0ならどうなる?
プログラム以前に・・・。
プログラミングにも当然ながら、向き不向きがあるのよね
亀レスすみません。
その後色々と試したのですが、
>>232 さんの方法で何とか実現できました。
ありがとうございます。
あまりにも取り込み→利用が簡単で驚きました・・・(;´Д`)
269 :
デフォルトの名無しさん :02/06/19 22:09
今大学でDelphiを習ってるんですけど 全然分からないんですけど、 どうすれば 皆さんのように分かるようになりますか?
プログラムってさぁ、習うものじゃないよね
>>271 言語(道具)やアルゴリズムやデータ構造(基礎となる部品)を習うことは否定しない。
でも、何を作るか、どう工夫するかは自分の頭で考え体で実行しないとダメでしょう。
>>269 何かを作りたい!という目的を持つ、これ最強。
オレは「分かるように」なってるかどーかは知らんが、
1.○○するツールが作れないかなぁ?
2.そのツール作るにはどーすればいいのかなぁ?
3.ネットで検索してヒントから学ぶ
こーゆー形で理解してきたが…。
よーするに「必要」から、と。後は
>>273 に同意。
>>何かを作りたい!という目的を持つ、これ最強。 おおむね同意。 ヒトによっては、熱意だけあって、激しいクレクレ君に変身する場合もあるので。
>>264 他の人が教えてくれた物は、Helpで調べるとかして、できる限り理解する様に努めています。
手続き・関数のローカル宣言はよくわかりました、ありがとうございます。
>>266 >>263 で
Button1を一回押した時点では、OldCntには何も代入されていないから、
NewCntの値、つまりGetTickCountの戻り値がそのままCaptionになるということですよね。
277 :
デフォルトの名無しさん :02/06/20 07:08
TraceRouteコンポーネントってどこかにありませんかね? Delphi5 で動くフリーの奴
>>259 IncMilliSecondは手続きではなく、関数ですよ。(Incは手続きだけど)
だから PassTime := IncMilliSecond(PassTime); にしなきゃダメだと思う。
どれくらいの誤差が出るのか、さきほどこの方法で自分でやってみましたけど、
MSecの百の位が秒を刻んでる様に見えるほどの誤差でした。(藁
こんなにTimerって誤差があるのか・・・
>>277 Indy のデモプログラムじゃだめか?
>>278 インターバルタイマは分解能せいぜい1/30秒しかないから
>280 マルチメディアタイマー使えばいいんだと思うけど やはりGetTickTimeを使うのがいいのかな...
>>281 GetTickTime って何?
GetTickCountの事なら ストップウオッチの応用なら Now を使えばいいと思うけど?
たしか精度同じ程度でしょ
マルチメディアタイマも単位は msだし、使い難いから
実行時間を計算するような場合はパフォーマンス カウンタを使う方がいいと思う
RDTSC命令を呼ぶか QueryPerformanceCounter を使うか
ストップウォッチの計時にタイマを使うのは、精度を考慮するとダメです。 GetTickCount や Now など時刻を基準として差をとるべきです。 241の問題で残っているのは、単に表示の仕方だけ。
>>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 がもっとも手軽で精度も通常用途では十分だと
思われる。タイマなど時間間隔をつかった計時は、誤差が累積するので
時刻差を利用したほうがよいのは当然。
>GetTickCount NT系ではデフォルトの精度が10msecなので、 timeBeginPeriod(1); を忘れるな。
286 :
デフォルトの名無しさん :02/06/21 10:15
287 :
デフォルトの名無しさん :02/06/22 08:57
質問です。 時刻と時間の違いに関してですけど、時刻を扱う時はTDateTimeを使えばいいとして、 時間を扱う時はTDateTimeを使っていいのでしょうか? それとも、カウンターとして整数型の変数を利用した方がいいのでしょうか?
>>287 TDateTime を使ってもよいと思うが、時間間隔を TDateTime に変換する
コストや変換にともなう誤差を考慮すると、わざわざ TDateTime に変換する
意味はないと思うよ。
例えば、GetTickCount で時間差を計時すると、ミリ秒単位での数値が得られ
るわけですから、これを時間、分、秒に換算するのは簡単です。どこにも
TDateTime への変換を考慮する必要はありません。
delphi5を使っているのですが、検索ダイアログや、エディタのタブなんかのフォントサイズが突然変わり、 一旦delphiを再起動すると治る。 ってな症状が出てるの俺だけですか?
>>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; みたいなことをやってみても、エラーになってしまいます。
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;
>>288 上の方を読んで、精度が必要な時はGetTickCountの差で求めるのかなと思ったのですが、
基本的に時間を使う時はGetTickCountの差で良いってことですかね。
教えてくれてアリガトです。
>>294 GetTickCountが一周して0にもどってもいいように処理してね。
>>289 リソース不足なんでは?
以前Win98で使ってて、リソース不足でフォントが異様に大きくなり、
その製でスクロールバーが馬鹿でかく膨らんだ経験あり。
解決策は、NT系に乗り換えること。
とはいえNT系でも無尽蔵なわけでもないが。
>>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とやってます。
VCLの勉強をはじめようと思うのですが、 どこか参考になるようなサイト教えてください。
げ、リンクがほとんど切れてる。
>300 大体こんな感じなんだけどな。 「プロジェクト○○がEDataBaseクラスの例外を生成しました。データセットが編集又は挿入モードではありません。」
>>304 そのままやん。Table1 の宣言の方法などをさらせば識者のご加護が得ら
れるだろう。(俺は、Delphi 使いじゃねーから期待するなよ。)
>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;
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のようなエラーになる。
うまくいきました。 edit; は、書き込みの度にやらなければならないようですね。場所を変えたら、うまくいきました。 ども、皆さん、ありがとうございました。
>>302 ありがとうございます。
参考にさせていただきます。
310 :
デフォルトの名無しさん :02/06/23 07:10
ちょっとDB周りの処理で苦しんでいます。 UpdateSQLを使用した更新を行っているのですが 更新ボタンを押すと、Query1.ApplyUpdatesを実行するようになっています。 しかし、この時点でアプリを起動したままWindowsをシャットダウンすると 書き込んだはずのデータが消えてしまうんです。 ディレクトリ内に MBファイルが残っているところを見ると 正常に更新ができていないという事なのでしょうか? ちなみにアプリケーションをきちんと終了した場合は データはちゃんと書き込まれています。
>>310 そもそも何で...
> この時点でアプリを起動したままWindowsをシャットダウンすると
と言う運用するんだ ?
312 :
デフォルトの名無しさん :02/06/23 09:00
>>311 クライアントがむちゃな操作をするもので…
>>311 まさか Commit してないとか?
ヘルプより
>データセットを更新する方法としては,個々のデータセットの ApplyUpdates
> メソッドを呼び出すよりは,データベースコンポーネントの ApplyUpdates
>メソッドを呼び出すことをお勧めします。
>データベースコンポーネントの ApplyUpdates メソッドは,
>トランザクションのコミットおよびロールバックを処理するとともに,操作が成功したときにキャッシュをクリアします。
Filter文字列に「あ行で始まる名前」をセットするにはどうすればいいのでしょうか? Dataset.Filter := '''YOMI = '' + ''あ*' or 'YOMI = ''い*' .....以下同じ...'''; みたいなことをやろうとしているのですが、’の数とか訳分からなくなってしまう厨です。 もっといい方法ありますか?
315 :
デフォルトの名無しさん :02/06/23 17:26
>>314 横一行に書くんじゃなくて段落分けしなされ。
orの部分で改行すべし。
>>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は、濁音・半濁音は区別しないようですが、区別させるスイッチか何かあるんですか? ワシの所では、'は*'だと「は〜」も「ば〜」も「ぱ〜」もヒットしますけど。できれば区別させたいです。
ASCII ソートの Index を作成して有効にすればよかったかと。
321 :
デフォルトの名無しさん :02/06/27 23:38
BMPを白黒ビットマップかどうか見分けるにはどうしたらよいですか?
>321 Pixelformatでみたらどうすか? それとも1bit以外のBmpで白と黒だけが使われているってことですか?
323 :
デフォルトの名無しさん :02/06/27 23:48
>>322 あ、そうですね。PixelFormatで見ます。
>>321 Image1.LoadFromFile('ファイル名');
if Application.MessageBox('白黒ですか?', '突然ですが質問です', MB_YESNO or MB_ICONQUESTION) = ID_YES then
//白黒
else
//カラー
>324 文法エラー。
326 :
デフォルトの名無しさん :02/06/28 18:05
関数とか宣言したあと、なにかショートカットキーを押すと 実際に処理する部分をすぐ書けるように出来たと記憶してるんですが、 なんでしたっけ? 3個ほど一緒に押してたような…。
イヤン!そこは違うってば!
クラス補完 か コード補完 でヘルプを検索して
>>326
329 :
デフォルトの名無しさん :02/06/28 18:44
>>328 さんきう。〔Ctrl〕+〔Shift〕+〔C〕 がそうらしいのだけど、
押しても何もならない。今日、delphi6 personal 入れたばかりで
設定とかはディフォルトのままのはずなのに…。
personalにはないよ
>>330 マジ? なんでこんなものを省略するわけ?
ぼうらんどさんよ、もうね、アフォかバ…(以下略
332 :
◆tare/k3c :02/06/28 20:11
もし初心者ならコード補完なぞ使っちゃいかんよ。 補完しなくてもソラで打てるようにならないと上達しないよ。
personalにコード補完まで入れてしまうと、professionalが売れないからでしょう… データーベースよりもActiveXよりもVCLソースよりも何よりも、 コード補完と[Ctrl]+上下の移動がprofessional最大の価値と僕は思ってます。
>>332 まぁ、初心者かな。N88-BASIC のころからサンデープログラマー(死語)もどきでは
あったんだけどね。つーか、あれでしょ、Delphi に限らないと思うんだけど、
覚える単語っていうかスペルっていうか多すぎ。
これで飯を食っていかなくちゃいけないのならともかく、休みの暇つぶしにやる程度なら、
絶対覚えれないって、、、たぶん (;´Д`)
>>333 なるほど…(w
>休みの暇つぶしにやる程度 こんなもんは上達しようというのが無理。 趣味だって、一所懸命やらなくては物にならんよ。 単語覚えるのは、言語の文法を覚える以前の問題だと思う
>>334 アルファベットの列と見るから覚えられない。
アレは意味のある英単語だ。
>>335 >>336 言いたいことは分かるが、はっきり言って、補完が効くものを全て覚えようという気はない。
限られた時間のなかでの優先順位は 文法>単語 だな。単語をいちいち覚えるくらいなら、
自分の作りたい処理(アルゴリズム? ちょっと大げさか)を考るほうが楽しいし、やりたい。
338 :
デフォルトの名無しさん :02/06/28 23:36
char 型の文字からAScIIコード得るにはどうすればいいんですか? Cのような自由さがないからいいんだけど、 なさ過ぎてこまったり・
339 :
デフォルトの名無しさん :02/06/28 23:43
340 :
デフォルトの名無しさん :02/06/28 23:51
>>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()を使う。
憶えるも何も、俺は脊髄反射で書けるようになったよ。 考える前に手が動くので、コード補間などいらん。 むしろ勝手にprivate部に置いてくれたり、インデント幅が自分のスタイルと違う(かなり深刻)ので使えん。
346 :
デフォルトの名無しさん :02/06/29 09:58
データベースについて。 項目がMEMO型の場合、dbgridを使うと、(MEMO)としか表示されませんが、DBMEMOコントロールを使わずに内容を表示する方法はありませんか? グリッドにアクセスとかエクセルとかみたいに一覧表示をさせたいのです。
メモ型のデータは長い文字列になることが多いですから、グリッドのセルに うまく収まるかなど溢れた場合の対策をきちんと行う必要がありますが 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ファイルは、実行ファイル内に 取り込むことはできないのでしょうか?宜しくお願いします
>>348 Animate1のcommonAVIをaviFindじゃだめなの?
350 :
デフォルトの名無しさん :02/06/29 13:01
>>338 です。
>>343 ナルホド。順序型と考えるなら、すごく納得できます。ありがとうございました。
>>334 16進数の場合も教えてもらってありがとうございます。
Pascalやってた時使わなかったから、その内またココで聞いてしまったかも!?
>>349 !まったくそれで解決しました。有難うございました!
352 :
デフォルトの名無しさん :02/06/29 16:22
Del6のTDownLoadURLでファイルをダウソしようとするときの イベントOnDownloadProgressのStatusTextを取り込むには どうしたらいいんだ?
353 :
デフォルトの名無しさん :02/06/29 17:09
tEDITのキーボード入力モードについて質問 windows制御でctrl+英数 を押下することで半角カナモードにしている場合 それをdelphiで制御するのどうやるの? IimeModeは単にIMEだけの制御みたいでできません。 ほとんどの領域はカナ入力である部分だけ英数にしたいのです。 ctrl+英数 なんて使うな!という回答がないよう祈っています。
>>353 大文字小文字、全角半角の織り交ぜ方が素敵です。
何がしたいのか意味がわからん. ImeModeでなにが足りないの?
最近、方々のBBSや掲示板を見てみると、プログラミングの前に、 日本語勉強しろや、と思ふことしばし。
どこでもそうだけどな。
(´-`)。o ○ (
>>352 みたいな礼儀知らずに答えてあげる心優しい人はいるんかな…?)
(´-`)。o ○ (>>答えてあげたいけど、DLEPHI歴5時間の俺には意味さえわかんない)
>>352 取り込む?マジで意味わかんねーよ!?
オマエStatusTextが何なのかは知ってるか?
フォームにTMemoでも貼り付けて Memo1.Text:=StatusText; とでもしたらどーだ ゴルァ!
>>360 ありがとう。TMemoに表示させたらURL(TDownLoadURL.URL)がでてきたよ。
でも、Helpにある「StatusText は,ダウンロードの状態をユーザーに表示」ってこんなものなのかなぁ(´-`)。o ○
ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!! ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!ストッピング、ゴー!!
で?
あるか
>347 コメントありがとうございました。実験してみて、また結果等をうぷします。
367 :
デフォルトの名無しさん :02/06/30 23:16
で、あるぱ
369 :
デフォルトの名無しさん :02/07/03 06:22
7月あげ
昨日保存したファイル(*.pas, *.dfm)があるですが、 Delphi でまた続きからやろうとしても、 実行(F9)が無効になっていて実行できないんですが、 これは Borland の嫌がらせですか?それとも、 Personal では、保存したらもう二度と使えないという 罠ですか?マジレスお願いします。
>>371 レスありがとうございます。
*.dpr はなくて、*.pas と *.dfm しかありません。
もしかして、昨日作ったぶんはあぼーんですか?
がんばってあぼーんは回避しました。
>>372 保存してない可能性もあるけど、別の場所に保存した可能性もあるから
HDを *.dpr で検索してみたら?
それでもダメなら 新しいプロジェクト作って その *.pas を開いて
プロジェクトに追加するだけでいいと思うよ(普通は)
>>374 レスの入れ違いになりましたが、解決しました。
その後の方法でできました!
アドバイスありがとうございました!
自動保存のチェック入れといた方がいいよ
377 :
デフォルトの名無しさん :02/07/09 23:17
緊急age
3日間以上もカキコがなかったのは、376 読んで脱力したからだと。
>>378 625 は Delフサスレからのです。
380 :
age man :02/07/10 22:10
別に脱力してないので age
なんか変なスレになってきたねぇ…
あついからねぇ...
__________ / ∧,,∧ < 暑苦しいと?おっしゃる? ミロ゜ ,彡 \ U ミ \ ミ @  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ U''U  ̄ ̄ ̄ ̄
__________ / ∧,,∧ < 暑いので、毛、刈られますた ミロ゜ ,| \ U | \ | p  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ U-U  ̄ ̄ ̄ ̄
このスレで日本を統一!! で、あるな。
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」???
>>386 新しいプロジェクトで最小限のコードでも再現する?
>>386 同名の API と混同されている。
uses 節の Windows と SysUtils の順番に注意
>>387 左辺定数の評価式は基本だろ?知らないのか?
>>397 =387
よかったな。賢くなったぞ。
友達に自慢しれ。
393 :
デフォルトの名無しさん :02/07/13 23:54
基本なわけねーだろこのアフォ!異端児!
Delphiでははじめて見た。
↓=387らしい
397 :
デフォルトの名無しさん :02/07/13 23:58
オレだ(藁
>>389 同名の API と混同されている。
uses 節の Windows と SysUtils の順番に注意
SysUtil,・・・,Windows になってました
Windowsを先頭に持ってきたら見事直りました。有難うございます
usesにも順番ってあるんですね、まったく知らなかったです
ところで同名の API と混同されている。というのはどういう
意味なのでしょうか?
>>387 左辺定数には特に意味無くつかってます。というかコピペさせてもらったのを
使ってるだけですので..
389ではないが
>>399 SysUtilsで宣言されているDelphiの関数FindFirst, FindCloseと同じ名前のWindowsAPI
がある。これの関数宣言はWindowsユニットにある。
同じ名前の場合は、usesでは後から宣言したほうが有効になったはず(確か)
だから入れ替えたらSysUtilsのほうが使われるようになる。
明示的にユニットを指定して関数を呼ぶこともできる。SysUtils.FindCloseとかWindows.FindCloseというふうに。
間違ってたらスマソ。
へー。初めて知ったよ。ふーん。ちょっと感動。有意義!
>>399 =386
400 さんの説明どおりです。解決してよかったですね。
ちょっとつけ加えると、
VCLの SysUtils ユニットの FindFirst()、FindNext()、FindClose() は
Windows に宣言されている FindFirstFile()、FindNextFile()、FindClose() API の
ラッパーなんですね。そして、FindClose() だけが名前が同じなんです。コンパイラ
は関数名や変数名、定数名などの識別子を見つけるために、最初に、そのコードが書
かれているユニットの前方を探します。そこで見つからないと、直前の uses 節の
うしろの方のユニットから順番に探します。ですから、uses 節の並びの順番は重要
なんです。Delphi の Object Pascal に名前空間の概念がありませんが、このように
して、各ユニット間での参照の優先順位を設けることによって識別子を解決します。
ほかにも TControl.GetClientRect と GetClientRect API のようにメソッドで同名
のものもあります。400さんが指摘されているように、優先順位が低いユニットの
識別子を使うときは、ユニット名を参照します。
なるほど、uses節は全く考えずにどんどん追加してたのですが、いろいろ法則が あるのですね、問題解決以外にも知らなかったことを教えていただき 非常にためになりました(説明文にも分からない単語がいくつか...w 調べてきます)。有難うございます。
404 :
デフォルトの名無しさん :02/07/14 09:47
フレーム内のEditのExitイベントに処理を記述して、 そのフレームを貼り付けたフォームの中の同じEditのExitイベントに別の記述を行った場合、 フレーム側で記述してあったイベントの処理が流れないのですが、 これは仕様なのでしょうか? (あれ?と思いinheritedも書いて見ましたが駄目でした。)
ごめんなさい、勘違いしてました。 Frame21.Edit1Exit(Sender); ってな感じでかくんですね(汗)
406 :
デフォルトの名無しさん :02/07/14 10:04
Delphi初心者なのですが、
>>404-405 さんの文面を拝見して思ったのですが、Delphiのフレームを利用する場合に
フレーム自体は、貼り付けたフォームに対してクラスとして扱われないのでしょうか?
クラス内クラス的に定義出来れば、フレーム元を継承してinherited等ですっきり爽やかに書けそうなのですが
Delphiのクラスはクラス内に多段階的にクラス定義(継承?)できないのですか?
# クラス・クラスと書いてますが、まだ勉強始めたばかりでよくクラスについても分っていないのですが・・・。
フレームもクラスですよ。 でも、フレームとフレームを貼ったフォームは所有関係になるので継承は関係ないですね。 それと、イベントを上書きした時元が呼ばれないのは、 イベントは(仮想関数では無くて)メソッドポインタ型のプロパティにすぎないからです。
フレーム使わないので知らなかったけど
確かに
>>405 で書いてるような使い方じゃちょっと使いづらいね。
あ、フレーム内にコード書かないような作りにしちゃえばいいだけか。
>>407 なるほど・・・。マジで初心者なんで私にはまだよくわかりませんが(^^; でもなんとなく、イメージできました。
>>407 でもコンパイル時にイベントが上書き定義されてる!って
警告でも出して欲しいとか思ったりするけど。
411 :
takuo :02/07/14 11:41
かとちんうざい
>>411 2chと勘違いしてる香具師もアレだが、それに反応するのもウザイさね
413 :
デフォルトの名無しさん :02/07/14 18:43
414 :
デフォルトの名無しさん :02/07/15 14:59
ものすごく基本的なことを聞くようですが、教えてください。 Chr(i) で文字コード i の文字が得られますが、2 バイト文字の文字コードから文字を取得 するにはどのようにすればよいのでしょうか? いろいろ試したり調べたりしたのですが お手上げです。
function Chr2(lo, hi: Byte): String; begin SetLength(Result, 2); Result[1] := Chr(hi); Result[2] := Chr(lo); end;
>>415 できました。ありがとうございました。
今までできなかったのはエンディアンを逆にしていたからだったなんて
恥ずかしくて言えません……。
えーと、質問です。 普通オブジェクトのインスタンスをつくるときは、 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 を使えば良いんでしょうか?
オブジェクトの数が1か多で 生成・廃棄のタイミングは変わらないのでは。
try も finaly もいらないよーん
>>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;
とかやっちゃうかもしれません。私の場合。
でも、もっと楽な方法とかありそう?
ミ,,゚Д゚ミつ TDateTimeを二つ用意して その差分の分を求めるには どしたらいいでしょうか? "+30"分とか"-180"分とかで 表示してみたいのです。
T1 := Now; T2 := Now; TDiff := (T2 - T1); Label1.Caption := Format( '%d分', [TDiff * MinsPerDay]); でどお?
nilが入っている変数へのFreeは何も起こらないので、if文をひとつ省略できます。
>>423 FreeAndNilを使っても良いのでは?
nilをつっこむ手間もはぶけるはずです。(うろ覚えですが…
>>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イベントだと常に効いてしまいますし・・・。
まぁ、私個人の意見で適当かもしれませんが…。
>>426 ColWidthsプロパティとOnDrawCellイベントを利用して出来そうですがどうでしょう。
面倒かなという気もしますけど…。
>>427 私も先日同様の問題に直面いたしまして。各所ホームページを参照しながら作成しま
した。折角ですし、TBitmapを継承したクラスで実装しては如何でしょう?
>>428 プロジェクトソースでGetKeyStateを利用すれば簡単に実装できますよ。
>>429 あぁ…そう言えばそうですね。早速作っておきます。
それがその、回りくどいことにTJEPGImageのbmp版?を作ってました(笑
いやいや、あまり笑えません。ありがとうございます。
>>429 ありがとう!試してみます。
プロジェクトソース側で書けば良かったのかぁ・・・勉強になりました!
自己フォローです。 何故に変な形式なのかなぁと久々にTBitmapが吐いたbmpファイルを眺めていた のですが、よくよく見ると32bit/pixな形式になってました(気付けよ)。 どうやら画面モードが32bitになっているのにつられてそうなったようです。 で、試しに bitmap.PixelFormat := pf24bit; とやってみたところ24bit/pixなbitmapが生成されました。 これだとPhotoShop他でも問題なく読めました。 32bit/pixなスタイルがいけないのかどうなのか不明ですが、これでひとまず 大丈夫なようです(いいのかなぁ)。 今後はもう少し熟考してから質問します。失礼しました。
正直、未だにinterface型が分かりません。 GUID?何じゃそりゃ?って感じです。 どなたか教えてください・・・。
434 :
デフォルトの名無しさん :02/07/16 19:28
複数のフォームを静的に生成するアプリなのですが 表示させるフォームが常に一つだけという形にしなくてはなりません メインフォームを非表示にし、他のフォームだけを表示させたいのですが SubForm1.Visible := True; MainForm.Visible := False; ではだめですし。。。 SubForm1.ShouModal; だと メインフォームが可視状態ですし。。。
>>434 .dprファイルで、CreateFormする前に
Application.ShowMainForm := False;
とすれば?
>>435 ご回答ありがとうございます
起動時はそれで解決できたのですが、
その後、メインフォームを一度表示させてから、
メインフォームが受け取るイベントによって
>>434 で記述したように
他のフォームと表示・非表示を切り替えたいのです
>>434 Hide, Showとか使っても・・・同じか
>>436 ていうか普通に出来るぞ。
どういうイベントで、どういう状況?
>>437 あ!
これ やってみたらできますぃた!!!
Hideじゃだめかと思っていたんですが
Visible := False;
と同じだとばかり思っていましたが、違うみたい。。。
ありがとうございます
参考までに他の手段をご存知でしたら、お教えください
>>438 起動時に
Apprication.ShowMainForm := False;
として メインフォームではないフォームを表示させて、
タイマーきって そのフォームを閉じて、メインフォームを表示させます
その後 メインフォームにあるボタン等のOnClickメソッドで、
他のフォームを表示させて、メインフォームは非表示にする。。。
という部分ができなくて
メインフォームが残ってしまったりして。
441 :
デフォルトの名無しさん :02/07/16 20:33
ほっしゅほっしゅ
>>439 いや、同じだぞ・・・。
参考;Forms.pasのソース
procedure TCustomForm.Hide;
begin
Visible := False;
end;
>>442 多分、あれじゃないですかね。
MainForm.Visible:=False;
と処理したのではなく、オブジェクトインスペクタで代入した…と。
その場合、Application.ShowMainFormプロパティに触れていなければ強制的に表示
されますんで。違うかな?
>>417 リストクラスを作ってしまった方が簡単確実だと思います.
// 手抜きリストクラスの宣言
TMyObjectList = class(TObjectList)
private
function GetItems(index: integer): TMyObject;
public
property Items[index: integer]: TMyObject read GetItems; default;
end;
// 手抜きリストクラスの実装
function TMyObjectList.GetItems(index: integer): TMyObject;
begin
result := inherited Items[index] as TMyObject;
end;
// 使う
myobjs := TMyObjectList.Create;
try
myobjs.OwnObjects := True;
for i := 0 to MAX do
myobjs.Add(TMyObject.Create);
// いろいろ
// 各オブジェクトは myobjs[i] と配列のように表せます(文字列リストと同じ).
finally
myobjs.Free;
end;
445 :
デフォルトの名無しさん :02/07/16 23:45
「モナーの *やさしい* Delphi質問スレ」は無しってことでしか?
>>446 1000超えてるから、新スレは?ってこと。
保存はしますた。
あのスレの最後のほうに書いてあるように、 ここに統合された。
450 :
デフォルトの名無しさん :02/07/17 03:55
WinAPIの検索してる方。こんなページを見つけました。 messageも載ってる様です。 yokohama.cool.ne.jp/chokuto/hsp/index.html ww2.tiki.ne.jp/~yuarin/toy/api.htm
プログラミング初心者がDelphiを覚えるのに(・∀・)イイ!!書籍って何でしょうか? というか、本屋に行ってもDelphiの本が少ないんですが。
>>452 最近の Delphi-ML では 日経BPの「カンタンDelphiプログラミング」というのが
初心者向けではいい! ということになっているようです。
454 :
デフォルトの名無しさん :02/07/17 23:14
Delphiの仕事がありません。どうしたらいいでしょうか?
>>455 仕事ある言語を覚える。言語スレで言うのもなんだが、言語に寄りかかるなよ。
>>453 本屋でちらっと見たんですが、ムックですよね。
無くなる前に購入してみます。
回答ありがとうございました。
>>457 本は少ないやねぇ。でもネット徘徊してれば必要無いよ。
特に最初のうちは。
んで、突っ込んだヤツを考え始めるといろいろ困る。
しかし、delphiマガジンっていまだに見たことないんだけど、伝説上の本か?(^^;。
近所の図書館にLinuxマガジンが入ってるのを見た時は「delphiマガジンも購読してくれよ!」
と思いますた。
459 :
デフォルトの名無しさん :02/07/18 00:58
Delphiで以前に作ったProjectを開こうと思ったらエラーが出たんですけど、原因と復旧法を教えてください。 Del6(Personal)で、以前に作った時も同じバージョンです。 エラー文 --------------------------- エラー --------------------------- モジュール 'rtl60.bpl' のアドレス 40009054 でアドレス 00000054 に対する読み込み違反がおきました。. --------------------------- OK ---------------------------
>>455 自分で企画・提案・計画・仕様書書け!!
461 :
デフォルトの名無しさん :02/07/18 01:03
>>459 Delphi6の修正RTLダウンロードしてインストールした?
>>461 してません。(名前を聞くのも初めてです。・゜・(ノД`)・゜・)
Borlandのページかな?
逝ってきます。
>>461 AV アドレスから見て RTL アップデートとは関係ないと思います。
ちょっと追ってみましょう。
アドレス間違えていないかな?
>>459 また明日...
465 :
デフォルトの名無しさん :02/07/18 04:53
Memo1.Lines.SaveToFileでMemo1の内容を保存できません。 kakoっていうフォルダを実行ファイルと同じフォルダに置いてます。 どこが悪いですか? 以下、関係する部分です。 var kakoPath: String; procedure TfrmMain.FormCreate(Sender: TObject); begin kakoPath := IncludeTrailingPathDelimiter(ExtractFileDir(Application.ExeName)) + 'kako\'; //kakoフォルダの場所 end; procedure TfrmMain.S1Click(Sender: TObject); var res: Integer; begin res := frmSave.ShowModal; if res = mrOK then with frmSave do Memo1.Lines.SaveToFile(kakoPath + YEdit.Text + '/' + MEdit.Text + '/' + DEdit.Text + '.txt'); //YEdit・MEdit・DEditはfrmSaveに属します end; ____________________________________________________________________________________________________________________________________________ これより、pasファイルが変わります。 var frmSave: TfrmSave; implementation {$R *.dfm} procedure TfrmSave.SaveBtnClick(Sender: TObject); begin frmSave.ModalResult := mrOK; end; procedure TfrmSave.CancelBtnClick(Sender: TObject); begin frmSave.ModalResult := mrCancel; end;
はぁ。歴史的事情でファイル名に / は使えません。 Unix 風ディレクトリセパレーターである / を DOS の セパレーターである \ と同一視していた時代があったため。 ためしに 期待するファイル名を手で作成してごらん。はねられるから。
>>466 おっしゃる通り、 / は使えませんでした。どうもありがとうございました。
というか、Win2kなんかだと/は\の変わりに使える罠。
>>468 W2K でもデフォルトではだめでしょ?
>>469 実験で、FindFirstを用いてWin2kで/を使ってみたらうまくいきました。なんか、
設定がしてあるんでしょうか。
質問があります。 DLLプロジェクトなんですが、起動時に表示されるフォームを画面上部に画面横幅い っぱいに表示したいと思っています。(その後は、サイズ調整自由) この時、フォーム内のコンポーネントには、横幅にあわせて位置が変わるコンポーネ ントもあります。(AnchorsプロパティでakRightを指定してあります) 実現方法として、OnFormCreateイベント中で、フォームのWidthにScreen.Widthを 代入するという方法をとりました。 ところが、この手で大きさを変えると、AnchorsにakRightを指定したコンポーネン トが、とてもフォームの右端を基準に調整したとは思えない場所に表示されます。 どなたか、原因、解決策等ご存知でないでしょうか?
実際にテストしたわけではないので確実ではないけれど。 FormCreate はオブジェクトが作成された時点のイベントだから、 OnShow の方がよいと思う。
>>472 OnShowを利用したのですが、同様にうまくいきませんでした。
追記)一応場所が動いてはいるのですが、十分に動いていない(予定位置の半分くら
いの位置で止まっている)のです。何が原因なんでしょうか…。
すいません。原因が分かりました。 OnCanResizeイベント内で、 if NewWidth<480 then NewWidth:=480; と、最低幅縛りを入れるとAnchorsプロパティにakRightを指定してもまともな位置に 表示されないようです。原因はわかりませんが…。 とりあえず、どのような解決法がありえるんでしょうか。
>>474 Windowの大きさ制限はフォームのプロパティでやるようにしたらどうですか?
>>475 色々やったらうまくいきました。有難う御座います。
(Constraintsプロパティなんて使ったこともありませんでした。多謝)
477 :
でもどり初心者 ◆KcG2I.hg :02/07/18 15:25
最近、OSを再インストールしたんで、 Delphi6.0Personalも再インストールしようと思ったんですが、 使用許諾コードの取得でまでは完了するんですが、 キャプションが「Delphiの登録」のウィンドウの下の方に 「登録に失敗しました。もう一度試して見てください。」 とでるんですが、何度やっても先に進みません(涙) 捨てメアド取得して1から再インストしないとだめなのかなぁ ネットで配るんなら、認証もっとゆるくしてくれよぉ
>>477 で、結局どーなったんでしょう?おちおち再インストールも出来ないですなぁ…。
ところで、関係無いですが、英和訳エンジンって便利だけど
○全体的にユニークな確認者(GUID)
○タイプ図書館
○ActiveX図書館
○COMオブジェクト魔法使い
やっぱりまだまだかなぁ(^^;。ところどころで「タイプライブラリ」って
訳せるくせにどうして図書館になるかなぁ?あと「COMオブジェクト魔法使い」が
気に入った。
>>477 ,
>>478 あれは十分ゆるい/ぬるい認証システムだとおもうがなぁ。
使用許諾コードを新しいマシンの上で生成したのだよね?
最悪、Borland に電話してみたら?
>>477 私、会社のマシンでDelphi6インストールして、そのままのコードを使って自宅のパソ
コンにもDelphi6インストールしたらうまくいきました。
まぁ、同じWin2ksp2ではありますけど。
別のパソコンで使いたいならレジストリの内容を保存しとけば?
482 :
でもどり初心者 ◆KcG2I.hg :02/07/19 12:23
結局、一度アンインストールし、別のメアドで登録してキーを取得して
インストールしてうまくいきました。って、うまくいくの当たり前か。
>>479 金払ってないから、サポートに電話するの気が引けるんだよね(汗
認証はMSのアクチに比べると緩々だと思うけど、
せめて、もうちょいわかりやすくメアド登録して、帰ってきたパスを
打ち込むぐらいにして欲しかった。
いや、タダで使わせてもらってるから、大きい声ではいえないんだけど(w
>>481 どのレジストリのキーかわかりますか?
Borland の言語製品は複数のマシンへのインストールを許していますし、 Personal 版は無料で公開しているものなのですから、サポートに電話してみても 問題ないと思いますよ。 もちろん、Pro/Ent の不正コピーとかという話だとまた別ですが。
>>482 どのレジストリって・・いかにもなのがあるから自分で見たら?
それにレジストリ保存しないと色とかの設定で困らないの?
485 :
デフォルトの名無しさん :02/07/20 11:48
あげ
486 :
デフォルトの名無しさん :02/07/21 01:20
あげてもあげてもさがっていくなぁ。 せっかく統合したのに談話室の方が人気ある
ただ煽り合いが加熱してるだけでしょ
相談室は隔離施設だから、質問はここで。
489 :
デフォルトの名無しさん :02/07/21 18:17
bmpファイルをexeに埋め込むことはできないのですか? exeだけ移動して実行すると「***.bmpは開けません」という エラーメッセージがでます。
>>489 簡単なのはイメージリストとかvisible:=falseなイメージとか。
リソースに組み込んでもいいけど。
491 :
デフォルトの名無しさん :02/07/21 18:23
>>490 ありがとうございます。リソースに組み込むのをやってみようと思います。
_____________ 彡ミ | | ∧,,∧ |__ / |ヽ | | ミ,,゚Д゚ミ/ / < 世間はぶっそうだなあ |ヽ | | (ミ ,/__()旦~~ \ ⊥ |  ̄| ̄|| ̄ ̄ ̄ ̄ ̄|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |__| ◎ ̄| ̄| ̄ ̄ ̄ ̄ ̄| ところで、DateTime型を受け付ける プロパティエディタってないでしょうか? MilliSecまで設定できる奴がいいです。 自作るのも面倒だし、、、 できればTTimeStampでも同じ動作する と、うれしいです。
>>492 勘違いかもしれんが
type TDateTime = type Double;
だから、そもそも published にできないのでは?
Del付属のリソースエディタでは ビットマップやアイコンしか入りませんが、 リソースにバイナリデータを埋め込むにはどうスレば良いのですか? (アプリケーションで、このデータをまるごとファイルに書き出してのに使います)
496 :
Delフサギコ ◆VzDeLphI :02/07/22 00:27
? _____________ 彡ミ | | ∧,,∧ |__ / はて? |ヽ | | ミ,゚Д゚,ミ/ / < フサんちではDateTimeも |ヽ | | (ミ ,/__()旦~~ \ Doubleもインスペクタに出ますよ ⊥ |  ̄| ̄|| ̄ ̄ ̄ ̄ ̄|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |__| ◎ ̄| ̄| ̄ ̄ ̄ ̄ ̄|
すまぬ。ヘルプによれば 実数型は,Real48 を除いて published が指定できます。 でした。
>>494-495 リソースに任意のファイルを埋め込む事のみを目的にしたコンポって
作れないのかな?
それとも原理的に無理なの?
あれば便利だと思うんだが。
初級者丸出しな質問ですまそ。
>>498 リソースは、コードがコンパイルされる前にコンパイル済みでなくては
ならないので、コンポーネントにするのは非常にむつかしい。
*.dfm に取り込むなら簡単だけど。以前、ML で議論されていた。
>>499 dfmに取り込まれるってことは、実行するとメモリ上に展開されるってことでいいのかな?
つーことは巨大なファイルだとメモリを大量消費するのかな?
そのとおり。それがリソースとの比較では欠点だよね
ところで
>>495 のURLの方法では何が不満なの。テキストファイルひとつ
書くだけじゃん。
>>498 TImageのようなのを作れば可能と思うよ
ByteImageプロパティと SaveToFileメソッドだけのコンポーネントね
ただByteImageプロパティエディタも作らないといけないけど
>>500 dfmはたしかリソースに入ってるから、ストリームとして読まれるんじゃなかったっけ?
504 :
デフォルトの名無しさん :02/07/22 12:21
256色以上のビットマップをリソースにするにはどうすればいいのでしょうか?
505 :
デフォルトの名無しさん :02/07/22 12:32
>>504 確実なのは、BMPのファイルイメージをバイナリリソースにして
おいて、実行時にリソースから読み出したバイナリ列でピクセル
列を作成する方法かな。
最近デバッグ実行を終了する際に、 delphiの反応が無くなるようになって作業にならないんですが(;´Д`) OSの再インスト時期なのだろうか……
>>506 さあ・・・ 自作コンポが悪さしてるかもしれないし何とも他人には判りません
今、D6でエディタを作ってるんですが、 TMemoやRichEditに改行マーク↓や[EOF]マークを 付けるようにするには、どうしたらよいのでしょう?
>>497 Delphiが出たばかりの頃に出た昔の某Y氏の本に
実数型はpublishedにできないと書いてあったので
しばらくだまされた(^^;ものです.
#まだDelphiをよく理解しないうちに書いたように思える本でしたが
この本のおかげでDel始めてすぐにコンポを作れました.
>>509 TEditorのようなものを自作したいので、
どのようにやるのか方法が知りたいんです。
>>511 TEditor作りたいなら TLabelを参考にした方がよかったり
TLabelとTEditorを参考にしたら出来ました! ありがとうございました。
>>515 文末と行末に TLabel を貼ったのか?
>>513 は別人です。
どなたかヒントか何かいただけませんか?
どうにかして改行やEOFを判定して PenやCanvasで文字のあとに描くのでは、
519 :
デフォルトの名無しさん :02/07/23 03:57
フォームAの上にEditを配置して、入力中に[F2]を押すと別のフォームBをポップアップ表示させて 丁度、コンボボックスのリストの高機能版のようなことをさせようとしているのですが、以下の問題が 解決できません。 1.フォームBを表示させるとフォームAからフォーカスが奪われる 2.フォームAにフォーカスが移動するとフォームBが後ろに回って見えない。 何か良い解決策はないでしょうか。
>>519 TForm では無く、TListBox とかの普通のコントロールを動的に生成して
位置あわせしたらどう?
521 :
デフォルトの名無しさん :02/07/23 05:43
FormのOnpaintイベントじゃなくて、OnCreateでCanvasを扱おうとすると無理ですよね? それはOnCreateが呼び出されるのがフォームのインスタンスが作成された直後で、フォームが表示される前だから、Canvasは反映されないっていう考え方で合ってますか?
>>520 ちょっと項目が多いのでフレームでなんとかやってみます、有難うございました
>>521 procedure TForm1.FormCreate(Sender: TObject);
begin
show;
Self.Canvas.Pen.Color:=clRed;
Self.Canvas.LineTo(100,100);
end;
やろうと思えば、こんなかんじで show 入れるとできますけど。
524 :
デフォルトの名無しさん :02/07/23 06:24
>>523 なるほど、勉強になりますた。ありがたや、ありがたや。
>>519 フレームでいいと思うけど フォームでやる方法もあるよ
type
TForm2 = class(TForm)
・・・
procedure CreateParams(var Params: TCreateParams); override; //これを追加
end;
その実装部
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.Style:=WS_CHILD;
Params.WndParent:=Form1.Handle; //親をForm1に変更する
end;
フレームと違って、位置合わせはコードでやらないといけない。
でも、フォームにPaintBoxを貼っておいて
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.BoundsRect:=PaintBox1.BoundsRect;
Form2.show;
end;
と、PaintBoxの範囲にあわせるようにすると楽
ツルーバーについて教えてチョンマゲ TToolBarのWrapableプロパティをTrueにした状態で、ToolBarのWidthを縮めると ToolBarが折り返されるんだけど、折り返されたときのイベントって分かりますか?
ゴメンヨゴメンヨ。ツルバーのOnResizeで取れたよ。 全然違うツルバのResizeにブレクポインコ張ってた。テヘ。
530 :
デフォルトの名無しさん :02/07/24 12:25
ADVゲームを作ろうと思うのですが、文字を一つずつ表示するようなコンポーネントって ありませんか?
Delphian WorldのGraphics&Mulitmediaで探せば?
533 :
デフォルトの名無しさん :02/07/24 16:03
TListView の vsReport 表示のときに、項目幅を変えさせたく無いんですが、 何かいい方法ありませんか? columns のwidth 設定はちょっと・・・ 幅変更のマウス表示すら無くしたいのですが。
534 :
デフォルトの名無しさん :02/07/24 18:17
>>533 ListView1.ShowColumnHeaders := False;
だったら変更できなくなるけどヘッダが見えなくなるからなあ・・・
そういうスタイル定数やメッセージも見当たらないし。
TStringGridで見せかけるのは?
535 :
デフォルトの名無しさん :02/07/24 18:21
Kylix3あげ
>>534 サンクス。やっぱり無理っぽいので、美しくないけど Width で逝きます。
TStringGrid は跳び選択? が出来ないので使うの辞めました。
あと、書き換え時のデータ初期化がめんどいから。
ListView1.ShowColumnHeaders := False にしておいて、 別途THeaderを置いておくとか、駄目ですか?
TListcolumnのMinWidthプロパティは? ポインタは変わっちゃうけど。
>>533 >TListView の vsReport 表示のときに、項目幅を変えさせたく無いんですが、
LsitView をサブクラス化して、子ウィンドウであるヘッダーコントロール
からのメッセージを処理すると column 幅変更を阻止できます。
{ Private 宣言 }
public
OrignalProc:TWndMethod;
procedure SubClassProc(var Msg:TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
Commctrl;
procedure TForm1.FormCreate(Sender: TObject);
begin
OrignalProc := ListView1.WindowProc;
ListView1.WindowProc := SubClassProc;
end;
procedure TForm1.SubClassProc(var Msg:TMessage);
begin
OrignalProc(Msg);
if Msg.Msg = WM_NOTIFY then
if pNMHDR(Msg.LParam)^.code = HDN_TRACK then begin
Msg.Result := 1;
ListView1.Refresh;
end;
end;
TListView の vsReport 表示のときに、横スクロールバーを常に非表示にしたいのですが、 何かいい方法ありませんか?
>>540 サブクラスプロシージャを以下のようにします。そのはかは 539 と同じ
procedure TForm1.SubClassProc(var Msg: TMessage);
begin
OrignalProc(Msg);
if Msg.Msg = WM_PAINT then
ShowScrollBar(ListView1.Handle,SB_HORZ,false);
end;
>>541 の 訂正。垂直スクロールバーがあるときも考慮して
procedure TForm1.SubClassProc(var Msg: TMessage);
begin
OrignalProc(Msg);
case Msg.Msg of
WM_PAINT:ShowScrollBar(ListView1.Handle,SB_HORZ,false);
WM_VSCROLL:begin
OrignalProc(Msg);
ShowScrollBar(ListView1.Handle,SB_HORZ,false);
ListView1.refresh;
end
end;
end;
>>541 の再訂正。 すまぬ
procedure TForm1.SubClassProc(var Msg: TMessage);
begin
OrignalProc(Msg);
case Msg.Msg of
WM_PAINT:ShowScrollBar(ListView1.Handle,SB_HORZ,false);
WM_VSCROLL:begin
ShowScrollBar(ListView1.Handle,SB_HORZ,false);
ListView1.refresh;
end
end;
end;
>>541 の再々訂正。すまぬすまぬ。
procedure TForm1.SubClassProc(var Msg: TMessage);
begin
OrignalProc(Msg);
case Msg.Msg of
WM_PAINT:ShowScrollBar(ListView1.Handle,SB_HORZ,false);
WM_VSCROLL:ListView1.refresh;
end;
end;
546 :
デフォルトの名無しさん :02/07/25 12:05
GetMemとAllocMemで確保するのって何か違いがあるんでしょうか?
好みで使い分けていいと思いますよ。 AllocMemはゼロ初期化がされますけど、どうせ何かのデータを入れるならGetMemで取って個別に代入しても結局同じですし。
548 :
デフォルトの名無しさん :02/07/25 13:16
メニューの"ファイル(&F)"のFを指定する プロパティの名前って何がいいですか? Accelerater? HotKey?
SDKのドキュメントだと"Menu access key"になってるから、accessKeyは?
550 :
デフォルトの名無しさん :02/07/25 13:40
一太郎のファイル(拡張子jtd)からデータを読み込むことになったのですが、 どのようにしてデータを引っ張ってきて、どのような単位(行単位とか?)で、 引っ張ってこれるのかが、わからなくて。。。 ADOを使用したりしまする?
551 :
デフォルトの名無しさん :02/07/25 14:04
教えてください。 A,B,Cのユニットがあります。 Aのinterfaceで、列挙型を宣言しています。 type TMyColor = (mcBlue, mcRed); Bのuses節にAを加えれば、TMyColorを参照できます。 しかし、Cのuses節にBを加えてもAのTMyColorは参照できません。 ここまでは、理解しています。 お聞きしたいのは、これを可能にする方法です。 試しに、Bのinterfaceで type TMyColor = A.TMyColor; と宣言してみたのですが、Cで参照すると未定義のエラーになりました。 数珠つなぎにすることは可能なのでしょうか?
>>551 unit unit3;
interface
type TMyType = (ltest, ltest2);
---------------------------------------------------------
unit unit2;
interface
uses unit3;
type TMyType = unit3.TMyType;
---------------------------------------------------------
unit unit1;
interface
uses Unit2;
var t : TMyType;
…
こんな感じ?一応コンパイルできましたが…。??
すんません。。。 質問の仕方がいけないでしょうか? こまっちょります。。。。・゚・(ノД`)・゚・。
>>553 一太郎でマクロ使えば?
それとも
obj = CreateObject("JXW.Application")
obj.Visible = true
obj.Documents.Add()
obj.TaroLibrary.Insert("Hello, Ichitaro.")
こんな漢字でやるとか
どっかにコンポがあったような
>>553 それが可能ならJustSystemのサイトで技術情報公開してるはず。
してなかったらアンテナハウスに聞け。
>>554 一太郎でマクロ。。。調べてみます
記述していただいたコードが既に理解できていない罠。。。
調べます。。。
ありがとうございます
>>555 技術情報。。。そんなに難しいことでしか。。。
どぼぢまじょお。。。
>>556 おおお
それは どっかのTipsでしか?
内容が。。。知りたい。。。
Invokerユニットに含まれてるTInterfaceInvokerってクラスに詳しい人って居ま せんか? Webサービスでサービスとして使うクラスはすべてこのメソッドで起動されるみた いなんですが、implements宣言でInterfaceを他のオブジェクトに委任してると 不正なメモリアクセスが発生してしまいます。 おそらくInterfaceの取り出しなんかせずにメモリマップを決め打ちして実行して るんだろうと思いますが、それを回避する方法が解りません。 何か良い知恵は無いでしょうか?
>>559 たとえば、
Thogehoge = class(TInvokableClass, Ihogehoge)
FhogeImpl: Ihogehoge;
public
constructor Create; override;
destructor Destroy; override;
property hogehoge : Ihogehoge read FhogeImpl implements Ihogehoge;
end;
と言うふうにIhogehogeインターフェイスを持つThogehogeというクラスが有った
とします。
インターフェイスの実装はFhogeImplに委任されていて、コンストラクタの実行時
にFhogeImplへインスタンスがセットされ、デストラクタで解放されます。
このクラスをWebサービスとして登録すると、TInterfaceInvokerによって実行さ
れる際にEAccessViolationが発生してしまうのです。
(発生個所:SOAPPasInvユニット114行目)
で、このクラスの実装方法を変えて、
Thogehoge = class(TInvokableClass, Ihogehoge)
FhogeImpl: Ihogehoge;
public
constructor Create; override;
destructor Destroy; override;
function Hogefunc(const Value: Integer): Integer;
end;
function Hogefunc(const Value: Integer): Integer;
begin
Result := FhogeImpl.Hogefunc(Value);
end;
という風にメソッド内で委任を行った場合は問題なく実行できます。
で、TInterfaceInvokerがどんな風にHogefuncの呼び出しを行っているのかを調
べようと思ったのですが、TInterfaceInvokerのソースはインターフェイス部しか
無くて私の手におえない状態です。
手におえないと思ってたらあっさり解決してしまいました。 そもそもなんでインターフェイス委任がやりたかったかと言うと、Webサービスを 普通に実装してしまうとリクエストのたびにCreateが実行されてしまって永続的 なサービスにならなかったので、Singletonなオブジェクトへ委任してしまおうと 思ったんです。 そこで迂回路を探してたら、ズバリそのものがヘルプにありました。 Delphiヘルプ-「インターネットアプリケーションの開発」-「実装の作成と登録」 を見てみたらオブジェクト提供プロシージャを登録できる事がわかったので、 procedure Createhogehoge(out obj: TObject); begin if Singleton = nil then begin Singleton := THogehoge.Create; { インターフェースへの参照を保存し,解放を防止する } SingletonIntf := Singleton as Ihogehoge; end; obj := Singleton; { グローバルインスタンスを返す } end; initialization { 起動可能インターフェースの登録 } InvRegistry.RegisterInvokableClass(Thogehoge, Createhogehoge); という風にしてやってWebサービスを単一インスタンスで実行する事が可能になり ました。 これでDCOMとかCORBAとかの高コストフレームワークに頼らずに、しかも厳密な型 チェックが可能なC/Sシステムが作れそうです。
>>557 > それは どっかのTipsでしか?
> 内容が。。。知りたい。。。
あれ見てMLだとわかんないオマエは・・・ひょっとして、ひょっとすると、
そーか、わかった、やはりな、ふふふ、ははは、はぁーーっはっはっ!!
563 :
デフォルトの名無しさん :02/07/26 18:47
誰か実装してください。 TProcess = class public procedure Execute; procedure Terminate; property Executing: Boolean; published property ExeName: String read FExeName write FExeName; property Directory: String read FDirectory write FDirectory; property Args: TStrings read FArgs write FArgs; property Priority: TProcessPriority; property UsePipe: Boolean; property OnExecute; property OnExit; property OnStdOutput; property OnErrOutput; property OnInput; end;
>>563 お前、writeln()が溢れかえる結果が見えないか?
566 :
デフォルトの名無しさん :02/07/26 21:50
2バイトの文字列、例えば"2F" を 16進数の 2F に対応する1文字、つまり この場合なら "/" に変換したい。(結局、chr($2F) の結果の文字列) 何か、いい方法はありませんか? よろしくお願いします。
>>566 if(a = 47) then
b := b + '/';
習得する手間と、言語としての機能の2つのポイントで考えると、 C++とDelphiどっちを勉強したら良いでしょうか。
普通にオヤジ登場
>>567 どこから、そんなロジックが出てくるんだ?
冗談で書いてるのか?
>>568 簡単さならIDEが洗練されている(RAD的にね)Delphiの方が簡単。
Delphiは機能的にはC++のサブセットと言えると思う。
だからC++への移行は割と簡単かと。
逆も然りだけどC++書けたらもうDelphiいらんでしょう。
簡単に何かを作りたいときは使うけど。
>566 HexToBin
>>572 なるほど。Delphi→C++への移行は楽なんですね。
実の所、現在C++を勉強中なんですが、イマイチ掴めないので、停滞していた所でした。
とりあえず、しばらくDelphiを使ってみて、
機能に不満を感じるようになったらもう一度C++に戻ってみます。
で、教えて君みたいで非常にカンジが悪いと思うのですが、
Delphiの解説サイトでオススメのところとかありますでしょうか?
できれば、現在も更新されている(管理人のやる気が持続している)サイトがいいです。
もし宜しかったら、お願いします。
>>574 知らん。俺はDel3のヘルプとマニュアルだけで覚えた。w
乗換えが楽って書いてあるけど、 デルファイとC++ってそんなに似てるか? 俺はデルファイ専門だからよくわからんのだが……。
>>576 クラスもあればオーバーロードもある。
C++に言って取りあえず覚えなきゃいけない新しい概念。
多重継承
テンプレート
参照
位じゃないの?
まぁ、でも乗りかえるって事は色々と覚えなおさなくちゃならないコトがあるわけで、 ラクな乗りかえってのはありえないわな。
>>577 参照ってDelphiのvarじゃないの?
>>578 まぁね、でも共通の概念が多いから理解は早い。
VBユーザとか大変そうだよ?見てると。
参照はObjectPascalにもvarとかoutとかあるし、 多重継承もinterface+implementsで事実上実現できますし。 テンプレートの他には、C++ではコンストラクタとデストラクタが自動で呼ばれること、とかかな? でも、それもstringやVariantの解放処理が自動で行われることの延長のようなものですし。 何よりC++Builderの存在が、ふたつの言語が直接リンクできる程度に近いことを証明してくれてるし。
DelphiからC++に乗り換えて(別にDelを使わなくなったわけではないが)、 一番苦労したこと。 それは、C++のソースが読みにくい! 私の体験なんだが、同じ思いをした人はいません?
同じC++でも C++BuilderとVisualC++ではかなり開発手法が違う罠(本当に罠。
C++はクラスのインスタンスを静的に生成できる。
難儀ならしなければいいのでは。
まぁ、なんだかんだいってもC++の方が性能は上だわな。 俺はDelphiiつかってるけど。 っつーか、別に生産性の悪いC++なんぞつかわんでも、 Delphi使えればもう9割がたやりたいことは出来ると思うんだが。 どうかな?
588 :
デフォルトの名無しさん :02/07/26 23:50
>>582 コンポーネントはObject Pascalで書けばいいじゃん。
どうせBCBは両方コンパイルできるんだから。
>>587 機能はC++が上
性能はObject Pascalが上
でないかい
>>587 C++Builderに限って言えばDelphiと生産性は同じ様なもんじゃないのか?
STLや既存の大量のライブラリが使える分Builderの方が上かも。
Pascalの魅力は制限が多いことなんだよ。 煽りじゃないよ、念のため。
593 :
デフォルトの名無しさん :02/07/26 23:57
C++にできてDELPHIで出来ないこと、 またその反対の例を具体的にあげて貰えないでしょうか。 あんまりないなら暫くはDELPHI parsonalでいこうかと思ってます。
気合いさえあればC++だろうがObject Pascalだろうが出来ない事は無い。
doxygenのような使えるクラス関係解析ツールがObjectPascalには無い。
>>593 俺はあんまり感じないけど。
ま、俺c++使ったこと無いんだけどね(笑
>>589 そりゃ、どーだろ。
単に実装方法の違いだけだろ、ライブラリを使う場合にC++だと簡単に扱えるけど
Delだとちょい手がかかる、もっともDirectX関連のようにC/C++で書いた方が楽な
ものもあるしね。
性能や機能とはちょっと違うと思うけど。
それと、Delphiの欠点はDelphiであるって事かな、C++の場合gccやvcやBCBと色々
とあるけど、DelphiはDelphiでしかないからね、FreePascalもまだ成長しきれてない
しなんとなくもう駄目だろ。
まぁ、折れの場合は、Pascalが好きだからDelphi使ってるってだけで他に理由はないんだが。
>>594 早レス、サンキュッ!
じゃあやっぱり、DELPHI+BCCでいってみます。
生産速度的にはどうだろう?Delphiの方がはやくないか?
>>597 そんな深い意味じゃないC
C++ はテンプレートが使える分、高機能
Object Pascal はコンパイルが桁違いに速い分、高性能
という程度の意味だC
>>593 初心者の方ですか?
「手っ取り早くゲームを作るぜっ」という軟派な方ならDelphiをお勧めします。
無料で手に入る高機能RADツールですから。
「プログラムの基礎やアルゴリズムをじっくり勉強していきたい」という硬派な
方なら、やはりDelphiですな。教育用言語、というくらいだから。文法も美しいし。
それ以外の普通の人は、C++をやってください。以上。
>>599 コンパイルはDelphiの方が速いね。
全体的な生産速度で言えば、
C++Builder > Delphi >> VC++じゃない?
(ライブラリの充実度から言って)
書き忘れたけどVC++が低いのはRADじゃないからね。
話が面白い方向に進んできたな。 ほかのDelphiユーザの意見が聞けて面白い。 もっとやってくれ。
Delphiは柔軟な言語だな。 Delphi自体はc++にも決して劣らない能力を持ち、 かつc++に移行したくなったらわりと容易に移行できる。 っつーか、c++とdelphiが似てるってコトなんだろうな(笑
柔軟すぎて逆に困る事が多いのがC++。 ObjectPascalは固い言語。
>>605 経緯は一緒よ?
ALGOL(だっけ?)から派生して無理やりOOPに仕立て上げたって言う。
正直CやC++の言語仕様って、いきあたりばったり、って感じで嫌い。 PascalやObjectPascalって凄く練られてるって感じがして好き。 お前ら、そう思いませんか?
MacOS と BeOS の違いみたいな感じでは? BeOS は消えたけど・・・
C++は無理矢理CをOOPLにしたって感じだからね。
テンプレート乗せたOPが最強です。
ObjectPascalは言語的には悪くないと思うけどBorlandが潰れたらおしまいだからなあ。
>>615 死ぬ前にオープンソースとかに・・・無いか?
>>615 BorlandはM$に潰されそうだしね。
言語的に考えたらC#が最強だと思う。 M$は嫌いだが。
c#ってc++に機能追加しただけじゃないの? 根っこの部分から違ってるの?
javaにしてもC#にしても、なんで新世代言語は、あの汚いC++の言語仕様を ベースにしようとするのかわからん。 だれかPascalベースの新世代言語を作ってくれ。Pascalと互換性なくても いいから。
多くの人はbeginとendで区切られたスコープ見るだけで気持ち悪がるからね。
まぁ、俺はDelphiマンセーだよ。 信者が少ないのがネックだが。
>>617 MSはBorland、Apple、Corelを潰せません。
>>616 >死ぬ前にオープンソースとかに・・・無いか?
InterBaseの先例があるよね
(後で商用に戻ってしまったけど FireBird が残った)
俺、ゲームつくりたいんだけど、Delphiで十分かな?
>>626 Delphiで限界感じたら他の言語使えばいいだろ。
>>622 Oracleのストアドも begin〜end なんだけどね〜
DBやる人、少ないのかな?
オープンソースになり、信者のうちのもの好きが色々と他のユーザーの意見とか要望を織り交ぜて新世代言語を作りだし、 C++を打ち破る。 と、妄想してみる
>>628 これから増えるというか今増えてる途中じゃないの?
>>622 確かにねー。別に慣れれば何てこと無いんだが。
あと function や procedure を敬遠する人も多いね。 Integer, Booleanも。
if の後の then や、for の後の do や、でもcaseはPascalの方が上か(つーかCのcaseはまんまgotoだろ)。
ても経験上Pascalの方があまりホームポジション崩さずにコーディングできるから、
あまりC++と比べて打つのに時間がかかる、ということは無いと思う。
>>626 多分十分だろう。
>>631 むしろPASCALのほうが速くコーティングできる。俺は。慣れかもしれんが。
Pascalはタッチタイプできることが前提みたいなところはあるかもね
&& って打つより、明らかに and の方が早いしね。 hoge->hage って打つのも、 hoge^.hage のほうが早い。 % より mod が早いし、でも += や *= はあると便利だなぁ…。
追加 << より shl が早い!
637 :
デフォルトの名無しさん :02/07/27 00:49
仮にBorlandが潰れてもFreePascalもOOPLじゃないの?
クラスの継承は確実にC++よりObjectPascalの方がバグ出しにくいと思う。
>>639 そのC++の間違えやすい継承を分かりやすくしたのが、
JavaやC#じゃないの?
>>640 JavaやOPやC#じゃ
になるんじゃないの?言語の出現時期から見て。
TurboPascalのOOPL化の方が早かった?
>>639 つーかあらゆる事に関して、ObjectPascalはC++よりバグを出しにくいと思う。
スレ違いな議論がお好きなようで。
盛り上がってる所に水を差すのがお好きなようで。
>>643 仕切り厨の出現は荒れる兆候なんで、漏れは寝ます。
おやすみなさい。
ま、正直よほどヒネクレたつかいかたをしなければ、 大体のことはDelphiで事足りると思うんだがどうよ?
>>646 同意。
VBよりは遙かに自由度が広いと思われ。
Delphiで事足りるのは確か。 Delphiが一番効率がいいかどうかは人次第。
Pascalはツール・ライブラリが少ないのが痛い。 UNIXがPASCALで作られてたらC(++)と(Object)Pascalの立場は逆転してたと思うけど。
>>649 たしかに、それはあるなぁ。
やっぱユーザが少ないのが原因なんだろうけど。
こればっかりはどうしようもないもんなぁ。
みんな寝たのか……。今日は色々と面白かったな。
そろそろ寝ます。おやすみ
>>654 アンタ、3時間もレスを待ってたのか。
やるな。(笑
プログラミングを勉強し始める動機って、人によって色々あるでしょ? 会社で使うアプリを作りたいとか、ゲームを作りたいとか。 そこで質問なんだけど,Delphiを勉強し始めて、 その「動機」になったプログラムを完成させられるようになるまで、 どれくらいかかった? 大体で良いから教えてけれ。
658 :
デフォルトの名無しさん :02/07/27 17:14
23'88
エディットボックスの数字をデータベースの実数項目に代入するには、どうすればいいの? StrToFloat関数でもTextToFloat関数でもエラーになるんですけど
/
http://pc.2ch.net/test/read.cgi/software/1025843952/ |暇な奴作ってくらさい。
|
|操作性等がかちゅ〜に酷似or同じ。
|スレ立て機能。
|ソース公開しても、亜種禁止。
|カチュクロンのログは新形式。今までのかちゅ〜ろぐはコンバーターで変換。
/ ./\ \_______________________________
/ ./( ・ ).\ o〇 ヾ!;;;::iii|//"
/_____/ .(´ー`) ,\ ∧∧ |;;;;::iii|/゙
 ̄|| || || ||. |っ¢..|| ̄ (,, ) ナムナム |;;;;::iii|
|| || || ||./,,, |ゝ iii~ ⊂ ヾwwwjjrjww!;;;;::iii|jwjjrjww〃
| ̄ ̄ ̄|~~凸( ̄)凸 .( ,,)〜 wjwjjrj从jwwjwjjrj从jr
>>662 try
フールド.asString:= Edit1.Text;
except
例外処理
end;
>>660 作りたかったツールというのが、
「IE のプロクシ設定を簡単に切り替えられるツール」だった罠。
プログラミングそのものの知識はほとんど必要なかったよ。
\ 蚊厨はとっとと巣に帰れ!
 ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,__
/ ./\
/ ./( ・ ).\
/_____/ .(#゚Д゚) .\ ∧∧
 ̄|| || || ||. |っ¢..|| Σ( ;)
>>663 || || || ||./,,, |ゝ||ii~ ⊂ ヾ
| ̄ ̄ ̄|~~凸( ̄)凸 .( )〜
>>667 (´-`).。oO(それ、漏れも作った)
Delphiって、(つい最近、お遊びで始めたばかりだが)魅力はかなりあるのに、ドキュメント (オンラインヘルプ)がVBにくらべると、貧弱な気がする。 関数やサブルーチンのうち、コード例の記載があるのが1〜2割。 ヘルプをあてにしないで、書籍やWEBで調べた方がよいのではないかと感じてしまう。 また、API関数の解説は皆無。(仕方ないので、APIビューアーで調べるハメに・・・W) MSには悪い点が多々あるが、技術情報(MSDN)の量の豊富さだけは某乱土より評価して よいのではないか?
>>670 誰もMSDNけなしてる奴はいないよ。カコスレ全部読んでもらってもかまわない。
わざわざDelphiスレでMSDNの評価する必要もないし。
コード例が無いと何もできなういと言うのも問題だと思うが。
>(つい最近、お遊びで始めたばかりだが)
語るならもうちょっと勉強した方がいいと思われ。
APIヘルプはちゃんと英語版がついてきてる。CD-ROMには日本語版も。
>>671 > APIヘルプはちゃんと英語版がついてきてる。CD-ROMには日本語版も。
てゆーことは、製品版を購入せずに、雑誌の付録のPersonal版を使ってるのが、
論外ということか・・・。
>>672 >APIヘルプはちゃんと英語版がついてきてる
後、プラットホームSDKに思いっきりついてくる。
ダウンロードしたPersonalにも入ってますが?
>>673-674 げげ、確認不足かよ! 煤i ̄□ ̄;
仕事(Access, VBのみ)で使わんから、ちゃんと調べなかった、ってのは
言い訳にならねえよなあ・・・。(逝
>>675 >(つい最近、お遊びで始めたばかりだが)
語るならもうちょっと勉強した方がいいと思われ。
これだからVB厨は・・・とまた評判を下げることになりかねないよ。
質問です。 (1) Application.Title プロパティは、IDEのメニューから設定する、固定リテラルで記述する、 のどちらか。(メニューで設定した時点で、コードが自動生成されるので、実質的におなじ) (2) 上記のプロパティを変数で(動的に)記述することはできない。 自分なりにいろいろ試した末の結論なんですが、間違ってますか? [ 環境 ] Windows 2000 Pro SP2 Delphi 6 Personal MS Office、Visual Studio 6.0 Enterprise SP5 その他 雑多なソフトいっぱい・・・。(^^;
>>678 2できない?
最悪でもSetWindowText()で。
API使うのは試してません。(思いつかなかった) 追加質問、失礼。m(_ _)m (1) FindWindowって、クラス名(第1 Arg)、Window Title(第2 Arg)のどちらか片方を 指定すればよい(もちろん、両方指定してもよい?)と思うんですが、Delphiアプリ の場合、クラス名には何を指定すればよいのでしょう? (2) 文字列ポインタを渡すAPI引数を省略(VBの場合のvbNullString)する場合、nilで よいのでしょうか。 FindWindowはそれで問題なく動いたのですが、ほんとにそれで正しいのか(コード は正しくないのに、たまたま運よく動いただけ、とか?)確信が持てなくて・・・。
>>680 まぁ、Delphiはvarがあるからnil渡せるならそれでいい。
更に追加質問。(しつこい) use節に不要なユニットが記述されている場合、 (1) 実行ファイルのサイズやパフォーマンスに影響する。 確認して、削除(またはコメントアウト)すべし。 (2) コンパイラが最適化してくれるので、問題なし。 どっちが正解ですか? あ、書いてる途中で気が付いたけど、実行ファイルをCompareすれば、 確認できるのかな?(でも、今、手元に環境がないや・・・)
漏れ的にはC++だろうがPascalだろうが、あんまり気にならないのよ。 精々ドイツ語と英語の違い程度。 だけど、だけど、COBOLだけは・・・中国語くらい違う(泣
>>683 的を射た表現
Lispはまた別だろうね(案外、日本語だったりして)
685 :
デフォルトの名無しさん :02/07/27 22:29
Delphiはスレッド作れますか? 会社の基本的な方針は VB なんですが… マルチスレッドが必要なときなどは Java を使っています。 けれど、Javaは開発環境が貧弱なこともありGUIフロントエンドを作るのに 向いているとは思えません。VBと同じような RAD である Delphi で マルチスレッドができれば、採用したいと思っています。
>>685 自分で必要になったことはないけど
確か「拍子抜けするくらい簡単」だったはず
>>683 他の言語には、それぞれに熱烈なファンがいますが、COBOLが好きな人間だけは
聞いたためしがありません。(いるのだろうか?)
>>686 ありがとうございます。
Personal版をダウンロードして評価してみます。
>>686 最悪でもAPI呼べるでしょう。
VCLがスレッドセーフかどうかは別として。
691 :
デフォルトの名無しさん :02/07/27 22:53
>>693 多分ダンバインはPrologで動いてます。
>678 >(2) 上記のプロパティを変数で(動的に)記述することはできない。 できます。 Application.Title := 'タイトル'; >682 >(1) 実行ファイルのサイズやパフォーマンスに影響する。 > 確認して、削除(またはコメントアウト)すべし。 ユニットによっては、usesしただけで処理が走るものもあり(initializationで)。 不要なユニットは削除するのか吉。
>685 できます。 ただし、VCLはスレッドセーフじゃないので、スレッドからフォームやコンポーネントにアクセスする場合はロックする必要がある。 ヘルプを参照のこと。
ちょっと聞きたいのですが、Delphiでダウンローダ作ってます。 それでIndyコンポーネントのIdHTTPを使ってるのですが、ダウンロード状況やリジューム機能がなくて不便です。 こういう時に使う、いいコンポーネントありますか?? もしくは実装についていいTIPSオナガイしますm(_ _)m
>>697 うーん。対象をある特定のエンティティとするか。あるいは任意のエンティティにするか、
によっても 相当変わってくるですよね。
あとは プロトコルを意識せずに既存媒体からダウンロード方向にするか、
トップダウンに あるデータファイルを適用する形にするか。
もしくは 何でも屋を目指さず、システムに解釈しやすい
通信規約を想定して作る、ってのも ありですよね。
#リジュームはここかな。
要は、ダウンロードという動作ひとつとっても、プロトコル体系としてスカスカで、
つまりその概念が出てくる頻度が とっても少ないけど、
基本的な概念、っていうのがあるわけです。
つまりそのプロトコルの意味が分からんとプログラムの意味がさっぱり、
っていう。
そういうのを ぜーんぶ網羅しなければいけない時点で
ダウンローダをDelphiで作るという気力はかなり萎えてしまうものです。
>>700 ようするにWolfy氏はすごいってことだよ・・・、たぶん。
>>699 リジュームの概念は昔どこかのHPで見たことあります
HTTP/1.1 とか鯖で対応してないと無理とかRange やヘッダうんぬん。。。
いちおうHPを巡回してDLまでできたのですが、Indyコンポ事体バグだらけで使えません(><;
多くは望みませんが404や503が検出でき、DLする容量が随時分かるようにしたいです(全部望んでるかも、、
>>699 / ̄ ̄ ̄ ̄\
( 人_ヽ__ノ)
|ミ/ ー◎-◎-) / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(6 (_ _) ) < おい、出鱈目を言うんじゃない!
_| ∴ ノ 3 ノ \_____________
(__/\_____ノ_____∩___
/ (__)) ))_|__|_E) ̄´
[]_ | | どれみ命ヽ
|[] | |______)
\_(___)三三三[□]三)
/(_)\:::::::::::::::::::::::/
|Sofmap|::::::::/:::::::/
(_____);;;;;/;;;;;;;/
(___|)_|)
いや、出鱈目は
>>699 に言ったんだけど・・・
書いてある内容が文章として意味を成していません。
>706 よく見たら 誤爆ですた、、
>>704 HTTP 1.1日本語版RFC今見たけど(鬱
脳内エラーが発生しました
try 脳.loadFromFile('HTTP 1.1日本語版RFC'); except 脳.Text := 'もーだめぽ'; end;
脳 := DQN.Create; try 脳.loadFromFile('HTTP 1.1日本語版RFC'); showMessage(脳.text); // 出力:(not) Accept-Agent: ja ...逝ってよし except 脳.Text := 'もーだめぽ'; end;
>>695 > できます。
> Application.Title := 'タイトル';
それ、固定リテラルですよね。
その方法は当然試してますが、それだと、(一例ですが)INIファイルやDBから読み込んだ
リテラルを設定することはできないと思いますが・・・。
それと、IDEのメニューでタイトルを設定した場合でもそのコードが自動生成されるよう
なので、「事実上、おなじ」(?)と書いたのですが・・・。
> ユニットによっては、usesしただけで処理が走るものもあり(initializationで)。
> 不要なユニットは削除するのか吉。
感謝。m(_ _)m
(時間があるときに、よく調べてみます)
>>711 何を言ってるか判らないが、
試してみたらいいじゃない。
それから、pro以上ならソース読め
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.Title := (Sender as TComponent).Name+FormatDateTime('hh:mm:ss',now);
end;
ああ、 VBから移ってきたんだね。じゃ優しくしなくちゃ・・ ようるするに Application.Title = xx は SetWindowText( Application.窓ハンドル, PChar(xx)); と同等って事 >(1) FindWindowって、クラス名(第1 Arg)、Window Title(第2 Arg)のどちらか片方を 指定すればよい(もちろん、両方指定してもよい?)と思うんですが、Delphiアプリ の場合、クラス名には何を指定すればよいのでしょう? これは疑問の内容がよく判らない。 Delphiで作ったアプリのクラス名が知りたいの?
>>713 明らかにWindow Classのことだと思われ。
raiseのポップアップって抑制できる方法ってありますか? >raise ******.Create(++++); 現在こんな感じ
>713-714 Application.Titleに設定するのと同じことをやるなら、クラスはTApplicationでいいんじゃない?
>>715 IDE の中でのデバッガのポップアップの抑制?
デバッガ - 言語例外 - 追加 - 抑制したい例外のクラス名
>>716 DelphiってWindow ClassもTApplicationになってるの?
勉強になった。
うん 基本的にWinControlとかも含めてクラス名がそのまま WindowsClassの名前になる仕掛けみたい BUTTONとかもGetClassInfoしてサブクラス化してる様子 だからフォームなんかは TForm1 とか作成した時の名前がそのままWindowClassの名前になるみたい ただ、自分のアプリの場合 FindWindowする必要はないので 他人の作ったアプリだと思うんだけど・・・
フォームのScaled プロパティはどうしてますか。 Trueだと勝手にデザインが崩される気がするし、 Falseだと解像度やフォントサイズが違うパソコンだと 異常に大きさが変わってしまう。 皆さんの意見を聞かせてください。
香ばしい人がいますな。
723 :
デフォルトの名無しさん :02/07/28 17:27
>raiseのポップアップ raiseしたいけど、誰もキャッチしてくれないと エラーがポップアップするから嫌って事なら EAbort 継承を利用するといい メッセージも不要ならAbortを使えばいい 例: raise EAbort.Create('メッセージ'); 自作の構文処理とかでエラーとかの為に深いスタックから一挙に帰りたい とかにはこれが重宝するよ。
>>702 >Indyコンポ事体バグだらけで使えません(><;
バグってなんですか?
iniファイルにデータを保存してます。 任意のセクションを削除したいのですが、 どのように記述したら良いのでしょうか?
>>728 iniファイルに削除って概念はないよ。値を空にすることしかできない。
どうしてもファイルから消したかったら、自前でファイル操作して削除しる。
>>728 TIniFileを使ったことがありますか?
あるならヘルプ隅から隅まで読んだ?
EraseSection メソッドは,INI ファイルのセクション全体を削除します。 procedure EraseSection(const Section: String); override; 説明 EraseSection メソッドを呼び出すと,セクションとそのすべてのキー, およびデータ値を INI ファイルから削除できます。Section は削除す る INI ファイルのセクションを指定します。セクションが削除できない 場合には例外が発生します。
>>721 俺の場合、スプラッシュとか以外はScaled=Trueにしてる。
おおきいフォントにした場合とか、Anchorsを使っている場合は変になる場合が
あるけど、Alignで画面を調整すればいい感じだよ。
>729,730,731 レスありがとうございます。
TIniFileを使用してread,writeなどは普通に動作するのですが、
>>731 のEraseSectionを使ってみてもセクションが削除されません。
例外も発生しません。自前でファイル操作めんどい。と思って質問しました。
ちなみに、DeleteKeyを使用してもエントリが削除されません。
環境はWinXP,Del6(Pro)です。こんな風になってるの俺だけなのかな??
>>733 処理の最後にUpdateFileメソッドやってる?
それより、TMemIniFileのほうが、なにかといいよ。
>>719 > ただ、自分のアプリの場合 FindWindowする必要はないので
> 他人の作ったアプリだと思うんだけど・・・
ふつうはそうなんですが、VBのTipsでよく出てくる、「二重起動の防止」を
やってる関係で、自アプリをFindWindowしてます。
(返値 <> 0 なら、そのWindowを最前面に表示し、後から起動した方を終了)
取りあえず、動くようになってはいるが・・・。
//昔漏れが作った多重起動防止用ユニット unit SngPrcs; interface uses Windows; function IsSecondProcess(const UniqueString:String):Boolean;//二重起動チェック procedure ActivatePrevInst(MainFormClass:TClass);//先行プロセスのメインフォームをアクティブにする implementation function IsSecondProcess(const UniqueString:String):Boolean; begin CreateMutex(NIL,False,pChar(UniqueString) );//みゅーテックスオブジェクトを作成してみる Result :=(GetLastError=ERROR_ALREADY_EXISTS);//ミューテックス作成エラーが起きた場合は二重起動とみなす end; procedure ActivatePrevInst(MainFormClass:TClass); var Hwnd,HAppWnd:THandle; begin Hwnd := FindWindow(pChar(String(MainFormClass.ClassName)), nil); if Bool(Hwnd) then begin SetForegroundWindow(Hwnd);//メインフォームをアクティブ化 HAppWnd := GetWindowLong(Hwnd, GWL_HWNDPARENT);//アプリケーションハンドルを取得 if HAppWnd <> 0 then Hwnd := HAppWnd; if IsIconic(Hwnd) then ShowWindow(Hwnd,SW_RESTORE);//アイコン状態なら元に戻す end; end; {==SAMPLE======================================================= program Project1; uses Forms, SngPrcs in 'SngPrcs.pas', wMain in 'wMain.pas' {Main}; const UNIQUEID='TEST APPLICATIONS ID'; begin if IsSecondProcess(UNIQUEID) then begin ActivatePrevInst(TMain);//←ここに指定するのはクラス型そのもを指定すること。 Exit; end; Application.Initialize; Application.CreateForm(TMain, Main); Application.Run; end. ==SAMPLE=======================================================}
>>736 私が試行錯誤して書いたのも、ほぼおなじような内容です。
(VBからのパクリですが・・・(^_^;)
肝心なことを言うのを忘れていたYO! この例で作ったアプリと同時にDelを使用すると、FindWindowはDelのメインウインドウを拾ってくるのです(w まあ、漏れの場合、これを一つの会社に納めただけなので、特に気にせずこれで行った。
>>740 > この例で作ったアプリと同時にDelを使用すると、FindWindowはDelのメインウインドウを拾ってくるのです
FindWindow の第1引数をnilで、第2引数をApplication.Titleにすればよいと思いますが?(^_^;
(「語るならもっと勉強しなさい」とお叱りを受けそうですが・・・)
742 :
デフォルトの名無しさん :02/07/29 17:34
Canvas.TextOutだと、FontのSizeで文字の大きさが変わりますが、 横長の大きさの文字を描画するにはどうしたらよいでしょうか? Win32API等でないでしょうか・・・ StretchBltで大きさを変えるのではなく、 文字を描画した時点で横長の文字を描画したいのですが・・・ できないでしょうか・・・
743 :
デフォルトの名無しさん :02/07/29 17:59
既にあるユニットをActiveX化するにはどうすればいいのでしょう。 ブラウザで数値を入力し、それをDelphiに渡して、 Delphi内で計算した結果を、再びブラウザに返す、 というようなことをやりたいのです。 参考になりそうなURL、文献等、 どなたかご存知でしたらお力を貸してください。 よろしくお願いします。
744 :
デフォルトの名無しさん :02/07/29 18:08
745 :
デルファイの名無しさん :02/07/29 18:19
デフォルト以外のプロジェクトソースを持つプロジェクトを作れるようにしようと OpenToolsAPIに挑戦しているのですが、 IOTAProjectCreator.NewProjectSourceでnil以外(吐きたいソースを保持したIOTAFile実装)を返すと ルールが指定されていない旨のエラーが出ます。 これは何ですか?それと、回避方法があれば、教えていただけないでしょうか。
>>742 APIだけでフォントハンドルを作る時のLOGFONT構造体には、
VCLが対応して無いメンバーが幾つかあって、lfWidthというのもあります。
フォントハンドルを作成し、SelectObjectなりしてやれば、可能な筈。
>>746 >>747 ありがとうございます。無事できました。
わがままですが、文字の横幅を大きくしたり、回転したりすると、アンチエイリアスがかからなくなりますね。
かかるようにできないでしょうか?不可能ですか?
var i: Int64; 〜 i := 1*1024*1024*1024; みたいに書くとオーバーフローって怒られるんですが、何故なんでしょう?
>>747 >>750 出来ることならそうしてしまいたいんですが、
仕事の都合上どうしてもActiveXにしたいんです。
とはいっても、Delphi自体、触るのは今日で2日目。
前途多難です。
どなたかお力を貸してください。お願いします。
>>743 いたるところで同じ質問をしてますね。Delphi-gig の掲示板にまで
書き込みがあるのは笑えました。
Delphi-ML で回答がついています。そちらをお読みください。
>>749 それでオーバフローで叱られないと思うが・・・
たぶんもう一つ掛算を書き忘れたのだとして、 1000000*1000000 で説明します。
どうしてオーバフローになるかというと、即値は32bitの整数の範囲なら32bitとして解釈されます。
それで、1000000*1000000 は32bit同士の掛算としてコンパイル時に掛算してしまおうとして
32bitの範囲に入らないよ=オーバーフローになるよとエラーが出るわけです。
Delphiのコンパイラは、結果をint64に入れるのだから型はint64だろうなんて推測はしません
回避するには64bitの定数である事をどこかで教えてやればいいのです
たとえば、
Int64(1000000)*1000000 とか 片方だけでもint64だと教えてやります
なお、 Int64(1)*1000000*1000000 はOKだけど
1000000*1000000*Int64(1) は駄目です
>>749 begin
i := 1 * 1024 * 1024 * 1024;
Memo1.Lines.Add(IntToStr(i));
end;
で起きませんでしたが。別のところが悪さしてるんでない?
755 :
デフォルトの名無しさん :02/07/30 09:54
>>752 ありがとうございます。
現在そのMLで教えていただいた個所をプリントアウト中です。
(ヘルプの[COM アプリケーションの開発]-[ActiveX コントロールの作成])
VC++で用意していたのに、客先からいきなりDelphiでやってと言われ、
そんなん知らねー、今更言うなー、やったことねーと、
ほとほと困り、だめもとで色んなところに書き込んでいました。
とりあえずこのヘルプを読んで、また出直してきます。
>>756 客をだませるのなら、ActiveX コントロールではなく ActiveX フォームで
アプリ丸ごと ActiveX にしてしまう。という手もあるぞ。
>客先からいきなりDelphiでやってと言われ へー、客先からDelphiを指定されたという話はあまり聞かないね その客が奇特なのかこれからそういうケースが増えるのか
759 :
デフォルトの名無しさん :02/07/30 11:43
つかぬ事をお伺いしますが、Delphi6のエディタを 上下分割又は左右分割させたいの ですが、ひょっとして出来ないのでしょうか? 別の編集ウインドウを開くでなんとなく似たような事を していますが便利悪いです。なんとかなりませんか? キーマクロもあるし、行マークもあるしそこそこ使える エディタなのに残念。
>>759 できません。
しかし同一のファイルに対して複数のエディタウィンドウを開くことができます。
もちろん片方を編集すると別のウィンドウの内容も更新されます。
エディタ自体タブ付ですから、プロジェクト全体を見るエディタウィンドウと
ここのファイルを眺めるウィンドウを広げておけば十分でしょう。
>>759 分割なんてできなくていいだろ。
そんなことより、
(sss(ssss) と入力して次の ")"を入力した時に
対応する 最初の"("を協調表示してくれた方が
随分便利
>>761 JBuilderあたり(C++Builderかな)で導入されてるみたい
将来的にDelphiにもつくんじゃないの。
俺はいらんが。
レコード/クラスビルダがホスイ・・・一方通行でええから。
コードエディタの80文字目に表示されるタテ線を移動できませんか?
>>767 エディタオプションの[右マージンの位置]
.....イジイジ
>>769 弊社のサポート窓口までご連絡下さい。
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ ニヤニヤ
( ・∀・)
( ) 1インシデント\30,000ダカラナ
| 某|
(__)_)
OpenToolsAPIはいいかげんソースのコメントだけじゃなくて ちゃんとしたドキュメントつけて欲しい。いやマジで。
エディトボックスから値を取得する場合、例えば、数字以外はエラーにするとか、半角カナはエラーにするとかの方法はないの? 更新後か入力後に、いちいち検査するしかないのかな。
>>775 > 更新後か入力後に、いちいち検査するしかないのかな。
最もスマートな方法だと思いますが。
>>775 そもそもその入力文字をキープレスイベントで受け付けなく
すればいいんだよ。
ただ問題は実数や符号付の場合。-123はいいけど123-,12-3,-123-
とか12.3, .23.とかは入力後に検査するしかねーわな。
桁とか決まってればマスクエディットが簡単でいい。
778 :
デフォルトの名無しさん :02/07/31 00:37
OpenToolsAPIのドキュメントって何処にあるのでしょうか?
($DELPHI)\source\Toolspai これが全て。 (registerComponentなど僅かながらヘルプに解説されている ものもあるが・・・)
>>775 >エディトボックスから値を取得する場合、例えば、数字以外はエラーにするとか、半角カナはエラーにするとかの方法はないの?
数が多いようなら、そういうコンポーネントを作ってしまうと楽。
DelphianWorldから探してきてもいいな。ソースつきの奴
781 :
デフォルトの名無しさん :02/07/31 00:56
PCのIPを取得するにはどうしたらよいですか?
C++Builder6には付いてきているという噂も…→OpenToolsAPIのヘルプ …結局誰も使ったことが無いようですね。 新規プロジェクトで毎回やっている作業を手抜きしたいってだけで\30,000は絶対嫌だ(w ( リポジトリだと、単なるフォルダコピーで、ファイル名を変えることすらできませんし )
後はCode Centralに行ってソース付のエキスパートを ダウンロードして見てみるのが一番手っ取り早いかなあ。
>>782 けど、ToolsAPI 使えるようになると生産性がはるかにあがるよ。
他人が使えない IDE にしてしまって、とっても困ったけど。
みなさんOpenToolsAPIでどんなことやってるんですか? Experts使ってるんで間接的に恩恵受けていることはわかりますが・・・
>Experts >GExperts
エディタカスタマイズとか 定型コメント、ソースの入力とか
Delphiはclassと名前空間に相当するものはありますか? あるならやってみようかな。
class は 多重継承は出来ませんがあります コンポーネントもクラスなので、C+;が使えるなら 自分でコンポーネントを作れるようにすぐになるでしょう コンポーネントが作れると、結構楽しいです。 多重継承出来ない代わりに、interface型があります。 interface型はCOMと非常に相性が良いので、COMサーバ・クライアントは C++より簡単に書けます(理屈が判っていればより高度に、判ってなくても それなりに) 名前空間は C++と違って unitが名前空間を提供します C++と同じように unit名.関数名 というように識別出来ます ただし、unit名はプロジェクトで唯一でなければいけません またコンポーネント名もIDEに登録する場合名前空間の仕掛けを利用出来ません コンパイル速度の維持の為には仕方ないのでしょう まあ中途半端という言い方も出来ますが、バランスが良いという言い方も 出来ます。
>>788 classも名前空間(ユニット)も両方あるよ。
ただし名前空間は今となってはかなり変。
・ファイル名=名前空間になってしまう(1階層のみ)
・usesは#includeとusingを兼ねたような機能をもつ(名前空間の修飾の省略の禁止が不可能)
793 :
デフォルトの名無しさん :02/07/31 13:07
複数のフォームを開いているときに、メインフォームを最小化するとすべてのフォームが 最小化されてしまいます。 また、子フォームをアクティブにすると、メインフォームも前面に出てきてしまいます。 僕の理想は、IEみたいな、ひとつのプロセスだけど、各ウィンドウが独立しているものです。 こういったことは、どのようにすればできるのでしょうか。
>>793 pro以上を持ってるなら Forms.pas の
procedure TCustomForm.WMSysCommand(var Message: TWMSysCommand);
を参照
つまり最小化=SC_MINIMIZEが送られた来た時に
Application.MainForm が自分なら、 Application の最小化を行っています
この動作を迂回すればよいでしょう。迂回方法はお好きな方法で
795 :
でもどり初心者 ◆KcG2I.hg :02/07/31 15:29
抽象的な質問で申し訳ないですが、 DelphiになれててVBAになれて無い人が Delphi6Pesonalでデータベースアプリ作るのと AccessVBAでデータベースアプリ作るのどっちが近道と思いますか? 簡単な会社の給与計算や顧客管理をしたいなぁと思ってるんですが…。 ちなみにリレーショナルはあんまり使わなくてもいい程度のDB設計です。 (顧客マスター←売上データ程度です) AccessのVBAを勉強しようと思うんですが、メインに使ってるのがDelphiで、 言語を二つ使いこなすには頭に余裕無くて…。 クエリーとか簡単なSQLなら、むしりとった衣笠で書けるのですが。 以前はN88、DOS-N88、Quick、VB5とベーシックばかり使ってたんですが、 Delphi4を使ってからはDelphiマンセーになってしまって脳に拒否反応が…。 Delphi6Pro買うのが一番速そうだけど、零細だから予算おりなさそう(涙) #ちなみに印刷系の会社なので、開発はあくまでおまけ
>>795 誤字ハケーン
×Delphi6Pesonal
○Delphi6Personal
>>795 一番早いのは市販パッケージを買うこと
給与計算は年末調整とかいろいろややこしいから買った方が安上がり
顧客管理は件数が少ないのならCsvとかテキストでも十分間に合う
零細なら取引先も多くないカナ?
AccessならVBA使うこともない
おもしろいのはDelphiで自分で作る方
残念だけど、それは AccessVBAでしょう。 もちろん D6Personalでも可な方法はあるし、そっちが速い人もいるだろうけど そういう人はそういう質問はしないでしょう D6Proを素直に買った方がいいと思うけどね それと、personalを会社の仕事に使うのはどうかなあ
>>798 Personalでは、DBの機能(ADO等)は使用できないはず。
>>795 逝ってよし
Personalで作成したアプリは業務で使用出来ません。
弊社のサイトにある改訂されたライセンス文書を
読みましょう。
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ・∀・)
( ) ホウムカンケイノ ケイヒウワノセシタ
| 某| トクベツカカクノProfessionalカワセルゾ
(__)_)
すばやいレスども。 ヤパーリAccessで作るのが順当ですか…。 もうちょい修行してみます。 D6per+CSVで強引に作ってしまうってのも 魅力的なんですが(w あと、Personalのライセンス問題ですが、 去年の8月にサポートに直接メールして聞きました。 転載しちゃいます。 --------自分がボーランドに送ったメール 貴社のサイトに「Delphi 6 Personalは商用・業務目的のアプリケーショ ン開発にはご利用いただけません」とかかれていますが、Delphi 6 Personalで作成したプログラムをインターネット上で無償で公開するの はOKなんでしょうか? また、インターネットでの公開がOKの場合そのプログラムを業務に利 用するのはOKなんでしょうか? --------ボーランドからの返事 Delphi 6 Personal で開発したアプリケーションによって報酬を得るよう な場合には使用できません。フリーソフトの開発は可能ですが、シェア ウェアの開発はできません。開発したアプリケーションで、その開発自体 で報酬を得ることが無い場合には、開発したアプリケーションを社内業務 でご使用いただけます。
>>801 実はライセンスが改訂されているんだな。
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ ニヤニヤ
( ・∀・)
( )
| 某| イチバンシタノ文ナ
(__)_)
本使用許諾契約の条項に従うことを条件として、お客様は本使用許諾契約に基づき本製品を使用し、個人
使用のみを目的とした著作物を作成する権利を行使することができます。お客様は、本製品または著作物
を、商用、業務用、政府や企業での使用を目的として(以下「商用目的」)、使用することはできません。
本契約の他の条項に従うことを条件として、お客様はご自身の作成した著作物を他人に配布することがで
きますが、直接、間接を問わず、配布や著作物の使用に対する報酬を受け取ることはできません。また、
お客様が他人に配布した著作物は、商用目的で使用してはなりません。
>>803 そのページまだぱっと見ただけですが、
すごく役立ちそうです。サンクス。
>>802 社内で完結するテキストの処理とか
さっき自分が話題に出した顧客管理とかは
ボーランドが言う所の商用目的になるのか
ならないのかが論点と思います。
で、6のPersonalが出たての時、自分も
「お客様は、本製品または著作物 を、商用、
業務用、政府や企業での使用を目的として
(以下「商用目的」)、使用することはできま
せん。 」
の文章の解釈が気になって、ボーランドに
確認を取りました。(
>>801 のメール)
おそらく、その部分の規約は大幅改定は
無いと思いますが。
つーわけで、自分はボーランドからのメー
ル(
>>801 )を根拠に、売り物にしないプロ
グラムならOKと解釈しています。
#えーと、Personalのライセンスの範囲の問
#題ってよく話題にあがる?
#もいっかいボーランドにメールしてみよかな
743=756です。
ヘルプ見てもよくわからずに泣きながら戻ってきました。
>>757 > ActiveX フォームでアプリ丸ごと ActiveX にしてしまう。
ヒントありがとうございます。それってどうやるんですか?
まだDelphi3日目で、何が何やらさっぱりです。
>>758 > その客が奇特なのかこれからそういうケースが増えるのか
多分、前者です。
ただ、今後こういうケースが増えても大丈夫なように
これをいい機会にDelphi習得したいです。自信ないけど。
ていうか、そもそも既存のユニットから
ActiveXコントロールって作れるものなんですか。
何も知らず、何もわからないまま手探りでやっていて、
急に不安になってきました…。
>>806 ええと、その「既存のユニット」の内容ですが、
通信系の処理をやるためにTFormでクラスを作ってます。
これをActiveX化って出来るんですか?
>>807 TForm継承なら、
IDEにコンポーネントとして登録(つまり Register 手続きを追加)
してから ActiveXコントロールにすれば
TForm継承だと出来ないんじゃない?よく知らないけど
810 :
Delphi3日目(743) :02/07/31 18:25
>>808 タメになりそうなレス、ありがとうございます!!
でも、実はどうやったらいいのかわかりません。
もしよろしければ、もうすこし手順を詳しく教えていただけないでしょうか。
よろしくお願いします。
811 :
Delphi3日目(743) :02/07/31 18:47
>>809 うわ、ほんとですか。どうしよー。
そこんとこ詳しく知ってる人、どなたかいませんか。
やってみた。
1、既存のフォームの名前を適当につける Form1とかのままだと名前が喧嘩するみたい
例としてフォーム名をTestForm クラス名をTTestFormになったとする
2、var TestForm:TTestFormのような部分を消去する
3、 procedure Register ; を設計部に追加
4、実装部に
procedure Register;
begin
RegisterComponents('Samples', [TTestForm]);
end;
5、コンポーネントのインストールで上記フォームをインストールする
6、ActiveXウイザードでVCLクラス名を TTestFormにする
後は適当に
7、試験する。
実行->ActiveXサーバの登録して試験するとか サーバー用意済なら
プロジェクト->Web配布で試験するとか
結果: マズイ
動くけど、やっぱりフォームとして動く。 意味は試してみれば判る。
>>525 のように 無理やり WS_CHILDすればいけるかも。 自分で試してみて
813 :
Delphi3日目(743) :02/07/31 19:08
>>812 808さん、ありがとう。めっちゃいい人やー。助かります。
まだ試していないので、また試してから戻ってきます。
本当にありがとう。
どうでも良さそうなことかもしれぬが、 Pro以上使っているヤシで、全部のコンポーネント登録したまま使っているヤシいる?
>>812 試してきました。ばっちりです。ありがとうございました。
おっしゃるようにWS_CHILDすると、フォームとして動かなくなりました。
本当にありがとう。さあ、今からこれを仕事に活かさなくっちゃ。
>>815 3日目で あのヒントでそこまで出来るんだから結構やるね。
それなら楽勝だよ
817 :
Delphi3日目(743) :02/07/31 20:17
すいません、また質問させてください。 今やってる仕事で、Delphiで作ったActiveXと、 Delphiで作った別のプログラムとでやりとりをさせたいんですが、 ActiveXから、別のプログラム中の TFormで出来た関数を呼び出したい時はどうすればいいんでしょう。 どなたかご存知でしたらお力を貸してください。お願いします。
・・・なんじゃそりゃ? 別のプログラムっていうのは、別のプロセスでって事? TFormで出来た関数ってメソッドの事?
>>817 初めて3日目で、妙に抽象的に書くと他人には何のことやらワケワカです
もっと具体的にやりたい事を書いてみたら?
既に 単体のアプリとして通信(ってTCP/IP)出来てるアプリがあって、それを
ActiveXにしたいんだよね?
>>814 よく使うやつと、自作のコンポ集以外は「その他」ってページを作って集めてる。
使いそうにないコンポを消してしまうとひょっと使う事があった時に便利悪いから。
>>794 ありがとうございます。
がmmmばってみます。
>>817 メソッドポインタを渡してコールバックさせるか、
アプリケーションにオートメーションオブジェクトを仕込む。
DLL化した方が楽だろ。
DLLで解決するならDelphiのソースあるなら usesした方が楽だろうに
825 :
Delphi4日目(743) :02/08/01 11:33
>>816 808さんがわかりやすく説明してくださったおかげです。
ありがとうございました。
>>818 ,
>>819 すいません、正直私自身よくわからないままやっているので
あいまいな言い方になってしまいました。
今やっている仕事は、とある機械を操作するためのプログラムです。
操作はブラウザ上で行うため、作ったものはActiveX化します。
機械はDelphiで制御されているので
(その機械を作った人の得意な言語がDelphiだったから)
操作側のプログラム(ActiveX)とその機械とのやりとりは
全部Delphiでやってくれ、みたいな感じの仕事です。
そして、新人の私は調べ物+サンプル作りが主な仕事です。
プロジェクトの全体像を知ることのないまま。
ActiveXとその機械とで情報や命令のやりとりをしたいみたい。
動けーとか、止まれーとか。
これをやってくれーとかいう命令や、その結果を受け取ったりとか。
そして、そうするにはActiveXで、
機械の方の関数(メソッド?)を呼び出す必要があるらしく、
でもそれってどうやるのか誰もわからないので困ってます。
こんな説明じゃわかんないですよね。うーん。
これ調べてって言った先輩が午前中は休みなので、
午後に詳しく聞いてから、また戻ってきます…。
>>825 操作をブラウザからする為に ActiveX化したってのが一番よく判らん
ブラウザ上のActiveXなら、自動的に他のパソコンと通信作出来るとでも勘違いしてるんじゃないか?
DCOMならActiveXを遠隔操作出来るからあたりで勘違いしてるんだろな 機械の遠隔操作ならソケット直接で処理した方が簡単だろう
取りあえず、COMとかOLEとかについて勉強しなされ。
ついでに CORBA も・・・ だけど ソケット直が結局楽だと思うけどね
>>831 Simple Object Access Protocol
でしたっけ?
「特殊なお風呂屋さん」を連想してしまいました・・・。(鬱
Delphiにダイアグラムってのがありますけど、あれ使ってる人いる? これって、単にドキュメント作成って言うか、コメントを図形式で書けるってなだけなんでしょ? こんなの付けるより、雛型を設定可能な仕様書の方が使えそうだと思うけど、 ついでに、簡単にhtml吐けるようにするとかしてくれたらいいのになぁ、 それとも、OpenToolsAPIを詳しく知ってるとアドオン的なプログラムができるのだろうか・・・。
>雛型を設定可能な仕様書 いみふめーん
>>834 ドキュメントの形式を統一するって意味です。
>ドキュメントの形式を統一 なぜ統一する必要があるのかふめーん
統一はいいことだよ 南北統一マンセーってなもんだ
おまえら、ちゃかすんじゃねーよ! 統一教会もお忘れなくってなもんだ
UMLに統一しなさい。
仕様書がないとプログラム書けないようじゃ素人だね。
842 :
デフォルトの名無しさん :02/08/01 18:15
こんにちは 質問でし! 非表示のフォームBを表示中のフォームAからメソッドshowで表示させます フォームBではイベントshow発生時に FormB.Position := poScreenCenter; と記述してフォームBを画面の中央に表示させようとしています フォームB設計時のPositionプロパティの値もpoScreenCenterです 一度目の表示は問題ないのですが、フォームBを中央から別の場所に マウスで移動させて、Hideにして、再度フォームAからshowさせると、 上記記述の部分でエラーが発生してしまいます 単純に表示するときは絶対画面の真中なの! ということがしたいのですが。。。
ああ、JavaDocみたいなもの? かなり意味ふめーんだよ >833
>>842 FormA の FormB.Show の次の行に
中央寄せするコードかけば?
>>844 うわぁぁぁい
ありがとおございます
できました
多謝でし!感謝しるでし!
でも どうしてOnShow内ぢゃできないんだろ。。。
846 :
Delphi4日目(743) :02/08/01 18:49
>>822 ありがとうございます。多分、それです。
会社の先輩にここ見てもらったら、そのコールバックが
一番やりたいことに近いみたいだって言ってました。
ただ、Delphiで作成したもの同士でのコールバック関数を使った例が、
探してもなかなか見つからない上に、
見つかってもAPPとDLL間のやりとりの例だったりしました。
(
ttp://www2.biglobe.ne.jp/~sakai/callback.htm )
DLLは作成したくないので、
コールバックを頼むのはDLLではなく、EXEにしたいんですが、
どうすればいいのかわかりません。
参考になりそうな情報(文献、URL等)を
もしご存知の方がいらっしゃるなら、
どうか助けていただけないでしょうか。
>>841 C++やJavaのDoxygenみたいに参照関係やクラス関係を出力できるフリーのソフト無いのかね。
849 :
デフォルトの名無しさん :02/08/01 23:58
ここのサンプルを実行させてソースコードを 調べてみれば? $(Delphi)\Demos\Activex\Oleauto\Autoserv
>814 Ent版つかってるけどコンポーネントはそのままだよ. もちろん良く使う奴を左に寄せてはいるけど.
851 :
デフォルトの名無しさん :02/08/02 00:46
WAVEファイルを、EXEファイル内に埋め込めますか? もしできるなら、そのときのWAVE参照方法を教えてください(sndPlaySoundとか)
852 :
デフォルトの名無しさん :02/08/02 00:50
853 :
デフォルトの名無しさん :02/08/02 11:35
DelphiってCみたいにデフォルト引数指定できないの?? こんな感じにしたいのだが・・・ void hoge(String str = Null); ← C procedure hoge(str:String); ← Delphi
procedure hoge(str:String = '');
855 :
デフォルトの名無しさん :02/08/02 12:35
チャットで他の全員落とすにはどうすればいいんでしょうか?
しん先生 が素で書けば皆ひいていつも落ちてますよ・・・てなレスをよこせとおっしゃるのですか? しん先生
858 :
IDEの小枝 :02/08/02 13:47
MLの「IDEの小技」に因んで、 こっちでは「IDEの小枝」をやろうぜ! MLに負けない奴をどーぞ
>850 はいはい。次の質問どうぞ。
860 :
IDEの小技 :02/08/02 13:49
>>858 んじゃま1つ
[Ctl]+[SPACE] で自動補完が任意にだせる
(´-`).。oO(常識だろ、それ‥‥)
>>860 小枝だろ。
interface部とimplementation部間の移動は、
[Ctrl]+[SHIFT]+[↓]
[Ctrl]+[SHIFT]+[↑]で移動で可能
>854 ちょっと賢くなった。
コード補完。 普通のソースコードの部分じゃなくて、クラス定義の内側( = class() から end までの部分) で Ctrl-Space を押すと親クラスから継承したメソッドが表示される。 で、Delphi6 からはマウスで複数選択できる。ちゃんと Public/Protect を認識して 分けてくれるし。
866 :
デフォルトの名無しさん :02/08/02 14:25
IDEの小枝は某 ML には転載しないでください よろしく。 連中(の一部)は 2ch をよく思っていないので、こんなネタが存在すると 気づくと、また荒らしにきます。
え?MLの大半はここもかねてると思うんだけど?
http://www.borland.co.jp/delphi/devsupport/d6issues.html >Delphi 6 の動作が Windows XP 上で不安定になる場合、
Delphi 6 を「互換モード」で実行してください。
互換モードを設定するためには、まず、エクスプローラーで
Delphi 6 をインストールしたディレクトリの bin\delphi32.exe
(例: C:\Program Files\Borland\Delphi6\Bin\delphi32.exe)をマウスで右クリックし、
ポップアップメニューから[プロパティ(R)]を選んで、プロパティ設定ダイアログを呼び出します。
次に、[互換性]のタブをクリックして[互換モードでこのプログラムを実行する]をチェックして、適当なOSを選択してください。
※Delphi 6 は、Windows XP 上での包括的な動作検証は行なわれておりません。ご了承ください。
他システム上で動作するDLLを作成し、そのDLL内でParadoxデータベースを利用して います。 で、バックアップ機能を付加しようと思い、単にParadoxのファイル(dbファイルそ の他)と、ホストプログラムが利用するデータをコピーしました。(copyfileを使用) そのコピーデータはきちんと取れたのです。ところが、復元機能を付加して、バック アップフォルダからファイルをコピーしたのですけど、ファイルのコピーはされてい るのに、データベースのレコードが更新されていません。(旧データが残っている) 何故でしょうか。 一応、復元部分は以下のような処理を行っております。 // データベースを一旦閉じます。 DBModule.MainDataBase.Close; try // ホストプログラムデータをコピーします。 i:=findfirst(BackupFolder+'Dat\*.dat',faAnyFile,sr); while i=0 do begin copyfile(pchar(BackupFolder+'Dat\'+sr.Name),pchar(DataSystem.DatFolder+sr.Name),false); i:=findnext(sr); end; findclose(sr); // データベースファイルをコピーします。 i:=findfirst(BackupFolder+'DataBase\*.*',faAnyFile,sr); while i=0 do begin copyfile(pchar(BackupFolder+'DataBase\'+sr.Name), pchar(DataSystem.DBFolder+sr.Name), false); i:=findnext(sr); end; findclose(sr); この後、ホストプログラムはシャットダウンされます。(そうでないと、ホストデー タの更新が効かないので) もしかして、キャッシュが残ったりしているのかなぁとか思っているのですが。何か 原因等考えられましたらお願いします。
871 :
デフォルトの名無しさん :02/08/02 16:50
var a, b: array of Byte; SetLength(a, size); b := a; SetLength(a, newSize); var c, d: PByteArray; GetMem(c, size); d := c; ReallocMem(c, newSize); ここで、「a = b」と「c = d」はそれぞれ必ず true を返しますか?
>>871 そうですなぁ。監視式を利用して、
pointer(a)とpointer(b)
を見られては如何でしょうか。
873 :
デフォルトの名無しさん :02/08/02 17:26
WindowsXPからLinux上のMySQLに接続したいのですが、いまいちやり方がわかりません。 myODBCをインストールしてコンソールからmySQLに接続することはできました。 SQLConnectionを使用して接続するのだろう、とは思うのですがうまくいかないのです。 dllの起動に失敗しましたと警告されます。 何かヒントをいただけると幸いです。よろしくお願いします。
874 :
デフォルトの名無しさん :02/08/02 18:02
ハッシュ(連想配列)ってDelphiで使えるの? もし、使えるならどうやって使うの?
単純にそのdllがsystem32に無いだけでした…トホホ
>>874 Stringsのサブクラス
ヘルプを読むの
ちなみにDelphi5です・・・ TStringHashやTBuckutList,TObjectBucketListは無いです・・・
TStringListでも使えますよ。 いやなら自分で実装するとか。
アクションゲームを作ろうと思うのですが、ちょっと困ったことが。。。 例えば、→が押されたら■(label)のleftプロパティをプラスしていくということがしたいのですが、 ウィンドウがかなりちらついてしまいます。どうすればいいんですか?
Label1.DoubleBuffered := True
しかしWinDiff知らない厨房がいたのには驚いたね。 奴らいったい今までどうやって開発やってたのか 小一時間問い詰めたい気分で一杯です。
882 :
デフォルトの名無しさん :02/08/02 18:56
>>873 BDEつかってODBC経由せつぞくですな。
途中で送信してしまったよ。 MySQLより PostgreSQL+PQCompoの方がいいと書きたかった。
Microsoft Office XP Web Service Toolkit 2.0をインストールするとDelphiで 作ったWebサービスが動かなくなってしまったよ。 ブラウザ上でWSDLを見ようとしたら、 「エラー : この名前に文字 ':' を含むことはできません: -->:<--n1/EOleException」 と表示されますた。 どうもMSXMLかMSSOAPのバージョンが上がってしまうのが原因らしいが、ネームス ペース修飾の":"が使えないってのはXMLのパーサとして完全に失格。 MS逝ってよし。
image1に"a.bmp"を読み込んでそれから1秒後に"b.bmp"にしたいんですけど、 どうすればできるんでしょうか?
あげときます
procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.LoadFromFile('c:\a.bmp'); Sleep(1000); Image1.Picture.SaveToFile('c:\a.bmp'); end;
>>889 訂正
Image1.Picture.SaveToFile('c:\b.bmp');
>>890 それだと 'c:\a.bmp' が残るんじゃないの。
>>891 残っちゃいけないなんて書いてないだろ!
アニメーションさせたいってことじゃないの?
>>893 うっぜええええええええええええええええええええええええ
アニメーションのアの字も書いてないだろ!!!!!!!
分かった!分かったよ!!!!
887=891=893なんだろ?
>892 procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.LoadFromFile('c:\a.bmp'); Sleep(1000); Image1.Picture.LoadFromFile('c:\b.bmp'); end; ってことじゃないの?
まあ、おまえら気持ちはわかるが 低脳厨房はぐっと我慢して放置してくれ。逆恨みして荒らされたらたまらん。
899 :
Del初心者厨 :02/08/02 23:16
質問です。 文字を表示して、一定時間(5秒とか)ウェイトを持たせて 一定時間たったら次の文字を表示とかはできるのでしょうか? ちなみに、ウェイト中は操作が一切できないようにしたいです。
>>899 (´-`)。o ○ (「出来る」「出来ない」ってレスもらってウレシイか?)
出来ます。
>899 できる。 で、どこに表示したいんだ?
903 :
Del初心者厨 :02/08/02 23:20
>900 いや...言葉不足でした。どうすればできるのか教えてください。
904 :
Del初心者厨 :02/08/02 23:21
>902 ラベルに表示したいです。
>903 Label1.Caption := 'A'; Sleep(5000); Label1.Caption := Label1.Caption + 'B';
906 :
デフォルトの名無しさん :02/08/02 23:23
>906 え。違うの? オレハナニヲマチガエタンダラウ...
908 :
Del初心者厨 :02/08/02 23:29
>905 ホント厨で申し訳ないんですけど、その命令はどこに入れればいいんですか? FormCreateに入れてデバックすると5秒後に起動されるんです・・
(´-`)。o ○ (厨というか…)
>908 それはいつ実行したいのかな?
911 :
Del初心者厨 :02/08/02 23:34
自己解決しました!今日始めたばっかだったんで。 ご迷惑をおかけしました。
久々に笑えるやつを見た(w
913 :
デフォルトの名無しさん :02/08/02 23:38
>905 でも、これって確か実行している間は終了もできないんだろ? いいのか、それ教えて(ワラ
一度でいいから見てみたい 自己解決したソースUPするところ。 歌丸です。
>913 だって、Application.ProcessMessages出して、自前でフォームをDisableにして、フラグ立てて、キャンセルボタン押したらフラグセットして...とか説明するの面倒くさい。 ほっといても5秒たてば終わるんだし... Wait時間を可変でっていう話なら考えるけど。
916 :
助けてDel兄さん :02/08/02 23:55
TreeviewにImageListのImageを割り当てて 選択してないときはImageが表示されるんですが、 選択するとImageが消えてしまいます。 消えないようにするにはどうすればいいですか?
918 :
デフォルトの名無しさん :02/08/03 00:04
画面を初期化(クリア)したいのですが、どうすればいいでしょうか? たとえば、最初に白いフォームにボタンが10個。 3秒したら初期化(クリア)して青いフォームにラベル5個。 また3秒したら白いフォームにボタンが10個。 という感じにしたいんです
919 :
助けてDel兄さん :02/08/03 00:08
>>917 一発で出来ました
ありがとうDel兄さん
920 :
デフォルトの名無しさん :02/08/03 00:09
が… が… 画面…
>918 別のフォームにして、表示/非表示を切り替えるのが吉。
フォームですた(w
>>918 Form1.Color := clWhite;
Label1.Visible := True;・・・Label10.Visible := True;
Sleep(3000);
Form1.Color := clBlue;
Label1.Visible := False;・・・Label5.Visible := False;
>920 いちいち突っ込むなよ・・
まあ、フォームを「画面」と呼ぶこともあるわな。仕様書とか。 汎用機から流れた人(漏れもそうだが)は特に。
COBOLerは MDIとSDI、モーダルとモードレスの違いが分からない。
わかりました。どうもありがとうございますた。
俺は天才
931 :
デフォルトの名無しさん :02/08/03 00:19
オレはモーダルとモータルコンバットの違いが分からない。
>928 CICSはSDIでモーダルしかありませんが何か?
>930 >924のコードって、デザインが非常に鬱陶しいような気がするんだが...
>933 俺も思った...
935 :
デフォルトの名無しさん :02/08/03 00:45
お前ら!最小化したときにタスクバーで表示されるタイトルをファイル名じゃ なくするやり方を教えてください!
(´-`)。o ○ (どんなレスが付くのか楽しみだ…)
>935 (´-`)。o ○ (根性..)
(´-`)。o ○ (レスが付かない…もう寝よう)
つまりさあ、暇な2ちゃんねらーは中国人より単価が 安上がりって事さ。
>940 暇とは何だよ(暇だけど) もう寝る!!
v (゚ω゚) <そろそろ期待してる? /( )\ /'\
943 :
デフォルトの名無しさん :02/08/03 02:49
質問です。 ファイルの属性を一気に変更したいんですがどうしたら良いのか教えて下さい。 具体的には hoge\ディレクトリ以下のファイル全てを「読みとり専用」を外したいんです。(サブディレクトリ含む) FileGetAttrと言うのがあるらしいですがこれはファイル一個一個指定しなくてはいけないらしいです。 一括で変更できる方法がありましたら教えて下さい。
(´-`).。oO(ファイル操作は普通、ひとつづつやるだろ。)
>>943 (´-`).。oO(ノイマン型CPUで複数一括処理は無理だろ)
>>874 TStrings.Valuesってことじゃなくて?
>946 隠照のMPUは複数命令を同時実行します。と言ってみるテスト。
>>948 HDコントロール用CPUは未対応とか言い返してみたりする。
というか、パイプラインなんてすっかり忘れてたよ(恥)
950 :
デフォルトの名無しさん :02/08/03 12:26
さんくす
>949 たとえHDDコントローラが対応しても、アームは1本という罠。
Del6のTStringsはDel3のTStringsより明らかに重い。
953 :
デフォルトの名無しさん :02/08/03 18:01
>>952 抽象クラスの実行速度なんぞ良くはかれたな。感動。
ソースが思いんだよ!タコ
956 :
デフォルトの名無しさん :02/08/03 18:15
抽象クラスにはソースファイル無いの?
褒められた!
>>959 こんなふうにして下さい
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure NewButtonProc(var Msg: TMessage);
public
OldButtonProc:TWndMethod;
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.NewButtonProc( var Msg: TMessage);
begin
with Msg do
case Msg of
WM_RBUTTONDOWN: Msg := WM_LBUTTONDOWN;
WM_RBUTTONUP: Msg := WM_LBUTTONUP;
end;
OldButtonProc(Msg);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin ShowMessage( 'こんにちは' );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldButtonProc:= Button1.WindowProc;
Button1.WindowProc:= NewButtonProc;
end;
end.
>>960 なるほど。
しかし、FormのメンバーにNewProcを置くと、SetWindowLongは使えないと言う事ですか・・・。
これは何故ですか?
>>961 SetWindowLongはメソッドではなく手続きしか登録出来ないからです
ポインタが1つしか渡せないから、メソッドポインタを渡しても
どのオブジェクトかを識別出来ません。
MakeObjectInstance を使うとメソッドを手続きに仲介するコードを作らせる事が出来ますが・・・
詳しい仕掛けはここ参考にするといいでしょう
ttp://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm が、VCLを使うなら WindowProcプロパティを操作する方が簡単ですからそうした方がいいです
964 :
デフォルトの名無しさん :02/08/04 01:08
>>963 オブジェクトが別の場合は別のアドレス空間になるのですか?
てっきり一つのプロセス内なら、アドレスは全て一つで表せるのかと・・・。
うーん言いたい事がうまく伝わって無いかもしれない罠。
>オブジェクトが別の場合は別のアドレス空間になるのですか? とりあえずこの文章はおかしい
>>964 メソッドポインタは普通のポインタと違うんだよ。
>>966 指してるものは違えどポインタはポインタだろう。
969 :
デフォルトの名無しさん :02/08/04 08:54
どなたか、ModelMaker という UML を使われている方、いらっしゃいますか? 感触を知りたいのですが。
>>964 オブジェクトは同じアドレス空間にあります。
しかし、メソッドポインタは、命令コードと データ領域の2つを示さなければいけません。
FormのメンバーにNewProcをおくと、NewProgは手続きではなくメソッドになります。
メソッドには隠れた引数があり、それはどのオブジェクトインスタンスであるかを示すものです
具体的にForm1である事を教える必要があります。
それから
>>959 の例だと、 実際に buttonをホントのサブクラス=継承して動作を書き換える方が
簡単だと思います。
>>970 へぇ、C++みたいに隠されたthisポインタみたいなのがあるんだ。
972 :
デフォルトの名無しさん :02/08/04 12:03
Quick Report
973 :
デフォルトの名無しさん :02/08/04 12:05
Quick Reportのソースでは、パラメータクエリは使えないんですか? 直接SQLで記述するとうまくプレビュできるのですが、パラメータクエリにすると、真っ黒(っていうか灰色)のままなんですけど。
975 :
デフォルトの名無しさん :02/08/04 12:59
>974 どもです。 いえいえ、セットしてます。構文も間違っていません。(他のクエリでも使っているがそちらは正常。)
うんこくさいって。。。
記念パピコ(^〜^)
981 :
デフォルトの名無しさん :02/08/04 17:28
v (゚ω゚) <正直言って、出てくるとおもってないか? /( )\ /'\
982 :
涙でディスプレイが見えない… :02/08/05 00:11
981の放置っぷりが見事で…見事で…。
ああ、待っているよ!
>>981
ひょっとして、出てくるタイミングを失った?
さあ、どう出る!
>>981
あれ? 出てきたのは別のスレ?
逆放置プレーされていると思われる・・・
そろそろ埋める? その5よりその6の方が先に埋まったら、 それはそれでいいけどな(w
992 :
デフォルトの名無しさん :02/08/08 00:44
996
ふーつかれた
あとすこし
999
きたー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。