5 :
デフォルトの名無しさん :2006/04/17(月) 20:55:34
7 :
デフォルトの名無しさん :2006/04/18(火) 01:05:49
ここで質問して回答して頂いた者です。そのときは1週間ほど苦しんで、 もうどうしようもなくてわらにもすがる思いでしたが、なんとも的確な 回答を頂いてホントに助かりました。回答者様には本当に感謝しています。 (ぶっきらぼうな回答でしたが…)delphi は最初はなじめませんでしたが、 今になってみるととっても憎らしくてかわいい奴で、 すんげーいい奴っぽいです。 すみません、ちょっと書いてみました。
delphi だとドキュメントが不足してるから、無駄に苦しむけどね。 好きなら、長くつきあってやってください。
>>8 そうなんです。
だから、貴方達のアドバイスが必要なんです。
なので決して氏ね!なんていわないでね。
氏ね!
ま、他人に頼ってるうちはダメだろ、何事も
書籍出した人って最初どうやって勉強したんだろね? 裏技とか・・・・ 昔のハード知り尽くしたマシン語使いとか・・・やはり天才肌なんだろうか
( ゚Д゚)?
チュートリアル付マニュアルが付いてくるんだけどね。
TListViewのOwnerDataをTrueにしてアイテムを追加すると、終了時にメモリーリークが起きるんだけど、どうすれば直りますか? del6 personal winxp procedure TForm1.Button1Click(Sender: TObject); begin ListView1.Items.Add; end;
スマン解決した 追加も全部自前でやらなきゃだめなのね
まあええことよ
18 :
デフォルトの名無しさん :2006/04/20(木) 20:47:48
いままでDelphi6を使っててやっと2005にうpしたんだけど、古いプロジェクトを開いたら.netにするかWin32に するかどっちか選べってダイアログが表示されます。 これってどういう違いなんでしょうか? .netっていまいち意味がよく分からないのですが・・・
ちなみにHelpにはプロジェクトをアップグレードしますとしか出てこないっす。。。 両者の違いを知りたいのに・・・
.NETは.NETマネージドコードなアプリ、 Win32は従来通りのWindowsネイティブなアプリ。 よく分からなければ、Win32を選んでおけば今まで通り。
この板で最近、2005使ってるなら絶対2006買え、というのを見て買いました。感謝してます。 ところで、BDS2006のdelphi IDEで、「ユニットの表示」のアイコンをクリックすると ユニットのコードが出ずにフォームが出てしまいます。まあ切り替えれば終わりなん ですが。 何がいけないのでしょうか? それともバグ??
ユニットの表示を押すとユニットの表示ウィンドウが表示されると思うんだけど、 そこでユニットを選択したときの話?
23 :
デフォルトの名無しさん :2006/04/21(金) 18:42:14
整数値とオブジェクトを関連付けるためにTBucketListを使っているんですが、質問があります。 例えば、100とObjAを関連付ける時は、bucketlist.Add(Pointer(100), ObjA);とやっています。 で、100をキーにObjAを取り出す時なんですが、 p := bucketlist.Data[Pointer(100)]; のようにDataプロパティを使うやり方だとうまくいくのですが、Findメソッドを使って、 bucketlist.Find(Pointer(100), p); とやると、 変数実パラメータと変数仮パラメータとは同一の型でなければなりません というエラーになってしまいます。 Findを使って取り出すにはどうすれいいのでしょうか?
p は Pointer 型じゃないとダメだよ? 必要なら Pointer 型の p で受けた後、必要な型にキャストするべし。
var bl: TBucketList; p: Pointer; begin bl.Find(Pointer(100), p) なら通るが。pはなにもの?
26 :
23 :2006/04/21(金) 19:25:30
おかげで分かりました。 ちなみにpはTObject型。 Pointer(100)がエラーの原因だとばかり思っていました。
exeファイルを作るにはどうしたらいいんでしょう
プロジェクトをビルドすると通常.dprと同じディレクトリに.exeができる。
コンパイルスすれ
30 :
27 :2006/04/21(金) 20:54:58
>>22 そうです。ユニットの表示ウィンドウでユニットを選択したときです。
ユニットのコードが出るのは、フォームをもたないユニットを選択したときだけです。
他にこんな人はいないのかなあ・・
あまりグダグダ言うと、またアンチ扱いされるぞ。BDS へ
デフォルトの挙動がおかしーんじゃねーの?って話だろ
ParamCount=1の時 p := PChar(ParamStr(10)); // ''を期待 Win32APIの何か(p); ってやっても大丈夫ですか?
36 :
31 :2006/04/22(土) 02:54:15
>>33 Ctrl+F12でも同じです。2005まではそんなことはなかったのですが。
でも落ちないだけありがたいです。
ブラウザでテキストをコピーしたときにそれを関知してメモにペーストするために 以下のように記述したのですがうまくいきません。どこが悪いのでしょう? (WinXp+DElphi5) private { Private 宣言 } //クリップボードビューアチェーン内の次のウィンドウのハンドル hNextChain:HWND; //クリップボードの変更時に受け取るメッセージ procedure ClipChange(var Msg:TMessage); Message WM_DRAWCLIPBOARD; procedure ChangeChain(var Msg:TWMChangeCBChain); Message WM_CHANGECBCHAIN; procedure TForm1.ClipChange(var Msg: TMessage); begin if Clipboard.HasFormat(CF_TEXT) then Memo1.Lines.Add(Clipboard.AsText); //ビューア内の次のウィンドウに同じメッセージを送る SendMessage(hNextChain,WM_DRAWCLIPBOARD,0,0); end; //ビューワチェインのうちの次のものが自分よりはやく //抜ける場合を考慮して、WM_CHANGECBCHAIN メッセージも処理 procedure TForm1.ChangeChain(var Msg:TWMChangeCBChain); begin if Msg.Remove = hNextChain then begin hNextChain := Msg.Next; Msg.Result := 0; end else Msg.Result := SendMessage(hNextChain,WM_CHANGECBCHAIN,Msg.Remove,Msg.Next); end;
どう うまくいかないわけ? hNextChain:= SetClipboardViewer(Handle); をしてないとか? ところで、トロイの木馬作ろうとしてないよね?
つ NkClipDetector
Windows XP でスラッシュ"/"を組み合わせたショットカットキーを設定しても機能し ません。たとえば mnFindAll.ShortCut := TextToShortCut('Shift+Ctrl+/'); (※mnFindAll はメニュー項目) とした場合 Win98 ではOKですが XP ではだめです。 メニュー項目のShortCutプロパティにはShift+Ctrl+/が設定されますがこのキーを 押しても XP では機能しないのです。なぜでしょうか?
42 :
デフォルトの名無しさん :2006/04/22(土) 10:12:16
TBitmapについて質問です。 何らかの画像がロードされているTBitmapオブジェクトがあるんだけど、 今は必要ないから、オブジェクト自体はFreeしないで画像データ等だけ アンロードしておきたいんですが、具体的にどういう処理をすればいいの でしょうか? 画像データの解放は、タスクマネージャを観察する限り、Widthまたは Heightプロパティを0にすればいいみたいですが、他にやっておいた 方がいいことはあれば、教えてください。ReleaseHandleもやっておいた 方がいいんでしょうかね? ちなみに画像が必要になったら、LoadFromFile等で再度ロードします。
>>41 テンキーの方の / なら大丈夫なんじゃない?
44 :
41 :2006/04/22(土) 11:16:56
確かにテンキーの / なら大丈夫です。
>>42 必要なときに LoadFromFile するんなら、必要なくなったら Free すりゃ
いいんじゃないの? 何で Free したくないんでしょう?
プロパティかなんかなんだろ
FreeImaegするだけでいいんじゃないの。
Delphi7 Pro ですが、長い時間立ち上げて作業していると、Windows の タスクバーに、Delphi の本体のアイコンだけでなく、ソースのエディタなど のアイコンも出てくるときがあります。これって、何らかの操作で消したり 逆に表示したりするって出来るんでしょうか。
49 :
デフォルトの名無しさん :2006/04/22(土) 17:37:20
PersonalでAccessやOracleやPosgreのDBに接続する方法はないんでしょうか?
つ ADO
51 :
50 :2006/04/22(土) 18:08:29
でもタイプライブラリを解読できる人のみかな。
52 :
デフォルトの名無しさん :2006/04/22(土) 18:30:11
まだDelphiほとんど触ったことないので無理かなぁ。 プロフェッショナル買ってもいいんだけど高いので、 それよかVisualStudio買う方がよさげだし。
53 :
49 :2006/04/22(土) 18:30:57
DBアプリなら VisualStudio買うよりお得で楽だと思うけど、まあVisualStudioで苦労するのも修行だし
ひさしぶりにDelphi MLの過去ログを見ようとしたら、まったくアクセスできないんだけど、 これって一時的な障害なの?
56 :
デフォルトの名無しさん :2006/04/22(土) 22:09:49
GlobalMemoryStatusは使えるんですが GlobalMemoryStatusExだと未定義の識別子となって使えません win2k,D6personalです
57 :
56 :2006/04/22(土) 22:18:18
言葉足らずだったので補足します API関数なのは分かってますが ぐぐってもwin2k以降なら普通に使えるようにしか出てこないのに 自分の環境だと上記のようになって使えないのでここで質問してみました
自分で定義しましょう
>>57 単純に windows.pas で定義されていないだけなので
どうしても使いたいなら自分で定義して使うという事になると思いますよ
>>43 ノートPCではどうにもならんな・・・・
しかし、なんでだろう?
まさかシフトすると ? だから / と ? で混乱しないように禁止したとか
>>61 たいていのノートはNumLockでテンキー側の/も入力できるようになるから、
どうにもならんてことはないと思うけど。
ストロークが増えて面倒だと思うなら、キーアサインを見直すしかないだろうね。
64 :
56 :2006/04/23(日) 10:33:14
>>58 >>59 ありがとうございます。
定義したら関数は呼べるようになりました。
しかし変な値が帰ってきます。
DWORDLONG(符合なし64ビット整数)はdelphiでどのように定義したらいいでしょうか?
今はInt64にしてるんですが、恐らくこれが悪いんですよね。
入門書を見ながら Delphi 6 Personalで StringGridで簡易家計簿プログラムを作っています。 OnCreateハンドラに Cells[0,0]:='月\項目'; 等とかいてセルに文字列を出すことは できたんですが、 OnDrawCellハンドラに Data[i,j]:=StrToInt(Cells[i,j+1]); などと書いても 未定義の識別子:"Cells" といわれてしまいます。 何が間違っているのでしょうか? 入門書で使っているDellphiのバージョンは4のようです。
検索したらヒットしたのはココだな
http://podgoretsky.com/ftp/Docs/Delphi/Memory/virtual/TMemoryStatusEx.html なんか漢字の国にどんどん負けてゆきそうな雰囲気
TMemoryStatusEx = record
dwLength: DWORD;
dwMemoryLoad: DWORD;
ullTotalPhys: Int64;
ullAvailPhys: Int64;
ullTotalPageFile: Int64;
ullAvailPageFile: Int64;
ullTotalVirtual: Int64;
ullAvailVirtual: Int64;
ullAvailExtendedVirtual: Int64;
end;
function GlobalMemoryStatusEx( var lpBuffer: TMemoryStatusEx ): Boolean; stdcall;
procedure GlobalMemoryStatusExexternal kernel32 name 'GlobalMemoryStatusEx';
>>64 OnDrawCell はフォームのメソッドで受け取ってますから
with Sender as TStringGrid do begin
Data[i,j]:=StrToInt(Cells[i,j+1]);
end;
のようにしてやる必要があります。 あるいは直接
Data[i,j]:=StrToInt( StringGrid1. Cells[i,j+1]);
69 :
65 :2006/04/23(日) 10:59:35
DWORDLONGをCardinalにすると、
>>67 の構造体が上から順に
1
655343
65536
65536
2147418111
1
13673473
0
1072496640
Int64だと
0
0
58224486
156250
655229
655343
65536
1
0
のように帰ってきます。自分のメモリは2.5Gのはずなんですが……。
type TMemoryStatusEx = record dwLength: DWORD; dwMemoryLoad: DWORD; ullTotalPhys: Int64; ullAvailPhys: Int64; ullTotalPageFile: Int64; ullAvailPageFile: Int64; ullTotalVirtual: Int64; ullAvailVirtual: Int64; ullAvailExtendedVirtual: Int64; end; function GlobalMemoryStatusEx( var lpBuffer: TMemoryStatusEx ): Boolean; stdcall; external kernel32 name 'GlobalMemoryStatusEx'; procedure TForm1.Button2Click(Sender: TObject); var b: TMemoryStatusEx; begin b.dwLength:=sizeof (TMemoryStatusEx); GlobalMemoryStatusEx( b ); allocConsole; writeln(' dwMemoryLoad ',b.dwMemoryLoad :12,'%'); writeln(' ullTotalPhys ',b.ullTotalPhys div 1000000:12,'Mb'); writeln(' ullAvailPhys ',b.ullAvailPhys div 1000000:12,'Mb'); writeln(' ullTotalPageFile ',b.ullTotalPageFile div 1000000:12,'Mb'); writeln(' ullAvailPageFile ',b.ullAvailPageFile div 1000000:12,'Mb'); writeln(' ullTotalVirtual ',b.ullTotalVirtual div 1000000:12,'Mb'); writeln(' ullAvailVirtual ',b.ullAvailVirtual div 1000000:12,'Mb'); writeln(' ullAvailExtendedVirtual ',b.ullAvailExtendedVirtual div 1000000:12,'Mb'); end;
RS232接続(GP-IBは高いので)の実験装置(ポテンショスタットと呼ばれるモノです)の制御用プログラムを作りたいのですが 2006Trialと2005personalはどちらがいいのでしょうか?(貧乏学生でお金無いので)無理ならKylixでもかまいませんが 使いたい機能は,測定装置との通信,タブによるメニュー切り替え,測定結果のcsv形式でのファイル出力,Table(表)での表示などです 外部に公開する予定はありませんが,それがライセンス条件ならソースコードごと公開してもかまいません ごく簡単なExcelのマクロと,VBでHello Worldプログラムを書いてみたことがある程度の超初心者のため 要領を得ない質問で申し訳ありませんが,宜しくお願い致します
73 :
70 :2006/04/23(日) 12:16:09
>>71 sugeeeeeeeeeeeeeeeeeeeeeeeeee
なんか、自分がいろいろ間違ってたようです。人生とか。
71さんを始め考えてくれた皆様、ありがとうございました。
>>72 そりゃ 2005personal がいいだろ。ドイツ語の勉強にもなるし(藁
75 :
72 :2006/04/23(日) 13:01:18
ドイツ語!?
>>75 2005Personalは日本語版が無い。
雑誌付録が配布のメインだったので今でもWebで手に入るのはドイツ語版なのだ。
ドイツ語版だけ出とるのかワロス ひどい対応だなw
78 :
72 :2006/04/23(日) 20:50:00
ありがとうございました 6か7のPersonalを探してみます 2005は日経ソフトウェアあたりのバックナンバーを探せば 日本語版があるのだろうか……
ない
>>72 きみは、Delphi を取り巻く現状をまず認識することが重要だな
> Delphi を取り巻く現状 ニートの荒らしアンチが365日24時間 2ch に粘着して暴れてるって事?
オブジェクト指向ってのがどの部分を指すのかよくわからないんですが・・ proceder ごとに区切ってソースを書くあたりですか?
つ class
久しぶりにDelphi関連のサイトとかスレとか見てみたんだけど、 Delphiマガジンって廃刊になったの?最近出ていないようだけど。
>>81 チミの世界は2chだけのようだな、かわいそうに。(藁
本当にかわいそうなのは粘着し続けるオッサンだけどな
>>82 まあドットがオブジェクト指向だと思えば大きな間違いじゃないよ。
form1.Canvas.Font.Name
とか書く時のドットね。
フォームをテキストとして表示してみて! objectがいっぱいあるから。
>82 レコード型(Cなら構造体)に、そのレコードを操作する専用の関数がもてるようになった物と考えれば良いかと。
StringからWideStringやWideStringからStringをキャストする場合、自動変換されますが、 これを自動変換されないようにキャストしたいのですが、どうすればいいのでしょうか?
あらかじめSetLengthしておいてstrcopyしたら。
イマイチやりたいことが分からないのだが とりあえずWideCharToString or StringToWideChar
>>92 >>93 ありがとうございます。レスを参考にいろいろ試してみたところとりあえずこれで出来ました。
PCharとPWideCharを通してのキャストだけでも出来そうだったのですがWideCharには#0が使われるので
WideStringに戻すときがうまく行きませんでした。
function StringToWideString(Str: String):WideString;
var
Len: Integer;
begin
Len := Length(Str) div 2 + 1;
SetLength(Result,Len);
StrCopy(PChar(PWideChar(Result)),PChar(Str));
end;
function WideStringToString(Str: WideString):String;
var
Len: Integer;
begin
Len := Length(Str)*2;
SetLength(Result,Len);
StrCopy(PChar(Result),Pchar(PWideChar(Str)));
end;
function StringToWideString(const Str: String): WideString; begin Result := WideString(Str); end; function WideStringToString(const Str: WideString): String; begin Result := String(Str); end; いったいこれで何が不満なんだ。
せめて質問の意図を理解しろよ
なら質問の意図を説明してくれ。
>>91 では自動変換をしたくないと言いつつ、
>>94 ではPChar <-> PWideChar のキャストなんて意味不明なことをやろうとしているし、
何がしたいのか全くわからん。
わからないならもう黙ってていいよ。解決したみたいだし。
D7でPCA給与のようなボタンメニュー画面を作るにはどうしたらいいですか。 具体的には、あるボタンを押すと、右側にサブメニューのボタンがいくつか表示される といった具合に順々に選択ボタンが表示されるメニュー画面を作りたいです。 、
ボタンが押れたら、右側にサブメニューのボタンをいくつか表示すればいいんじゃない? 、
TPanelにそのサブメニューのボタン群を載せておいて、Visibleプロパティで制御するとか。 、
102 :
デフォルトの名無しさん :2006/04/24(月) 19:40:59
VBの For Each A in B hoge Next をDelphiに置き換える方法って無いでしょうか? for i:=0 to j begin hoge end; で置き換えようとしたのですが、型がVariantなどの特殊なために出来ないのではまってます。 どなたか教えてください。
104 :
デフォルトの名無しさん :2006/04/24(月) 19:57:33
2005です。 For each OleValiant1 in OleValiant2 hoge next ってのがどうしてもうまくいかないので・・・
ああ、OLEVariantのままでって事か 1次元配列なら for i := VarArrayLowBound(OleValiant2 , 1 ) to VarArrayHighBound(OleValiant2 , 1) do hoge でいいんだけどねえ
106 :
デフォルトの名無しさん :2006/04/24(月) 20:49:29
>>105 レスありがとうございます。
やってみたのですが、iのままでは駄目でした。
そこで、Olevariant1に代入してみたのですが、順序型では駄目と怒られました。
hogeの部分で
fnchogehoge (Olevariant1.Value(2), Olevariant1.CellValue(3));
とprocedureにデータを渡したいのですが、こういう場合はどうすればいいのでしょうか?
だから1次元配列なら for i := VarArrayLowBound(OleValiant2 , 1 ) to VarArrayHighBound(OleValiant2 , 1) do begin Olevariant1:=Olevariant2[i]; fnchogehoge (Olevariant1.Value(2), Olevariant1.CellValue(3)); 2次元かもしれないし、3次元かもしれないと厄介なのよ
>>107 1次元配列です。
Olevariant1:=Olevariant2[i];
この形で簡単に持って来れないので困ってます。。。orz
allocConsole; writeln(VarArrayLowBound(OleValiant2 , 1 ) ) writeln(VarArrayDimCount(Olevariant2) ) writeln(VarArrayHighBound(OleValiant2 , 1) ) は何を返す?
答えがないので、 writeln(VarArrayDimCount(V) ) ; がゼロを返すなら writeln( V.length ) ;を試してみて。 これはコレクションだから for i := 0 to V.Length-1 do begin V1:=V.item(i); みたいにアクセス出来る
image.Picture.LoadFromFile();がファイルが存在しない等の理由でファイルの読み込みに失敗したとき どのようにすればエラー処理がだせるのでしょうか?
↑がなんか分かりにくい文章になってますが、C言語で言うところの ファイルポインタ fpがあったときの if (fp==NULL) { printf("読み込みエラー"); } みたいなことがしたいのです
何もしなくても例外が出ると思うけど try image.Picture.LoadFromFile(); except on E:Exception do MyErr(E.Message ); end;
114 :
デフォルトの名無しさん :2006/04/24(月) 22:22:26
>>109 移動していたので、返事が遅れてすみません。
やってみたのですが、不正な引数が渡されました。とエラーになってしまいます。
>>114 という事は、配列型じゃなくて、コレクション型なのでは?
実行させて
OleValiant2.length と OleValiant2.Count
を読み出してみたらどう? lengthがあるなら
>>110 OleValiant1:=OleValiant2.Count.item(i); と出来る
>>113 ポップアップが出るのが気持ち悪くて
ありがとうございました
>>97 文字コードを変えないでString<->WideStringの型変換をしたかったので。
>>115 やってみたのですが、両方とも無いです。
Helpを色々と見ているのですが・・・
VBのソースをどっかにうpしたほうがいいでしょうか?
質問です。DirectShowを使用して動画ファイルの各フレームをビットマップとして切り出そうとしています。 DSPackをインストールして、FilterGraphとSampleGrabberを使用し動画を再生させながら 各フレームの画像を切り出すことはできました。 これを動画を画面上で再生させずに各フレームのデータを切り出すにはどうしたらよいのでしょうか?
120 :
デフォルトの名無しさん :2006/04/24(月) 23:13:20
121 :
デフォルトの名無しさん :2006/04/24(月) 23:38:54
118です。
http://makegumi.no-ip.info/loader/src/makegumi0155.zip.html こちらにVBソースとHelpFileをうpしました。
DL Key:hogehoge
です。
このソースの
For Each oRow In oOffersTable.Rows
fncGetRate oRow.CellValue(2), oRow.CellValue(3), oRow.CellValue(4)
If oRow.CellValue(17) > dtLastDate Then dtLastDate = oRow.CellValue(17)
Me.lblDDEStatus.Caption = "Latest Update: " & oRow.CellValue(2) & " - " & dtLastDate
Next
の部分を移植したいのですが・・・
122 :
119 :2006/04/25(火) 00:12:20
pfRendererにNull レンダリング フィルタを指定するだけだった。。。。。orz
>>117 > 文字コードを変えないでString<->WideStringの型変換をしたかったので
文字コードを変えなければ型変換はできませんよ。
たんにメモリイメージをコピーしただけだし、それをしたかったんでしょ。
>>121 自己解決しました。ありがとうございました。
125 :
デフォルトの名無しさん :2006/04/25(火) 13:35:35
マルチスレッドに初めてチャレンジしたいのですが、勉強できるサイトがありましたら、教えてください。 バージョンは7です。
開発者ガイド嫁
129 :
デフォルトの名無しさん :2006/04/25(火) 13:50:08
Delphi2005で実行するとモジュールのロードって表示されて関係ないモジュールまで読まれてしまうのですが、 これって回避する方法は無いのでしょうか? 具体的にはマウ筋のMauHook.dllが読み込まれてしまいます。 それだけなら何も問題ないのですが、このファイルを削除することが出来なくなってしまいます。 Delphiを終了させたあとでも同じです。 削除するにはいまのところリブートしかありません。 マウ筋は持ち運び環境なので定期的に削除したいのですが、これを回避する方法は無いでしょうか。
>>129 無償のVB 2005に乗り換えるのがいいと思います。
何気にエミュもハードル高いよな
ハードルは高ければ高いほどくぐりやすいよ
>>132 オマエ頭いいな。 そうだな。 別に誰かと勝負してるわけじゃなし、くぐりゃいんだよな
Delphi6でμ秒単位で時間を取り出す方法がありましたら、教えてください。
>>129 フックを行うdllは全プロセスに侵入してるので、Delphiだけなんとかしてもどうにもならんが?
Windowsだと、QueryPerformanceCounterが最高精度かな? いやよく知らんが。
Del6は無理だろ。 WinCE-T-EngineハイブリッドO$/Delドトネト なら可能性あるだろうけど。 Winはミリセカンド。
つまり.NETの方が優れてるということですね。
>>134 function RDTSC: int64;
asm
DW $310F
end;
この関数の帰り値は、たとえばクロックが2GHzなら、1uSECに 2000づつカウントアップするから
これでなんとかならない?
Del7 ListViewとImageListで32bitビットマップまたは32bitアイコンを 綺麗に表示する方法ありますか。
コンポーネントを配列にすることはできますか? imageコンポーネントの処理をするときにいちいちimage1,image2,・・・の処理を image[i]でできるようなふうに
array[0..num] of コンポーネント TList
//変数を用意して FImageArray: array[0..5] of TImage; //FormのonCreateイベントで関連付ける FImageArray[0] := Image1; FImageArray[1] := Image2; FImageArray[2] := Image3; //これでFImageArray[i]を使ってのアクセスが可能となる 変数を準備するのが面倒なら //Image1〜5の初期化例 for i := 1 to 5 do TImage(FindComponent('Image' + IntToStr(i) )).Picture := nil
sendbufの用途を教えていただけないでしょうか
147 :
デフォルトの名無しさん :2006/04/26(水) 17:36:48
Delphi7 Professional 使っています。 VB6 の Event と RaiseEvent の処理を移植しようとしています。 これを置き換えられそうな関数はあるのでしょうか?
DelphiのVCL見れば分かるけどイベントハンドラは、 メソッドポインタを直接コールだお。 procedure TSizeConstraints.Change; begin if Assigned(FOnChange) then FOnChange(Self); end; で、コントロールの親のイベントハンドラコールするなら、 ParentForm := (TForm)self.Parent; ifAssigned(ParentForm.OnCreate) then ParentForm.OnCreate(self); みたいな感じじゃね?
149 :
デフォルトの名無しさん :2006/04/26(水) 17:57:50
Delphi2005で株のチャート表示をやろうとおもっているのですが、できるだけ簡単に表示できる コンポーネントがありましたら、教えてください。 今まで数値演算系のプログラムは作成したことはありますが、Graphicsは初めてです。
150 :
148 :2006/04/26(水) 18:00:03
で、クラスメソッド=イベント、の関数型宣言はVCLの通り、 TNotifyEvent = procedure(Sender: TObject) of object; というようにクラスメソッドの型を宣言するか、 TNotifyEventのように既にある型を使うかのどちらか。
151 :
デフォルトの名無しさん :2006/04/26(水) 20:32:45
>>125 です。
スレッドの作成は成功したのですが、もう一歩成長したいので教えてください。
スレッドにパラメーターを渡すにはどうしたらいいでしょうか?
あと、Executeメソッドは
>>126 のサイトには
>Execute メソッドはスレッドが生成された直後に実行されるメソッドです ( 引数により直後に実行するかどうかを指定できます )
と書いてあるのですが、直後に実行しない方法と言うのはどうすればいいのでしょうか?
>>151 >スレッドにパラメーターを渡すにはどうしたらいいでしょうか?
例えばスレッドオブジェクト側にプロパティを作って、作成後実行する前に書いておくとか。
スレッド実行中に書き換えるならTCriticalSectionで保護しておく。
>直後に実行しない方法
t:=THogeThread.Create(True);
・・・
t.Resume; //ここで実行
>>152 プロパティを作るってやったことないので、チャレンジしてみます。ありがとうございました。
154 :
デフォルトの名無しさん :2006/04/26(水) 22:28:08
Delphi 2005とVB 2005でどちらが優れてますか?
155 :
154 :2006/04/26(水) 22:29:22
すいません。スレ間違えました。
156 :
149 :2006/04/26(水) 22:54:47
どなた様かアドバイスの儀よろしくお願いします。
2005ってことはPro以上だよな? TChartっていうチャートコンポーネントが付属しているはず。 或いはExcelのActiveXを貼りつけてもよいかもしれない。
ファイルの ctime/mtime/atime を変更したい場合はどうしたら良いでしょうか?
Windows.SetFileTime
Singleなどの実数を0.00015とかの形でLabelのCaptionに入れたい場合はどうすればいいのでしょうか?
Label.Caption := FloatToStr(0.000015);
163 :
デフォルトの名無しさん :2006/04/27(木) 03:20:17
DOSプロンプトに命令を飛ばすどんな関数を使えばいいのでしょうか? DOSプロンプトをCreateProcessで起動し PostMessageで終了させるところまでは作りましたが 制御するための検索キーワードが思いつかず適当な関数が発見できませでした プログラム中でJavaコンパイル用のBatファイルを作成してるのでそれを実行させたいのです よろしくお願いします
TDosComman
>>163 バッチファイルを作ってるなら、そのバッチファイルの内容で制御したらどう?
167 :
デフォルトの名無しさん :2006/04/27(木) 07:45:50
Delphiの言語仕様がVBより優れてる部分って何でしょう?
ありません。
>>167 asm 文 低レベルな所も好きなように書ける
>>163 引数を指定すれば任意のbatを実行できると思ったけど
CreateProcess(nil, PChar('cmd.exe hoge.bat'), ・・・
だめならkeybd_eventdで1バイトずつ送るとか
171 :
デフォルトの名無しさん :2006/04/27(木) 08:41:08
>>162 説明が足りませんでしたすみません。
あるSingle変数をキャプションに代入しようとしているのですが、
変数の中身が0.000015とかの場合はそのままきちんと表示されますが、
8.55E-6などとなっているときがあります。
このデータを0.0000000855と表示したいのですが、これはどうすればいいのでしょうか?
SingleじゃなくてDoubleで受けろ
>>125 です。
マルチスレッドでメインスレッドではファイルへの書き込み、もう一つではファイルを
読み出して計算をやらせているのですが、ファイルが使用中とのエラーが出てしまいます。
これを回避する方法ってないでしょうか?
TFileStreamなら同時アクセスもできたはず
>>171 FormatFloat('0.####################', 0.0000000855)
もうすこしスマートなやり方もありそうだけど・・
>>175 それか、Synchronizeでどうよ
>>175 それってどうやるのでしょうか?
>>176 他のサイトでそれを読んだのですが、使い方を解説してるところがなくて・・・
>>178 Synchronizeでファイルを開いて計算してって処理をすべて書くとなるとマルチスレッドの
意味がなくなるのでやりたくないです。
>>177 だから、Format('%*.*f', [12, 10, 0.123456789012]);
>マルチスレッドでメインスレッドではファイルへの書き込み、もう一つではファイルを 同じファイルなんだったら、 TMemoryStreamにしてカキコするのはSaveToFile、 読み込む方はTMemoryStreamのMemory読めば良いんでない?
TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone)
そもそも、出力中のファイルを計算対象のファイルにするのなら 同じスレッドで計算すればいいのではないかとおもうのだけど? 対象が大量で再計算頻発するのか? それとも、同じ名前のファイルに書込み続けるのか?
>>182-183 ぐぐってからやってみます。
>>184 永遠とデータが追加されながら再計算をするソフトです。
なので、途中経過を画面に表示したいのですよ。
再計算が色々とあるので別スレッドにチャレンジしました。
ファイルいらないんじゃね?
入力→メモリ→計算・描画→ファイル という形にならないのかな?
>>187 >>188 マルチスレッドプログラミングへのチャレンジなんだから、
それは言わない約束でわ?
TFileMappingStream を自作するといいと思うよ ファイル マッピングを使えばメモリとファイルは等価になるから
性能を問題にするなら、TMemoryStreamの保持するメモリで全部処理。 で、アプリが終るときにSaveToFile。 メモリが足りなくなるようだったら、メモリマップトファイルか?OSがファイルスワップするんだから、どっちでも一緒かな?
私が馬鹿なのでみんないじめんと相手してくださいorz
>>182 の方法でやろうとしたのですが、ちょっと難しそうです。
あと、CSVフィアルを読み込んで処理しているのですが、FileStreamやMemorystreamで
やろうとすると、CSVの処理がめんどくさいです。
こうなるとデータベース化しないと無理なのでしょうか。
>>187 それってどういう意味ですか?
>>190 すみません難しいこと分からないです。。。
193 :
デフォルトの名無しさん :2006/04/27(木) 14:57:12
時間をテキストファイルに格納してるんだけど、それを取り出して日付時刻計算するのがめんどくさい。 今はhhmmss形式で保存して読み出して日付時刻計算するときは hh*3600+mm*60+ssとやってるんだが、日付が入ると面倒なことになる。 String形式からDatetime形式に簡単に変更する方法かString形式の日付時刻を簡単に計算する 方法ってない?
CSVを再度スキャンしてるの? 何か効率悪そうだな。 内部データは1行の内容のレコード型を作って、それを動的配列にして使えばいいんじゃないの?
>>193 俺様書式なら面倒なのは当然で、
俺様書式じゃなくて StrToDateTimeで処理出来る形式にしたらいいんじゃないの?
俺様書式なら TRUNC(TDateTime*3600*24) をファイルに書き出すとか
>>192 CSVファイルとくればTStringListの出番ですよと思ったけどバイナリだから無理か
>>194 の方法が一番スマートかと
>>193 FormatDateTime使えば少しは簡単にならないかな
for ii:=0 to 4 do begin s[ii]:=''; hoge end; s[ii]:='';にBPを設定してF8を一回押す。 次にiiの部分にマウスを持っていくと5の表示が出るんだだがこれって何? ちなみにXP ProSP2 Delphi2005 Pro こんな症状初めてで不気味。
F8?ならforに入る前なんじゃないの?
199 :
デフォルトの名無しさん :2006/04/27(木) 15:41:44
>>198 F9で実行してBPで止まった後の話ね。
赤くなってるのはhogeの部分
>>189 >>188 だと例えば入力→メモリとメモリ→計算・描画→ファイルで2つのスレッドにわければいいと思う。
>>197 最適化をOFFにしてみれば?
最初にbreakしたときは? hogeに入る前は?
最適化のチェックを外しても変化なし。 forに入る前ii=0 forに入った直後ii=5 orz
>>202 リセットしたら直ったとか言わないよなぁ・・・
>>200 kwsk!
あとできるだけ優しく!!!
>>203 リセットってどういう意味?
ちなみにforの直前にii:=0入れても変化なsアッー!
何この仕様。。。
>>197 最適化OFFでも最適化してるのかfor ii:=5 downto 1 doみたいな動きしてるなw
しかもforに戻ってiiがデクリメントされた時点でテーブルがクリアされてる
どうやらループ内で使ってないものはどうでもいいや的な動きをしてる s[ii]:=''; showmessage(inttostr(ii)+'('+s[ii]+')'); hoge ならちゃんとした動作になる
>>204 んなこと言われても、そっちの仕様がよくわからないんだが・・・。
とりあえず俺がやったことある方法ね。
・スレッドオブジェクト側で入力データをrecordなりclassなりに保存し、それをリスト(TList等)に追加する。
・ある程度(100個とか)リストに追加したら、PostMessageでメインスレッドにメッセージを送る。
・メインスレッド側がメッセージを受けたら、リストのItem数を確認し入力データを取得。
・そのデータを計算なり描画に使うなりする。
・TFileStreamでそのデータをファイルに出力。
これで1つのファイルを読み書きに使うようなことはなくなる。
リストはどちらからも読み書きするのでTCriticalSection等で排他制御する必要あり。
いっそタスクに別けた方がトラブルが少ないかもよ データを読む側は、起動時にファイルがあれば読み表示 データを作る側はファイルに書き出した後PostMessage 完全に別けて作成しておいて 一体の方がいいなら、後で合体させればいい
210 :
デフォルトの名無しさん :2006/04/27(木) 18:38:03
>>208 record
classなり
TFileStream
TCriticalSection
これらをまったく使ったことが無いしぐぐってもサンプルソースが無かったので諦めます。
DBにTryしてみます。
初心者ですがすみません。 タスクトレイに収納されたアプリケーションを閉じる方法を教えていただけないでしょうか。 (トレイ外のウィンドウハンドルでキルするのは出来てます。)
213 :
デフォルトの名無しさん :2006/04/27(木) 19:19:16
>>166 バッチファイルで制御するためにその起動方法が知りたかったんです><
>>170 CreateProcess( nil, Pchar('cmd.exe /c "'+workfolder.Text+'"\make.bat"'), nil, nil, False,CREATE_DEFAULT_ERROR_MODE, nil, nil, StInfo, PrInfo);
で無事起動できましたありがとうございますm(_ _)m
214 :
208 :2006/04/27(木) 19:21:11
「使ったことないからやめます」って・・・脱力しましたw
215 :
デフォルトの名無しさん :2006/04/27(木) 19:26:07
ウィンドウ右上の「×」を押して終了されたのをトリガーにする方法はありますか?
WM_SYSCOMMAND WM_CLOSE
>>212 >>214 ごめんなさい。
読んでもちょっと理解できなかったのですよ。
再チャレンジしてみます。
たぶんヘルプは全く見ていないんでしょう。
220 :
211 :2006/04/27(木) 20:00:11
211です。 先ほどのはすこしわかり辛い質問の仕方かと思いますので、改めて質問しなおさせてください。 タスクトレイ内に登録されているアプリのハンドルを知る上手い方法をご存じないでしょうか。
タスクトレイに収納されてるかどうかなんか、なんも関係ないだろ。
「アプリのハンドル」ってなに?
Application.Handle
224 :
211 :2006/04/27(木) 21:25:02
えとつまり 通常ウィンドウハンドルは FindWindow(nil,'hoge.exe'); 等で目的のアプリケーションのウィンドウハンドルが取得できるわけですが タスクトレイに収納されてるものはこの方法では取得できません。 なにかよい方法は無いでしょうか
タスクトレイはただアイコンを表示するだけの領域です。 タスクトレイにウィンドウを収納することはできません。 従って「タスクトレイに収納されてるウィンドウ」という概念は成立し得ません。
228 :
211 :2006/04/27(木) 21:35:15
なるほどです。自分が勘違いしてるみたいですね。 もうすこし自分で調べてみます。有難うございます。 EnumProcesses ググって見たら出来そうな気がしてきました。サンクスです。
>>219 ヘルプは一応読んでます。
ただ検索にあまりにもひっかからないのでぐぐるほうが多いです。
文字列を浮動小数点に変換するFunctionがstrtodoubleだったか何だったか忘れたので、
strtoで検索しても何一つひっかからないとか使い勝手が悪いんですよね。
コマンドが分かってる人じゃないと使えない。
部分一致がもっとまともに機能すればいいのですが。。。
ご迷惑をおかけしてすみません。
>>229 回答でrecord、class、TFileStream、TCriticalSectionなどのキーワードを教えて貰ったんだから
それぐらいはヘルプで調べて読みなさいな
231 :
デフォルトの名無しさん :2006/04/27(木) 23:49:06
ちょっと前に株価チャートを表示できるコンポとしてTCHARTを教えてもらったのですが、 これってX軸を反転させることはできますか? 具体的には一番右のデータが0で一番左の数字が大きくなるのですが、どうしても左端が 小さな数字になってしまいます。 AddXY以外に何か軸を反転させる方法があるのでしょうか?
>>229 ヘルプがイマイチなのは認めるが、ヘルプのテキスト検索で「浮動小数点」と
入力したらなんとか探し出せると思う。
ところでDBやるとか言ってるけど、使ったことある?
recordもclassも調べる気がありませんでは、とても無理な気がする。
ButtonPicClick(sender); としてみたところ 「未定義の識別子:'sender'」 というエラーがでて動きません。 一体何事なんでしょうか?
スコープ内に sender がないんじゃないの?
無い変数は使えない。呪文じゃないんだから。
>>215 マジですか?本当なら禿げしくW-ZERO3に乗り換えたい。
無い呪文も使えんと思うが
無い呪文でも となえた事にして、女にモテモテ
VirtualRDってDelphi製ですか?
> こっちで判定ソフトを作ってる。 ソフト自体はDelphi製じゃないけど
244 :
231 :2006/04/28(金) 09:43:05
TChartを右クリックして「チャートの編集...」を選びじっくり見てみる
株価チャートなら、どうせ出来高とか、5日平均とか色々欲しくなるんだから 表示[関数]を作って自前表示した方がいいよ
>>245 編集→軸→スケールのところにY軸を逆転させるのはあるけど、X軸を反転させるのは無いですだ。
>>246 これが成功したら移動平均Functionとかを作って、計算後にTCHARTの表示ルーチンに投げる予定
だったんだけど、それよりもTImageを使って1から作ったほうがいいってことけ?
>>247 軸を下にしてスケールの反転をチェックすると?
249 :
デフォルトの名無しさん :2006/04/28(金) 12:41:53
レコードのリストって作れましたっけ? クラスはTlistで出し入れできるのですが レコードの場合は配列しか無理?
ポインタにすべし PHoge = ^THoge; THoge = record end;
前方参照を許さないDelphi唯一の例外ですね
>>247 こんな感じでデータ型を作って
type TKabuka4Item= record
sday,eday :TDateTime;
hajime:Integer;
takane:Integer;
yasune:Integer;
owari :Integer;
end;
TAKabuka=array of TKabuka4Item;
TCharProp = record
DtMax :Integer; //グラフの最大値
DtMin :Integer; //グラフの最小値
HigePen :TPen ; //ローソクを描く時のペン
InBrush :TBrush ; //陰線を描く時
YoBrush :TBrush ; //陽線
end;
procedure DrawKabuChart(cvs:TCanvas;rect:TRect;dt:array of TKabuka4Item;prop:TCharProp);
とTCanvasに描画する関数を作っておけば
TImage でも Bitmapでも、プリンタでも、フォームでも表示可能
254 :
デフォルトの名無しさん :2006/04/28(金) 19:00:15
delphi6のエディタには行数を表示する機能はないのですか?
ステータスバーが見えないなら無い
256 :
デフォルトの名無しさん :2006/04/28(金) 20:24:44
>>250 やっと打開できましたありがとうございます
ポインタむずかしいですね
監視式で監視しても数値が変わらなかったんで動かないのかと思ったのですが
実装したらなぜか正常動作
バグが起きても絶対発見できないなと思いつつも次段階へ進みました
258 :
デフォルトの名無しさん :2006/04/29(土) 01:51:01
VB 2005は無償だそうですが、Delphi 2005にはVBよりも勝る点がありますか?
弱い者いじめはよしましょう
>>258 道具というのは使う人の能力によるものなんで、
勝るかどうかを知るには貴方の事をもっと知る必要があります。
死ねよ気違い
VB VC++ VC# 全部無料バージョンがあるのか。早速ダウンしとこう しかもボーランドはIDEから撤退予定と・・・・ 業界2位が頑張らなきゃ面白くないぞ!!
変な独り言だな
スレタイ読めない人が多いですね
他者を貶めることで自分の優位を誇ることがどんなにくだらないかわかんねぇの?
わかんねぇから
>>258 みたいなやつがいるんだろうけどな
パソコン使える程度の頭があるんだから、もちっと想像力働かせろよ
とマヅレス
スルーできないなら一言「スレ違い」と書いとけ。
>パソコン使える程度の頭 これもホント、ピンキリだからなぁ…
でもさ、Delphiが爆発的に普及したのは 言語・環境のすばらしさもさることながら Parsnal版の無料配布が大かったんじゃね?
で、爆発的にユーザ減少したのは、D8 D2005 があまりにひどかったからなんだな。
スレタイが読めませんか?
Delphi超初心者です。
「Delphi はじめの一歩」(
ttp://delphi.sakura.vg/index2.html )というページを参考に
Delphi6でオリジナルブラウザを開発するのに試行錯誤しております。
このページの作者は「Acty」というブラウザを開発した方で
その「Acty」のブックマークパネルの挙動が、ドッキングウィンドウというのでしょうか?
VisualStudioやEclipseなどのIDEでよく見られる、画面の端に持っていくと
吸い付くような感じでドッキングするといった挙動をするのですが、
これは、どのように実装しているのでしょうか?
「Delphi はじめの一歩」で、ブックマークパネルのソースをダウンロードできるにはできるのですが
サンプルのブラウザと「Acty」ではブックマークパネルの仕様が異なっており
このドッキングウィンドウをどうやって実装してるのかがわからないのです。
簡単に実装できるのか?あるいは、この作者だからこそなせる業なのか?
どなたか、Delphiに詳しい方、教えてください。
よろしくお願いいたします。
C:\Program Files\Borland\Delphi6\Demos\Docking がしかし、これをアプリに組み込んでいる実例は未だ見たことがない。
Delphi の IDE で使ってるやん。
>>271 俺も使ってるよ
ほかにドッキングウィンドウの実装方法ってあるの?
274 :
270 :2006/04/29(土) 20:46:26
>>271 >C:\Program Files\Borland\Delphi6\Demos\Docking
すばやいレスありがとうございます!
これを応用すれば、うまく実装できそうな感じですね
275 :
デフォルトの名無しさん :2006/04/30(日) 01:37:58
∧,,∧ ミ,,゚Д゚彡 ミ つ旦)~~ Delphi 2005南下と比べると VB 2005の方が実は優れてるんじゃないかと思う京子のゴロ いずれにしても某はもうだめですね。 ブビ坊の言ってることは実は正しかったような希ガス。
フサまでそんなこと言うのか・・・
つか、気づくの遅すぎだろ、いまごろ・・・
278 :
デフォルトの名無しさん :2006/04/30(日) 01:53:34
現状ではVS2005>>>BDS2006と言われてしょうがないと思う 両方使うとわかるけどテンプレートの選ばせ方とかはマイクロソフトの方が上手 あと・・・今更ながら画面のセンス。
ヒント:トリップ
うっかり信じちゃったよ!
.netって某を潰すためのM$の罠だったの?
むしろ某潰し以上にMS社内を混乱させた欠陥兵器
.NET って、CPUパワーがあと3倍10Gくらいになったら、素晴らしい技術になるだろう。 ネイティブマンセーなDel厨の言うことは、信じちゃダメ
つーかVC2005も無料なのにVB2005使う意味無いじゃん
CPUパワーが3倍になったらOSやミドルウェアの重さも3倍になる
>>285 今のマシンにWin95とか走らせたら快適なんだろうか
実際はドライバなどの問題から無理だろうけど
Win95 でしか使えないアプリに限定されるだろ。BDS なんかは使えない。 環境とはそういうものなんだよ。いつもでもネイティブマンセーなんていってると Del厨と同じになるよ。快適さは、軽いことだけじゃないんだ。
軽快動作が第一条件なら、D7 からもうバージョンアップする必要なしだね。以後無視。
.netマンセー
確かに残念ながらWIN95はUSBが使えないというたった一つの欠点によって今では使えない。 でもVMWareで WIN95走らせると、とても快適
API の互換性がないから、多くの環境でサポート外なんだな。Win95 っていうか 非NT系はもう無視される運命。ITune でも2000とXpだけだもんね。
∧,,∧
ミσ゚Д゚ミσ
>>275 おまいさん誰だい。
∧,,∧ ミ,,゚Д゚彡 <プビフサギコだお ミ つ旦)~~
完全にコンパイラが消滅する世界が正しいと?
ttp://www.microsoft.com/japan/msdn/vbasic/support/vistasupport.aspx >Visual Basic チームは、Visual Basic 6.0 アプリケーションが WindowsR Vista でも
>"そのまま" 動作する互換性を提供することを表明します。」
>サードパーティ コンポーネント
>マイクロソフトでは、OCX コントロールや ActiveX コントロールなど、
>サードパーティ コンポーネントに関するサポートは提供できません。
>サードパーティ コンポーネントに関するサポートの詳細については、
>コントロールの製造元に問い合わせることをお勧めします。
>Visual Basic 6.0 のサポート ライフサイクル
>Windows Vista には Visual Basic 6.0 のバイナリ ファイルが同梱されますが、
>Visual Basic 6.0 IDE や Visual Studio 6.0 自体のサポート ポリシーに変更はありません。
>これらの製品の延長サポートは 2008 年 3 月で終了します。
BDS2006(アップデート1)のDelphi for Win32でActiveXコントロールを作ろうと思って、 マニュアルに書いてある通りActiveXライブラリのプロジェクトに ActiveFormを追加したのですが、プロジェクトメニューにWeb配布オプションが現れません。 どうして?
297 :
デフォルトの名無しさん :2006/05/01(月) 19:08:45
いろんな屁理屈があるみたいだけど結局サクサク動く軽いアプリが一番 特に仕事で使うカスタムアプリとかでモッサリとしか動かないやつは金返せといいたくなる こっちは残業するかしないかの瀬戸際なのに画面ひとつ表示するのに何万年かかってんだょと… ドトネトごときに10年も待てん ネーティブでもなんでもいいから今すぐ何とかしてけろ
> いろんな屁理屈があるみたいだけど結局サクサク動く軽いアプリが一番 ずーーーーーと、Delphi2 あたりを使ってたらいいじゃないの。
そんなことよりもハローワーク行けよ。
すれ違い
303 :
デフォルトの名無しさん :2006/05/02(火) 01:14:34
delphi6 と 7 では どっちがバグ少ないのでしょうか?
6 イントラウェブ使わないなら6で十分 7での追加はサードパーティのツールど考えてよしだよ あと追加のレポートツールはバグだらけ 少なくとも日本語版はダメダメ
Delphi高い。VBの方が無償で高機能で安定してて高速で、選ばない理由がない。
そうだけど、ま、いろいろ好きずきやら因縁があるから・・・
307 :
デフォルトの名無しさん :2006/05/02(火) 01:51:26
delphi7のComCtrls にある Listviewって スクロールバーが 無効リージョンを描画しなおす時、 無効じゃなかったところだけは 拝啓で塗りつぶされてちゃんと描画されないことがあるのですが これって バグなのでしょうか
308 :
デフォルトの名無しさん :2006/05/02(火) 01:52:53
>> 307 拝啓 → 背景 訂正するまでも無いことですが一応
そんなこと指摘する前に質問に答えてやればいいのに
7にはXPマニフェストがついている。 これ大事。
VCが無料なのにVBを選ぶ理由も理解しがたいがな
313 :
デフォルトの名無しさん :2006/05/02(火) 14:03:58
文字の縁を綺麗にするのってどうすればいいんでしょうか。 ペイントソフトの文字入れ機能に良くあるオプションのことです
自前で実装するならビットマップに4倍のサイズで描画しておいて 4点の平均を1点に縮小して使うとか
TLogFont で、lfQuality := ANTIALIASED_QUALITY;
この方法はXPでしか使えないな。他の種類は自分でやるしかない。
そんなことはない。Win98以降ならば普通に使える(正確にはWin95OSR2以降) もっとも、日本語フォントではほとんどアンチエイリアス効果がないけどな。
318 :
デフォルトの名無しさん :2006/05/03(水) 00:51:28
5個の整数型変数のうち一番大きなものを取り出す関数がありましたら教えてください。
オープン配列引数にすればいいんだから無問題でしょ
MaxIntValue([a, b, c, d, e])
>>322 ガ━━(゚Д゚;)━━ン!オープン配列知らなかった。こんなのあったのかよ(w
>>323 あ”Formatとかと同じってことか?
procedure TForm1.Button1Click(Sender: TObject); type PData = ^TData; TData = record s:string; end; POwner = ^TOwner; TOwner = record Data : Pointer; end; var P: POwner; begin GetMem(P,Sizeof(TOwner)); GetMem(P.Data,sizeof(TData)); PData(P.Data).s := 'test'; ShowMessage(PData(P.Data).s); FreeMem(P.Data); FreeMem(P); end; これをやるとメモリリークしますが、Stringを持つ構造体のポインタを確保するって駄目なんでしょうか? 参照カウントあたりでミスってると思うんですが。素直にクラスにするべきですか?
new/dispose使っとけ。うまいことやってくれる。
ありがとうございます。マジ感謝です。
>>325 FreeMemのヘルプ
「Pが長い文字列またはバリアントを含む構造を指す場合は
Freemem を呼び出す前に Finalize を呼び出します。」
FreeMemはメモリを破棄するだけなのでレコードや動的変数の中身は検知しない
Finalizeを使うかあるいはFreeMemの前に
PData(P.Data).s := ''と書いて参照先をnilにするか処理が必要
まあ、
>>326 が言うようにNew/Dispose使えばこんな面倒臭いことしなくていいんだけどね
329 :
デフォルトの名無しさん :2006/05/03(水) 09:16:18
勝手につくられたはずのpdrユニットでコンパイルエラーが出る。 作った当初はコンパイル出来てEXEも吐き出した。 ちょっと直そうと思ってMain.pasを修正し実行しようとしたらこれだ・・・・ なんなんでしょう?この融通のきかないプロジェクトファイルってのは? del7perです。 program ProjectTest3d; uses Forms, Main in 'Main.pas' {Form1}, {$R *.res} begin ←[エラー] ProjectTest3d.dpr(10): 識別子 が必要な場所に 'BEGIN' があります Application.Initialize; Application.Title := 'Test3D'; Application.CreateForm(TForm1, Form1); Application.Run; end.
Main in 'Main.pas' {Form1}, Main in 'Main.pas' {Form1};
331 :
329 :2006/05/03(水) 09:27:05
?わかりません Main.pasはありますよ(未修正のやつ)
というかunit Mainだけでコンパイルしたいのだが 勝手に出来たprogram ProjectTest3d;のユニットを切り離したい。
333 :
329 :2006/05/03(水) 09:37:55
Main in 'Main.pas' {Form1}; ←セミコロン わかりました、ありがとうございます。 そうだ、わけわからんタイプライブラリ読み込んでたから1行消したまま保存してたんだ。
Delphi で、複数のディレクトリなどのパスを結合する場合には、どうしたら良いですか? IncludeTrailingBackslash 関数 IncludeTrailingPathDelimiter 関数 などの関数でデリミタを付加して、文字列を結合するのが普通なのでしょうか?
たんなる文字列操作。すきにやればよし。
>>335 そうですか。
最近の他の言語は、面倒みてくれるんですけどねぇ。
真面目に対処しようと思うと、結構わずらわしいと思うのですが。
移植などの時も、下手にやると書き換えなきゃならなくなりそ。
Delphi こういった部分がおそまつだったり、マニュアルが酷かったりと、
これじゃぁ、新規の人が増えないだろうなぁ。
まぁ、探せばコンポがあるのかな。
JCLにいろいろ関数があったような。 ま、335の言うとおり 単なる文字列操作だから好きにやればよいと思うけど。
煩わしくは無いと思うが?
>>336 いったいどういう所で悩んでるの?
>>338 うげー、いつの間にかドメイン取ってDelWiki名乗ってるし。
使いにくいからPukiWikiにしろよ。
>>339 「真面目に対処」したくないから悩んでるんだと思う。
言語に付いてないと何もできない、ってのはゆとり教育のせいかな?
今日も時代遅れの出がらし君大活躍だなw
つまらない疑問かもしれませんが教えて下さい 一つのpasファイルの中を複数のスレッドからほぼ同時に走らせる事は並列処理として成り立つのでしょうか?
意味が分からん 複数のスレッドが1つのpasファイル内のProcedureなりFunctionを呼ぶってことか? それならそのProcedureやFunctionをスレッド内に記述するべきだと
最近Delphi界に復帰してきました。 うろ覚えなんですけど、 hoge1,hoge2,hoge3,hoge4… てな文字列があった場合、これをhoge1 hoge2 hoge3 とかって切り離す手続きか何かなかったですか? あったような気がしたんだがな〜と思ってHelpを見てたらCommaTextみたいなプロパティがあって、これのことを勘違いしてたのかな? って、思案しています。 なかったですか?
TStringList.CommaText
var sList: TStringList; begin sList := TStringList.Create; try sList.CommaText := 'hoge1,hoge2,hoge3,hoge4'; finally sList.Free; end; end; これでsList.Strings[0]にhoge1, Strings[1]にhoge2・・・Strings[3]にhoge4が入ります CSVファイルを解析する時なんかに便利ですがスペースを含む文字列がある場合は要注意 CommaTextはスペースまたはカンマで区切るので(””で文字列を囲まれていれば大丈夫) スペースで区切りたくない場合は一度スペースをStringReplaceなんかで置換して CommaTextにブチ込んだ後で元に戻す
テストしてない。 function StringSplit(Text: string; const SubStr: string; List: TStringList): Integer; var Count, Len: Integer; S, P, U: PChar; V: string; begin Count := 0; Len := Length(SubStr); List.Clear; S := PChar(Text); U := PChar(SubStr); P := StrPos(S, U); while P <> nil do begin SetString(V, S, P - S); List.Add(V); S := P + Len; Inc(Count); P := StrPos(S, U); end; List.Add(string(S)); Inc(Count); Result := Count; end;
352 :
348 :2006/05/03(水) 22:19:12
>>349-351 サンクスです!やっぱCommaTextってこういう使い方するんですね。
やっぱDelphiいいわ。細かいことができる。
まだ.NETのほうは試してないですけどねー。
∫,,,,,,,,,∧,,∧ 便乗質問です。
⊂,,,,,,,,,つ,,゚Д゚ミつ
>>325-326 、
>>328 TRecordってのがあったとして
type PRecord = ^TRecord;
var p:PRecord; Item: TRecord;
begin
New(p);
p^ := Item;
っていうのは
begin
GetMem(p,SizeOf(Item));
Initialize(p^);
p^ := Item;
と、等価
begin
Dispose(p);
っていうのは
begin
Finalize(p^);
FreeMem(p);
と、等価
って理解でいいのかしら?
>>336 ∫,,,,,,,,,∧,,∧ まあもれも
⊂,,,,,,,,,つ,,゚Д゚ミつ
「CharToByteIndexだとかのWideString版がネエ!
嫌だ嫌だ、標準でナキャイヤダ。
VCLは.NETみたいに膨らみまくってなんでも標準であるべきだ」
と騒ぐタイプなので、少し共感はするんだけど、
実際には
[最近の他の言語はどういうことを面倒みてくれるのか]
[結構わずらわしいのを、どんなに楽にしてくれるのか]
[移植のときはどういう楽なのか]
を伝えておいてくれれば、共感したら誰か作ってくれるかもよ。
単なる文字列処理になるわけで漏れでも作れるレベルだろうから。
.....
>>352 いや、おそらく多分確かうろ覚えだけど、ことこの処理に限れば
.NETの方が全然いいかと、、、、
いい加減、TStringListは何かに置き換わったりしないかな、
widestring対応じゃないし、改行コードはCRLF前提だし......
String or WideString の動的配列か、
もしくはTList派生で本当にStringのListを作るとか。
まあ、漏れは昔いらついてTList系でWideStringとかつくったり
Split関数も作ったりしたので別にいいんだけど、
VCL標準でもどんどん成長してって欲しいな。
Delphi は文字列処理には向いてない環境である、と思った方がいいよ。 自前で文字列処理のライブラリをつくるくらいの気構えがいるくらい、Delphi で まじめに文字列処理するのは覚悟がいる。Perl や Python でやった方がはるかに簡単。
>>355 string型があるんだし、Cよりは文字列処理に向いているとは思うが。
要するにライブラリが整備されていないってことでしょう?
そゆこと
MD5やSHA1やSHA2を手軽に求められるコンポーネントってありますか? SHA1だけでも良いので、知っている方がいらっしゃたら教えて下さい。
探したのか?
例文や使い方などは付いてないのでしょうか?
読めばわかる
>>356 スクリプト厨は昔から張り付いてる奴だから相手にすんな
C にもインタプリタあるだろw 素直になれよw
?
a^2-b^2=(a+b)(a-b)
出がらしが毎日毎日張り付いてるだけだなこのスレ
質問する → 馬鹿にする → 人が去る → Delphi 死亡
× 馬鹿にする ○ 愛しのDelphiタソが馬鹿にされたと逆切れ
Delphi はこんなことすら簡単にできないの? → ○○すればできるでしょ → Delphi 糞のまま化石化 Delphi はこんなことすら用意されたないの? → ○○すればできるでしょ → Delphi 糞のまま化石化 Delphi ××するにはどうした良いの? → 質問には答えず、馬鹿にしておなにー → Delphi 糞のまま化石化
今日はハローワークも休みなんだっけ
>>367 検索かければいくら出てくるだろ、C にもインタプリタはある。
しかも、スクリプト言語には、単体で実行可能なバイナリの生成が可能なものも多い。
というか、実行バイナリを生成するかどうかなんて、文字列処理とは関係ないだろ。
C# は、文字列も処理しやすくなってるし。
スクリプト厨呼ばわりした逃げ口上にしてはお粗末。
単に、言語が貧弱なだけ。
何時までたってもスクリプトだからと叩いてたりするから、化石時代の出涸らしと言われるんだよ。
JavaScript ですら見直され、非常に熱いこの御時世だぞ。
文字列処理は、みんな好きなスタイルでやってるよ。 Delphi 用 TP Lex/Yacc を使ってコードを生成して利用するのが好きな人もいれば 自前で状態遷移を表現しやすいクラスを作って処理してる人もいれば ひたすら copy と deleteと+の人もいる状態。 縛られる必要はない。 みんな自分のスタイルで書けばいいんだよ。
標準関数が貧弱の一言ですむことをよくもまあ長々と
標準関数は強力すぎるくらい強力だが? 何が欲しいの?
時代遅れで無知な出がらし君に聞きたいことは特にありません。
>>368 文字列レベルでその変換をする方法が知りたいわけ?
面白そうだね。
>>378 だったら、質問スレに出没しなけりゃいいのに・・・・
「標準関数が貧弱の一言ですむこと」なんだよなぁ。 フリーのコンポやユニットでできる、とかいうのと、標準でできる、ってことは 実に大きな隔たりがあるんだよね。 努力すると何でも出来る、のは Delphi についてはそのとおりだが、簡単にできる ようになぜ進化しないのか、そこらへんに近頃の衰退の理由がありそうだよね。
>>375 >ひたすら copy と deleteと+の人もいる状態。
俺のことかぁぁぁ!!!
> 標準関数が貧弱の一言ですむこと Delphi は GUI 以外は、ライブラリが貧弱。これほんと。
>>380 なんか、マニュアル最近読まないからアレだけど、最近のDelphiは文字列操作の関数は
イヤンなるくらい増えてるみたいよ。知らないのが100以上あって驚いた。
もしかすると探せば、大抵あるのかもしれないね。
でも、あのヘルプじゃ探せないって事なのかもしれない。
話は違うけどさ、
最近の1チップマイコンはハードに色んな内蔵周辺回路が付いていて、とても強力だけど
だけど使おうとしたらマニュアルの解読がとてもメンドクサイ作業になる。
232Cでのシリアル通信なんか、内蔵UART使うの逆に面倒で
タイマー割り込みか、エッジ割り込みで命令数数えて作る方が楽。
でも、そう思わない人も当然いて、なんでこんな安い仕事で、こんな面倒なコード書いてるの?
と不思議そうに聞く。 安いから、マニュアル読むのも時間のロスって事なんだけどさ。
豊富な機能、優れたマニュアル、これに優るもの無し。Delphi にはどっちもない・・・
豊富な機能も優れたマニュアルも、入門時には確かに必要だな。 でも、Delphiには、このスレのように24時間webサポートが付いてるから問題ないけどな。 という事で、このスレの機能を破壊するのが目的なのか? 暗黒だな
かぶった(w
質問ある人は臆せずどうぞ。 雑談してても質問は最優先で受け付けますから
初心者も減ったんだろ・・
> でも、Delphiには、このスレのように24時間webサポートが付いてるから問題ないけどな。 優れたマニュアルのかわりには、2chの初心者スレじゃ無理だろ。妄想もいい加減にしろよ。 ふらっとC#すれの方が100倍ましだな
>>390 だから、どこで悩んでるの? それをチャンと表現してよ。
さすがにどこで悩んでるのかまでは超能力者じゃないから判らんのよ。
>>389 しかしAboutDelphiの検索数は去年が最低で今年は少し回復傾向にある
ファイルを現在他のプログラムが利用中かどうかを調べる方法がありましたら教えてください。
Delphiの問題というより windows-APIの問題という所だね リネームが可能なら使われていなうと思うが・・・
ロックモードでファイルを開いて失敗したら使用中とか・・・
ちょっと前にmaxintvalueを教えてもらったのですが、 どの変数が一番大きな値を保持しているのかを出す 方法って無いでしょうか? 今は値を取り出した後でforで回して検索しています。
>>395 これでやってみます。ありがとうございました。
文字列処理房は結局何がいいたいの? 欲しいものを素直にいってみなよ。 それともただの暇人?
消えろ基地外
ユニコード房=スクリプト房=文字列房=標準房=インライン房
>>397 for で回して検索という事は配列なんだよね?
なら
function MaxValueAdr(const Data: array of Integer): Integer;
var I: Integer;
begin
Result := Low(Data);
for I := Low(Data) + 1 to High(Data) do
if Data[Result] < Data[I] then Result := I;
end;
としてインデックスを返してもらって、配列を参照したらどう?
> しかしAboutDelphiの検索数は去年が最低で今年は少し回復傾向にある ミラーが閉鎖したから、一方に合計されただけ。ここ数年は単調減少。
TShellListViewとTShellComboBoxを使ってるんですが コードの中で新しいパスを指定する方法が分かりません。 一応、TShellComboBoxのPathにパスを指定すると TShellComboBoxは新しいパスに切り替わるんですが TShellListViewが連動してくれません。(もちろん、マウスで 操作すれば無問題です) このような場合、どうすればいいのでしょうか? よろしくお願いします。
405 :
デフォルトの名無しさん :2006/05/04(木) 22:43:07
外部のDLLからもらうイベントのデバッグ時の不自然な挙動について教えてください。 DLLはネット通信をしているもので、通信が成功したらデータを流してもらうものです。 約1秒ごとに発生するイベントで呼ばれるプロセスにブレークポイントを設定して デバッグをしているのですが、 hogehoge1; hogehoge2; hogehoge3; とあり、1から2へF8キーで移動して次に3に行かないといけないのになぜかhogehoge1に行ってしまいます。 毎回同じように1へ行くわけではなく行ったり行かなかったりします。 これって新しいイベントが発生したからそれを処理してるってことでしょうか? それともこんなことはありえませんか?
>>404 procedure TForm1.Button1Click(Sender: TObject);
begin
ShellComboBox1.Path:='C:\';
ShellListView1.Root:=ShellComboBox1.Path;
end;
みたいな事がやりたいわけ?
>>405 スレッドIDは同じ? 違うならマルチスレッドで処理してるんじゃないの?
ShellListViewのShellComboBoxを設定してるなら(相互参照だから、逆でも同じ) ShellComboBox1.Path:='C:\'; ShellListView1.Root:=ShellComboBox1.Path; と両方に設定しなくても ShellListView1.Rootに代入すれば ShellComboBox1.Pathは自動設定される。
>>406 はい。DLLは別のプログラムですが、マルチスレッドも使っています。
Label1からLabel10まで値を順々に代入していきたいんだけど、 for i:=1 to 10 do begin Label(i).Caption:=hoge[i]; end; じゃエラーになります。 これはどうすれば出来ますか?
>>409 ポトペタで貼り付けたコンポーネントは、フォームが所有している
だから、フォームのメソッドで
(FindComponent( 'Label'+IntToStr(i) ) as TLabel ) .Caption:=hoge[i];
とやればいい。
これを何度も繰り返すなら、あらかじめ配列に代入しておくといい。
コンポーネントを代入してもコピーではなく参照だから
>>410 ありがとうございます。Labelではきちんと動作しました。
同じことをStringlsitでやろうとしたらエラーになるのですがこちらの場合はどうすれば出来ますか?
412 :
デフォルトの名無しさん :2006/05/05(金) 00:30:34
その質問にはエスパーでもない限り答えられないな もっと詳しく
>>412 tmplist0,tmplist1,tmplist2とあるのですが、
これに
for i:=0 to 2 do
begin
tmplist(i).insert(0,hoge);
end;
みたいなのをやりたいのですが、findcomponentではTComponentと互換性が無いとエラーになってしまいます。
tmplist+inttostr(i).insertでも無理でした。
そりゃそうだろう。 var templist: array[0..2] of TStringList; みたいにするのが一番分かりやすいかな。 for i := 0 to 2 do tmplist[i] := TStringlist.Create; みたくすれば良し。 使うときは for i := 0 to 2 do tmplist[i].Insert(0, hoge); 使い終わったらちゃんと解放しようね。
Stringlistでも配列が使えるなんて考えもしませんでした。 ありがとうございました。
>>410 回数繰り返すなら予め配列に代入する他に
for i:=1 to 10 do
FindComponent( 'Label'+IntToStr(i) ) . Tag := i;
と Tagに初期化しておいて (プロパティで設定しておく方法も)
var i:Integer;
begin
for i:=0 to ControlCount-1 do
if (Controls[i] is TLabel ) then
if Controls[i].Tag>0 then TLabel(Controls[i]).Caption := hoge[ Controls[i].tag ];
end;
という手もある
418 :
デフォルトの名無しさん :2006/05/05(金) 10:42:09
メインスレッドでStringとTListをグローバル変数として宣言しました。 これを別スレッドで読み書きすることは出来ないのでしょうか。 もし無理なのでしたら、他に出来る方法がありましたら教えてください。
メインスレッドで宣言ってのは、ちょっと用語的にアレだな。 ローカル変数として宣言したら、当然だめ スタック領域はスレッド毎に異なるから、将来アクセス違反になるかもしれない。 グローバル(関数の外側)で宣言してるなら、どのスレッドの持ち物って事じゃない。 ただし、両方のスレッドから読み書きするというのはダメ 片方から主に書いて、書き終わったら 別の参照変数に代入して 参照変数をセマファ代わりに使うなら大丈夫
[ ゚д゚]y-~~~~~ デフラグ /[へへ カンリョウシマシタ 、、、、、、。。。いいいいううかかかかききししししししじすた たただだだちちっっっっててててててででとととどななななななな ににににににのののののののはははみめもゃょらららららららりる るるるれわわをァアアイカククグススススススセセタダッッッッッ ドドドドバフマメメルルレレレレレロロンーー丈両主事代代使側入 別参参反域変変変外大夫宣宣宣将当持数数数数方方書書書来毎然照 照片物用異的終言言言語読違関領()
421 :
デフォルトの名無しさん :2006/05/05(金) 11:18:42
>>419 グローバル変数の場所に書いてるのですが、中身が得られないんですよ。
implementationの前です。
メインスレッド側では書き込み専用として使い、もう一つのスレッドは読み出し専用として使うつもりです。
それでも同期処理はしないとダメだよ。
>>422 シンクロナイズ部でグローバル変数の読み書きをしないと動作しないと言う意味でしょうか?
文字列のように複数のリソースを使う場合、 片方が書いてる途中に片方が読むとマズイ事になる だからリソース一つだけの何かを使って排他処理をする必要がある そのあたり判らないならクリティカル セクションを使うといい。 それも面倒というか待機させたくないなら、 文字列を簡単に渡したいなら 文字列配列を用意するといい var buf: array [0..100] of string; var RdAdr:Integer=0; var WtAdr:Integer=0; 書き込むスレッドでは buf[WtAdr]:=文字列; inc(WtAdr); if WtAdr>High(buf) then WtAdr:=0; とし 読み込むスレッドでは if WtAdr<>RdAdr then begin // buf[RdAdr] を文字列として使い // inc(RdAdr); if RdAdr>High(buf) then RdAdr:=0; end;
>>424 まず、Form1.Create部でTLIST.Createしています。
TLISTの解放はFORM1.DESTORYでやっています。
次にメインスレッドでTLISTにデータを書き込み、別スレッドで
showmessage(inttostr(hogelist.count));
とやると、Canvasに描画できません、とのエラーになってしまいます。
Showmessageでこんなエラーが出る意味が分からないものでドツボにはまってます。
424を参考に全面的にソースを見直してみます。
>>406 ,407
レス遅くなり、申し訳ありません。
そうですか、ShellListView1.Rootに
入力すればいいんですか。
ありがとうございました。
>>416 >
>>408 という事は
>>405 でブレークした時のスレッドIDを確認してみてはどう?
ブレークしたときのスレッドIDはどこで確認できますか?
またこのような症状をデバッグ中に一時的にでも無くす方法って無いでしょうか?
>>425 それの問題は、別スレッドでShowMessage してる事かもよ
ShowMessageは内部でVCLコンポーネントを作成するから
MessageBoxに換えてみたらどう?
>>427 CPU窓で確認するか 表示 -> デバッグ -> スレッド で
>>424 やってみたのですが、アドレス00000000への読み込み違反が発生しました。ってのが出るようになり
結局駄目でした。
bufの数値を上げてもエラーになるまでの時間が若干増えるだけでした。
クリティカルセクションでやってみます。
>>428 出来ました。ありがとうございました。
>>430 bufの数値が配列サイズの事なら、書き込み側が非常に頻繁に書き込んでいて
読み込み側が滅多に読まない状態なのだと思える。
クリティカルセクションでロックすると、
書き込み側がロックされてしまうよ。
だから、逆にバッファを小さくして、
書き込み側で、
if not WtAdr<>RdAdr then begin //と読み込み側をロックする
buf[WtAdr]:=を文字列 と書き換える
if WtAdr>High(buf) then WtAdr:=0;
end;
とやって、読み込み側が読んでいないなら書き換え無いのがいいんじゃないの?
時間を5分単位で切り捨てる方法って無いですか? 15時9分59秒を15時5分に切り捨てたいのですが、いい方法が見つからないので。
Encode/DecodeTime
>>432 TDateTimeなら 実体は24時間を 0〜1で表現したものだから
24*12 倍して切り捨てればいい
>>434 これもらいます。ありがとうございました。
436 :
デフォルトの名無しさん :2006/05/06(土) 03:06:13
常に全画面表示させているフォームをアクティブで無い時に透過させたいんですが 何か良い方法ないですか?
ひどい仕様だな・・・
438 :
436 :2006/05/06(土) 03:30:59
>>436 WM_ACTIVATE
それにしても、ひどい仕様だ
それにしても、ひどいレスだ TForm.OnActivateで begin AlphaBlend := False; end; TForm.OnDeactivateで begin AlphaBlend := True; AlphaBlendValue := 100; // 0..255 end
質問です。 Timer で、10秒おきにある処理を実行するように設定して、 その処理が15秒かかるとき、 前の処理と次の処理が同時に行われてしまう様ですが、 前の処理がまだ終わってない場合は、次の処理を待つなりスキップさせて、 重複しないようにするには、どうしたら良いのでしょうか?
大体10秒間隔で動けばいいって程度ならOnTimerイベントハンドラで begin try 処理 finally Timer1.Enabled := False; Timer1.Enabled := True; // この時点から10秒後にタイマイベント発生 end; end;
他に時計を見て、10秒以上経過してたら処理しないとか 時計は now を引き算して 10/(24*3600) が10秒だから
>>440 すべてのOSのバージョンで有効な手段じゃないけどね
445 :
441 :2006/05/06(土) 11:03:07
446 :
436 :2006/05/06(土) 11:37:08
みなさんレスありがとう!特に440さんありがとう! やってみます!
Delphi7 Proで文字列をUTF8に変換するにはどうすればいいのでしょうか? ぐぐったらskUnicode.pasというのがあるみたいなのですが、見つからないでした。
448 :
436 :2006/05/06(土) 12:40:53
すいません。またまた失礼します procedure TForm1.FormActivate(Sender: TObject); begin AlphaBlend:=False; end; procedure TForm1.FormDeactivate(Sender: TObject); begin AlphaBlend:=True; AlphaBlendValue:=100; end; のような感じで記述してみたんですが何も起きません。 記述の仕方が間違っているのでしょうか?
>>447 ヘルプで UTF8まで打てば、そっから調べられると思うよ
>>448 定義部がprivateになってない?
なってるなら、一度消して
フォームのイベントから書くとといいよ
そうでないなら、やりたい事はもしかして TApplicationのイベントの方でやりたいのかな?
Form1て大本のフォームじゃないのか。 透明化したい小さい方のフォームのイベントハンドラに書くんだぞ。
451 :
436 :2006/05/06(土) 13:03:31
>>449 さん
レスありがとうございます!
定義部はprivateにはなってないですと思います。今こんな感じです
type
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
すいませんTApplicationというものについては勉強不足でわかりかねます(;;)
452 :
436 :2006/05/06(土) 13:06:25
>>450 さん
大本の方のフォームをアクティブに応じて透過させたいんですがそれは無理ですか?
>>438 のような感じのソフトを作りたいんですがいかんせんうまくいかなくて悩んでいます
453 :
436 :2006/05/06(土) 13:12:35
あ!ちなみにツールはdelphi6です!
454 :
デフォルトの名無しさん :2006/05/06(土) 13:22:32
Borlandが死滅したそうですがこれからどうすればいいですか? VBが無償らしいのでそちらに乗り換えた方がいいですか?
>>454 好きにしてください。そしてVBスレに移行してください。
全画面なのにアクティブじゃないってどんなソフトだ?
早々にJavaに乗り換えた俺は勝ち組
ブビ厨の断末魔イタス
osがXP/2000以外だったらぬっころ
MeってまだM$サポート範囲内だっけ? まぁ98以前は考慮に入れなくても、ぬっころされる筋合いはないな。 これが、大儲けできるM$のやり方。
>>452 やっぱり、ApplicationのActiveに反応させたんだね。
だから TApplicationの方のOnActivate OnDeactivateにすればいい。
今のコードのまま
Aprocedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate :=FormActivate;
Application.OnDeactivate:=FormDeactivate;
end;
と入れてみて、それが希望のようなら、
FormActivate/FormDeactivateeを フォームのイベントから外せばいい。
463 :
436 :2006/05/06(土) 14:37:07
キタ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─ !!
>>462 さんありがとう!神です!出来ました!
ほんとに感謝!!
特定のサイトまでの通信時間を測定する方法は無いでしょうか。 一日のうちで通信速度のばらつきが多く、酷いときにはGoogleは開けるけどYahooは開けないほどなので、 NTTかプロバイダーのNiftyにクレームを入れようと思っています。 一度NTTの調査は入ったのですが考えられない・・・の一言だったので証拠を揃えたいと思いまして。 Del7Pro,非ny厨です。
>>464 無理に作らなくても コマンドプロンプトから
ping google.com
と打てばいいだけでは? ファイルにリダイレクトさせるバッチ作って 結果をメールで送ればいいだろ
tracert google.com も。
467 :
デフォルトの名無しさん :2006/05/06(土) 15:18:26
そんなものに証拠能力は無いけどな
プロバイダ変えればいい
>>465 pingで結果をテキストとかで受け取ることはできますか?
結果を受け取る方法が分からないので画面に張り付いていちいちコピペするしかないと
思ってたのですが。。。
IdIcmpClientでも使えばいいと思うよ
>>469 >ファイルにリダイレクトさせるバッチ作って
>>469 Indy9 のデモにPingGui って奴がある。
Javaに浮気してみて改めてDelphiの良さを理解した ポインタ弄れるDelphiサイコーおまけでC/C++もイイ
474 :
デフォルトの名無しさん :2006/05/06(土) 18:00:30
本当はVBがやりたいくせに(ワラ
>>471 ぐぐってやっと分かったばい。
ありがとうばい。
JAVAは遅いから江戸っ子の俺はイライラするんだよ
BDS は遅いから江戸っ子の俺はイライラするんだよな。Del3 で十分。
478 :
デフォルトの名無しさん :2006/05/06(土) 21:38:01
delphiではfor文のカウンタに i+=3とか+=1以外を指定きないんですか?
できません
i := 0 whlie i < 15 do begin inc(i , 3); end; しかなかったっけ。
481 :
デフォルトの名無しさん :2006/05/06(土) 22:59:18
うわ、だせーw それぐらいVBでもできるのに
for i := 1 to do begin j :=i * 3 hogehoge jで end;
>>481 出来ないからいいんだよ。
1刻みしか出来ないから、そういうコードを書くからね。
484 :
デフォルトの名無しさん :2006/05/06(土) 23:07:13
HELPメニューにwindowsSDKの奴があるのって標準だったっけ? なんかで追加した記憶もあるんだがHELPフォルダにも入ってないし どっからリンクしてるかわからない リンクのさせ方も忘れたしどうするんだったっけ?
>>484 バージョンによって カスタマイズとかでOpenHelpが起動するんだろうけど
あんまり色々入れると鬱陶しいよ
SDKはスタートメニューにでも置いておいた方がましだな
ああ、スタートメニューに突っ込むと反映されるんだったか ありがとう
>>483 そーいやループ変数を別の事に使おうとしても怒られるよな。
他の言語でもループ出たらループ変数は保証されないだろ?
いや、C言語はブレーク時のカウンタは後で使えば保持してくれると思うが
forのスコープ内で変更できないってのも特徴じゃね?
491 :
490 :2006/05/07(日) 10:11:47
すまん。 俺、寝ぼけてるわ
ふつーに、できる言語とできない言語があるだろ。 できない言語は、その代わりに、境界値ぎりぎりまでループできたり、コンテナからループ範囲を得たり、ループに閉じたスコープでループ変数を提供したり、いろいろ特典もある。 Pascalの場合は最初のしかありがたみ無いけど、#0から#$ffまでのループをChar型でできたりするのは案外大きい。(C式だと無限ループになる)
493 :
デフォルトの名無しさん :2006/05/07(日) 13:28:49
DelphiでUnixtimeからJSTは計算できるのですが、ロンドンタイムやNYタイムの夏時間冬時間を 簡単に計算する方法って何か無いでしょうか? 自分で換算関数作っていちいち計算させないと駄目でしょうか?
ダメですね。
意図的にエラー(例外)を発生させる手続きはないですかね?
abort が例外を発生するよ でも なんで raise を発行しないの?
コンパイル中・・ リンク中・・ っていうのを待ってると江戸ッ子の俺はイライラするんだよ。 やっぱコンパイル爆速のDelphiだよなぁ おっと、相撲がはじまるぜ?
>>495 EMyErrorを投げるprivateメソッドはよく作るな。
private
procedure Error(msg: String = ''); overload;
procedure Error(fmt: String; args: array of const); overload;
procedure TMyClass.Error(msg: String);
begin
raise EMyError.Create(msg);
end;
procedure TMyError(fmt: String; args: array of const);
begin
Error(Format(fmt, args));
end;
499 :
vbから :2006/05/07(日) 18:40:08
今度Delphiを使って会社の受注ソフトを作ろうと思い、professionalの購入を考えています。 価格が安い2005を買おうと思ってるのですが、2006との大きな違いって ありますか? そんなに高度なことはしません。 pc何台かでネットワークで使えたらいいです。
500 :
デフォルトの名無しさん :2006/05/07(日) 18:44:05
直接borlandに聞いたほうが速いし正確
契約関係は、さすがに個人的問題だからなあ
Delphi7以降はシラネ
2005,2006使ったことない奴らは黙っとけ
真面目な質問をくだらないスレでするのもどうかと思いますよ
……2005…か…
2007使ったことない奴らも黙っとけ
ってか、いまどき Delphi で新規案件なんてどうかしてる
VBで半年かかって動いてなくて、納期まで7日しかない状態でもDelphiなら 使い手によっては間に合う事があるからなあ・・・・・そんな感じの状態じゃないの?
>499 普通に2006にしとけ。
本当はDelphi7のほうがいいけど、もう売ってないさそうだからな…… 自分も2006のほうが良いと思う
Delで一週間で組めるスキルがあるプログラマなら、 VB使っても一週間で組めると思うのですよ。
VBはAPIの宣言をコピーするのが面倒だよ
>>499 2005はバグバグでクソだから、普通に2006にしとけ
Delで一週間で組めるスキルがあるプログラマなら、初めから Del 使ってるだろ。
というわけで、
>>508 のような状況はあり得ない。
納期まで半年あったのに何やってたの?
プレステでもやってたんだろ
1週間のボリュームを半年って・・・おいしいなぁ(w 公共事業からみかや?
そういうのは既にお金を前任者が食いつぶしてしまっていて、泣いてくれっていうパターン。 オイシクない事が多いよ
スレタイも読めないのかこいつらは
質問があったでしょ。スレタイ読めないのは
>>519
スレタイのどこにも質問スレとは書かれていない件
スレタイ読めるからDelphiについてくだらないことを書き込んでる件
このスレのいいところはどんなに話がそれても コードの質問にはちゃんと答えが返ってくること
しっかし、超初心者も減ったな
では、次の質問者どうぞ↓
526 :
デフォルトの名無しさん :2006/05/08(月) 15:49:21
else if 文があるならcase文なんていらねーだろ?
PascalというかDelphiの文法は 制御文は貧弱なんだけど それでも唯一強力なのが case なんで、それくれいは許してやって下さい
caseは条件に順序型が使えるからかなり使い勝手いいよ
範囲も使えるし
順序型しか使えないところが貧弱。C# は文字列も使える
case節で文字列リテラルを使うこと自体アレだと思うが
文字列として分岐するなら、ストリームから 正規表現でマッチさせて 最初にマッチしたものから その文字列を取れるというのが期待だと思うけどなあ 中途半端だと、C#で書かれたコードを他のC系に移植する障壁になるだけ
RegCase str in stream of '[0..9]*' : '[A..Z]*' : .... みたいに書けたらなあ
534 :
デフォルトの名無しさん :2006/05/08(月) 16:27:58
正規表現で文字列比較できる言語って、結局、正規表現のライブラリを持っているか いないかの違いだと思う。言語で規定する問題じゃないと思うな。
タイプライブラリってなんぞや? 消してしまっても問題ない? DAOとかACCESSとかデータベース絡みのありそうだけどパーソナル版じゃ使えんのでしょ?
OCXを使うだけなら、普通は消しても問題ない。 タイプライブラリは埋め込まれていて、それを読み出してるだけだから 欲しければまた作れるから タイプライブラリが別に提供されていると困るけど
Personal版でもデータベース使えるよ 直接DAOのAPIを叩けば
ありがとう 全部消そう d3d9.dllとか追加しても駄目だったんでいつも気になってたんだ。 でもコンポーネントとかいろいろ追加したい今日この頃
>>537 む?ほんとですか
それ関係残しとくか
そういえば基本のwindowsAPIのタイプライブラリって見当たらないね?
まぁそれはSDKHELPから書式引っ張ってくれば済むけど・・・・
いまいちタイプライブラリやらコンポーネントやらパッケージやらの区別がよくわからない。
もしかして、消そうとしてるのは タイプライブラリじゃなくて xxx_TLB.pas みたいなファイルじゃないのかな? コンポーネントを既に作成してるなら消してもいいには違いないけど
> いまいちタイプライブラリやらコンポーネントやらパッケージやらの区別がよくわからない。 まず、ヘルプ嫁。はなしはそれからだ。
542 :
デフォルトの名無しさん :2006/05/08(月) 17:15:54
こういうのは、どう? CのCASE文のように使えて、 条件(変数も)は、何でも使える(書ける)。 repeat --- until文を必ず1回のみ実行させて。 write('INPUT J:'); readln(j); repeat {SELECT CASE} {case} if j = 1 then begin writeln('melon'); break; end; {case} if j>1 then writeln('apple'); {case} if j = 3 then begin writeln('Peach'); break; end; {case default} writeln('pink',j-100); until true; {END SELECT}
CreateOleObjectを使ってCOM経由でDAOオブジェクト作ればデータベース扱えるよ Personalでデータベース使えないってのはBDE経由で接続出来ないってこと DAOの実体はdao36.dllってファイルだからそれがあればOK ↓こんな感じ procedure Func1; var objDBEngine, objWorkspace, objDatabase, objRecord: Olevariant; sSQL, sTemp: String; begin objDBEngine := CreateOleObject(DAO.DBEngine.36); try objWorkSpace := objDBEngine.Workspaces[0]; objDatabase := objWorkSpace.OpenDatabase('hoge.mdb', False, False); sSQL := 'SELECT Name FROM Hogehoge'; objRecord := objDatabase.OpenRecordset(sSQL); sTemp := VarToStr(objRecord.Fields['Name'].Value); finally objRecord := Unassinged; objDatabase := Unassigned; objWorkspace:= Unassigned; objDBEngine := Unassigned; end; end;
545 :
デフォルトの名無しさん :2006/05/08(月) 19:21:59
Delphiのbeginにも 行頭派と文末派の宗派ってあるんですか?
好きにすればよし。過去にくさるほど議論された。
547 :
デフォルトの名無しさん :2006/05/08(月) 19:53:21
object Pascalで不思議なのは、objectを宣言するときに、 type aaa=class(bbb) ... end; になるのだけれど、このendはどれと対になっているわけ?
548 :
デフォルトの名無しさん :2006/05/08(月) 19:55:39
Delphiの最高のコンポーネントは、TDBNavigatorだと思うが、VBやら.net系に このコンポーネントが実装されたら、俺はDelphiを捨てるだろうなぁ。
1 object Pascalで不思議なのは、unitを宣言するときに、 unit aaa; interface ... implementation ... end. になるのだけれど、このendはどれと対になっているわけ?
>>547 強いていえば class と対になってるのだと思うよ
class(bbb) の後に セミコロンでなければ end;までというふうになってるんだと思うよ
551 :
デフォルトの名無しさん :2006/05/08(月) 20:20:30
>>550 おかしいのは、end; のインデントが、どれともかみ合わないこと。
C++のように{}が対になっていないのに、どうしてどこまでがclassの
宣言だと分かるの?
type begin
end;
なら話はよく分かるのだが...
552 :
デフォルトの名無しさん :2006/05/08(月) 20:22:33
>>549 end.は特殊なstatementでしょ。
ここで終わりという意味。end;とは意味合いが違うと思うけれど。
553 :
デフォルトの名無しさん :2006/05/08(月) 20:25:35
>>551 結局delphiは出来損ないということだろう。
とても洗練された言語とはいえないじゃろ
case文は最初不自然だと思ったけどもう慣れた
555 :
デフォルトの名無しさん :2006/05/08(月) 20:33:13
適当にend;とかend.ってつけとけば動くんじゃないの?
556 :
デフォルトの名無しさん :2006/05/08(月) 20:44:31
dllウイザードでDLLを作ろうかと思いますが、 DLLの中でFormを表示させるにはどうしたらいいですか? というかこんな初歩的なことを書いてる参考書とかってないですかね? 何処の本屋にいってもDelの本って本当に少なくて・・・。 ネットで検索してもそれらしい本は絶版になってたり・・・OTL だから誰かコード書いてくれませんか library Project2; uses SysUtils, Classes; {$R *.res} begin end.
dllでフォーム?何を言っておるのだね君は
>>556 フォームは、Createしてやれば作成出来るが
どこかでメッセージポンプを回してやらないといけない。
といってDLL側で勝手にスレッド作って独自にメッセージポンプを回していいのかどうか
>>551 インデントを考えると aaa と対になってる事になるね
type
aaa=class;
aaaはクラスです。 という文で
aaa=class(bbb)
...
end;
aaaはbbbを継承するクラスで、メンバーは・・・を持ちます。終わり。
てな感じなんだろうな。
ヘルプの言語ガイドの文法嫁 何と対になっているとかどうでもいい ただどう書くかを覚えとけ
561 :
558 :2006/05/08(月) 21:28:06
とりあえず、 DLLの呼び出し側としてコンソールアプリを作って。 program Project1; {$APPTYPE CONSOLE} uses SysUtils; procedure ShowExec ;external 'Project2.dll' name 'ShowExec' ; begin ShowExec; readln; end. DLLウイザードでプロジェクトをつくり、フォームを1個新規作成して
562 :
558 :2006/05/08(月) 21:29:02
library Project2; uses SysUtils, Classes, Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} procedure ShowExec; begin { こっちでメッセージポンプを作れば普通に動く Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; } Form1:=TForm1.Create(nil); Form1.ShowModal; //<--- これをShowにするなら次のCloseを消してみる Form1.Close; end; exports ShowExec; //<----------- これで外部から呼べるようにする begin end. とやれば、フォームは表示される
563 :
558 :2006/05/08(月) 21:34:44
つまり、ダイアログ的にアプリの動作を止めて動くものはDLl側でも作れるけど メイン側とは独立にフォームを作るなら別スレッドとして作らなければいけない。 でも、だったらDLLにするより EXEにし プロセス間通信でやりとりした方がいろんな面で楽だと思うよ
マウスのプロパティでポインタを規定のボタンにジャンプをチェックしているのですが Delphiで作ったプログラムのDefaultプロパティをTrueにしたボタンにポインタがジャンプしてくれません。 どうして?ジャンプするように出来ます?
> メイン側とは独立にフォームを作るなら別スレッドとして作らなければいけない。 そんなことはないよ。呼び出し側が GUI アプリなら、Show で表示するフォームを つくるのになんの問題もない。メッセージポンプはスレッドに一つあれば十分。
> どうして? フォーカスを得るのはキーボード。マウスは関係なし。
>メイン側とは独立にフォームを作るなら別スレッドとして作らなければいけない。 (笑)
568 :
556 :2006/05/08(月) 22:49:52
>>562 懇切丁寧な回答あり画多雨ございます。
またご指導のほどおねがいします。
569 :
564 :2006/05/08(月) 23:01:23
>>566 いやでもね、うちではインテリポイント使ってるんですけど、規定のボタンに移動するって項目がある訳ですよ。
ポインタを勝手に動かすのはインテリポイントのソフトだとは思いますが
表示されたウィンドウに規定のボタンがあるかどうかインテリポイント(長いので以下インポ)がチェックし、
かつジャンプオプションがONならそこにポインタを移動するんだと思うんです。
つまりDelphiのボタンのDefaultプロパティはWindowsに対して通知すべき何かが抜けているのではないのか?と。
普通の多くのソフトはフォーム表示直後に規定のボタンにちゃんとポインタが移動するので
Delphiには何か抜けている点があり、それをコードを追加する事で直せないのか、ということです。
結局ポインタ移動アプリ次第。 SetWindowsHookEx()で表示を察知すると仮定すると 1. Dialogクラスに DM_GETDEFID を送って調べる 2. 'Button'クラスの BS_DEFPUSHBUTTON を調べる 3. WM_GETDLGCODE の戻り値でボタン属性を調べる あたりが思い浮かぶ
572 :
564 :2006/05/09(火) 00:49:33
>>570 おお、まさしくそれですね。Delphiのウィンドウって普通じゃなかったんですね。
>>571 おっしゃるようなメッセージを捕まえて「デフォルトボタンがあるーよ」って返すんですかね?私には無理ですねw
という事で答えて下さった皆さん、ありがとうございました。
>(長いので以下インポ) 使ってねーじゃんw
574 :
デフォルトの名無しさん :2006/05/09(火) 09:23:11
delphiで、(今使ってるのは6) リリースビルド(VS2005とかみたいに)って出来るのですか? 出来るとしたら、どこをいじれば??
delphi6でVSみたいに簡単には出来ないよ もしやりたいならスクリプトとかコンパイルオプションとかで切り替える。
>>574 デバッグビルドでリリースしても何も困らないお。
578 :
デフォルトの名無しさん :2006/05/09(火) 12:17:24
>>575-577 さんくす
デバッグビルドでも、VSのリリースビルドと同等な処理速度だが、
さらに、何%程度の処理速度の向上とサイズのスリム化が出来るのだろうか?
579 :
デフォルトの名無しさん :2006/05/09(火) 12:19:46
というか、VSがデバックビルドだと、2,3倍も遅くなるのは、 (遅くなるにもほどがある?) なぜなんだろう?
>>578 サイズならDownXとかで・・・ただしそれによる速度への弊害は解らん。
てか、サイズ気にしても意味ないと思うんだけど
>>579 V$はデバッグビルドだとランダムな値でメモリを濁すというやっちゃいけないことをやってる。
>>578 VC++ は
MFCxx.DLLを使わないと、
Delphiで作った実行ファイルよりもサイズでっかいよ。
>>581 ランダムではなく
auto 0xcccccccc
heapBottom 0xfdfdfdfd
Freed 0xdddddddd
notuse0xcdcdcdcd
>>582 そうなの?
自作Delphiアプリがやたらファイルサイズでかいので
公開するのが恥ずかしいって思ってた頃があった。
Delphiで言うところのパッケージファイルをOSが持ってるから VCは実行ファイルを小さくできるだけ
そんなこと言っても、小さくなるのは事実だろ
そんなあなたに .NET
VCL はイベント委譲主体でMFCはクラス継承主体だから、MFCの方がどっちかいうと 要らないもの色々リンクしてしまうんだろうな。
いや、色々リンクは許せるよ。 許せないのはMFCはクラスライブラリでありながら、 巨大なスケルトンコードを吐き出すところ。 クラスライブラリの場合、差分だけ小さく記述でよい筈だろ!
またv.s.か もううんざり
Delphiもランタイム切り離せば小さくなるやん
いや、大きさは問題ない。 それよか、Exeが起動しなかったときのウザさと逝ったら。
その点Delphiは1ファイル完結だから安心だよな
自称PCフリークとかのちょっと知識ある素人さんには EXEの他にDLLが一杯同梱されているとか、 EXEサイズが小さくないと手が込んでいるソフトとみなされないようです。 ドデカイEXEが一個だけ納品だと手抜きすぎナメテンノカ?状態みたいですよ。
そうですか。 珍しい人がいますね。 出合った事はありません。 今度Delphiを教えて上げて下さい、
いっぱいDLLに押し込むのは簡単だわな。
ひょっとして使わないDLLたくさん入れとくだけでもその相手は満足してくれるのかな。w
使わないのがバレるぞ、そんなことやれば。Dependency なんとかでみればすぐ分かる。 ちゃんと使う関数やらなにやらDLLに押し込め。
何もしない関数作って適当に呼んどけばおk
夜分、すみません。 ちょびっとずつ、ポインタの勉強なんか始めた素人ですが、自作のクラスにTBitmapのポインタを返す関数をつけようと考えたんです。 そこでPublicのとこに function getBMPPoint: ^TBitmap; て宣言して Result := @FBitmap; みたいにしようとしたんですが、 [エラー]識別子が必要なところに'^'があります。 となってコンパイルできません。 Bitmapのポインタを返す関数をつくるときはどうしたらいいですか? ^TBitmapの代わりに汎用ポインタであるPointerを返すように書いてみたけどダメですた。 教えてください。夜分すいません・・
>>600 Delphiの場合、classの代入は 実体の複製ではなく参照の複製です。
つまり、Tbitmapをそのまま返せば、ポインタで渡したのと同じなのです
TBitmapをそのまま返せばおk
603 :
600 :2006/05/09(火) 22:57:36
ありがとうございます。 ヘルプ読んでたんですが、Classにすると自動的にポインタになるので・・ っていうようなことが書いてたので、ポインタからポインタ返すのはな・・って思ってたんです。 ありがとうございます。夜分、すみません・・
605 :
604 :2006/05/10(水) 01:29:51
Sub-Categoriesだけど、次のSub-Categoriesは日本語のリンク先があった。 Installation & Registration Programming Database リンク先が英語ばかりのSub-Categoriesが、少なくなかったので書いておくね。
>>604-605 乙です。
googleからの検索で読んでいたから気がつかなかったyo!
もうdelphi7proって売ってないの?
店に在庫があれば買えるかも!
新しいバージョンが出たら古いの手に入れるのは困難だね。 ラオックスとかの量販店にすらないし、屋台みたいなとこで海賊版みたいの売ってる奴らのとこにもない。 ヤフオクとかで出回ってなければ、割れものでもさがすか中国人のコピーでも買うしかないのかな? 今使う予定がなくても、案外、買い置きしとくべきなのかな?
ボーランドに直接問い合わせれば買えるよ 俺は2005が出てる時に7を買った
kakakuで調べても売ってるとこ見つかんないの? 俺は去年の春にSEshopで叩き売られているのを買ったよ。
そういえばDelphi8を買えば7が付いてるよ。 探せばまだまだあるはず。
nyで普通に流れてるYO
615 :
デフォルトの名無しさん :2006/05/10(水) 16:30:03
Delphi2005にIndy10をインスコしたんだけど、Indy9に変更するにはどうすればいいの? インスコ時にはあとからでも変更可能って表示があったけど、糞Helpで検索しても出てこないっす。
プロジェクトのオプションでIndy10のパッケージを削除して Indy9のパッケージをインスコ。 ライブラリぱすを変更すればおしまい。 詳しくはReadMe 嫁。
617 :
デフォルトの名無しさん :2006/05/10(水) 18:24:33
Dmonkeyを使って実行形式のファイルつくるにはどうしたらいいですか?
DMonkey初期化してスクリプトソース食わせて実行するコード書いてビルドするだけ。
619 :
デフォルトの名無しさん :2006/05/10(水) 22:01:48
>>618 どうもありがとう。
ちっとも使い方がわからない初心者なんでつが
DMSコンポーネントをフォームに貼り付けてからどうしたらいいんですか。
もうちょい教えてもらえないですか。
>>619 DMonkeyに同梱されてるデモプロジェクトのソースは読んだ?
ボーランドから買うときは定価じゃなかった?
定価でも欲しい。
Delphiで"ステップ数"はどうやってわかりますか? コンパイル対象の行数とは違うのですか?
DelphiのIDEみたいな移動できるツールバー作るには、 どのコンポーネント使えばいいんでしょうか。 ActionManagerを使った場合は、どうしたらいいんだろうか。 ActionToolBarだと、移動できないし・・・。
>>619 DMS.Compile(文字列)
DMS.Run
で駄目?
Delphi7 Professional WinXP-Pro です。 時間のかかるDBアクセスやSOAP通信を途中でキャンセルさせたくて 通信部分をスレッド化したまではいいのですが 実際キャンセルするにはどうすればいいんでしょう? [メイン] th := 通信スレッド.create while th.通信中 do Application.ProcessMessages; [通信スレッド] procedure 通信スレッド.execute() begin 通信中 := True; 処理結果 := SOAP通信するメソッド(); ←この途中でスレッドを強制終了したい 通信中 := False; end; キャンセラー用のスレッドを作って、 通信スレッドに 通信中 := Trueをセットすることで メイン処理側を先に進めることはできるのですが 裏で動き続けてるのが気持ち悪くて。 いい案があればお願いします。
× 通信スレッドに 通信中 := Trueをセット ○ 通信スレッドに擬似的に 通信中 := False をセット です。すみません。
Excuteメソッド内で止めたいならSuspend
630 :
デフォルトの名無しさん :2006/05/11(木) 15:45:21
Delphi2005でデバッグ中にBPを設定してF8を押していると空白の行や End;などでは止まるのに、肝心のShowMessageやhogehoge.free;の行が赤くならずに、 1〜2行上下の行が赤くなったときにその処理が行われることがあります。 たぶんコピペミスか何かだと思うのですが、どこがおかしいのかが分かる方法がありましたら教えてください。
最適化切ってみれ
632 :
デフォルトの名無しさん :2006/05/11(木) 16:18:58
一次元配列の test: array[0..5]of integer = (0,0,0,0,0,0); のように二次元配列に初期値を与えるにはどうすればいいんでしょうか?
>>631 レスありがとうございます。
何も変化がありませんでした。
>>632 無理
やり方あるかもしれんが俺は知らない
>>634 起動時にforか何かでやるしかないってことですね
ありがとうございました
>>633 じゃあdcuファイル全部消してプロジェクト再構築
hoge: array[0..1, 0..1] of Integer = ((0,0), (0,0));
639 :
デフォルトの名無しさん :2006/05/11(木) 17:22:30
>>636 *.dcuで検索かけてすべて削除、Shift+F9で再構築しましたが駄目でした。
if hoge then
if hoge then
begin
if hoge_boolean then ここから
begin
hoge
end
else
begin
hoge
end;
end;
end
else なぜかここへ飛ぶ
begin
;の打ちもれを徹底チェックしてるのですが、どうしても分からなくて・・・
バカはbeginとendを省略するなよ
>>640 あっ、ごめん。
1行目のIFと2行目のIFの間にBEGINはもちろん入れてます。
失礼。
たしか、デバッグしたいところの処理の前にブレーク置かないといけないんじゃなかったっけ?
オプションのソースを表示のチェックボックスをすべてチェックしたら問題の場所で 改行の文字が緑色のEみたいな文字じゃなくてEnterKeyに刻印してある矢印を 半時計方向に90度回したものに縦線が入ったマークになっています。 これを普通の改行に変えてみたいのですが、 同じ位置や上下の位置で改行しても同じマークが出てしまいます。 他の行からコピーしてきても駄目です。 これってどういう意味の記号でどうしてこんな症状が出てしまうのでしょうか。
時々あるんだよ
>>630 コメントの位置を変えたり、定義の位置を変えたり、してみたら?
例えば
>>639 なら if で 番号 を返す関数内関数定義して
case で実行するようにするとか
>>643 行の終わりに改行マーク付けるようにしたのかな?
それなら見た目に何も書いていなくても、
消し忘れや打ち間違いで空白文字が入ってるのをチェックするのに役たつけど。
>>639 ソースダンプしてみたら? CR/LFで改行されてる?
647 :
デフォルトの名無しさん :2006/05/11(木) 19:37:47
ServerSocketコンポーネントで待ち受けてる時、 複数から接続してきたら、どういう挙動になるんですか? 一度一台と繋がったら、そのポートに2台目が接続してきた時、 どういうことになるのかお伺いしたいのです。
普通に繋がる。
649 :
デフォルトの名無しさん :2006/05/11(木) 20:19:41
エディタの質問が出ていたので便乗して教えて。 Delphi7を使ってるんだけど、改行のあとの空白部分にカーソルが行かないように する方法ってないかな? あと、空白行の改行コードの部分で←カーソルキーを押したらエディタみたいに 上の行の最後に移動して欲しいんだけど、こんな機能って設定できないよね?
>ALL 改行が0d 0aになってないといけないのに、0dのみになっていました。 ありがとうございました。
>>648 じゃあクライアントにsendtextしたら同じ内容が
2台に送られるってこと?
>>652 接続クライアントごとに自分で管理しないと・・・
管理って具体的にはなにをすればいいのですか?
つまりIndex値0が最初につないできたClient、 1がその次につないできたclientってことでおk? あーもうよく分からない
まだDelphiやってる奴なんているのか。 時代はPS3 Linuxでgccだろ。
>>656 もうちょっと頭柔らかくなってから出直せ
異なるユニットに書かれた二つのクラスで、 それぞれがお互いのインスタンスをメンバ変数として持つことは可能ですか? C++では、 //foo.h class bar; class foo { bar m_bar; } // bar.h #include "foo.h" class bar { foo m_foo; } // foo.cpp #include "bar.h" とすればできたはずですが(即興で書いたので間違ってるかもしれませんが)
できない
循環参照になるからブリッジするユニットが必要だな。 (と書いてみたが実際どうするんだろ?片方をforward宣言?)
>時代はPS3 Linuxでgccだろ。 え?出るって?
こんな方法しかないかな…。
unit a; interface uses b; type foo = class fbar: bar; end; implementation ... end.
unit b; interface type bar = class end; implementation uses a; type barimpl = class(bar) ffoo: foo; end; end.
ちなみにbar.createで実はbarimplを、みたいな細工は別途可能。
どうでもいいが
>>659 はm_barかm_fooのどっちかをポインタにでもしないとコンパイルできないんじゃなかろうか
数ヶ月前のインタビューでPS3のHDDにLinux標準搭載を明言してる。 E3でPS3にHDD標準搭載を発表。 くったりじゃなければLinuxプリインストールのBDプレイヤーがなんとたったの62,790円(税込み) おまえらこれがPS3って名前じゃなければ大喜びで買ってただろw
やっぱ同一ユニット内で宣言、実装した方が手っ取り早いかも。
S○NYのGPか? 開発に必要なのそろえたら逆に高いだろw
ファイルが増えても大変だし、 同一ユニットが良いよ。 頻繁に使わないなら、 TObjectで宣言してキャストして使う。
GPって何よ。
Great Programer
Garbage Programmer
別ファイルにするといろんな意味で管理が楽だからね 自分は$Iでインクルードして作ってる。
PS3にカイリックソでも入れるか。
676 :
デフォルトの名無しさん :2006/05/12(金) 06:46:30
Delphi 7で作ったGUIのプログラムってVistaで動きますかね?
ベータで試してみた限りだと6, 7, 2006はフォーム一枚のプログラムすら起動しなかったよ。 VB6.0やVB.NETは普通に動くのにこの現象はとても不思議。 Borlandが互換性向上に対する技術協力を拒んでいるのかな。
そうそう、gccやBASIC/98やCOBOL.NETすら動かなかった。他社製品軒並み全滅。 逆にMSの開発言語だと16ビット版のVB2.0すら動く。 なんなんだろうな。
>>632 FillChar(test,SizeOf(test),0);
あ、寝ぼけてたw
>>679 はあぼーんしといてねと
DelphiはVistaでは動かないのか・・・ VB2005やっているからVistaはそっちでやろうかな。
Vistaが出たら2006を投げ捨てて2007買いかえればいいということですね。
DelアプリがXPで不安定だって書き続けてたブビ厨が板。 ウソを書き始めると歯止めが利かなくなると思うだけど。 つまり半在予備軍。
686 :
682 :2006/05/12(金) 09:45:48
Vistaはネイティブじゃなくて.netが主体になってくるから 遅かれ早かれWin32アプリは動かなくなるだろね DelphiだろうとVCだろうがそれは変わらない MSの口車に乗るのは悔しいけど
つ Delphiドトネト
>>689 なんとかExpertとかいう外部ツールをつかわないとエディタのフリーカーソルは
変更できないよ
693 :
692 :2006/05/12(金) 10:17:28
かぶった orz
みんな教えてくれてありがとうだっぺ。 これで安心して裏の畑で糞にいけるっぺ。
も、もしかして14時間も我慢してたのか?
>>687 ∩___∩ /
| ノ ヽ /
/ > < |/ そんな餌パクッ
| //// ( _●_)/ミ
彡、 l⌒l ノ
/ __ \ \ヽ
. (___) \__)
. O| /
| /\ \
| / ) )
∪ ( \
\,,_)
基本的なことを教えて欲しいんだけど uses hogehoge; A private B public C end D とあるけど、それぞれには何を書くの? Bが内部用、Cが外部からも見えるってのは今まで理解してたんだが、AとDの区別がよく分からんもので。
ヘルプ持ってないの?
>>698 ヘルプで検索しても禿しく意味不明なのばかりヒットするもんで。
A はpublishedだよ。IDE が自動的に永続化してくれる部分。イベントハンドラが 自動で書き込まれる。ユーザがここを使う必要はまずない。 D 単なる関数とか定数宣言やグローバル変数の定義場所。 ヘルプに詳しく書いてあるけど
> ヘルプで検索しても 検索じゃなくて目次からの方が速い。ユニットファイルの構造とか、可視性とか
PCの時間を0.01秒単位で修正する方法って無いですか? 出来るだけ正確にあわせたいのですが、Windows標準のタイムサーバーとこまめに同期しても 動機直後に0.5秒ぐらいずれてることがあるので。
>>702 サーバをmfeed辺りに変えれば良いという話ではないのか?
「特定のアドレスの特定のポートに発信するプログラム」 を特定するプログラムを作りたいのですが、 どのような方法があるでしょうか?
ファイヤーウォールとかパケットモニターを参考にしる
imageコンポーネントに表示させてる画像を左右反転させたり上下逆にしたりできるでしょうか?
できます。
どのようにすればいいのでしょうか?
ScanLineプロパティを使って画像処理すればok
無限ループ突入↓
どのようにすればいいのでしょうか?
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; begin for i:=0 to j do begin j := i+1; showmessage('m9(^Д^)プギャー'); end; end;
スペースで区切られた文字列を分解したいのですが Posでスペースを探して、自分で区切る以外に なにか方法はありますか?
DelimitedText で出来そうだが
721 :
719 :2006/05/13(土) 12:09:18
ありがとうございます。 > DelimitedText で出来そうだが StringList のことでしょうか? SList := TStringList.Create; SList.Add(Text); SList.Delimiter := ' '; としても SList.Count は1のままです。
>>719 p:=PChar(s);
while p^ <>#0 do begin
while p^ = ' ' do inc(p);
SetLength(w,length(s));
n:=1;
while p^ <> ' ' do begin
w[n]:=p^;
inc(p);
inc(n);
end;
SetLength(w,n);
wを使う
end;
723 :
719 :2006/05/13(土) 12:35:28
ありがとうございます。
>>722 Pos より速そうですね。
ふつうにDelimitedTextでできるでしょ
725 :
722 :2006/05/13(土) 13:06:50
よほど巨大な行を読み込む可能性がなければ 速度的な効果はないよ。 ただ、状態遷移型も慣れておいた方がいいとも思う。 そんなに長くないから、テンプレート的に使うクセを付ければいい それと、 SetLength(w,n); は間違い SetLength(w,n-1); だな
ふつうにDelimitedTextでできるでしょ
ちょっとしたユーティリティ関数。速くはないけど。 s := 'Foo Bar Baz'; repeat t := Strip(s, ' '); ShowMessage(t); until s <> ''; function Strip(var s: String; Delimiter: String): String; var idx: Integer; begin idx := AnsiPos(Delimiter, s); if idx = 0 then begin Result := s; s := ''; end else begin Result := Copy(s, 1, idx-1); s := Copy(s, idx+1); end; end;
ダウンロードした画像からアイコンを作って タスクトレイにアイコンを表示しているのですが 元の画像が横長なので、つぶれてしまいます。 この画像の両端は無地なので 切り落とせば多少ましになると思うのですが、どうしたら良いでしょう。
StringReplaceだとすげぇ楽だけど遅いの?
Stringと便利関数使って切り貼りすると大概遅い。 遅いなと思ったらPCharとC言語系の文字列処理関数の出番。
731 :
719 :2006/05/13(土) 14:34:42
勉強になりました。 皆さん、ありがとうございました。
>>728 無地の判定をしなくていいなら
元となる画像から適当な範囲をコピーして
アイコンを作ればよい。
with NewBmp do
begin
Width := 24;
Height := 24;
for y := 0 to 23 do
for x := 0 to 23 do
Canvas.Pixels[x,y] := MotoBmp.Canvas.Pixels[x + 10, y + 5];
end;
>>729 一般的に文字列処理で切り貼りするアルゴリズムは O^2 アルゴリズムで
操作するサイズが2倍になれば4倍の時間がかかる。
パソコンの性能が上がると、速度も速くなるけど処理するデータも大きくなるわけで
それに応じてデータサイズが大きくなるような場合逆に遅くなるわけ
ただし、1行のサイズが80行に限られているような場合は、別にそこまで拘る必要はない
734 :
デフォルトの名無しさん :2006/05/13(土) 21:42:32
Delphi7proでIndyのSMTPコンポを使ってるのですが、 Indyの色々なバージョンを試してたら >[致命的エラー] Main.pas(8): ユニット IdSMTPBase は異なるバージョン IdEMailAddress.TIdEMailAddressItem によりコンパイルされています と言うようなエラーが出てくるようになってしまいました。 Indyのサイトにある4つのバージョンをすべて試したのですがすべて駄目でした。 これを回避する方法かIdEMailAddressとTIdEMailAddressItemのバージョンを確認する方法は 無いでしょうか。 IdEMailAddress.TIdEMailAddressItemは私自身は使ってないのですが、孫引きされてるみたいで、 他のものに入れ替える方法が無いので。
∧,,∧ ミ,,゚Д゚彡 コロコロ ⊂ ∪ミ g,,, (~,,(~,,,ミ@ imageエディタってのがなくなったんですが コンポーネントパレットのアイコンを編集したいので dcrを扱えるソフトがほしいのですが お勧めはありますか?
>>735 お勧めかどうかは分からんが
パートナーDVDに XN Resource Editor が入ってる。
> 1行のサイズが80行に そいつは難しいなぁ。 ごめん。
> これを回避する方法 Indyをアンインストール Delphi7のbplフォルダにあるIndy系のパッケージを全部消して ライブラリぱすにあるゴミを片付けて Indyをインストール。 自分のプロジェクトのdcuを全部消して 再コンパイル。
739 :
デフォルトの名無しさん :2006/05/13(土) 22:47:29
>>738 1 D7プロジェクト-オプションからIndyを削除
2 D7フォルダ内の*.Indy*.*で検索してすべて削除
3 ライブラリパスは見たけどゴミは無し。
4 Indy10.1.5を落としてきてインスコしようとしたら古いバージョンがまだ入ってると警告が出るけど無視してインスコ
5 自分のプロジェクトのDCUすべて消してプロジェクト開いてF9
これだけやったのですが、エラーでした。
AnsiPosで部分文字列の位置を求める場合、返り値の位置が2バイト文字の 2バイト目かどうかチェックする必要はありますか? マルチバイト文字セットをサポートするとあるので、その辺は関数内でやって くれているのでしょうか?
心配無用 よきに計らってくれるよ
どうもです。
>>739 bpl フォルダはMy Document だったかも。
>>743 たびたびありがとうございます。
Cドライブをすべて検索しましたけど、スタートメニューとsystem32に二つファイルがあっただけでした。
∧,,∧ コロコロ
ミ゚Д゚,,彡
σ⊂ ∪ミ
┳┳ (~,,(~,,,ミ@
>>736 レス、紹介ありがとう。
XN Resource Editorを
インストールしてみました。
ランゲージのところにFont指定が文字化けしてますね。
それは仕方ないとしよう。
dcrファイルをSaveAsすることができない
なんていいかげんなつくりなんだ、、、、
で、結果は、アイコン、変わってくれないんだ....
TTrayIconってのがBDS2006で標準のクラス名とかぶっちゃって
TTrayIcoって名前に変更して使おうとしてるんだけど
Taskbar.dcrを編集してもアイコンが反映されないな。
わかんないや、、、、悲しい。
こういう時BDSが一歩、嫌いになる........
>>745 うぅ、なんか変なアプリを紹介してしまったのかも orz
XN Resource Editor はrc ファイルを作れないらしい。
自分でNotepad を使って作らないと駄目とか。
もう少しマシな物を探してみます orz
>>739 > 2 D7フォルダ内の*.Indy*.*で検索してすべて削除
ここが問題なのかも。Idで始まるファイルも多いから。
Lib フォルダに古いdcuが残っているとマズイらしい。
∧,,∧ キニシナイデ ミ,,゚Д゚彡 σ⊂ ∪ミ ┳┳ (~,,(~,,,ミ@ いや、むしろ、BDSの何かの関係かもしれないから あんまりきにしないでください。 今、D6インストールしてみました。 イメージエディタで昔のやり方どおり設定して 新しいコンポーネント作成しても やっぱり、なんかアイコン更新されない、、、、、 ユーザー数少ないと、 問題に出会う人も少なくなって、、、 と、、、、カキコしてから BDS2006を再起動すればアイコンが更新されることがわかった .......BDS........orz...........
Indy のパッケージを自分でコンパイルして dcu をLib フォルダにコピーすると良いらしい。
>>749 > BDS2006を再起動すればアイコンが更新されることがわかった
> .......BDS........orz...........
それってD6でも同じじゃね?
imageコンポーネントを複数横に並べて(左からimage1,image2・・) いずれかがクリックされたときにどれがクリックされたか判定したいのですが、どのようにすればいいのでしょうか?
人様のコードを眺めて勉強中ですが、ふに落ちない点があるので教えてください。 例えば function hogehoge(strhoge: string): string; var P: PChar; str: string; begin Result := ''; ←ここでResultって書いちゃってる。 str := str + hoge; ・ ・ 素人見解ですと、これって、Resultのとこで処理が終わって、このケースでは''(空白?)を返しちゃうんじゃないかって思うんですが、こういう関数をよく見ます。 関数の最初の方の行でResultに代入するワケを教えてくれませんでしょうか?
エスパーな俺が推測するに 753はCやJavaを齧ったことがあり、 そしてResultとreturnを混同しているのであろう
>>754 いや、学生でそんなキャリアないです!
平行してC++もやってるんですけど、returnとは違うんですか?
難しいこと考えずに「関数の途中で無駄だったらexitって記述するだけで済むから」 って理由はダメなの? もちろん「無駄なら空白返す」ってお約束前提で。
>無駄なら空白返す じゃ、「関数の処理ができなかったときに返すべき値を初めにいれておいた」ってことでいいんですか? どのResultを返すかはコンパイラが判断してくれると?
関数は全部走り終わって呼び出し元にResultを返す Resultに代入するだけじゃ処理は終わらんよ
>関数は全部走り終わって なーる。そうだったんですか。 returnとは違うわけだ。 ありがとうございます。
760 :
デフォルトの名無しさん :2006/05/14(日) 07:44:17
Delphi起動時にForm1とUnit1を 起動させないようにするにはどうすればいいの?
なにをしたいの?
プロジェクトから削除
/np
>>762 フォームをプロジェクトから削除したい
つ プロジェクト -> プロジェクトから削除
メインフォームを変えたい
つ プロジェクトオプション -> フォームで変更
起動時に出てくるのがうざい
つ ツール -> オプション -> どこか。デスクトップの保存をOFF
オレはランチャーの引数に/npを設定して起動してる
ランチャー(誤) ショートカット(正)
>>748 >>750 1 Delphiを削除
2 Indyのソースのみ退避
3 Delphiフォルダを削除&SYSTEM32フォルダに残ってたIndyのファイルを削除
4 DelphiをIndy抜きで再インストール。LibパスにIndyソースフォルダを追加
5 Indyのソースを一つのフォルダにまとめてIndyProtocols40.bplを開いてコンパイル
[エラー] IdStreamRandomAccess.pas(23): 未定義の識別子 : 'TIdStream'
[エラー] IdStreamRandomAccess.pas(25): forward または external 宣言された 'TIdStreamRandomAccess.GetPosition' が見つかりません
[エラー] IdStreamRandomAccess.pas(26): forward または external 宣言された 'TIdStreamRandomAccess.GetSize' が見つかりません
[エラー] IdStreamRandomAccess.pas(27): forward または external 宣言された 'TIdStreamRandomAccess.SetSize' が見つかりません
[エラー] IdStreamRandomAccess.pas(28): forward または external 宣言された 'TIdStreamRandomAccess.SetPosition' が見つかりません
[エラー] IdStreamRandomAccess.pas(32): forward または external 宣言された 'TIdStreamRandomAccess.Skip' が見つかりません
[致命的エラー] IndySystem40.dpk(48): 'IdStreamRandomAccess.pas' ユニットはコンパイルできませんでした
となってしまいます。
もちろんIdStream.pasはソースフォルダにありますし、エラーの出たファイルのusesにはIdstreamがあります。
768 :
デフォルトの名無しさん :2006/05/14(日) 10:59:15
delphi6 Personalで勉強を始めましたのですが、 デバッガについてですけどVBのローカルウインド に相当するものはありますか? ブレークポイントを設定して変数に どんな値が入ってるか確認したいのですが。
[V|D|L]
>>768 たぶん
表示 -> デバッグ -> ローカル変数
771 :
デフォルトの名無しさん :2006/05/14(日) 11:11:18
>>769 Lがありませんが、
カスタムインストールか何かをするとあわられるのですか?
> IndyProtocols40.bpl Delphi 4用なんてある?
>>771 じゃあwatchするかマウスカーソルエディタ上の変数に合わせてインスペクトするしかない
Del6Perの機能制限は結構極悪なんだよな。
774 :
デフォルトの名無しさん :2006/05/14(日) 11:33:49
>>773 そうですか有難うございmす。
ということはper盤はVer7とかでもやはり同じですか?
>>772 レジストリの動的パッケージに追加されているとか。
今、コンソールアプリケーションでプログラミングをしているんですが var a, b, c:integer; begin { TODO -oUser -cConsole Main : この下にコードを記述してください } c:=a*b; write('1000になるように2つの数字をかけてください。'); writeln('数字を入力してください'); readln(a); writeln('aに値が代入されました'); writeln('次にその数字にかける数字を入力してください'); readln(b); writeln('bに値が代入されました'); writeln('計算の結果',c,'の値が出ました'); case c of 1000..1000:write('正解です'); 1..999 :write('数字が足りません'); 1001..10000:write('数字が大きいです'); end. 実行すると、case c ofのところが表示できずにプログラムが終了します どこが間違っているか指摘してくれませんか? お願いします
>>777 writeln('計算の結果',c,'の値が出ました');
の後にreadln;を挿入したところ
case c of の前までは表示されるんですが、その後が表示せずに
終わってしまいます。
また一番最後にreadln;を追加してみたところ
[エラー] Project2.dpr(30): 'END' が必要な場所に ファイルの末尾 があります
になってしまいます。
何がおかしいかわからないです
>>777 お礼忘れていました。
レスありがとうございます。
>>776 コンソールアプリで練習する場合も
普通にGUIアプリとして作って
ボタンを一つおいて、ダブルクリック
その最初に AllocConsole; を入れておけば
そのコードを実行する事が出来るよ
>>778 case c of
1000..1000:write('正解です');
1..999 :write('数字が足りません');
1001..10000:write('数字が大きいです');
end;
readln;
end.
>>780 レスありがとうございます。
でもはじめたばかりの私には少し難しくてわかりません。
すいません。
>>781 ありがとうございます。
実行したところ、できましたが
適当な数字を入力してやってみたところ何故か
0になってしまいます。
c:=a*b; のところを+やーに変えたところ
すごい数字になってしまいます。
重ね重ねすみませんが、何がいけないのでしょうか?
>>782 c:=a*b;
の位置を変えたところ、できました。
レスしてくださった皆さんありがとうございます。
>>782 一番最初は Demoフォルダの EathPngあたりを開いて、コードを見ながら
速すぎる動きを遅くする改造からやるといいよ
>>784 これはゲームか何かですか?
すごく早い動きでとてもゲームといえるレベルではないですね。
というか私自身、コンソールアプリケーションでプログラミング
始めたばかりでまったく無知なんですよね。
どこをいじっていいかというのがまったくわからない状況です。
pascalの予約語も6つぐらいしか使えないのでorz
>>776 if DebugHook <> 0 then Readln;
TStringListを継承した自前クラスを作ろうかとおもってるんですが TMyStringList = class(TStringList) ・ ・ public constructor Create; destructor Destroy; override; ・ ・ このconstructorには「override;」をつけなくても大丈夫なんでしょうか?
overrideする必要があるのはメソッド同様、親constructorにvirtual, overrideが付いている場合のみ。 というわけでTStringList継承クラスにつける必要はない。 もし必要あるけどつけ忘れた場合コンパイラが警告してくれるから警告チェックしておけばいい。
>>788 ありがとうございます。そうします。
つけるのはdestructorだけでいいんですね?
>>789 少しはヘルプ読め
下位オブジェクトのクラスで Destroy メソッドを宣言するときには必ず override 指令を追加し,
継承された Destroy メソッドをオーバーライドするメソッドの最後の文として呼び出します。
Destroy メソッドは仮想メソッドなので,継承された動作が正しく実行されるようにするにはそれをオーバーライドします。
791 :
デフォルトの名無しさん :2006/05/14(日) 22:04:28
画像のファイル形式をbmpからwmfに したいのですがどうすればいいでしょうか?
逆だったか。
http://groups.google.co.jp/group/borland.public.delphi.winapi/msg/f5b40c73fb550619?hl=ja& var
bmp: TBitmap;
wmf: TMetaFile;
wmfc: TMetaFileCanvas;
begin
bmp := TBitmap.Create;
bmp.LoadFromFile('c:\copy\kingsx_small.bmp'); // Any test image
wmf := TMetafile.Create;
wmf.MMWidth := 5000;
wmf.MMHeight := 5000;
wmf.Width := bmp.Width;
wmf.Height := bmp.Height;
wmfc := TMetaFileCanvas.Create(wmf, 0);
wmfc.StretchDraw(Rect(0, 0, wmf.Width, wmf.Height), bmp);
wmfc.Free;
bmp.Free;
wmf.SaveToFile('c:\copy\small.wmf');
wmf.Free;
end;
BVから乗り換えた者です。少し質問させてください。 TArrayRec = record num: array[0..2, 0..6]of integer; end; みたいなレコード型があるとして、 var FArrayRec: TArrayRec; で、 FArraRec.Num := ( (1, 2, 3, 4, 5, 6, 7), (1, 2, 3, 4, 5, 6, 7), (1, 2, 3, 4, 5, 6, 7)); としても代入できません。(「.が必要な個所に)があります」というようなエラー) ループで1個ずつなら入るはずですが、一発で代入することは無理なんでしょうか?
無理
797 :
795 :2006/05/15(月) 04:48:58
いろいろ調べてみたんですが、無理みたいですね。 配列の宣言時に入れてしまう方法はあるみたいですが。 ありがとうございます。
constとかで事前に定義しておけば代入出来るけど
799 :
795 :2006/05/15(月) 06:06:04
みたいっすね。ネットでconstに二次元配列を宣言してあるのを見ました。 functionの戻り値で二次元配列を返すクラスを作成しとこうと思ってたんですよ。 ちょっとやり方工夫しなければならないみたいです。
800 :
デフォルトの名無しさん :2006/05/15(月) 07:21:16
デlpヒ6のパーソナルを使い出して気になったのだが、 for i:=1 to 10 do のiは、 デバグ時なんで10からカウントダウンしていくの?
>>800 最適化してるからじゃないですか? iの順番に関係ないようなコードを使ってるんでしょ?
>>799 setarray(arr: array of integer);
setarray([1,2,3]);
というのは可能だから工夫の足しになるかも
803 :
デフォルトの名無しさん :2006/05/15(月) 14:50:50
Delphiを使ったグラフィックスを学べるサイトがあったら教えてください。
中村の里かな 初心者にはやや敷居が高いけど
pdf版買え
>>800 iを使用していないときは、最適化により逆から数える
他のコンパイラでもこういう最適化するのははある。
809 :
デフォルトの名無しさん :2006/05/15(月) 18:08:45
ClientSocketとServerSocketのことだけど、 非同期ソケットエラーは、try except構文で取得できないんですかね? exceptのエラーメッセージじゃなくて、Windowsのメッセージが出てくるので 困ってます。 あと、同じprocedure内で一気にOpenとSendtextを使うと 接続はできますが送信した文字列を認識しません。 接続した後にSleepを入れてもだめなのに、 Buttonとかで後から送信すると認識します。 (でもそのprocedureからButton1.click;としてもうまくいきません) 何か回避方法はないでしょうか? よろしくお願いします。
イベントドリブンの考え方を正面から否定されても困るんですが
>>809 通信が確立してからじゃないとだめだったと思うので
Connected以降でないと送信出来なかった気がする
>>752 OnClickイベントを共通にして、
Tagで判別するのはどうか?
自作のクラスの中でMyRect: TRect;と書き、uses節にWindowsを追加し、コードのなかでMyRect:=Rect(10,10,100,100);としても (未定義の識別子'Rect'と出て、コンパイルできません>< げんいんとしては何がかんがえられますか?
>>816 ヘルプを見たらWindowsでした。ちなみにGraphicsはすでにusesに追加してました><
どうしてコンパイル通らないのかわかりません。
function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect;はClassesで宣言されているから。
>>818 サンクスです!(^^
Classesを追加したら通りました!
820 :
816 :2006/05/16(火) 03:11:32
Classesが勘違いスマソ
821 :
デフォルトの名無しさん :2006/05/16(火) 04:08:08
Double 型が取り得るすべての値(±Infinity, NaN, 0.0 を含む)の範囲から乱数を得たいのですが、 どのようにしたらようでしょうか?
>>821 64bitの乱数ビット列を作ってそれをdoubleとして読みたいという事?
>>812 てことはOnconnectに
処理を書いていけばおk?
connected以降って何?
デルポイ
>>823 そんな単純じゃないと思われ・・・
あるきっかけ(ボタンを押す?)から接続、送信、切断をしたいんでしょ?
だったら、接続完了後、送信(完了後?)、切断って流れになるわけで
まぁ、きっかけが一個しかないのならconnectedに処理を書けばうまく行くかも
>>825 すまん、ClientSocketとServerSocketだった。connected -> Onconnect?で
( ^ω^)・・・
830 :
デフォルトの名無しさん :2006/05/16(火) 17:49:01
Case hoge of 1:begin end; のような条件分岐を文字列でやる方法は無いでしょうか? hoge='abc'などです。 今はIF文で大量に分岐させてるのでソースがとても醜く、困ってます。
hash値に変換とかアホなことやらない限りはない。 あとはRegisterHandler('foo', @HandleFoo); とか個別に処理関数を登録とか。
TStringList と IndexOf() メソッドをつかえば簡単にできるでしょ。
>>814 うまくいきました、ありがとうございました
ポインタの指すアドレスの値を16進数で表示したいのですが、 文字列への変換がわかりません。 procedure TMainForm.ABC(Sender: TObject) Label1.Caption:=XXX(Sender); XXXのところが変換する関数になると思うのですが、 見つけられませんでした。すみませんがお助けください。
Label1.Caption:=IntToHex(DWORD(Sender),8);
だいたい文字列の比較にはいろんな方法がある。 大文字小文字を区別するかしないかとかね。
>>835 ありがとうございます。DWORDだとなぜかうまくいかなかったので
longwordとしたらうまくいきました。
自作したAのアプリで処理がファイルコピーなどの処理が終わったときに、 Bと言う別の自作アプリに処理が終わった信号を方法って無いでしょうか? Handleを使えばできそうなのですが良く分からないもので教えてください。
IPC
841 :
デフォルトの名無しさん :2006/05/17(水) 05:34:41
Delphi2006でデータベースをやろうとしていますが、 お勧めの解説サイトや本はないでしょうか。
Delphiって本ないんだよな…
843 :
デフォルトの名無しさん :2006/05/17(水) 09:19:38
ファイル読み書きで、 BlockWriteで書くやり方と、 ファイルストリームによるやり方があるけど、 これらの使い分けがよくわかりません。
GoogleがDelphiを引き取ってくれる可能性はありますか?
すれ違い
>>844 はいわかいりました。
でもその理由はなんでしょう。
古ーい Pascal からの I/O と、OOP な TStream 派生クラスで、両方でできることなら TStream で済ますのは正解 ってことだ、と思う。
>>848 そうですか。ありごとうごせいます。
オブジェクト指向になれるためにもクラスをつかうようにします。
850 :
デフォルトの名無しさん :2006/05/17(水) 21:37:14
Cloneするメソッドを作りたいのですが、ClassTypeからCreateしちゃって大丈夫なんでしょうか・・・。 ちょっと自信がありません。 procedure THoge.Clone: THoge; begin Result := THoge(ClassType.Create); Result.Assign(Self); end;
851 :
850 :2006/05/17(水) 21:45:48
実験しましたが、THogeで、Createを再定義していると駄目ですね。
852 :
850 :2006/05/17(水) 21:46:21
駄目というか正確には、再定義したCreateが呼ばれないです。
853 :
850 :2006/05/17(水) 21:47:54
いけました! THogeClass = class of THoge; としておいて、 function THoge.Clone: THoge; begin Result := THogeClass(ClassType).Create end; とすれば、再定義したCreateも呼ばれますね
854 :
デフォルトの名無しさん :2006/05/17(水) 21:50:53
>>839 IPCって何ですか?
>>841 Delphi DB&Webプログラミング
おいらはこれを使いました。
でも内容はなんとも言いづらいから立ち読みの上ドゾー
最近VB荒らしが来なくて寂しいね
VB厨からも見捨てられたとか・・
>>854 >Delphi DB&Webプログラミング
どもー。参考にさせてもらいますー
>>850 Result := THoge.Create;
じゃなんで駄目なの?
>>858 あ、いや、サブクラスでもCloneの再定義なしに使いたいと思いまして・・・。
そういうことも書いておくべきでした orz
BDSのドッキングウインドウってどうやって作ってるんだろ・・・ 同じウインドウにドッキングするとタブ化しますよね? これを実現するコンポーネントないすかね? ToolBar2000+TBXがかなりいい感じなんですが、 タブ化できないみたいです・・・ 標準のTDockTabSetはなんか違うみたいですし・・・
あと、BDSのIDEのドッキングされているウインドウって、虫ピンアイコンとかありますよね。 あれも標準だとできないですよね。 コンポーネントないんだろうか・・・
昔から某はIDE作ってる部品は公開してないよな・・・
ユニットテストに興味を持って、どういうものか検索してみた。
ttp://www.hexe19.net/dunit/ で、読んだ限りassertと同じ事をわざわざやってるように見えるんだが。
>つづく…。
の後に、assertでは出来ないすばらしいデバッグ技法が書かれる予定だったはず。
dunitはわけもわからず使いたいので、assertでは不十分な事例とか教えてくれ。
866 :
デフォルトの名無しさん :2006/05/18(木) 16:48:40
ちょっと前にPostmessageを教えてもらったものですけど、これの BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); UINTの部分って数値とか文字列とか何でもいいの? 色々ぐぐってもWM_Closeとかの決まったものばかりなんだけど。 あと受け取りかたはどうすればいいのかもすみませんが、教えてください。
>>864 記事試してみましたら、TDockTabSetって、虫ピン用のコンポーネントなんですね。
UINTに入るのは符号なしの整数のみです。 でも、数字のままではわかりにくいので、 WM_CLOSEなどと数字に名前を付けています。 これが定数というものです。
>>866 VCLのソースがあるならMessage.pasを参照するべき
WM_CLOSE = $0010;
と定義されているから
で、受け取り方だけど 受け取りたい方のフォームにpublicに procedure rcvMyMsg(var Message: TMessage);message WM_USER + 1と定義 実装部はこんな感じ procedure TForm1.ReceiveMyMessage(var Message: TMessage); begin ShowMessage('受信したのさ') end; 送る方はFindWindowで送り先のフォームのハンドルを取得してメッセージ送信 こんな感じ procedure TForm1.Button1Click(Sender: TObject); var hndl: THandle; begin hndl := FindWindow(nil, 'rcv-test'); PostMessage(hndl, WM_USER+1, 0, 0); end;
871 :
デフォルトの名無しさん :2006/05/18(木) 21:12:35
.identcacheって必要なファイルなんですかね? バージョン管理ソフトの無視リストに加えようと思ってるんですが・・・
∧,,∧ ミ,,゚Д゚彡 ミ つ且~~ ミ,,__ ヾ ⊂二二二UU二二⊃ DUnitについてはよーわからんのだが Delphi界は世界が狭すぎてエクストリームプログラミング人口も 激少なので、情報もないので、自信もないが ユニットテストってのはたぶん if A = B then ShowMessage=正しいよ else ShowMessage=まちがっとるよ; の、程度の応用だと思われ。 で、その応用がエクストリームなプログラミングなので 爆発的にプログラムコードの品質が高まるという。 世にも素敵な方法論だったりする。
874 :
デフォルトの名無しさん :2006/05/19(金) 01:15:12
Delphiで、ユニットテストしてる俺がきましたよ。 DUnitじゃないが自作のGUIのユニットテストランナー使ってるけど。 ユニットテストはあくまでテストの手法なので、 assertでできてるんならそれでも別にいいよ。 結局、内部ではTestメソッドから発生させた、例外捕まえてるだけだし。 でも、既存のDUnitとかのフレームワークにあわせた方がやりやすいってだけのことよ。 グイーンと伸びるバーとか見てハァハァできるようになったりするとしめたもの。 あとは、リファクタリングもあわせてできると生産性がアップする。 ユニットテストは慣れると、いいよー。 ちょっとの機能追加でも、バグでても一発でわかるし。 俺は、いまんところ、GUIソフトのユニットテストがやり方わからなくてこまってる。 いい方法ないかね。
875 :
デフォルトの名無しさん :2006/05/19(金) 01:18:23
あ、あとコツだけど、わざとエラーを出させて例外が出なかったらテスト失敗! みたいにエラー処理がうまくいっているかもユニットテストでチェックすると、 よりアプリが強固になる。 ただ、けっこう面倒なんだよね。 たいてい、本体より、テストをかいたunitの方がサイズがでかくなる傾向にある。
> たいてい、本体より、テストをかいたunitの方がサイズがでかくなる傾向にある。 テストユニットのためのテストユニットとか、、無限連鎖しそうだな
DelphiでVBのIIf関数や、Cの?演算子のような if A then begin Hoge := 'あいうえお'; end else begin Hoge := 'アイウエオ' end; 上記のコードを1行でできるようになる関数か演算子ってありませんか?
IfThen
>>878 こんな関数があったのか。
これで無駄にコードの行が増えなくてすみます。ありがとう!
var a,b: Integer; begin a := 10; b := 20; if a = b then ShowMessage('a=b') else ShowMessage('a<>b'); end; 一行で済むんだけど。
マクロみたいなもん。便利とおもうならいいじゃないの
883 :
デフォルトの名無しさん :2006/05/19(金) 16:17:24
注意点としては、C言語の?演算子と違って、両方とも評価されてから、IfThenに渡されることな。 IfThen(True, A(), B()); としたら、A()とB()が両方とも実行される。 副作用をともなう関数の場合、注意する必要あり。 まあ、見りゃわかるが。
884 :
デフォルトの名無しさん :2006/05/19(金) 16:18:42
>>860 JVCLのJvDockingっがそれっぽいかも。
ドッキングしてタブ化もできるし、虫ピンもついてるみたい。
>>881 そういうふうにソース追いかける方法を教えてください
ソースついてるバージョンかってGrepするか定義の検索
( д ) ゚ ゚ perじゃ駄目っすね?
IfThen って書いて、Ctrl押しながらクリックしたらソース出るけどなあ。
>>888 はー、5年前もほとんど同じ議論の山。
186 名前: デフォルトの名無しさん 投稿日: 01/10/11 23:25
そこまでしてDelphiにこだわるのは
はっきり言って怠慢以外の何ものでもない。
C#が良いならC#に移ればよい。
今後Delphiに出来るのはC#の後追いだけ。
これはそうなったな・・・・
Cと比べる事自体がナンセンス
>>887 入信したいならPro版くらい買え。
いろいろできるぞ。
>>888 そいつら余程暇なんだろうな。
自分が糞だと思ったら使わなければいいだけの話なのに。
余程鬱憤が溜まってるか暇か或いはその両方なんだろうな。
他所でやれ
896 :
894 :2006/05/19(金) 19:18:23
勿論情報提供し合うのは良いけどね。 ただ批判するだけのクズに言ってる。
他所でやれ
いつのスレにレスしてんだよw
自前のコントロールをホイール対応にしたいのですが、どうしたらよいでしょうか・・・
DoMouseWheelDownと、DoMouseWheelUpのoverrideでいけました。サンクス。
5年前にレスに興奮してる人がいるようだな・・・
902 :
デフォルトの名無しさん :2006/05/19(金) 21:59:39
配列が等しいかどうかチェックするのに = は使えないみたいですが、 どうしたら良いのでしょうか? for で各要素を比較したりするのでしょうか?
>>904 もし、配列の要素が基本的な型もしくは、packedな構造体なら、CompareMemでいけると思う。
普通の構造体なら、forでいちいち比較かな
packedって何に使うの? ヘルプ読むと「データを圧縮して格納」としか書いてなくて意味わからんちん 圧縮すると速度が低下するらしいけど、そのかわりに何か得るものがあるんだろうか
XP+Delphi6を使ってます。 今、Form1とForm2を表示させて(Form2はForm1からForm2.Show;で表示)Form2のみ private procedure CreateParams(var Params: TCreateParams);override; procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited; Params.WndParent := Application.MainForm.Handle; end; にて最前面表示にする事は出来たのですが、 Form2の背後に他の最前面表示のソフト「aaa」がある場合の時に Form1を選択しアクティブにした場合Form2がこの「aaa」の後ろに隠れてしまいます。 これを回避する術はありますでしょうか?宜しくお願いします。
908 :
907 :2006/05/20(土) 00:00:45
すみません、Form2を最前面表示にする為に以下のコードも使ってます。 procedure TForm2.FormCreate(Sender: TObject); begin SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE); end;
>>906 record A:Byte; B:Integer; end;みたいな場合、普通だとAとBの間に3バイトの空きが入る。32ビットCPUでは4バイトごとに区切って扱う方が高速だから。勿論Aも4バイトの変数だと空きは入らない。
これがpackedだとどんな風にデータを並べても空きが入らない。バイナリファイルのフォーマットに従って要素を並べて一気読みとかできるし、空きのゴミデータを気にしなくていいからCompareMemで比較もできる。
>>909 すげえ
ものすごくよくわかった
thx
>960 たとえば15Byte x 40要素の配列を定義したとすると、 非packedな方は8バイト境界に揃えられるため、実際のメモリ消費量は16x40=640Byteになるが、 packedだと600Byteになる。
912 :
904 :2006/05/20(土) 01:00:49
>>905 ありがとうございました。
>>906-
ついでに、packed も勉強になりました。どうもです。
_________
∧,,∧∩ /
ミ,,゚Д゚彡 < こんばわ。
ミつ旦.ミ \
@ミ ミ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∪''∪
>>874 、いいねー
ユニットテストしている漏まえがきてうれしいです。
> ユニットテストはあくまでテストの手法なので、
> assertでできてるんならそれでも別にいいよ。
そっそっそ。
いやあ、ホント楽しくなくて平行線をたどるだけの議論を
どうして繰り返すかしら、、、、、みなさん。
C#でもDelでもいいからファーストテストや
ユニットテストを学べっつーの。
そrで、漏れにDUnitの使い方を教えるために
猫でもわかるような解説ページ作ってください。>>誰か。
漏れはすでにリファクタリングできない開発
(よく人のコードを引き継ぐとあるよね〜)
は、できない体になってしもた。
> 俺は、いまんところ、GUIソフトのユニットテストがやり方わからなくてこまってる。
> いい方法ないかね。
まあ、それは永遠に近いテーマだが、library部分のテストの場合
サンプルプロジェクトを作っておくってのは大事よね。やっぱり。
>>876 、無限連鎖はしないよ。
くだすれでユニットテストがどうのって
>>913 リファクタリングできるバージョンのDelphiだというなら、
ヘルプをDUnitで検索してみてね。
>>865 よりもわかりやすい。
俺の理解した範囲では、プロジェクトグループにテストプロジェクトを追加し、
本体プロジェクトで使用するユニットをテストプロジェクトでもusesすることで、
関数に外部から値を送って戻り値をassertできるみたいな話だな。
実際はassertじゃなくて、うまくいったかどうかをGUIで表示するんだがね。
たしかに、本体にやたらassertを書かなくても良いし、
リリース版だけassert無効とかしなくて良いので、便利といえば便利かも。
>>915 日本語でおk
なんか英語よりややこしいね
プログラム系の会話って
でも予約語はアルファベットで書かないとよけい分からんべよ
英語で書かれたXPの話だとさらにわからんぞ。
つまりはその意味に沿った日本語がないっちゅうことなのでしょうか
ハッシュ(連想配列)を使うには、どうしたら良いのでしょうか
コードを書く
真面目に質問してるんですけれど……
Delphi 連想配列 でググルと真面目に質問するより早いと思うけど・・・
TStringListのValues使うんだっけ? 文字列以外も代入したくなって 結局俺は自作してしまった・・・。
THashedStringList というのもあるけど、自作が一番使い易いのも確かだね
record配列にしておけばいいやん・・・
>>921 JEDIのJCLにHashMapがある
>>929 それを先に知っていれば、自作せずにすんだのに・・・
VB.NETにも標準であるよ
VCL.NETで使えるね。
>>907 所有されているウィンドウ(Form2)はHWND_TOPMOSTになることを
想定していなかったと思うけど、どうかな?
単にForm1がアクティブになった時は、 Form2 を手前に持ってくれば良いかもね。
935 :
907 :2006/05/21(日) 02:29:47
>>933 レスありがとうございます。
うまく説明出来てるといいんですがもう少し詳しく書いてみると
Form1,Form2どちらも自動作成の対象に入れて
Form1からForm2の呼び出しはForm2.Show;のみ行ってます。
FormStyleプロパティはForm1,Form2どちらもfsNormal
Form2のみ
>>907 >>908 のコードで最前面表示にしてます
>>単にForm1がアクティブになった時は、 Form2 を手前に持ってくれば良いかもね。
Form1のOnActivate 又は Form2のOnDeactivateでForm2を最前面表示にするコードを書くとForm1の操作が出来なくなってしまいます
Form2は最前面に表示したままForm1の操作は出来ない物でしょうか・・・
>>935 外してるような気がするけど、一応書いてみる。
procedure TForm2.FormCreate(Sender: TObject);
begin
form2.ParentWindow:=form1.Handle;
end;
ってやるとform2がbsDialogだとform1の後ろへは行かない。
ただし、form1はform2の前へは行けない。
>>936 ありがとうございます。書き忘れすみません、Form2のBorderStyleはbsNoneに設定しています。
さっそくやってみたのですが、BorderStyle(Form2)がbsNoneの場合だと
Form2がForm1の子コントロール(Form1の中のMemo1みたいな感じに)
になってしまい最前面表示も解除されてしまいました。
書いて下さってる通り、BorderStyleがbsDialogの場合だと上の様な状態にはならないのですが
Form2が他の最前面表示のソフト「aaa」より上に表示されてる状態で
Form1をアクティブ状態にすると、やはりForm2が「aaa」の後ろに隠れてしまいます。
938 :
936 :2006/05/21(日) 03:29:40
よく読み返してみたら、オレが思ってた質問と違った(汗 失敬。
939 :
937 :2006/05/21(日) 03:50:52
いえ、ParentWindow知らなかったので為になりました。
意味不明だけど、Handle が再生成されてない? もしそうなら、 HWND_TOPMOST も再設定する必要があるよ。
確認しました。 Form1がアクティブになると、Form1よりaaaが手前に表示されているから、 Form2もaaaの後ろに表示されるという解釈かな。 でも、Form2がForm1に所有されていなくても変わらないよね。
これかな。 >または最も前面ではないウィンドウの後ろに再配置されると、 >最も前面ではなくなります。このとき、 そのオーナー ウィンドウ、 >およびそのウィンドウが所有するウィンドウもすべて最も前面ではなくなります。 つまり、Form1はaaaより後ろにあるから、Form1が所有するForm2は前面で無くなる。 所有していなければ、Form1がアクティブな状態で Form2 は aaa より前に表示できます。
うーむ上の >の説明は HWND_TOPMOST フラグがクリアされると言うかな…。 Form1がForm2を所有している場合は Form1をアクティブにすると、Form2は必ず他のTopMostウィンドウより後ろに表示されるみたい。 Form1がForm2を所有していない場合は Form2がアクティブな時にForm1をアクティブにすると、aaaがForm2より手前になる。 他のウィンドウがアクティブな時にForm1をアクティブにすると、Form2がaaaより手前になる。
944 :
907 :2006/05/21(日) 07:37:37
沢山のレスありがとうございます
改めて自分の無知さを実感してます。
Form2を所有してると言う部分が良く分からず、これをキーワードに検索してみると
Form2.ParentWindow := GetDesktopWindow();
Form2.Show();
上記のコードを見つけ、実際に組んでみると
(
>>907 のコードは削除し、
>>908 のコードを OnShowの方に移動)
Form2がアクティブ、ノンアクティブに関係なくForm1をアクティブにしても
Form2が「aaa」に隠れる事無く、Form1も問題なく操作出来ました。
ParentWindow(Form2の所有権?)が、鍵だったんですね。
本当にありがとうございました。
945 :
907 :2006/05/21(日) 07:38:12
自動作成の対象:Form1, Form2 //Form1 BorderStyle = bsSizeable FormStyle = fsNormal procedure TForm1.Form2Show; begin Form2.ParentWindow := GetDesktopWindow(); Form2.Show; end; //Form2 BorderStyle = bsNone FormStyle = fsNormal procedure TForm2.FormShow(Sender: TObject); begin SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE); end;
すれ違い
>>945 Form1がForm2を所有したままでやるなら、これで解決するよ。
procedure TForm2.WMActivateApp(var Message: TWMActivateApp);
begin
inherited;
if Message.Active then
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
所有云々は日本語APIヘルプの「ウィンドウの概要」に詳しい。
949 :
デフォルトの名無しさん :2006/05/22(月) 17:21:09
TClientSocketとTServerSocketでソケット通信を行っており、ClientTypeはstNonBlockingなのにサーバーが落ちているときにソケットエラーを起こしてくれません。 SendTextの戻り値も正常(送信バイト数)で、データが浮いてしまうのですが原因としてなにが考えられますか?
950 :
デフォルトの名無しさん :2006/05/22(月) 20:53:19
Delphi2006で、演算子オーバーロードをやりたいんですが、 ヘルプに記述が見当たりません。 やり方を解説したサイトとかってないですか?
Add という名前と + という演算子の関係づけがわからんな、その例見ても。
> ヘルプに記述が見当たりません。 ひどいね
954 :
デフォルトの名無しさん :2006/05/22(月) 21:00:50
>>951 ありがとう。みました。
C:\Program Files\Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\ComplexNumbers\
にサンプルがありました。
でも、ヘルプには、全然ないのね。
955 :
デフォルトの名無しさん :2006/05/22(月) 21:05:27
ComplexNumbersのサンプル面白ですね。 strict privateとか、staticとか新機能使いまくり。 staticは、ヘルプによると静的クラスメソッドだそうですが、クラスメソッドとどう違うんだろ
ヘルプに説明ないのか?
つ 静的クラスメソッド
TMemoの最後の部分にスクロールバーを持ってくるにはどうしたらよいのでしょうか?
SendMessage(Memo1.handle, WM_VSCROLL, SB_BOTTOM, 0);
Memo1.PerForm(EM_SCROLLCARET, SB_BOTTOM, 0); でどうよ
> クラスメソッドとどう違うんだろ 通常のクラスメソッドとは異なり,静的クラスメソッドには Self パラメータがまったくありません。 また,インスタンスメンバーにもアクセスできません。 また,クラスメソッドとは異なり,静的クラスメソッドは,virtual として宣言できません。 クラスプロパティのアクセッサは,静的クラスとして宣言する必要がある
>>960 ヘルプより
EM_SCROLLCARET
wParam = 0 ; // not used now; reserved for future use; must be zero
lParam = 0 ; // not used now; reserved for future use; must be zero
SB_BOTTOM はなんで?
そもそも末尾にキャレットあるとはかぎらんし
>>961 なるほどー
つまり、クラスメンバ(class var)用なのか?
自己流でdelphiをいじっているプログラマです。 複数のアプリケーションを立ち上げている状態で、タイマーで順次特定のボタンやリストボックスを 押下する機能を作りたいと思っています。 この場合、 アプリケーションのウインドウをアクティブにする ↓ マウスカーソルをボタンに移動 ↓ クリックという手順で行うのでしょうか? ヘルプや検索でタイマーは何とか実装することが出来ましたがここで躓いています。 参考になるソース等教えてもらえないでしょうか?
APIのSleepを使うとフォームが固まってしまいます。 フォームを固まらせずに一定時間待機するにはどうすれば良いでしょうか? 何か良いAPIはありますか? #タイマーコンポやスレッドを使うのは最終手段としたいです。
>>967 スレッドを使わずにかー。
指定時間まで、ループ回して、
ループ内で、
Sleep(1);
Application.ProcessMessages;
って手もあるが。
何をどれ位待つかにもよって、最適な手段が変わる。 もっと具体的に処理を示せ。 Application.ProcessMessageという物もあるが、 これは時間のかかる処理をしている間にフォームを固まらせないための処理で、 一定時間待つという用途にはあまり向いてない(予期しない挙動する可能性が増える)
>>966 > ボタンやリストボックスを押下する機能を作りたいと思っています。
別にアクティブにする必要はない。
1)ウィンドウハンドルを取得
2)動作させたいメッセージを送る。
これだけ。でも 1)が一番難しい。
>>968 なるほど!ありがとうございます。
>>969 すいません。具体的にはクライアント/サーバ アプリを作成中で、
クライアントからサーバに連続でデータを取りにいく際、接続開始を
一定時間(200ms程度)待機する際に使いたいと思っています。
973 :
966 :2006/05/23(火) 00:06:10
>>970 ,971
早速のお答え有難うございます。
今日は遅いので明日拝見してみますね。
procedure SleepProcessMessages(Milliseconds: Cardinal); var StartTime, NowTime: Cardinal; begin StartTime := GetTickCount; while true do begin NowTime := GetTickCount; if Milliseconds <= (NowTime - StartTime) then Break; Application.ProcessMessages; end; end; ただし、連続で呼び出すと挙動がおかしくなる。 ほかにあったら俺にも教えてくれ。
>972 それなら悪いこと言わん。スレッドの使い方覚えた方が良い。後々簡単だから。
ネットワークで待つ場合、スレッド必須だとおも。 スレッド覚えといたほうがいいよ・・・。
977 :
967 :2006/05/23(火) 01:40:35
皆さん助言ありがとうございます。 今回はスレッドを使ってみようと思います。
200msって固まるって感覚じゃぁないと思うけど・・・ まぁ、長くするかも知れないのなら漏れもスレッド勧める
979 :
デフォルトの名無しさん :2006/05/23(火) 11:58:17
TLogFont.lfWeightに対応するプロパティは何でしょうか? TCanvas、TFont、TPen一通り探しましたがそれらしいものはなかったです。
TFont.Style の fsBold 。 細かい設定はできない。
981 :
デフォルトの名無しさん :2006/05/23(火) 13:24:49
他のアプリを監視して応答が無くなったら強制終了させるアプリを作りたいのですが、 終了ボタンを押しても終了しないアプリを強制終了させる方法がありましたら教えてください。 postmessageのWM_Closeだけでは無理でした。
WM_TERMINATE
TIdHTTP.ResponseCodeに対する処理って皆さんはどの程度されていますか? ちなみに私は下に書いてるのみです。 200:; //正常処理 403:; //Forbidden 404:; //NotFound 500:; //InternalServerError 503:; //ServiceUnavailable
実行中アプリのフルパスからトップレベルウィンドウのハンドルを得るにはどうすればいいでしょうか?
988 :
985 :2006/05/23(火) 17:03:59
987は私ではないですよ。 んで、日本語じゃないらしいのでもうちっと詳しく書くと テキストファイルにアプリのパスをずらずらっと書いてだ そやつらにWM_CLOSEを送って終了させたい訳だ。 んでWM_CLOSEをPostMessageする為にはウィンドウハンドルがいると。 あらかじめクラス名とかを調べておくのは面倒なのでフルパスからなんとかトップレベルウィンドウのハンドルが得られないかと。 EnumWindowsとかやってみたんだがどれがトップレベルウィンドウかコードから判別する方法が知りたい訳だ。 パスが一致する物全てにWM_CLOSE送ってもいいんだが、かっちょ悪いっしょ?
テキストファイルにずらずらっと書いたアプリを CreateProccess使って自前で起動したのなら プロセスIDからウィンドウハンドル取得が出来る そうでないなら俺もやり方知らんから 知ってる人いたら教えて欲しい
CreateToolhelp32Snapshot は使えないかな
だいいち、一つのフルパスから複数起動されている場合だってあるだろうし。
>あらかじめクラス名とかを調べておくのは面倒なので こっちの方がずっと簡単だわな。FindWindow() つかえるから。
どうでもいいが、他のアプリを勝手にKILLするって・・・・作成罪が成立したら気を付けろよ
どうせ、まともなアプリじゃないんだろなぁ・・
埋め995
Cardinal や Int64 を IntToStr みたいに文字列にしたいのですが、 どうしたら良いのでしょうか?
intToStr は複数定義されて overloadされてるから、心配ない Caption:=IntToStr(Cardinal(-1)); Caption:=IntToStr(-1); は違う結果になる
ヘルプより function IntToStr(Value: Integer): string; overload; function IntToStr(Value: Int64): string; overload; つかえるんじゃないの?
999 :
デフォルトの名無しさん :2006/05/23(火) 19:01:58
すいません上で書いた者ですが、サーバーが繋がっていない時にSocket.SendTextで例外が発生しないのは仕様なんでしょうか?D5です。
1000だとかわいくて素直な彼女が出来る
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。