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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その22
http://pc5.2ch.net/test/read.cgi/tech/1107332482/

<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
2デフォルトの名無しさん:05/03/11 01:09:51
3デフォルトの名無しさん:05/03/11 01:12:12
4デフォルトの名無しさん:05/03/11 01:51:27
おつ
5デフォルトの名無しさん:05/03/11 03:02:37
6デフォルトの名無しさん:05/03/11 04:53:38
begin
7デフォルトの名無しさん:05/03/11 06:21:54
end
8デフォルトの名無しさん:05/03/11 11:22:07
9デフォルトの名無しさん:05/03/11 12:23:16
キタ━━━━(゚∀゚)━━━━ッ!! 
「Delphiリファレンスガイド 6&7対応」
10デフォルトの名無しさん:05/03/12 17:10:47
任意のフォルダに新規テキストファイルを作るにはどうしたらいいんですか?
11デフォルトの名無しさん:05/03/12 18:25:12
var F: Text;
begin
AssignFile(F, "C:\Hoge\Huge.txt");
Rewrite(F);
Write(F, "テキスト");
CloseFile(F);
end;

もしくは、TStringList.SaveToFile とか TFileStream を使う。
12デフォルトの名無しさん:05/03/12 18:25:33
任意のフォルダに新規テキストファイルをセーブする
1311:05/03/12 18:26:18
あー、さっきまでC書いてたから間違えた…
"" → '' で。
14デフォルトの名無しさん:05/03/12 20:47:47
>>11-12
できました。ありがとうございました。
15デフォルトの名無しさん:05/03/12 23:36:16
Delphiで、日本語文字列に対し正規表現を使うには
どういう方法があるのでしょうか・・・
お願いいたします。
16デフォルトの名無しさん:05/03/12 23:41:38
http://onigiri.s3.xrea.com:8080/delphi/ を一通り読むとタメになるよ。
俺はActiveXコンポを使ってる
1715:05/03/13 00:04:07
>16
ありがとうございます。ポータルからの検索しかしておらず、見逃していました。すみません。
18デフォルトの名無しさん:05/03/13 01:44:09
パソ歴一週間の超初心者です。EXCELでA1÷A2をA3に表示したいのですが分かりません
誰か救済してください。
19デフォルトの名無しさん:05/03/13 01:58:19
また"超初心者"の文字だけ見た来訪者だな!
ActiveXの質問ではあるまい。
20デフォルトの名無しさん:05/03/13 02:22:16
>>18
EXCELが何を意味するか分かりませんが、
A1,A2,A3がTEditとすると、以下のようにやればできます。

if StrToInt(A2.Text) <> 0 then
 A3.Text := IntToStr(StrToInt(A1.Text) div StrToInt(A2.Text));
21デフォルトの名無しさん:05/03/13 02:25:54
>>20
Microsoft Excel でしょ。とネタにマジレス。

>>19
A3 に =A1/A2 と書く。とやっぱりマジレス。
22デフォルトの名無しさん:05/03/13 04:43:34
>>21 ありがとうございます。
Microsoft Excelを詳しく教えてくれる板どこにありますか?
A3の数値を小数点以下切り捨てにして、かつ最大数を1410までにしたいんですが・・・
本当にすいませんでした。
23デフォルトの名無しさん:05/03/13 04:58:59
24デフォルトの名無しさん:05/03/13 05:16:04
>>23 ありがとうです。あなたたちみんな神です。
25デフォルトの名無しさん:05/03/13 06:40:14
.
26デフォルトの名無しさん:05/03/13 06:49:16
OpenJaneやGikoNaviのレスエディタのコンポは同じなんでしょうか?
右クリックメニューがまるで同じなんですけど。
27デフォルトの名無しさん:05/03/13 11:08:22
メモ帳と同じ
28デフォルトの名無しさん:05/03/13 12:24:17
なんかこのスレ、ノートンが反応するんだけど...
29デフォルトの名無しさん:05/03/13 13:55:14
>28
どうも>>25のメール欄がUnix.Penguinとみなされるみたい
遅ればせながら>>1乙です.

>>19
次スレからは>>1

「このスレはボーランド社の『Delphi(デルファイ)』の質問スレです」

などと明確に書いた方が良さそうですね.
PCの初心者さんはおそらくせっぱ詰まった状態でいらしてくると思いますので,
「Delphiとはなんなのか」ということまで考える余裕もないのでしょう.

>>26
どちらも使っていないのでわかりませんが
Windows標準のポップアップメニューかもしれません.
フォームにエディットコンポを貼り付けただけのものを実行してみて,
このエディットコンポを右クリックしたときに出てくるポップアップメニューがそれらと同じなら
標準のポップアップメニューだと思われます.

>>28-29
VBSのラブレターウィルスのコード貼り付けと並ぶ,
ノートン先生が誤反応させる嫌がらせ行為です.

IEなどでご覧の場合は… http://info.2ch.net/wiki/pukiwiki.php?%A5%CE%A1%BC%A5%C8%A5%F3%C6%FE%A4%EC%A4%BF%A4%E9%A3%B2ch%A4%CB%BD%F1%A4%AD%A4%B3%A4%E1%A4%CA%A4%A4%BF%CD%A4%D8#faq08
Open Janeなどの専用ブラウザをお使いの場合は… http://info.2ch.net/wiki/pukiwiki.php?%A5%CE%A1%BC%A5%C8%A5%F3%C6%FE%A4%EC%A4%BF%A4%E9%A3%B2ch%A4%CB%BD%F1%A4%AD%A4%B3%A4%E1%A4%CA%A4%A4%BF%CD%A4%D8#faq12
後者の場合はログファイルが削除されてしまうので要注意.
31デフォルトの名無しさん:05/03/13 18:11:09
>>30
> このエディットコンポを右クリックしたときに出てくるポップアップメニューがそれらと同じなら
> 標準のポップアップメニューだと思われます.
 そのようです。で、TMemo(というよりその上位のTCustomEdit)も右クリックメニ
ューでIMEのオン・オフと再変換ができるのですがTCustomEditのソース(StdCtrls)
をみてもそれらを実現しているコードが見あたりません。StdCtrls.pasはImm.pasを
usesさえしていません。これはどういうことなんでしょ?
32デフォルトの名無しさん:05/03/13 18:38:39
>>30
> >>28-29
> VBSのラブレターウィルスのコード貼り付けと並ぶ,
> ノートン先生が誤反応させる嫌がらせ行為です.
削除依頼出してきます。
33デフォルトの名無しさん:05/03/13 18:53:55
>>31
コンポーネントではなく Wondows の EDIT コントロールのレベルで実装されている。
34デフォルトの名無しさん:05/03/13 19:13:32
Wondows
3533:05/03/13 19:18:50
orz
36デフォルトの名無しさん:05/03/13 20:26:19
みなさま、有難う御座います。
37デフォルトの名無しさん:05/03/13 23:27:00
恐縮ですが、質問です。
環境は、デルファイ6+WIN2k(SP4)です。
デスクトップの向かって右端に居座るタイプのランチャーを自作しています。
他のアプリケーションのウィンドウを最大化したときにランチャーに覆い被さらないようにしたのですが、どこを調べたらいいのかわかりません。
(タスクバーで「自動的に隠さない」+「常に手前に表示」にしたときのようにしたいのです)
ウインドウズシステムにデスクトップの幅を誤認させれば何とかなりなりそうだと考え、レジストリを調べましたが、それらしい項目は見つかりませんでした。
自宅に「Delphi Win32 APIリファレンス」という本があったので調べましたが、必要な情報はありませんでした。
Tscreen.widthは、読み出し専用なので、APIをつかわなければならないと思うのですが、setscreenやsetdesktopで検索しても該当の情報は出てきませんでした。
直接の実装方法でなくても、どのAPIを使えばいいかだけでも教えていただきたいと思います。
よろしくお願いします。
38デフォルトの名無しさん:05/03/13 23:40:31
AppBar アプリにする
39デフォルトの名無しさん:05/03/14 00:31:56
>>前スレ1000
利用者がクラッカーでなくても、コマンドラインさえクラッカーが流せば誰でも使えるじゃまいか
40デフォルトの名無しさん:05/03/14 00:44:51
クラッカーはクラックしたアプリを流せばやはりだれでも使えるんじゃないの?

ところで、デバッガを使ってどうやって「秘密のパラメータ」を知ることができるの
かを教えて
41デフォルトの名無しさん:05/03/14 00:50:35
怪しいexeを使うよりはコマンドラインスイッチ指定するほうが明らかに利用する奴が多いだろう…てか
誰もそこまで考えてねーだろな。フサギコも二重起動防止を回避できる一つの案としてああいうコードにしてるだけだろうし。

>>40
デバッガ使ったことないんか。APIでブレークすれば引数なんて全部丸見えだ。
42デフォルトの名無しさん:05/03/14 00:54:57
> APIでブレークすれば引数なんて全部丸見えだ。

単体のデバッガって使ったことないです。そうなんですか。ありがとう。

43デフォルトの名無しさん:05/03/14 01:01:08
デバッガ使わなくても、詳細な情報を取得できるツールはあるよ
44デフォルトの名無しさん:05/03/14 01:08:22
> デバッガ使わなくても、詳細な情報を取得できるツールはあるよ

うひゃ、そうなんだ。実は、ある言語の勉強のために専用 IDE RAD を使わないで
アプリをつくってるんだけど、コンパイラのパラメータの説明はあるんだけど、
理解できないんです。で、実際に IDE RAD を使った場合、コンパイラにどんな
パラメータを送っているのかを知りたいと思っていました。

Delphi の場合、IDE で CTRL+F9 でコンパイルしたとき、実際に dcc32.exe
にどんなパラメータを設定しているのかを簡単に見るには、どうした
らいいか教えてください。お願いします。
45デフォルトの名無しさん:05/03/14 01:23:25
> 二重起動防止を回避できる一つの案

二重起動防止のためにミューテックスを使っている場合は、CloseHandle() して
ミューテックスを破棄してから、自分を起動すると、パラメータを渡さなくても
いいよ。
46デフォルトの名無しさん:05/03/14 01:58:28
IDEでコンパイルした場合、dcc32.exeは使わないのでは?
47デフォルトの名無しさん:05/03/14 02:09:03
えっ、そうなの? IDE が dcc32.exe でコンパイルしてるんだと思ってた。
じゃなんでコンパイルしてるの? delphi32.exe はコンパイラを持ってない
と思うけど、持ってるの、なかに?
48デフォルトの名無しさん:05/03/14 02:28:02
dcc32.exeを削除してIDEでコンパイルしてみ。
49デフォルトの名無しさん:05/03/14 02:30:18
dcc??.dllってのがあると思う。
50ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/14 04:45:06
Batが万能とかいうつもりはないが、

> だって自分自身なんだから、適当なコマンドラインパラメータを渡せば
> 二重起動禁止ロジックを迂回できるようにすることができるでしょ? なぜ、バッチ?
> そうですか? 起動パラメータを使えば起動されるとき二重起動チェックをするかどうか、
> とか、任意秒のSleep()をすることも簡単に設定できますけどね。

iniにしてもregにしても、設定を終了時書いて起動時読むような
オブジェクトの永続化(って最近は言うかな?)コードともかぶらなくてすむ。

それに、秘密パラメータやCloseHandleで
二重起動防止解除してたらそれはそれで
起動時の処理コードやデバッグが面倒じゃなくてか?
51デフォルトの名無しさん:05/03/14 10:22:51
>>48-49

さんくす。Del6per だと dcc60.dll っ手言うのがたしかにある。知らなかった。
52デフォルトの名無しさん:05/03/14 13:38:42
今日トライアルをダウンロードしたばかりの
超初心者なのでお手柔らかにお願いします。
IEを扱うコンソールアプリを作りたいのです。

delphi7で新規作成でその他、
コンソールアプリケーションをえらんで
program IECALL;
{$APPTYPE CONSOLE}
uses
SysUtils;
var objIE:variant;
begin
objIE:=CreateOleObject('InternetExplorer.Application');
objIE.Quit;
Writeln('IE called!');
end.
と書いても[エラー]未定義の識別子 : 'CreateOleObject'って
出てしまいます。
53デフォルトの名無しさん:05/03/14 13:41:31
>>52
っ[ VCLリファレンス ]
54デフォルトの名無しさん:05/03/14 14:39:26
>>52
uses節にComObjを追加
必要なユニットをusesしないと起こる
55デフォルトの名無しさん:05/03/14 15:21:23
>>53-54
アドバイスありがとうございます。
VCLリファレンス。。
そうですね。
これが読めないとですね。。
uses
SysUtils,
ComObj;
としてみましたら上記エラーは出なくなりました!
が、次はEOleSysErrorが出ました。
ここで、VCLリファレンスですね。。
56デフォルトの名無しさん:05/03/14 15:39:05
EOleSysErrorとかEConvertErrorとか
EなんたらっていうのはDelphiが出す例外

>>52のソースが何をしたいか理解できないが
兎に角何かおかしな処理をしてるのだろう
57デフォルトの名無しさん:05/03/14 15:48:20
>>56
ソースは呼び出して閉じてるだけですが
成功すれば、.Navigateでurlを指定して
.document.body.innerHTMLでソースを
取得したいんです。
58デフォルトの名無しさん:05/03/14 15:56:27
>>52のソース打ち込んでもIEが起動しない・・
objIEがUnassignedじゃないんだろうか

if objIE = unassigned then
ShowMessage('バリアント空')
59デフォルトの名無しさん:05/03/14 16:02:32
TWebBrowserでも使ったほうがいいんじゃ無いだろうか・・・
60デフォルトの名無しさん:05/03/14 16:09:49
uses
  ComObj, ActiveX;
var
  objIE: Variant;
begin
  CoInitialize(nil);
  objIE := CreateOleObject('InternetExplorer.Application');
  objIE.Visible := True;
  objIE.Navigate('http://www.2ch.net');
  CoUninitialize;
end.
61デフォルトの名無しさん:05/03/14 16:26:11
>>60
ありがとうです。処理できました!
いやーなんとなくわかってきましたよ。
ShowMessageで未定義の識別子エラーがでれば
ヘルプでShowMessageを検索してユニットが
Dialogsであればuses節に指定するんですね。
基本もいいとこですが(笑)
トライアル期間はあと30日なんでがんばります!
62デフォルトの名無しさん:05/03/14 17:47:50
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
63デフォルトの名無しさん:05/03/14 17:53:49
>トライアル期間はあと30日なんでがんばります!
Delphi6 Personalで十分じゃないか?
64デフォルトの名無しさん:05/03/14 19:00:42
>Delphi6 Personalで十分じゃないか?
あ!そんなのあったんですねー。
もちろん商用じゃないし。。
インストールしなおします。

で、>>60さんのをソースをそのまま
procedure化しました。
メイン関数内で呼び出しに成功しましたが
呼び出し行以降が処理されずに
コンソールごと終了してしまいます。
CoUninitialize;をメインに書くと
次行以降も実行されますが、最後に
EAccessViolation例外エラーがでます。
CoUninitializeをコメントアウトすると
滞りなく動くのですがダメですよね?
65デフォルトの名無しさん:05/03/14 19:55:31
>>64
initialization 節で CoInitialize
finalization 節で CoUninitialize
じゃだめなん?
66デフォルトの名無しさん:05/03/14 20:16:55
ComObjをusesすれば自動的に初期/終了ルーチンが呼ばれるようになる
6737:05/03/14 20:56:51
>>38
回答に感謝。さっそく調べてみます。
68デフォルトの名無しさん:05/03/14 22:05:33
TMediaPlayerなんですが、ビデオCDの画像ファイルの拡張子がdatですと
エラーします。拡張子をwmvとかmp2にファイル名を書きかえるとちゃんと
再生できるのですが、CDの動画はおおよそ拡張子がdatになっていますから
困ってます(実用にならない)。皆さんはどの様にされているのでしょう?
MCI_sendcommandを使えなんて言わないで下さいね。
69デフォルトの名無しさん:05/03/14 22:49:54
MCI_sendcommandを使え
7068:05/03/14 23:32:18
>>69
語るに落ちたな69。mciSendCommandじゃ。愚か者め。だいたい
お前のような出来の悪いのが・・・やめておきます。皆さん
失礼しました。
この件は解決しているようなのですが何方かご存知な方は
いらしゃらないでしょうか?
71デフォルトの名無しさん:05/03/15 00:00:45


72デフォルトの名無しさん:05/03/15 02:53:06
>>70 「語るに落ちた」の使い方が変
73デフォルトの名無しさん:05/03/15 09:24:14
むしろ >>70 が 語るに落ちてますから。 ぷぷ
74デフォルトの名無しさん:05/03/15 09:48:01
ありがちですよ。自分もつい最近まで誤用してました。

語るに落・ちる
〔「問うに落ちず語るに落ちる」の略〕何気なく話しているうちに、
うっかり本当のことを言ってしまう。
75デフォルトの名無しさん:05/03/15 11:25:29
HTTPダウンロードをするクラスはどこかに落ちてませんか?
76デフォルトの名無しさん:05/03/15 11:42:28
>>75
TIdHTTP
77デフォルトの名無しさん:05/03/15 11:48:22
>>65
>initialization 節で CoInitialize
>finalization 節で CoUninitialize
すみません。具体的にどの位置に指定するのでしょうか?

78デフォルトの名無しさん:05/03/15 11:55:57
>>77
> すみません。具体的にどの位置に指定するのでしょうか?

だからInitializationとFinalizationの位置だって!
79デフォルトの名無しさん:05/03/15 12:02:18
InitializationとFinalizationを置く位置の質問でないか?

■ コンソールアプリケーションでInitializatonは使用できますか?
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200311_03110042.html
80デフォルトの名無しさん:05/03/15 12:04:46
ヘルプより

ユニットの構造と構文

unit Unit1;

interface

uses { ここにユニットを指定する }

{ インターフェース部を記述する }

implementation

uses { ここにユニットを指定する }

{ 実現部を記述する }

initialization
{ 初期化部を記述する }

finalization
{ 終了処理部を記述する }

end.
81デフォルトの名無しさん:05/03/15 13:38:56
ファイルを先頭から100バイト読んで確保したメモリに格納したいのですが、
どこが間違ってるかわからないので教えてください

var
 DataFile: file;
 AmtTransferred:Integer;
 Data: Pointer;
begin
 GetMem(Data,100);

 AssignFile(DataFile, 'c:\test.dat');
 Reset(DataFile, 1);
 BlockRead(DataFile, Data, 100);
 CloseFile(DataFile);

 Dispose(Data);
end;
82デフォルトの名無しさん:05/03/15 13:45:27
procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
の var Buf;に注意
83デフォルトの名無しさん:05/03/15 13:48:58
BlockRead(DataFile, Data^, 100);
FreeMem(Data);
84デフォルトの名無しさん:05/03/15 13:54:18
ありがとうございます。うまくいきました!
85デフォルトの名無しさん:05/03/15 13:55:36
>>81
さらに、

GetMem ⇔ FreeMem
New ⇔ Dispose

という対応関係もあるから、使い終わったメモリの解放は FreeMem(Data); にするといいでしょう。
86デフォルトの名無しさん:05/03/15 13:59:15
>>78-80
ありがとうございました。
79さんの言うとおりの症状&意味でした。
わかりづらくてすみませんでした。
Unit1を作成してUses節にAxtiveXを指定し、
initialization 節で CoInitialize
finalization 節で CoUninitialize
を指定しました。

もとのプロジェクトのuses節に
Unit1 in 'Unit1.pas'と指定すれば
できました!

87デフォルトの名無しさん:05/03/15 14:01:44
 ぱいチンコびろーん
   ∩___∩     
   | ノ      ヽ/⌒) 
  /⌒) (゚)   (゚) | .|  
 / /   ( _●_)  ミ/
.(  ヽ  |∪|  /
 \    ヽノ /   
  /      /  
 |   _つ  /    
 |  /UJ\ \       
 | /     )  )       
 ∪     (  \    
        \_)
88デフォルトの名無しさん:05/03/15 14:31:39
ttp://forum.nifty.com/fdelphi/faq/00049.htm

>上述した5つの方法を、列挙型の変数で分岐させて実行する手続きを作ってみます。

なんでわざわざこんな複雑なコードにするんだろう。
自慢なら他でやれと言いたい。 シンプルなコードのほうがありがたいんだよヴォケ。
89ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/15 14:53:49
別に複雑じゃないが?
共通処理があるのに5関数作るのがヤだったんでしょ。

必要ならシンプルなコードを自分で抽出して
公開して自慢して、他の人からありがたがられるのが
よいでしょう。

...他のスレで書き込めよといいたい。
90デフォルトの名無しさん:05/03/15 15:21:34
88の脳の処理能力が低いだけでしょう
91デフォルトの名無しさん:05/03/15 15:49:47
およそ9年前の記事に文句をつける人がいるスレはここですか?
92デフォルトの名無しさん:05/03/15 16:10:03
テキストエディタを作っていますが
テキストファイル内の文字コードを取得する方法はないでしょうか?

一応、適当に読み込んである文字コードに従ってエンコードして
一致すればその文字コードという方法は思いついたのですが
もっとスマートな方法なないですか
93デフォルトの名無しさん:05/03/15 16:21:33
TButton.Create(Self)
で生成したButtonのprocedure OnClickは、何処に書けばいいんでしょうか。
何か別のスレで聞いたらこっちに飛ばされました…
94デフォルトの名無しさん:05/03/15 16:35:19
95ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/15 16:36:33
B := TButton.Create(Self);
B.OnClick := Button1Click;

ではないかと。

Button1Click手続きは自分で記述する必要がありますよ。

96デフォルトの名無しさん:05/03/15 17:55:02
captionに一定文字数以上の文字列が代入されるとき、超した分を「・・・」みたいな感じで省略したいんだが、どうすればいい?
ヒントキボン
97ミ,,゚Д゚ミノ ◆A6VzDeLphI :05/03/15 17:59:36
98デフォルトの名無しさん:05/03/15 18:38:13
dクス
99デフォルトの名無しさん:05/03/15 18:39:35
ありがとうございます。
>>67
http://www.cmagazine.jp/bookreview/19990402.html
この本に解説が載っているのですが残念ながら絶版の模様.
101ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/15 19:53:06
http://www.asahi-net.or.jp/~GV4J-SGUR/narik/stp001.htm#SHAppBarMessage
SHAppBarMessage関数の項

uses ShellAPIをしてから動かしてみたけど
タスクバーとドッキングして動くようなものでは
ないんですね。

> モジュール 'user32.dll' のアドレス 読み込み違反
がたくさん出るので、やめときます。

その本は持っているけど難しくて理解できなかったや。
102デフォルトの名無しさん:05/03/15 19:59:57
すいません。前スレで自身を再起動する方法を見かけたのですが、
別途実行ファイルを用意せずに行う方法ってあるんでしょうか。
興味が沸いたので是非知りたいですッ!
103ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/15 20:41:16
こんな感じでしょうか,,,

procedure TForm1.Button3Click(Sender: TObject);
begin
 Application.MainForm.Close;
 //もしくは、Application.Terminate;

 WinExec(PChar(Application.Exename), SW_SHOW);
end;
104毛の生えたブリーフ:05/03/15 21:34:17
いまさらの話題です

D7のIDEのメニューバーの件ですが、起動後すぐは、すべてのメニューにアクセラレータキーが
表示されません。・・・・たとえば「ファイル」のみ
しかし、何かメニュー操作すると「ファイル(F)」のように表示されます。
それから選択されたメニュー項目はバックがブルーに反転しますが、別メニューを
選んでも前の反転がそのまま当たり前に二三箇所残る場合があります。

みなさんの環境ではどうですか? 別に支障がないけどすこし気持ち悪いです。
My環境は AMDK6-2、300MHz(笑)、PenV、500MHz(笑)
OSはWin2000sp4です。メモリは256MBです。
10568:05/03/15 21:41:07
TMediaPlayerなんですが、ビデオCDの画像ファイルの拡張子がdatですと
エラーします。拡張子をwmvとかmp2にファイル名を書きかえるとちゃんと
再生できるのですが、CDの動画はおおよそ拡張子がdatになっていますから
困ってます(実用にならない)。皆さんはどの様にされているのでしょう?
MCI_sendcommandを使えなんて言わないで下さいね。
10668:05/03/15 21:47:31
追加:TMediaPlayerは結構使えるみたいです。

107デフォルトの名無しさん:05/03/15 22:36:02
>>92
SJIS EUC JIS の3種類でよければ

 1. とりあえず EUC だと仮定する。
 2. エスケープシーケンスが出てきた -> JIS
 3. $80 〜 $A0 の範囲の文字が出てきた -> SJIS
 4 2 にも 3 にも引っかからなかった -> EUC の可能性大

SJIS の半角カナは無視してるけど、大抵はこれで判別可能。
昔書いたソースがどっかにあったはずだけど見つからない…。
108ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/15 22:43:40
>>104
ハードウェアアクセラレータのトコの問題っぽい感じがしますが

2台ともだとすると違うかな...

109102:05/03/15 23:46:37
>>103
こんな事できたなんて・・・!びっくりです。
ありがとうございますッ!
110ミ,,゚Д゚彡 ◆A6VzDeLphI :05/03/16 00:03:40
D2005です。
DMonkeyのHELPの[使用法][4.実行例]にしたがって

procedure TForm1.Button1Click(Sender: TObject);
var retval: TJValue;
begin
if DMS1.Compile('function f(a){ println(a);}') then
begin
DMS1.Run;
DMS1.CallFunction('f',['hello'],retval);
ShowMessage(retval.vString);
end;
end;
としたら、CallFunctionの所で
---------------------------
デバッガ例外通知
---------------------------
プロジェクト Project1.exe は例外クラス EJReturn (メッセージ 'return')を送出しました。
---------------------------
ブレーク(B) 次へ(C) ヘルプ
---------------------------
と、なるのですが、どうしたらええもんですかと…

・・・スレ?板?違い?
111デフォルトの名無しさん:05/03/16 00:06:52
>>88
自慢というか、思い付きでは?
ちゃんとしたアプリケーションでこんなコードは書かないでしょ。
必要ないだろうし。
112デフォルトの名無しさん:05/03/16 00:16:51
>>110
デバッグすりゃいいだろ
113デフォルトの名無しさん:05/03/16 02:43:04
>>110
ソース見た限りだと、必ず生成するっぽいね。
特に処理しなくてもいいんちゃう?
IDEからじゃなくて、普通に実行する分には問題なし。

ちなみに、そのスクリプトじゃ、helloとは表示されないのはわかってるよね?
'function f(a){ return a;}'
じゃないと。
114デフォルトの名無しさん:05/03/16 10:23:25
>>107
遅ればせながらありがとうございます
その手法で認識させて、後は文字コードを指定する機能を設けて
対応していこうと思います。

ブラウザでも文字コードを指定する機能があることから
まだまだ文字コードの自動認識は難しいようですね
11568:05/03/16 13:00:39
>>74
おもしろい。はい。私がバカでした。でも>>69は話にならないよ。
116デフォルトの名無しさん:05/03/16 13:44:26
さもしい
117デフォルトの名無しさん:05/03/16 14:10:12
QRLabel で印刷しようとしています。
Labelのフォントに取り消し線っていうのがありますが、
線1本なので困っています。
2重線をひくにはどうしたらいいですか?
118デフォルトの名無しさん:05/03/16 14:16:04
>>117
親WinControlのWindProc乗っ取ってWM_PAINTで自前で書く
119118:05/03/16 14:17:39
>>118
は取り消し
120デフォルトの名無しさん:05/03/16 14:22:07
splitterって幅を1にするとドラッグしにくくなるけど、
見た感じでの幅は1で、ドラッグできる範囲を2
とかにするのは不可能?
121デフォルトの名無しさん:05/03/16 17:05:14
Delphi7で、TStringListのn行目の文を
TSL[n]で取り出そうとするとエラーになるんですが、
どうやってとりだせばよいですか
122デフォルトの名無しさん:05/03/16 17:37:38
>>121
n-1
123デフォルトの名無しさん:05/03/16 17:37:44
>>121
Strings[n]
だけどその前に大きな勘違いをしていると思われ。
というか釣られたんですか私?
124デフォルトの名無しさん:05/03/16 17:54:56
(・∀・)ニヤニヤ
125デフォルトの名無しさん:05/03/16 19:35:45
DelphiのStringにVBでいうvbNullStringみたいなのって無いのでしょうか?
126デフォルトの名無しさん:05/03/16 21:33:16
>>125
'' とか #0 とか array[0..0] of Char = #0 とか?
何に使うの?
127Delフサギコ ◆A6VzDeLphI :05/03/16 22:15:37
    ∧ ∧  >>125-126
    ミ ゚Д゚彡
  〜ミ,,,,uuミ
SysUtilsに
 EmptyStr: string = '';
と定義されてるぞよ
128Delフサギコ ◆A6VzDeLphI :05/03/16 22:23:00
    ∧,,∧   センクス
   ,,ミ,,゚Д゚ミ   >>113さん
  .とミ,,,,,U,,U

EJReturnは無視する冷害にいれました。
この設定使ったの、何年ぶりだろう....

例外が発生しているので
てっきりスクリプトが誤動作orSyntaxErrorでも起こしているのかと思て
スクリプト側はあまり変更テストしていなかったのですが
正常動作を確認しましたです。

ありがとう。

DelWiki追記しとかないと...
129デフォルトの名無しさん:05/03/16 22:28:54
>>127
vbNullString はただの空の文字列じゃないよ。
130デフォルトの名無しさん:05/03/16 22:44:34
Delphiへの愛が感じられるスレですね
131デフォルトの名無しさん:05/03/17 00:52:04
var
 FList,GList: TList;

 Delphi5のTListにはAssignがないのですが
 FList.Assign(GList);
の代わりは
 for i := 0 to GList.Count-1 do
  FList.Add(GList[i]);
でいいのでしょうか?
132デフォルトの名無しさん:05/03/17 01:07:23
それでいいはず。

余談だが、TListのassignメソッドって、デフォルトパラメータが二つもあるんで、
一度、D6以降のヘルプも読んだ方が良いよ
知っておくと応用が楽
133125:05/03/17 01:10:58
>>126-127

vbNullStringというのを無理矢理Delphiで表現すると、

PChar(vbNullString) = Nil

です。ポインタがNil(=0)になる文字列が使えたら便利だなと思いまして。
DLLを良く使うプロジェクトに現在居る物で。
134デフォルトの名無しさん:05/03/17 01:46:42
カラーダイアログの基本色の色変更をしたいのですが、どうすればいいでしょうか?

135デフォルトの名無しさん:05/03/17 05:02:05
>>134
基本色はシステム依存なので変えられない。

MSDN より
The basic colors represent a selection of the colors
available on the specified device. The actual number
of colors displayed is determined by the display driver.
For example, a VGA driver displays 48 colors, and a
monochrome display driver displays only 16.

136デフォルトの名無しさん:05/03/17 09:18:14
>>135
ありがとうございます。 自分で簡易なパレットを作ってみます。
137デフォルトの名無しさん:05/03/17 15:36:08
TListView(vsReport)で選択中のアイテムが何行目か知りたいんだけど
どうやって取得すればよいのでしょうか?
138デフォルトの名無しさん:05/03/17 15:38:27
>>137
index
139デフォルトの名無しさん:05/03/17 18:05:28
すいませんIndexと聞いて某小説を思い浮かべてしまったんですがどうすればいいでしょうか?
140デフォルトの名無しさん:05/03/17 18:34:10
シリアルキー解析集「ALTEA」
大好評発売中!

http://openuser10.auctions.yahoo.co.jp/jp/user/dancexxx1960?


市販SOFTやオンラインSOFTのパスワード集です。
オークション関係から画像・OS・表計算・CAD・・・・etc
国内・国外のあらゆる分野のSoftを解析済です。


これを初めて手にされた時には、驚愕される事でしょう。
そして・・・手当たり次第にインストールを始める筈ですw
パソコンをご使用の方なら、必ず!満足されると思います。

解析結果のデータベースには15,000点を越えるパスワードが入ってます。
このパスワード集から検索するだけで、登録や制限解除が出来てしまいます。
シェアウェアを購入して、正規登録したのと同じ状態になります。
余りにもデータが多すぎる為、辞書引のようなパスワード検索SOFTで提供します。

シェアウェア以外にもパッケージ版をVectorなどでオンライン販売してるSOFTにも
多数対応しています。これらをダウンロードして無期限に試用する事も可能です(^^;

WindowsXPやOfficeなどのCDキー(プロダクトキー)ジェネレーターを使えば複数のパソコンに
インストールする事も可能です。デスクトップとノートPCなど2台以上持ってる場合は特に有効ですね。

オンラインSOFTを購入した経験は有りますか?
ありとあらゆる分野の優れたSOFTが、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。

もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?
141デフォルトの名無しさん:05/03/17 18:45:42
入札一件もねーじゃん

て思ったけど、評価見たら売れまってんな。
うはwwwぼろ儲けwwwwおkwwwww
142デフォルトの名無しさん:05/03/17 20:08:36
あふぉ
143デフォルトの名無しさん:05/03/17 21:07:51
こいつタイーホされるんじゃないの?
144デフォルトの名無しさん:05/03/17 22:00:57
ハングル

├−韓国マスコミ今日のホームラン
│ │
│ 竹島に続き対馬も韓国領と言い始めたぞ

プログラム技術

├−くだすれDelphi(超初心者用)
│ │
│ ├−コンポ編
│ │
│ └−アプリ編
│   │
│   └−グラフィックス

プロ野球

 TreeViewが維持しているNode.Textをこういう風に出力したいのだけど、どうしたらいい?
145144:05/03/17 22:08:26
procedure TForm1.TreeStructureSave(FName: String; Flg: Boolean);
var
 Temp: TStringList;  i: Integer; TreeStr,S: string;
 procedure StructureAdd(Node: TTreeNode);
 var
  j: Integer;
 begin
  if Node.Data <> nil then
  begin //ここで│'や'└−'を付加する処理を書けばいいような気がするがごちゃごちゃしてわかりまへん
   //TreeStr := hogehoge  S := TreeStr+S;
   Temp.Add(S);
   TreeStr := '';
  end else
   Exit;
  if Node.GetFirstChild <> Nil then
  begin
   for j := 0 to Node.Count-1 do
   begin
    Inc(i);  StructureAdd(Node.Item[j]);
   end;
  end;
 end;
begin
 Temp := TStringList.Create;
 TreeStr := ''; i := 0;
 while i < DataTree.Items.Count do
 begin
  StructureAdd(DataTree.Items[i]); Inc(i);
 end;
 Temp.SaveToFile(FName); Temp.Free;
end;
146デフォルトの名無しさん:05/03/17 23:18:45
tu-ka、>>144形式が統一されて無いじゃん

兄弟は

─兄者
  │
  弟者

なのか、それとも

─┬兄者
  │
  └弟者

なのか
147デフォルトの名無しさん:05/03/18 00:02:03
>>137
ItemIndexでしょ?
~~~~~
いや別に揚げ足取りじゃないけど。
「indexなんて無いよー」ってことにならぬように。
148Delフサギコ ◆A6VzDeLphI :05/03/18 00:23:44
149146 1/3:05/03/18 00:25:04
暇なんで作ってみた
形式は後者であると仮定

function ChkVerticalLine(Node: TTreeNode): String;
begin
 // ノードの左を通過する、親とその弟を繋ぐ縦線を再帰的に取得

 if Node.Parent <> nil then
 begin
  Result := ChkVerticalLine(Node.Parent);
  if Node.Parent.getNextSibling <> nil then
   Result := Result + '│ '
  else
   Result := Result + '  '
 end
 else
  Result := '';
end;
150146 2/2:05/03/18 00:26:48
リロードし忘れるは 1/3 とか書いてるは… orz

procedure OutputNode(Node: TTreeNode; Strings: TStrings);
var
 s: String;
begin
 // ノードの線と文字列を取得
 // 呼び出し側で TTreeNodes.Items 使ったほうが楽なので子の存在は無視

 s :=  ChkVerticalLine(Node);
 Strings.Append(s + '│ '); // ノードとノードの間の空行

 if Node.getNextSibling <> nil then
  s := s + '├'
 else
  s := s + '└';

 Strings.Append(s + Node.Text);
end;
151デフォルトの名無しさん:05/03/18 03:18:26
TThreadでExecuteを一回完了した後にクラスの状態をそのままにしたまま
何度もExecuteを呼び出せるようにするのは可能でしょうか
Resumeは効かないみたいなので…
152144:05/03/18 06:55:16
>>149
 おお! サンクス! すばらしい!!
 一番最初のノードの処理を少し変更して利用させてもらいます。
153デフォルトの名無しさん:05/03/18 12:04:53
>>151
やったことないけど、FreeOnTerminateをFalseにすれば、
Classのインスタンスを保持したまま、何回もExecute実行できないかな?
154デフォルトの名無しさん:05/03/18 14:44:42
やったことないなら、日記はチラシの裏に書け
155デフォルトの名無しさん:05/03/18 15:33:50
>>151
Execute内で一時停止かな。
156デフォルトの名無しさん:05/03/18 16:10:47
今日のチラシは裏も印刷されていて書けません。どうしたら良いですか?
157デフォルトの名無しさん:05/03/18 16:33:05
>>156

これにでも書いてろ、な!(AA略)

ttp://yuukiremix.s33.xrea.com/chirashi/
158デフォルトの名無しさん:05/03/18 17:25:29
Delphi製か・・
159デフォルトの名無しさん:05/03/18 18:51:38
コンソールアプリ自体に戻り値を設定するにはどうしたらいいのでしょうか?
他のアプリから結果をリダイレクトしたいのですが。
160デフォルトの名無しさん:05/03/18 19:17:47
>>159
ファイルに書き出すとか。
161デフォルトの名無しさん:05/03/18 19:42:29
そういう時の為の標準入出力じゃないのか
162151:05/03/18 19:51:54
>>153 >>155
レスありがとうございます。
Executeを無限ループにしてループ毎にイベント発生させてSuspend、Resumeで再開
こんな感じでそれっぽくできました。 助かりました
163デフォルトの名無しさん:05/03/18 20:37:10
Suspend,Resumeは推奨しない。
きちんと同期オブジェクトを使用するか、
Executeのループの中からSynchronizeを使って
メインアプリの方の終了フラグかなんかを読みに行きなさい。
164デフォルトの名無しさん:05/03/18 21:58:44
同期のため、とは書いてないんだが・・・
165デフォルトの名無しさん:05/03/19 01:48:59
パズルの16分割みたいな状態を実現したいのですが、
画像の分割ってどのような方法で分割してるのですか? 
どなたかご指導ください。
166デフォルトの名無しさん:05/03/19 02:02:43
例えばビットマップで横に2分割するときは、元画像の横幅半分のビットマップ
二つつくって、後は該当部分をコピーするだけ。
167デフォルトの名無しさん:05/03/19 10:19:57
>>166
ありがとうございました。
コピーしてみます。
168デフォルトの名無しさん:05/03/19 21:34:43
 コマンドラインコンパイラ DCC32.EXE で GUI の dpr ファイルをコンパイルするには
どうしたらいいのでしょ。
 オプションを確認したら
 -CG = GUI target
となっていたので
 DCC32 -CG abc.dpr
とやったのですが致命的エラーが出てダメでした。エラーの内容を確認するため
 DCC32 -CG abc.dpr > Erroor.txt
とやったのですが上記致命的エラーのために Erroor.txt が作成できませんでした。
169デフォルトの名無しさん:05/03/19 22:16:07
>>168
コマンドラインオプションを全部取ってコンパイルしてみる。

…それ以前にパスが通っていない悪寒。
170デフォルトの名無しさん:05/03/19 22:30:19
いや、パスは通っています。
DCC32 > option.txt でオプションを確認したわけですし。
オプションを摂ってコンパイルしても同じでした。
171デフォルトの名無しさん:05/03/20 00:46:26
プログラムがダメなんだろ
普通にIDEでは成功する?
172デフォルトの名無しさん:05/03/20 03:58:27
プロジェクトの内容にかかわらずエラーが出るって事だよね!?
.cfgファイルにおかしな設定をしているのかな。
173デフォルトの名無しさん:05/03/20 07:41:23
>>171
知らないなら黙っててください
174デフォルトの名無しさん:05/03/20 08:06:58
>>168
コンソール画面からのコピーの方法をご存知ですか?もし知っていたら
致命的エラーの内容を、コピーアンドペーストで間違えずに転記してもらえませんか?

または標準エラー出力をリダイレクトするために
DCC32 abc.dpr 1>stdout.txt 2>stderr.txt
とやってみましょう。もし NT 系 OS を使っているなら。

171 さんの指摘のように、IDE でコンパイルできるかどうかは試してみましたか?
175デフォルトの名無しさん:05/03/20 09:34:48
TStringListのStringsに直接アクセスしたいのであらかじめCountの個数を
指定したいのですが、今は下のように書いています。
for i:=0 to n do
  sl.Add('');
又は
sl.Text:=StringOfChar(#10,n);
特に不便でもないのですが、ほかのやり方はないでしょうか?参考までに。
176デフォルトの名無しさん:05/03/20 14:08:21
for i:=0 to n do



sl.Text:=StringOfChar(#10,n);

じゃ個数が違うわけだが
177デフォルトの名無しさん:05/03/20 16:22:51
今までCを少しとC#を使ってきて、Delphiも使えるようになりたいのだが、
オススメの書籍はあるだろうか?あれば教えて欲しい。
178毛の生えたブリーフ:05/03/20 18:31:18
>>177
Delphiの入門本は久しく出ておりませんでしたが、最近、最新版のDelphi2005
用の入門本がカットシステムからでました。
中身は本当に初めてdelphiを使う人向けですので、立ち読みしてご検討して
みてはどうでしょうか。


かなり古い書籍で、まだ入手可能かどうかわかりませんが、

「プログラマのためのDelphi2入門」(ゲーリー・コーレル著/小山裕徳 訳)
東京電機大学出版局

原題「Delphi Nuts&Bolts:For Experienced Programmers Second Edition」

私のお勧めはこれです、最新のDelphiではありませんが、とても分かりやすかった
です。

179毛の生えたブリーフ:05/03/20 18:35:21
「Delphi4プログラミング技法Vol1,Vol2」
(ザビエル・パチェコ+スティーブ・テイクセラ著/日向俊二 訳)
ピアソン

原題「Borland Delphi4 Developer's Guide」

これまた古いですが、入門本が終わったら次に読む本だとおもっています。
まだ入手可能だと思います。
>>175
Delphi 6以降はわからないのですが特になかったような.
プログラムの中のあちこちで使うようでしたら下のような手続きを用意して使ってください.
procedure SetCount(Strings: TStrings; Count: cardinal);
var
 i: integer;
begin
 Strings.Clear;
 for i := 1 to Count do
  Strings.Add('');
end;

もし文字列リスト固有のメソッドやプロパティを使わないのでしたら
つまり単に文字列の値を読んだり書いたりするだけなら
文字列リストではなく配列変数を使うことも検討してみて下さい.
181デフォルトの名無しさん:05/03/20 19:21:30
ちょっとずれるけどTStringListのCapacityプロパティってどうやって使うんでしょうね。
変更可能だけどCountより小さくしてはダメで、大きくしても領域を確保してくれない・・・
182デフォルトの名無しさん:05/03/20 19:26:29
確保するでしょ。カウントが増えないだけで。
183デフォルトの名無しさん:05/03/20 19:28:39
これ以上増えないのがわかっているなら、Capacityに最大値を設定
しとけば無駄な領域確保要らなくなるということでしょ?
184デフォルトの名無しさん:05/03/20 19:29:46
実際に使ってる量と確保してる量は違う。TStringList だけでなく、TList なんか
にもある。予めバッファとして割り当てておいて、その以下の項目増加では割り当て
直す必要がなくなって、パフォーマンスが改善するってことだ。
185デフォルトの名無しさん:05/03/20 19:42:02
Countが増えないだけで確保してるんですか。
例外でるのはCountをチェックしてるからか・・・。
空の文字列返してくると思ってたら例外でたもので。
ありがとう
186デフォルトの名無しさん:05/03/20 19:49:07
VCLソース持ってるなら嫁
187デフォルトの名無しさん:05/03/20 22:50:44
Classes.pas は誰でも持ってる
188デフォルトの名無しさん:05/03/20 23:03:31
んなことはない
189175:05/03/20 23:12:34
>>180
わざわざサンプルまでありがとうございます。
自分のニーズとしては、
・長さが不定な文字列の、数が不定な(実行時にはわかる)リスト
・文字列の途中に改行があることもある
・1つのリストを複数のTThreadの下位クラスのメンバー入れて複数のスレッドからアクセスしたい
というのなんですが。

type TMyStringArray = array[0..65535] of AnsiString;
type PMyStringArray= ^TMyStringArray;
みたいなのをつくって、GetMem()で配列に必要なメモリを確保して
配列のポインタだけ扱う方法も考えたのですが、
AnsiString型の仕様がいまいち理解できてないのでやめました。
190デフォルトの名無しさん:05/03/20 23:15:53
動的配列知らんのか?
191デフォルトの名無しさん:05/03/20 23:16:34
> ・文字列の途中に改行があることもある

TStringList は使えない
192デフォルトの名無しさん:05/03/20 23:19:26
>>189

string 型の動的配列を保持するクラスをつくって、CriticalSection でアクセスメソッド
を保護するといい
193デフォルトの名無しさん:05/03/20 23:21:47
初めからほんとの目標を明示しないで見当違いの質問して、結局遠回りするってよくあるんだよな
194175:05/03/20 23:34:02
>>191
>>TStringList は使えない
使えます。

>>動的配列知らんのか?
もちろん動的配列も試しましたけどヘルプ見ても「暗黙にポインタ」と書いてあるだけなので、
普通の変数のように代入したりしてもいいのかわからなかったので避けていたのですが。
195デフォルトの名無しさん:05/03/20 23:41:56
普通に使える。5分で確認できるでしょ。

procedure TForm1.Button1Click(Sender: TObject);
var
  sa: array of string;
  i: Integer;
begin
  SetLength(sa,5);
  for i := 0 to 4 do
    sa[i] := Format(' No of string = %d',[i]);

  for i := 0 to 4 do
    Memo1.Lines.Add(sa[i]);
end;

>>TStringList は使えない
>使えます。

自動的に改行されて、データの数と行数が一致しなくなるけど。それでもいいなら使える。
スレッドセーフな TStringList クローンのコードはどっかにあったはず。
196デフォルトの名無しさん:05/03/20 23:57:58
Addで改行を含む文字列を追加した場合、その改行は考慮されないよ。
197デフォルトの名無しさん:05/03/21 00:00:16
おお、そうなんだ。しらんかった。TMemo なんかと勘違いしてた。さんくす
198175:05/03/21 00:09:46
>>195
レスありがとうございます。
単純に各々の文字列を入れたり出したりするリストなので、トータルの行数が問題になったりはしません。
なので、TStringListでも間に合いそうです。

上にも書きましたが、複数のTThreadの下位クラスで使いたいので、
大もとのスレッドにある動的配列を他のTThreadのメンバーに代入したいわけなんですが、
sa: array of string;
のような宣言では代入互換性がないので使えません。
type TMyArray=array of string;
のような形で動的配列用の新しい型を宣言することになるわけですが、
a,b:TMyArray;
SetLength(a,10);
a[3]='ABC';
b:=a;
SetLength(a,20);
のように動的配列を他の動的配列に代入して、その後の元の配列を変化させた場合の仕様がよくわかりません。
とりあえず、テストしてみて動いていても、そのときたまたま動いてるだけで、
C言語のrealloc()みたいに、メモリが足りないときは別のポインタ割り当てられたりするかもしれないですし。
Delphiの動的配列の細かい仕様が書いてある説明でもあればいいのですが。
静的配列なら領域を確保してそのポインタをやり取りするだけなので、
安全だと思ったのでそちらを使おうとしたのです。
199デフォルトの名無しさん:05/03/21 00:27:19
> スレッドセーフな TStringList クローン

を使ってみては? インスタンスは、その内容が変化しても、参照変数自体が変わることはないし。

ttp://www.swissdelphicenter.ch/en/printcode.php?id=2167
200175:05/03/21 00:40:46
>>199
ありがとうございます。
TThreadListを使うのかと思っていたのですが、こっちの方が楽そうですね。
参考にさせていただきます。
201デフォルトの名無しさん:05/03/21 03:31:25
動的配列の勉強をしているのですが^^;

var a: array of integer;
begin
setlength(a,1);
a[5] := 3;
showmessage(inttostr(a[5]));
end;

を実行したら3と表示されてしまいます。
予想ではsetlength(a,1)と、添え字は0-1の範囲しか指定していないので
エラーとなるはずなのですが、なぜか動いてしまいます。
何か勘違いしているのでしょうか。
よろしくお願いします。
202デフォルトの名無しさん:2005/03/21(月) 08:50:00
>>201
動的配列はただのポインタなので、静的配列のようにコンパイル時は添え字の範囲のチェックまではやらないということだろう。
というか、動的に変化するからコンパイル時に範囲のチェックはできない。
a[5] := 3; は、たまたまその領域(この場合はaより20バイト先)が、安全な領域だったので
偶然使えただけだろう。
ためしに、a[50000] := 3;にしてみると、たぶん動かない。
また、以下のようにbっていう動的配列を一緒にすると値が変になる。
おそらく、メモリ領域がバッティングするんだろう。
var
a,b: array of integer;
begin
setlength(a,1);
setlength(b,1);
a[5] := 3;
ShowMessage(IntToStr(Integer(a)));
ShowMessage(IntToStr(Integer(b)));
showmessage(inttostr(a[5]));
end;


203177:2005/03/21(月) 12:14:04
>>178
サンクス。参考にしてみるね。
204デフォルトの名無しさん:2005/03/21(月) 22:06:41
>202
早速ためしてみました。
まず、A5000では>>202さんのいうとおり実行時エラーとなりました。

また202のソースをコンパイルして確認してみました。
確かに変な数が入ってきますね。(a[5]=22となりました)

以上をふまえてsetlengthは配列で利用する範囲を保障するための
手続きと考えるとすっきりしました。どうもありがとうございます。
205デフォルトの名無しさん:2005/03/21(月) 22:25:50
マルチスレッドを試してみたんだけど
Form1: TForm1;
BmpWork: TBitmap;
で定義したBmpWorkが他のユニットのスレッドでも使えるけどもプログラムを終了するときにエラー(例外発生)が出る
何ででしょう?
206205私はバカです:2005/03/21(月) 23:36:57
ごめんなさい、publicで宣言したら直りました。
207デフォルトの名無しさん:2005/03/21(月) 23:41:20
>>205
その前に、その質問の仕方で答えられる人は
そうそういないと思うよ。
煽りでも何でもなく。
208デフォルトの名無しさん:2005/03/22(火) 18:31:22
どこかwinsockを解説してるサイトとかないですかね?
pasとapiを見ながら組むと頭がこんがらがって。
winsocketのapiを解説してるサイトでもいいです。
209デフォルトの名無しさん:2005/03/22(火) 21:26:17
単発ですみません。
Editボックスで横幅いっぱいまで入力したら自動的に
2行目に折り返したりすることできますか?
210デフォルトの名無しさん:2005/03/22(火) 21:38:17
source codeの行数もしくはstep数を計測するアプリを紹介して下さい。
211デフォルトの名無しさん:2005/03/22(火) 21:50:28
step数なんて聞くの昭和60年以来だ
212デフォルトの名無しさん:2005/03/22(火) 22:00:46
>>211
そんな古臭い?最近はfunction pointで計測するのが一般的なのか?
213デフォルトの名無しさん:2005/03/22(火) 22:04:31
このスレで「アプリを紹介して下さい」なんて書くような奴だもん。
214デフォルトの名無しさん:2005/03/22(火) 22:18:06
>>213
source codeの規模計測となると言語別の質問すれで聞いた方が良いかと思った
もので。すれ違いだったら無視して下さい。
215デフォルトの名無しさん:2005/03/23(水) 03:39:13
>>208
↓とか。
Winsockを使ってみようぜ
http://www.asahi-net.or.jp/~nk2w-ishr/winsock0.htm

>>209
TMemo.WordWrap プロパティを True に設定すると自動的に折り返されます。
False に設定するとそのまま。
216デフォルトの名無しさん:2005/03/23(水) 06:34:24
>>215
ありがとうございます。EditじゃなくMemoを使うんですね!
隣のボタンだったけどわかんなかった。。
217デフォルトの名無しさん:2005/03/23(水) 08:01:29
>>210
step数とは何か、さえ定義付けられれば
簡単にプログラム組めそうじゃね?
ようはテキスト処理だろ?
218208:2005/03/23(水) 10:57:21
>>215
さんくす
参考にしてみる
219ななしへたぐらま ◆XcB18Bks.Y :2005/03/23(水) 19:37:16
>>198
動的配列についてはヘルプの『動的配列』のところで説明されていますので
良かったらご覧になってみて下さい.
(キーワード検索で『動的配列』と入れればすぐに見つかると思います)

>>201
Delphiでは初期設定では配列の添え字が正しいかどうかをチェックしません.

そのため全然関係ないところのデータを読み書きしようとします.
そこは別のデータの保管に使っていてそれを破壊してしまうかもしれませんし,
何も起きないかもしれませんし,エラーになる場合もあります.

対策としては『範囲チェック』を有効にするのが確実です.
『プロジェクトオプション』(の『コンパイラ』のタブ)に
『範囲チェック』という項目がありますのでここにチェックを入れて下さい.
220デフォルトの名無しさん:2005/03/23(水) 22:23:38
タイピングソフトを作ってるんですが、tyoとchoとかの切り替えを自動で判別するシステムってどうやればいいんですか??
教えてくださいお願いします!
221デフォルトの名無しさん:2005/03/23(水) 22:42:59
>>220
それだけじゃわけわからん。
何を自動で判別して、どうしたいのだ。
222デフォルトの名無しさん:2005/03/23(水) 23:54:10
Delphi6 personalだけで
MS-Excelを扱うプログラムって作れますか?
要件は 読んで、書いて、保存くらいの機能です。
参照設定みたいのすれば動くのかな?
comobjをusesとやらに追加したらpathを聞いてきた。
今日はじめて使った初心者なのでわかり易い説明お願いします。
223デフォルトの名無しさん:2005/03/24(木) 00:00:55
他のソフトがファイルを開いているかどうかをチェックするため以下のような
関数を作りました。
function IsOpened(FName: string):Boolean;
var
 WHandle: THandle;
begin
 WHandle := CreateFile(PChar(FName)
           , GENERIC_READ
           , 0, nil
           , OPEN_EXISTING
           , FILE_ATTRIBUTE_NORMAL, 0);
 if GetLastError = 0 then
 begin
  Result := False;
  CloseHandle(WHandle);
 end
 else
  Result := True ; //他のソフトで使用中';
end;
224223:2005/03/24(木) 00:01:30
if OpenDialog1.Execute then
begin
 if IsOpened(penDialog1.FileName) then
 begin
  MessageDlg(FName+' は他のソフトで使われています。',mtWarning, [mbOK], 0);
  Exit;
 end;
end;
はいいのですが
if SaveDialog1.Execute then
 if IsOpened(FName) then
 begin
  MessageDlg(FName+' は他のソフトで使われています。',mtWarning, [mbOK], 0);
  Exit;
 end;
end;
は他のソフトで使っていないときでもIsOpenedの結果がTrueになってしまいます。なんででしょ?
225デフォルトの名無しさん:2005/03/24(木) 00:03:04
1.出来る
2.まだ早い
3.何事もチュートリアル(不備があるが)から

※不備=無い機能なのに、使うように書いてある
226225:2005/03/24(木) 00:04:19
>>222宛ね。
227223:2005/03/24(木) 00:06:51
ああ! いかん、いかん!
penDialog1.FileName ---> OpenDialog1.FileName
FName ---> SaveDialog1.FileName
if OpenDialog1.Execute then
begin
 if IsOpened(OpenDialog1.FileName) then
 begin
  MessageDlg(OpenDialog1.FileName+' は他のソフトで使われています。',mtWarning, [mbOK], 0);
  Exit;
 end;
end;
if SaveDialog1.Execute then
 if IsOpened(SaveDialog1.FileName) then
 begin
  MessageDlg(SaveDialog1.FileName+' は他のソフトで使われています。',mtWarning, [mbOK], 0);
  Exit;
 end;
end;
228222:2005/03/24(木) 00:11:27
>225,226
どうもです。

明日中に形だけでも作ろうと思ったけど無謀か…。
Del6 perだけでも作れることが判っただけでも助かりました。
229デフォルトの名無しさん:2005/03/24(木) 00:34:13
>>223
そういうのって普通は、ファイルを読み書きする時に、
ファイルを開く関数の例外処理で判定しない?
230デフォルトの名無しさん:2005/03/24(木) 00:50:26
>>223
ほとんどのAPI関数は、成功した場合はGetLastErrorの返り値を変更しない。
まず関数の返り値をチェックしてください。
231デフォルトの名無しさん:2005/03/24(木) 01:57:55
>>他のソフトがファイルを開いているかどうかをチェックするため
他のソフトで開いていても、排他制御がかかってなければエラーにならないんじゃないか?
232デフォルトの名無しさん:2005/03/24(木) 02:54:44
Webサーバーに接続してコンテンツ取得するにはどうしたらいいですか?
TTcpClientでconnectするとtrueが返ってくるんですが、そこから
Sendln('GET /')してもReceiveln()でなにもとれないしOnReceiveイベント
ハンドラにも飛んでこないです。Webサーバー上のtxtファイルを読み込みたいのですが。

環境はDel7です。
233デフォルトの名無しさん:2005/03/24(木) 03:00:52
>>232
要はtxtファイルをDLしたいってこと?
WininetでDLしたら?
違ったらスルーしてくれ。
234デフォルトの名無しさん:2005/03/24(木) 03:05:48
そういうことです。Wininetっていうのはどれをusesしたら使えます?
パレットでは見あたらないのですが。
235デフォルトの名無しさん:2005/03/24(木) 03:08:56
>>234
使えます。
検索すれば、たくさんサンプル出てくるので
参考にしては?

多少、微妙な所も無くもないけど…。
オレは、ネット関係はWininetで済ませてる。
236235:2005/03/24(木) 03:11:30
あれ?「どれを」か。
読み飛ばしてた…。

「Wininet」をですよ(汗

uses Wininet;
237デフォルトの名無しさん:2005/03/24(木) 03:18:12
見つからないんですが、del7に居ます?

とりあえずIdHTTPで思っていたことができそうなんですが、
1行ずつreadlnで読み込んで、ファイルの終わりに来たことって
どうやって検知したらいいですかね。nilやEOFと比較できないようだし。
238デフォルトの名無しさん:2005/03/24(木) 03:28:37
Wininetがusesできたのでいるっぽいな。
InternetOpenも使えそうだけどF1押してもヘルプがでないので
パラメータがようわからん。Win32APIのインターフェースは
わかりづらくないですか?これでプログラム組める人尊敬する
239デフォルトの名無しさん:2005/03/24(木) 04:00:33
なああああんも考えずに
TIdHTTP.Get(URL)すればいいことに気付きました。
ありがとうございました。
240デフォルトの名無しさん:2005/03/24(木) 04:08:44
MSDN(ry
241デフォルトの名無しさん:2005/03/24(木) 10:57:35
Hintの文字列を改行させることってできますか?
#13#10とか入れても改行されないで表示されます。。
242デフォルトの名無しさん:2005/03/24(木) 11:13:37
>>241
んなこたーない!
243デフォルトの名無しさん:2005/03/24(木) 11:15:03
>>241
オブジェクトインスペクタからだと無理
フォームをエディタで開いてそこに記述するか
ソースにButton1.Hint := 'Hello'+#13#10+'hoge'と書く
244デフォルトの名無しさん:2005/03/24(木) 11:31:31
>>242
すみません。>>243さんのおっしゃるとおり
オブジェクトインスペクタでやってました。

>>243
ありがとうございました。ソースに書いたらできました!

245デフォルトの名無しさん:2005/03/24(木) 13:01:41
DelphiでdotNET2.0とか、Sleipnirとかみたいに
ツールバーとかがツヤツヤ(?)したコンポーネントってありませんか?

特にそれがないとだめって事は無いんですけど、なんかカッコ(・∀・)イイ!!
246デフォルトの名無しさん:2005/03/24(木) 13:31:10
>>245

Toolbar2000
http://www.jrsoftware.org/
TBX
http://www.g32.org/tbx/index.html
TBX Themes
http://www.rmklever.com/delphitbx.html
spTBXLib
http://club.telepolis.com/silverpointdev/sptbxlib/downloads.htm

SleipnirのOfficeXP風テーマはTBXに含まれてるから、最低限上の二つを組み込めば
それっぽいUIは構築可能です。
247デフォルトの名無しさん:2005/03/24(木) 13:37:08
フォームの大きさを変えられないようにするには
どのようにすればいいんですか?
248デフォルトの名無しさん:2005/03/24(木) 13:42:15
>>247

Formのオブジェクトインスペクタのプロパティ「BorderStyle」をbsSingleにする。
同じくプロパティ「BorderIcons」を適当にFalseにしてみる。
249デフォルトの名無しさん:2005/03/24(木) 17:43:56
250デフォルトの名無しさん:2005/03/24(木) 20:06:07
tb2kのMLにmbTBXLibというTBX対応コンポーネントもあったので、
wikiに書いておきました。
251デフォルトの名無しさん:2005/03/24(木) 21:16:29
>>250
ありがd
252デフォルトの名無しさん:2005/03/24(木) 22:57:33
>>246,249
ありがとうございます!

ですが、インスコ中にエラーします。
ttp://testesca.at.infoseek.co.jp/delphi/delphi.htm
ここを参考に
ToolBar2000にTBXのパッチを当てて、インストールはしました。
ですが、それではOffice2k風なんで
ttp://www.rmklever.com/delphitbx.html
でTBXテーマ(Additional Themes for TBX 2.1 Office2003 by Yury Plashenkov)
を拾ってインストールしようとしたら
「rmkGradient.dcuがありません」って怒られます・・・。

これではOfficeXP風にならない・・・。
rmkGradient.dcuはどこか別のサイトからダウンロードしてくるものなのでしょうか?
253デフォルトの名無しさん:2005/03/24(木) 23:11:52
TStringGrid(等)でRange指定するような感じで
配列をまとめてセットするような方法ありますか?
cellsで1つずつセットはしたくないので。
254デフォルトの名無しさん:2005/03/25(金) 00:40:13
>>253
Rows(Cols)プロパティを調べてみると吉。
255デフォルトの名無しさん:2005/03/25(金) 04:47:28
TFileStreamの使い方(というか、バイナリモードでの文字列書き込み)がよくわかりません。

var
test : String;
strsize : Integer;
F : TFileStream;
begin
test := 'test';
F := TFileStream.Create('./test.bin', fmCreate);
strsize := SizeOf(test);
F.Write(strsize, SizeOf(strsize));
F.Write(test, strsize);
F.Free;
end;

というルーチンでファイルに書き込んで、

var
test : String;
strsize : Integer;
F : TFileStream;
begin
test := '';
F := TFileStream.Create('./test.bin', fmOpenRead);
F.Read(strsize, SizeOf(strsize));
F.Read(test, strsize);
F.Free;
ShowMessage(test);
end;

そもそも解釈が何かおかしいとしか思えない結果が返ってきます。
どなたかアドバイスをお願いします。
256デフォルトの名無しさん:2005/03/25(金) 04:52:00
strsize := SizeOf(test);はstrsize := Length(test)じゃないかな?
F.Write(test, strsize);はF.Write(test[1], strsize);じゃないかな?
F.Readも同様
257デフォルトの名無しさん:2005/03/25(金) 04:53:04
あ、F.Readの前にSetLength()で領域確保が必要
258255:2005/03/25(金) 05:08:41
何か色々わかってきたかも。
SizeOfだと4バイトしか返ってこないですね(ポインタの値が返ってるだけ?)。

test[1]って書いてしまえば、残りの文字列も自動的に書かれるのでしょうか?
test[1]ってようするに文字列の先頭ですよね?

あと、SetLength()は文字列を格納する変数(例だとtest)に対してやってやればOK?
259デフォルトの名無しさん:2005/03/25(金) 05:23:19
いや'test'は4バイトだからSizeOfが4でも不思議じゃないですよ。Lengthも4が返るでしょ?
領域の長さと文字列の長さが一致することが保証されていない気がするだけです。

test[1]はtest[1]から長さ分だけで書かれるはずです。
Cで言えばポインタを渡したいところですが、delphiではポインタの値を渡すようで。

SetLengthはtestだけでいいはずです。
strsizeは4バイト領域が確保済みですから。
260デフォルトの名無しさん:2005/03/25(金) 07:38:06
>>259
( ゚Д゚) ハァ?
261デフォルトの名無しさん:2005/03/25(金) 07:52:08
嘘教えちゃいました?255さんごめん
262デフォルトの名無しさん:2005/03/25(金) 08:28:11
>>258

> SizeOfだと4バイトしか返ってこないですね(ポインタの値が返ってるだけ?)。

String 型の実体は別のところに動的に確保された文字列の実体を指すポインタ。
だから 32bit の環境なら常に 4Byte。
文字列の長さは Length で。
263デフォルトの名無しさん:2005/03/25(金) 09:00:13
やばい勘違いしてた。短い文字列では要素数+1が返るんですね。
短い文字列に使ってたからバグってなかった。ほっ
264デフォルトの名無しさん:2005/03/25(金) 12:17:01
どうして TWriter/TReader を使わずに自分で実装するの?

書き込みは
var
 m : TFileStream;
 w : TWriter;
begin
 m := TFileStream.Create('c:\test.bin', fmOpenWrite);
 w := TWriter.Create(m, 1024);
 try
  w.WriteString('sample');
 finally
  w.Free;
 end;
 M.Free;

読み込みは
var
 m : TFileStream;
 r : TReader;
 str : string;
begin
 m := TFileStream.Create('c:\test.bin', fmOpenRead);
 r := TReader.Create(m, 1024);
 try
  str := r.ReadString
 finally
  r.Free;
 end;
 m.Free;
265255:2005/03/25(金) 12:36:42
>>264
TWriter、TReader…こんな物があったんですねぇ。
違うデータ(数値とかブーリアンとか)書く時はWriteStringとかを
別のものにすればOKと。
これで何とかなりそうです。
返答して下さった皆様、ありがとうございます。
266デフォルトの名無しさん:2005/03/25(金) 14:17:47
TMemoの実態って何で塚?
Windowsコントロールでつよね?
267デフォルトの名無しさん:2005/03/25(金) 14:35:10
実体とはなんぞや?

ウィンドウコントロールとしては Edit コントロール。
268デフォルトの名無しさん:2005/03/25(金) 16:32:43
実弟
269デフォルトの名無しさん:2005/03/25(金) 17:00:16
あるメモリ領域を動的配列へコピーする場合どの様にするのがDelphi流なのでしょうか?
現状では次のようにやってますが、何だか問題ありそうなのでツッコミ下さると助かります。

SetLength(array, size);
CopyMemory(PChar(array), pSrc, size);

270269:2005/03/25(金) 17:15:32
arrayは予約語でしたね…。読み替えて下さると助かります。
271デフォルトの名無しさん:2005/03/25(金) 17:31:44
メモリ、ポインタが出てくる時点で、どうやっても同じ。
Windows.CopyMemory の代わりに System.Move を使うくらいかな?

272269:2005/03/25(金) 17:56:58
>>271
APIやDLLへデータを引き渡す場合、どうしてもポインタでのやり取りになってしまって、
どうも泥臭くなってしまいますね。
ありがとうございました。
273デフォルトの名無しさん:2005/03/25(金) 19:34:52
質問です。
Delphi5 Enterpriseにて
Microsoft Excelのブック保護(パスワード設定)操作を行いたいのですが、
ExcelApplicationとかExcelWorkbookなどを利用すれば良いのでしょうか?
274デフォルトの名無しさん:2005/03/25(金) 20:10:53
>>273
GW
275223:2005/03/25(金) 21:34:16
>>230
 遅くなりましたがサンクスです。
 他のソフトが排他制御で使用している場合は 32
 新規ファイル作成の場合は          2
でした。
276デフォルトの名無しさん:2005/03/26(土) 03:51:59
TFilestreamとTWriterで日本語が文字化けしてしまうんですが、
対処方法ありますでしょうか。
Memo.Lines.Add(Str)でうまく表示される文字列を、Writer.WriteString(Str)
してるだけなんですが
277デフォルトの名無しさん:2005/03/26(土) 04:01:52
ちなみにWriteWideStringでも駄目です。違う文字化けにはなりますが。
元のStrの文字コードはSJISです。
278デフォルトの名無しさん:2005/03/26(土) 04:11:31
あれ・・・?普通にテキストファイルを書き込みたい場合は
TWriterじゃなさそうですね。なにを使えばいいですか?
File変数とBlockWrite?
279デフォルトの名無しさん:2005/03/26(土) 04:18:34
>>276
メモ帳で開いたら文字化けするって落ち?
280デフォルトの名無しさん:2005/03/26(土) 04:20:10
Memo.Lines.SaveToFileでどうだろう?
他にもTStringListとか、TStringStreamとか、
もちろん、TFileStreamでも出来る。
281デフォルトの名無しさん:2005/03/26(土) 04:24:27
秀丸でひらいても駄目です。つうかサイズが160KB程度のはずなのに
文字化けした奴は210KBにふくらんでる。
TStringStreamやTFileStreamではどうやるのが普通ですか?今こんな感じなんですが

fs:=TFileStream.Create('file.txt', fmCreate or fmShareDenyWrite);
writer:=TWriter.Create(fs,1024);
writer.WriteWideString('あああ');
writer.Free;
fs.Free;

これで文字化けします。
282デフォルトの名無しさん:2005/03/26(土) 04:31:25
バイナリエディタで見るとファイルの頭に06,03というバイトが入っていて、
これが原因なんじゃないかと思うんですが。
WriteString('aaa')ならバイナリエディタでは「06,03,31,31,31」です。
283デフォルトの名無しさん:2005/03/26(土) 04:35:21
tu-ka,TWriter は指定した値以外にも勝手に色々書き込むぞ。
もともとシリアライズ化のメカニズムで使用される特殊なクラスだし。
ただ文字列を書き込みたい場合は普通に

 TStream.Write(S[1], Length(S))

でいいだろ。
284デフォルトの名無しさん:2005/03/26(土) 04:41:20
もしかして、
Javaの感覚で「Fileへの書き込みにはWriterを」という勘違いが起こっていると言うだけの話?
285デフォルトの名無しさん:2005/03/26(土) 04:48:22
>>284
>>264が TWriter/TReader を推奨したからだと思われ。
286デフォルトの名無しさん:2005/03/26(土) 05:11:35
例えばこんな感じかな。

procedure TForm1.Button8Click(Sender: TObject); // 型なしファイルで「あああ」を5行書く
var
 F: File;
 S: string;
begin
 S := 'あああ'#13#10'あああ'#13#10'あああ'#13#10'あああ'#13#10'あああ';
 try
  AssignFile(F, 'file8.txt');
  Rewrite(F, 1);
  BlockWrite(F, S[1], Length(S) );
 finally
  CloseFile(F);
 end;
end;

procedure TForm1.Button9Click(Sender: TObject); // TStringList で「あああ」を5行書く
var
 SList: TStringList;
 S: string;
begin
 S := 'あああ'#13#10'あああ'#13#10'あああ'#13#10'あああ'#13#10'あああ';
 SList := TStringList.Create;
 try
  SList.Text := S;
  SList.SaveToFile('file9.txt');
 finally
  SList.Free;
 end;
end;
287デフォルトの名無しさん:2005/03/26(土) 06:09:09
ああ、なんか遠い昔にAssignFileを使った記憶が・・
ありがとうございます。それでやってみます。
288デフォルトの名無しさん:2005/03/26(土) 08:59:46
Writeln
289デフォルトの名無しさん:2005/03/26(土) 09:01:43
>>286
文字列だったらFileよりTextFileの方が良くね?
それとも、Fileの方がコスト掛からんの?
290デフォルトの名無しさん:2005/03/26(土) 14:20:39
>>289
> 文字列だったらFileよりTextFileの方が良くね?
そうなんだけど、質問した人はテキストファイルを
「バイナリファイルとして」扱いたいらしい。
TFileStream を使ってる、と上で書いてるし。
291デフォルトの名無しさん:2005/03/26(土) 14:23:27
そうだね、質問者の先を行くのは失礼だよ
292デフォルトの名無しさん:2005/03/26(土) 17:52:58
TreeView で特定のNode以下だけをsortすることできますか?
293273:2005/03/26(土) 18:03:50
すいません。。GWってなんの略ですか?
294デフォルトの名無しさん:2005/03/26(土) 18:04:57
ゴールデンウィーク
295292:2005/03/26(土) 18:30:53
できました。
自己解決しました。
296デフォルトの名無しさん:2005/03/26(土) 18:48:57
>>293
Gateway2000
297デフォルトの名無しさん:2005/03/26(土) 21:47:02
FindWindowでハンドル取得して、
他アプリのビットマップを取得する方法は無いですか?
他アプリのPrintScreenして自分のプログラムのTBitmapに
取り込みたい。SendMessageでPrintScreenしてしまうと
クリップボードを壊してしまうから、それ以外の方法で。
298デフォルトの名無しさん:2005/03/26(土) 21:50:51
>>297
ウィンドウハンドルは取得できたん?
だったら GetDC でデバイスコンテキスト取得して
API か TCanvas で取れる
299デフォルトの名無しさん:2005/03/26(土) 22:03:13
>>298
はい、他アプリをSendMessageで最小化するとかは出来てます。
GetDCとかよく分かりませんけど、今からググって勉強します。
多分、後は事故解決出切るかと。アリガトウございました。
300デフォルトの名無しさん:2005/03/26(土) 22:27:45
301デフォルトの名無しさん:2005/03/27(日) 01:43:02
>>293
ここはグリーンウッドの事じゃないかしら?
302デフォルトの名無しさん:2005/03/27(日) 21:41:21
>>149を少しだけ書き換えさせてもらって利用しているのですがトップノードが1つしかな
い場合トップノードの前には何も付けずそれ以下のノードは無駄なインデントを避けるた
めに次のようにしたのですがうまくいきません(Level > 1 でないとインデントしない)。
何ででしょ?
function ChkVerticalLine(Node: TTreeNode): String;
begin // ノードの左を通過する、親とその弟を繋ぐ縦線を再帰的に取得
 if Node.Parent <> nil then
 begin
  Result := ChkVerticalLine(Node.Parent);
  if Node.Parent.getNextSibling <> nil then
   if Node.Parent.Level > 0 then Result := Result + '│ '//これではダメ
  else
   if Node.Parent.Level > 0 then Result := Result + '  '//同上
 end else
  Result := '';
end;

procedure OutputNode(Node: TTreeNode; Strings: TStrings);
var
 S: String;
begin
 S := ChkVerticalLine(Node);
 if Node.GetPrev <> Nil then  //最初のノードでなければ
  Strings.Append(S + '│ '); //ノードとノードの間の空行
 if Node.GetPrev = Nil then  //最初のノード
  if Node.getNextSibling <> Nil then  S := S + '┌'//トップノード2つ以上
 else if Node.getNextSibling <> nil then S := S + '├'
 else                  S := S + '└';
 Strings.Append(S + Node.Text);
end;
303デフォルトの名無しさん:2005/03/27(日) 23:25:37
こういう事? こういう複雑なのは、具体的な流れを想像するとわかりやすい。
ブレークポイントを置いてみて、変数の内容が想像通りになってるかどうかで確認。

function ChkVerticalLine(Node: TTreeNode): String;
begin
  if (Node.Parent <> nil) and (Node.Level > 0) then begin
    Result := ChkVerticalLine(Node.Parent);
    if Node.Parent.getNextSibling <> nil then
      Result := Result + '│ '
    else
      Result := Result + '  ';
  end else
    Result := '';
end;

procedure OutputNode(Node: TTreeNode; Strings: TStrings);
var
  S: String;
begin
  S := ChkVerticalLine(Node);
  if Node.GetPrev <> nil then
    Strings.Append(S + '│ ');
  if Node.Level > 0 then begin
    if Node.getNextSibling <> nil then
      S := S + '├'
    else
      S := S + '└';
  end;
  Strings.Append(S + Node.Text);
end;
304デフォルトの名無しさん:2005/03/27(日) 23:39:51
Delphi personalの日本語版の最新ってどれですか?
私は今Del6Personalを使ってるんですが、アップグレードしたいんです。
305デフォルトの名無しさん:2005/03/28(月) 00:16:34
指定したフォルダの中身だけを削除するにはどうしたらいいんですか?
306302:2005/03/28(月) 00:27:16
>>303
// if Node.GetPrev <> nil then Strings.Append(S + '│ '); 無視しする
うーんとですね。トップノードが複数のときはこんな風になり(これは問題ない)
┌家康
│ ├秀康
│ ├秀忠
│ │ ├家光
│ │ └秀長
│ └義直
├秀吉
│ └秀頼
└信長
  ├信雄
  └信孝
トップノードが1つのとき、家康の頭に何もないだけLevel=1のインデントが余分なので
家康
  ├秀康
  │ └忠直
  ├秀忠
  │ ├家光
  │ └秀長
  └義直
なってしまいます。これを
家康
 ├秀康
 │ └忠直
 ├秀忠
 │ ├家光
 │ └秀長
 └義直(尾張)
としたいのです。
307デフォルトの名無しさん:2005/03/28(月) 00:37:45
>>305
「FindFirstで回して、ファイルだけ削除する」…
以外に何か方法あるのかな。
オレにはソレしか思いつかないな。
308デフォルトの名無しさん:2005/03/28(月) 00:46:00
>>304
Delphi7 Personal(有償)です。
309デフォルトの名無しさん:2005/03/28(月) 02:38:12
>>306
function ChkVerticalLine(Node: TTreeNode): string;
begin
  if Node.Parent <> nil then begin
    Result := ChkVerticalLine(Node.Parent);
    if Node.Parent.getNextSibling <> nil then Result := Result + '│ '
    else if Node.Parent.Level > 0 then Result := Result + '  ';
  end
  else Result := '';
end;

procedure OutputNode(Node: TTreeNode; Strings: TStrings);
var
  s: string;
begin
  s := ChkVerticalLine(Node);
  if Node.GetPrev = nil then begin
    if Node.getNextSibling <> nil then s := s + '┌';
  end
  else begin
    Strings.Append(s + '│ ');
    if Node.getNextSibling = nil then s := s + '└'
    else s := s + '├';
  end;
  Strings.Append(s + Node.Text);
end;
310デフォルトの名無しさん:2005/03/28(月) 03:09:38
>>308
Del7Personalって無料版はないんですね。
しかたないので有料版を購入しました。
Del2005Personalでも出してくれたら嬉しいんですが。
311デフォルトの名無しさん:2005/03/28(月) 10:35:54
>>310
ドイツやイギリスではイベントで配布しているようですが・・・
312302=306:2005/03/28(月) 18:21:41
function ChkVerticalLine(Node: TTreeNode): String;
begin
 if Node.Parent <> nil then
 begin
  Result := ChkVerticalLine(Node.Parent);
  if Node.Parent.getNextSibling <> nil then Result := Result + '│ '
  else
  begin
   if Node.Parent.GetPrev = Nil then Result := Result + ' '//TopNode1つのとき
   else               Result := Result + '  '
  end;
 end else
  Result := '';
end;
procedure OutputNode(Node: TTreeNode; Strings: TStrings);
var
 S: String;
begin
 S := ChkVerticalLine(Node);
 if Node.GetPrev <> Nil then  //最初のノードでなければ
  Strings.Append(S + '│ '); //ノードとノードの間の空行
 if Node.GetPrev = Nil then  //最初のノード
 begin
  if Node.getNextSibling <> Nil then    S := S + '┌'
 end else if Node.getNextSibling <> nil then S := S + '├'
 else                    S := S + '└';
 Strings.Append(S + Node.Text);
end;
313デフォルトの名無しさん:2005/03/28(月) 19:12:05
凄く初歩的なので大変恐縮なのですが教えてください。
データ元の配列から数値を取り出し、ソート用配列の先頭から昇順になるよう
ソートするプログラムです。下記で実行するとデータが正しく返ってきてくれません。
よろしくお願いします。
var
//Arr : Array[0..19] of integer; //データ元配列 privateで宣言して別の部分でデータを格納しています
Sort : Array[0..19] of integer; //ソート用配列
i,j,k,Min0,Min : integer;
begin
Min0 := Arr[0];
for i := 1 to (Count -1) do
begin
if (Arr[i] < Min0) then
begin
Min0 := Arr[i]; //Sort配列の先頭、データ元配列の最小値
end;
Sort[0] := Min0;
end;

for j := 0 to High(Arr) do
begin
Min := Arr[j];
for k := 0 to High(Arr) do
begin
if (Min0 < Arr[k]) and (Arr[k] < Min) then
begin
Sort[j +1] := Arr[k];
Min0 :=Arr[k]; //次ループの下限
end;
end;
314デフォルトの名無しさん:2005/03/28(月) 19:34:39
宿題は自分でやろうね。
315デフォルトの名無しさん:2005/03/28(月) 20:12:24
これは・・・配列とか勉強しなおしたほうがいいんじゃね。
316デフォルトの名無しさん:2005/03/28(月) 21:01:53
>>313
type
 SortData = array[1..50000] of integer;
var
 Udt: SortData;
const
 SortMax = 50000;

procedure IntQuickSort(left,right: Integer; var Sdt: array of Integer);
var
 s,i,j,temp: Integer;
begin//クイックソート
 if left < right then
 begin
  s := Sdt[(left+right) div 2];  // 中央値を軸にする
  i := left;  j := right; // 軸より大きいグループと小さいグループに分ける
  while true do
  begin
   while Sdt[i] < s do Inc(i);
   while Sdt[j] > s do Dec(j);
   if i >= j then break;
   temp := Sdt[i];  Sdt[i] := Sdt[j];  Sdt[j] := temp;
   Inc(i); Dec(j);
  end;
  IntQuickSort(left,i-1,Sdt); IntQuickSort(j+1,right,Sdt);
 end;
end;
317デフォルトの名無しさん:2005/03/28(月) 21:02:48
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 i,x: Integer;
begin//配列にランダムなデータをセット
 Randomize;
 for i := 1 to SortMax do
 begin
  x := Round(Random*1000);
  if x < 1000 then Udt[i] := x;
 end;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
 IntQuickSort(0,High(Udt)-1,Udt);
end;
318デフォルトの名無しさん:2005/03/28(月) 22:35:39
質問させてください。
dllからFormを動的生成するのはどうしたらいいのでしょうか?
方法を探したりしたんですが全然ありませんでした。
319デフォルトの名無しさん:2005/03/28(月) 23:04:25
>>305
SHFileOperation()
じゃだめ?

>>318
「Delphi 4 プログラミングバイブル」
にDLL内にクラスをつくるための記述があったと思うけど、今手元にない。

320デフォルトの名無しさん:2005/03/28(月) 23:19:26
全くの初心者です、こんばんは。
これマスターするためには実践しながら勉強するのが一番早いと思うのですが
生憎本当に何もわからないため何を実践すればいいのかわかりません。

勉強用にどんなことすればいいか教えてかださい。
321デフォルトの名無しさん:2005/03/28(月) 23:24:32
>>320

>>225の3
322デフォルトの名無しさん:2005/03/28(月) 23:26:22
>>320
くだすれDelphi(超初心者用)の過去ログを全部読む。
323320:2005/03/28(月) 23:32:19
とりあえず暇はあるのでくだすれ読めるだけ読んで>>225の3とやらを頑張ってみます。
ありがとございました。
324デフォルトの名無しさん:2005/03/28(月) 23:41:56
降参、教えてください。

他のアプリのハンドルは取得してるのですが、
その他のアプリをアクティブ化するためには、
SendMessageをどう記述すればよいのですか?

というよりこういうAPI関係の基礎っぽいことは
どうやって勉強するのですか?ググっても分かりません。
325デフォルトの名無しさん:2005/03/28(月) 23:54:14
>>324
焦んなって。
そんなパッと始めて、パッと出来るようになるヤツなんていないって。
どうしてそんなに急くのか分からん。
地道に検索して、色々試してがんばればいいじゃないか。
それとも釣りか?
326デフォルトの名無しさん:2005/03/28(月) 23:59:40
そんなこと言ったらこのスレ不要だしw
327デフォルトの名無しさん:2005/03/29(火) 00:01:52
地道に検索して、色々試してがんばってなお分からないから「降参」なんだおr
328デフォルトの名無しさん:2005/03/29(火) 01:05:30
分かった。SetForegroundWindowだな。
場合によってはタスクバーで点滅するだけで、
望んだ機能にはならんかったけど、
これWinAPIの限界っぽい。
329デフォルトの名無しさん:2005/03/29(火) 01:33:45
ファイルはDeleteFileで削除できますが、
フォルダの削除はどうすればいいですか?
330ななしへたぐらま ◆XcB18Bks.Y :2005/03/29(火) 01:51:55
>>329
SHFileOperationというAPIを使います.
ちょっとぐぐってみただけですが,このあたりが参考になると思います.
ttp://www.borland.co.jp/qanda/delphi/d0009408.html
ttp://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=6#0275.txt

なお空(から)のフォルダの削除なら RmDir 手続きで可能です.
331151:2005/03/29(火) 05:37:16
>>324
procedure Hige(hWnd: HWND);
begin
 if IsIconic(hWnd) then
 begin
  ShowWindowAsync(hWnd, SW_RESTORE);
 end;
 SetForegroundWindow(hWnd);
end;

これでどう
332デフォルトの名無しさん:2005/03/29(火) 05:38:18
( ´∀前質問したときの名前残ってた…(・ε・)キニシナイ!!で下さい
333デフォルトの名無しさん:2005/03/29(火) 10:38:25
>>318
新規作成でダイナミックリンクライブラリを選択して、
更にこのプロジェクトへフォームの新規作成でフォームを一枚追加。そのFormのUnitへ

var
Form1: TForm1;
procedure ShowForm; stdcall;export;

implementation
{$R *.DFM}

procedure ShowForm;
begin
 Form1 := TForm1.Create(Application);
 Form1.ShowModal
end;

と記述追加。あとはDLLプロジェクトファイル内で上記のForm表示用手続きをexportsさせる。

exports
 ShowForm;
begin
end.

と記述。で、コンパイルでDLL作成。

これを動的に呼びたければ

http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm#dlluse

みたいにexe側から呼び出す。
自分の書いたのから抜き出して変更したので間違ってたらスマソ。
334デフォルトの名無しさん:2005/03/29(火) 10:40:54
静的に呼び出しでよければこれとか。
http://oto.chu.jp/kujira/text/delphi/dll.htm
335デフォルトの名無しさん:2005/03/29(火) 12:24:31
Delphi.NETって使ってない人多そうだから回答来ないかもしれないし、
逆に聞き返されるかもしれないから詳しく書いてみる。
D8の時点では、一つの名前空間に複数のクラスを入れたい場合、
ユニット名=名前空間なDelphiだけの仕様のせいで、
一つのユニットにそれらのクラスをすべて書かなきゃいけなかった。
なので、EXEタイプのアプリ作成ならDelで良くても、
DLLだと、ソース管理が面倒か、名前空間が多すぎるものしか作れなかった。
さて、D2005では、namespace1.class1と、namespace1.class2を、
ユニットnamespace1にまとめて書くには長すぎる場合、
二つのユニットにわけて書けるようになったのかね?
336デフォルトの名無しさん:2005/03/29(火) 12:37:27
すいませんTTabControlでMultiLineをtrueにすると
複数行タブが表示されるのはいいんですけど
タブをクリックするたびにタブが勝手に移動するのがうっとおしいので
タブを固定させたいのですがやり方教えてください
337デフォルトの名無しさん:2005/03/29(火) 12:40:08
ドットエディタみたいな描画パレットに、DrawGridを使った時、
ファイルをロードしてDrawGridに出力するにはどうすればいいですか?
338デフォルトの名無しさん:2005/03/29(火) 12:47:10
>>337
OnDrawCellでTBitmapのPixelsプロパティの色で塗ればええんでないの。
339デフォルトの名無しさん:2005/03/29(火) 12:51:44
>>336
ScrollOppositeのヘルプを読んだ上で、好みの動作が実現できないようなら、
StyleをtsTabs以外に変更することで、別のタブ動作に変える。
Windowsの仕様なので、それでも気に入らなければ、好みのタブを自作。
340336:2005/03/29(火) 12:57:11
>>339
StyleをtsTabs以外にしたら思ってた動作になりました
ありがとうございました
341318:2005/03/29(火) 12:57:29
>>333-334
ありがとうございました!
Form作成できました。
342デフォルトの名無しさん:2005/03/29(火) 14:17:29
Indy9のIdPOP3.Connectでエラーを感知するには
どうすればいいでしょうか?
ヘルプには接続または認証の間に例外が発生した場合,
ソケットは切断(Disconnect)されて,例外が再び生成されます。
とありますが、try..exceptを使うのでしょうか?
どのように書けばいいのか誰か教えてください。
343デフォルトの名無しさん:2005/03/29(火) 15:39:19
try
  connect(5000);
except
  showmessage('だめぽ');
end;
でやってる。詳細なエラーを拾うやり方は知らないので
デモでも調べてくれい。
344デフォルトの名無しさん:2005/03/29(火) 16:10:02
既出かもしれないけど、公式ページに騙された
つうか自分でちゃんと考えなかった俺が低脳なんだけどorz
ttp://www.borland.co.jp/qanda/delphi/d0002946.html

> べき乗演算はどうすればよいでしょうか?
> X の Y 乗を計算するには,Exp(X * Ln(Y)) とします。

機械工学の計算プログラム作ってたら
ありえない数値が出ちゃってどうしてだろうと悩んでて
これじゃYのX乗だということに今更気がついた。
345ななしへたぐらま ◆XcB18Bks.Y :2005/03/29(火) 16:29:11
>>313
最初に一番小さな数を探してそれを先頭に持ってきて,
次に2番目に小さな数を探して2番目に持ってくる,
以後これを繰り返す…という考え方はやり方のひとつとして間違っていませんよ.

ただ,別の配列に要素をコピーするよりも
元の配列の要素を直接入れ替える方がわかりやすいですよ.

procedure SortNumbers(var Numbers: array of integer);
var
 i, j: integer;
 MinIndex, MinValue: integer; { 値が一番小さな配列の要素とその値 }
begin
 for i := 0 to High(Numbers) - 1 do
 begin
  {◆Numbersの要素 i から最後の要素までの中で値が一番小さな要素とその値を探します.}
  MinIndex := i;
  MinValue := Numbers[i];
  for j := i + 1 to High(Numbers) do
   if Numbers[j] < MinValue then
   begin
    MinIndex := j;
    MinValue := Numbers[j];
   end;
  {◆Numbers[i] とNumbers[MinIndex] の値を入れ替えます.}
  Numbers[MinIndex] := Numbers[i];
  Numbers[i] := MinValue;
 end;
end;

ソートのやり方にはいろいろありますが>>315-316のクイックソートがよく使われるようです.
346デフォルトの名無しさん:2005/03/29(火) 17:26:51
>>343
hostアドレスが間違った場合の
タイムアウトはそれで感知できますね。。
hostアドレスが正しくて
usernameが不正だったりpasswordが不正だった場合は
EIdProtocolReplyErrorがでてから”だめぽ”となりました。
これをデバッガオプションの言語固有の例外として
登録すると表立ってエラーはでませんが、
このやり方って正しいんでしょうか?


347デフォルトの名無しさん:2005/03/29(火) 17:58:42
>>346
デバッグ時のみの問題なので、無視したいなら言語固有例外で逃げれ

(´-`).。oO(except on e:EIdProtocolReplyError で捕獲できるかも
348デフォルトの名無しさん:2005/03/29(火) 23:18:37
byte形式のデータの入った配列、例えば
hairetu[0] := $82
hairetu[1] := $A0
hairetu[2] := $82
hairetu[3] := $A2
hairetu[4] := $82
hairetu[5] := $A4
があるとして、
これを順番に並べて「あいう」と表示されるテキストとし、最終的にstring変数に入れたいのですが、
どのようなコードを書けば良いのでしょうか…?

よろしかったらご教授ください。
349デフォルトの名無しさん:2005/03/29(火) 23:28:49
>>348

var
hairetu : array[0..5] of byte;
pch : pchar;
str : string;
begin

//ここまでにhairetuに代入済み
pch := pchar(@hairetu) ;//キャストなくてもコンパイル通るかも
str := pch ;

ってなとこかいな。
350デフォルトの名無しさん:2005/03/29(火) 23:38:11
あ、これじゃヌル文字入ってないからあかんかも。
hairetuの要素を7個にして、hairetu[6]に、$00を入れてやれば確実。
hairetuの要素数を8個以上にして、最後の部分を$00で埋めてやっても一緒だよん。

あるいは、
var
hairetu : array[0..5] of byte;
str : string;
i:integer;
begin

//ここまでにhairetuに代入済み
str := '' ;
for i:=0 to 5 do
begin
str := str + char( hairetu[ i ] );
end ;

のほうがわかりやすいかな。
351348:2005/03/29(火) 23:47:40
>>349,350
素早い反応ありがとうございます!
早速試してみたらうまくいきました。
これで作業を再開することができます。本当に感謝です!
352デフォルトの名無しさん:2005/03/30(水) 01:54:15
SetString とか使おうよ。
353デフォルトの名無しさん:2005/03/30(水) 02:04:47
var
hairetu : array[0..5] of byte;
str : string;
begin

//ここまでにhairetuに代入済み
str := '' ;
setstring( str , pchar( @hairetu ) , length( hairetu ) ) ;

かね?
354335:2005/03/30(水) 08:54:25
よろ
355デフォルトの名無しさん:2005/03/30(水) 09:43:59
2005 をまじめに使っている人は日本にはいない。ということですかね。
356デフォルトの名無しさん:2005/03/30(水) 15:30:59
>>337
ありがとうございます。 粘ったのですがOnDrawCellの使い方でちんぼつでつ。(-_-;)
357デフォルトの名無しさん:2005/03/30(水) 16:00:33
>>355
アップデート2待ちかな。
358デフォルトの名無しさん:2005/03/30(水) 18:57:05
6Personalでの質問ですが 
ShellTreeViewのに、別のパスを文字列として渡して
ShellTreeViewのカレントパスを変更したいんですが、
やり方が分かりません。

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShellTreeView1.Path := 'C:\Winnt';
 ShowMessage(ShellTreeView1.Path);
end;

こんな感じでPathを指定してやっても、
変更されずに、現在のパスのままです。

ぐぐってみたらShellCtrls.pas内のTCustomShellTreeView.SetPathのとこに
記述してあるFUpdating := True;をコメントアウトすればいいようなことを
海外の掲示板に書いてあったんですが、試してみてもうまくいきません。

どうすればいいのか、誰か教えてださいです。
359デフォルトの名無しさん:2005/03/30(水) 19:54:40
shelltreeveiwいい加減なので自分で作り直した
それが、俺のpascalスキルが向上したたきっかけだな
360デフォルトの名無しさん:2005/03/30(水) 20:38:05
>>358
http://www.bekkoame.ne.jp/~itotaka/
この人のものを使ったら。
DelphiがShellコンポを組み込んだのはD6からだがこの人はD5の時代に作っていた。
D5用とD6用があるが別に俺は今もD5用のものを使っている。
361デフォルトの名無しさん:2005/03/30(水) 21:10:02
>>331お、お、おっ、凄いっす!完璧っす!
自分もこんな風に教えれる人になりたいっす!

>>332( ´∀`)σ)∀`)
362358:2005/03/30(水) 23:59:37
>>360
ありがとうございます。
そのツリーコンポーネント軽いしいいですね。
お陰さまで、パスを文字列として渡すことに成功しました。
今から、ShellTreeViewだった部分をみんなItoShTreeViewに
置き換えてみます。
363 デフォルトの名無しさん:2005/03/31(木) 00:16:13
FromDate,FromTime,ToDate,ToTimeの4項目より
経過時間を分で取得したいのですが、正しい値を持ってきてくれません。
現在↓の様に記述しています。

function GetDateTimeSabun(gDtF,gDtT : TDate; gTMF,gTMT : TTime;
out gSabunM : Integer ):Boolean;
var
DTM_F,DTM_T : TDateTime;
begin
Result:= False;
try
DTM_F := gDtF + gTMF;
DTM_T := gDtT + gTMT;

gSabunM := MinutesBetWeen(DTM_F,DTM_T);

Result :=True;
except
Exit;
end;
end;

ここでとまってしまって先へ進めない状態です。
どなたか教えてください、よろしくお願いします。
364デフォルトの名無しさん:2005/03/31(木) 03:13:09
>>363
WINAPIで各時間のFILETIME取ってきて現在時間-開始時関すれば簡単じゃないか?
365デフォルトの名無しさん:2005/03/31(木) 03:16:35
TDateとTTimeの足し算がおかしいんじゃないの?
EncodeDateTime使って変換すればいいと思うがスマートじゃないよなあ
366デフォルトの名無しさん:2005/03/31(木) 03:52:33
Del7Personalってフリーでダウンロードできないんですか?
キーは入手できるんですが、肝心の本体がありません。
367デフォルトの名無しさん:2005/03/31(木) 04:00:31
>>366
できません。

以前、海外の雑誌に外国語版が収録されていたとか聞くな。
当然日本語版は存在しない。
368デフォルトの名無しさん:2005/03/31(木) 05:34:06
お勧めの本あるますか?
369デフォルトの名無しさん:2005/03/31(木) 05:58:39
言語ガイドとVCLソースとML過去ログ。
370デフォルトの名無しさん:2005/03/31(木) 07:45:54
tumriwarezertu-hosimasuta
371デフォルトの名無しさん:2005/03/31(木) 13:18:23
>>366
D6 PersonalとD7 Personalって、中身は変わらないと思うよ。

>>368
http://onigiri.s3.xrea.com:8080/delphi/index.php?Delphi%B4%D8%CF%A2%BD%F1%C0%D2
372デフォルトの名無しさん:2005/03/31(木) 13:29:09
現在、唯一普通に本屋で売ってそうな、この間出たばっかりのDelphi2005本見てきたけど、
モノクロでCD-ROMも付いていないであの値段ってのはな。

Del6の頃までに出た入門者用の本、復刊して欲しいよ。
373デフォルトの名無しさん:2005/03/31(木) 14:06:55
ソースネクストの 1980円シリーズになったら買うかい?
374ななしへたぐらま ◆XcB18Bks.Y :2005/03/31(木) 15:09:01
>>363
この関数に渡したデータは正しいですか?DTM_FとDTM_Tの値は意図したとおりの日時を示していますか?

かなり昔,DateTimePickerコンポのDateプロパティとTimeプロパティの値が
どちらも日時を返してくるのに面食らった経験がありますが,もしかしたら….



あと,例外報告を無条件に握りつぶすのはバグの温床になります.
MinutesBetWeen関数が生成するクラスの例外だけをトラップするようにしてください.

 on <MinutesBetWeen関数が生成する例外クラスの名前> do exit;

※この関数はDelphi 5にはないのでどのクラスの例外を生成するのかわかりませんが
 多分ヘルプに書いてあると思います.または例外をトラップしないで動かせばわかります.
375デフォルトの名無しさん:2005/03/31(木) 16:28:16
indyなどでhtmlをゲットした結果と、IEの"ソースの表示"を比べると、
内容が微妙に違います(主に改行が)。
"ソースの表示"と同じ結果を得るには、どうすればいいのでしょうか?
ご教授ください。。
376デフォルトの名無しさん:2005/03/31(木) 16:50:26
OpenJane落としてきたけど
そのままじゃコンパイル出来ない
なんとかしてよ!
377デフォルトの名無しさん:2005/03/31(木) 17:48:42
>>375
「ソースの表示」は何で表示させてる?メモ帳?
メモ帳は CRLF しか改行として扱ってくれないので表示がおかしいのは仕方無いかも。
Indy で取得した内容を TMemo に入れると LF のみでもちゃんと改行として認識して
くれるのでメモ帳みたいに変なことにはならないはず。
「ソースの表示」じゃなく「名前を付けて保存」で保存したファイルを比べてみてください。

>>376
http://www.geocities.co.jp/SiliconValley-Cupertino/2486/
378デフォルトの名無しさん:2005/03/31(木) 21:10:59
>>375
procedure Get(AURL:string; const AResponseContent:TStream); overload;
の方を使って、TMemoryStreamに読み込めばオリジナルの情報だとおもう。
文字列に入れてしまうと、内部で変換されるかもしれないので。
379デフォルトの名無しさん:皇紀2665/04/01(金) 01:14:16
今日サポートに電話して聞いてみたけど
Delphi2005J Personal6月ダウンロード開始だってさ
380デフォルトの名無しさん:皇紀2665/04/01(金) 01:27:06
あれ、俺は今日からDelphi2005J Personal6月ダウンロード開始って聞いたぞ!
381デフォルトの名無しさん:皇紀2665/04/01(金) 05:08:51
>>379
>>380
まじレスですが、
http://www.borland.com/products/downloads/download_delphi.html
のDelphi 2005 Architect Trialをダウンロードして
インストーラー中のダイアログのpersonal Editionにチェックを入れてインストールすればいいだけですよ。
詳しくはreadmeに従ってください。
382デフォルトの名無しさん:皇紀2665/04/01(金) 05:59:43
今日は皇紀2665/04/01。 >381
383デフォルトの名無しさん:皇紀2665/04/01(金) 07:20:02
384デフォルトの名無しさん:皇紀2665/04/01(金) 12:22:25
>>381
あうあう。エイプリルフールじゃなくてホントだとぃぃなぁ。
385デフォルトの名無しさん:皇紀2665/04/01(金) 12:46:37
もう少し待てば何か有るよ。
386デフォルトの名無しさん:皇紀2665/04/01(金) 14:54:32
WideChar型について質問です。

WideChar型の変数に特定のマルチバイト文字を代入したい場合、
コードを指定する以外にシンプルに記述する方法はないのでしょうか?
普通にシングルクオテーションマークで囲んでも、
String型になってしまうため代入できないことに初めて気づきました。
今は非効率的で馬鹿みたいですが、次の方法で代替しています。

WC := PWideChar(WideString('あ'))^;
387デフォルトの名無しさん:皇紀2665/04/01(金) 17:39:46
ないです。
五十歩百歩で
WideString('あ')[1]
かな
388デフォルトの名無しさん:皇紀2665/04/01(金) 18:02:12
>>387
ありがとうございます。
そちらの方がいくぶんかすっきりしていますね。

それにしても、Delphiでは文字型も文字列型も
同じシングルクオテーションで表現できてしまうのが、
実に気持ち悪いです。
389デフォルトの名無しさん:皇紀2665/04/01(金) 18:13:33
それにしても、日本語ではlikeもloveも
同じ「好き」で表現できてしまうのが、
実に気持ち悪いです。
390デフォルトの名無しさん:皇紀2665/04/01(金) 18:25:05
それにしても、英語ではトロもイワシも
同じ「fish」で表現できてしまうのが、
実に気持ち悪いです。
391デフォルトの名無しさん:皇紀2665/04/01(金) 18:27:03
>>388
' と " を区別しなくてもよいから慣れると便利。

最大の問題点はそれではなく、WideChar と AnsiChar があいまい、指定できないこと。
C/C++ のように L 付き文字定数を導入できたらよかったのだが
392デフォルトの名無しさん:皇紀2665/04/01(金) 18:36:31
>>391
同意です。
WideChar型、WideString型をダブルクオテーションで囲み、
AnsiChar型、AnsiString型と区別できるようになればいいなって思います。
393デフォルトの名無しさん:皇紀2665/04/01(金) 19:06:18
UTF-8の時代に何言ってんだタコども
394デフォルトの名無しさん:皇紀2665/04/01(金) 19:44:50
>>393
UTF-16マンセー
395デフォルトの名無しさん:int 2ch =05/04/01(金) 20:20:37
ま、文字列と何文字目かを入力して、文字を返す関数を作ろうよ、ということで。
396デフォルトの名無しさん:2005/04/02(土) 22:37:22
文字列を入力したらその文字列の1文字目をWideChar型で返す関数をつくるとか。
397デフォルトの名無しさん:2005/04/03(日) 01:38:31
ほんとにDel2005Personalフリー版って出るの?
398デフォルトの名無しさん:2005/04/03(日) 01:43:29
惜しかったね、4/1限定でダウンロードできたのに。
399デフォルトの名無しさん:2005/04/03(日) 04:07:49
2005人限定だったのにね
400バグなのか:2005/04/03(日) 07:50:06
TEditに
HKKANATOHANK
(小文字でもいっしょ)
入力しても
HKKANATOHAN
までしか入力できません。
右HKKANATOHANK左
のようにするとOKです。ちょっと確認したら他のソフトもそうでした。
ですからブラウザでぐぐりたくてもEditコントロールを使っているので
検索できません。ギコナビなどの窓アプリの書き込みウィンドウでの名前
E-mail 欄でもできません。
ブラウザで見ているこの掲示板の名前、E-mail 欄にはできますが、これは
たぶんCGIで作成されているからでしょう。
401400:2005/04/03(日) 09:15:26
 すいません。↑の件はわすれてくだはい(w
 デフラグを実施したまま使っていたのですが、一部ファイル名等が文字化けしていたので
そのせいだと思います。再起動したら直りましたです。
402デフォルトの名無しさん:2005/04/03(日) 14:26:01
>>397
Del2005Personal「フリーダウンロード」版は出ません。US Newsgroup でそういう趣旨の説明が
出ています。その代わり雑誌やイベント等、マーケッティング上で意味を持つ形で配布することに
なっている。そうです。

ドイツでは、雑誌に CD が付いたり、イベントで配布したりされています。
日本での予定は知りません。だれかボーランドに問い合わせませんか
403くそプログラマー:2005/04/03(日) 18:42:14
Q:どの様にして下記を実現させられますか?

・フォームにLabel1とImage1しかない画面である。
・[マイドキュメント]-[My Pictures]に画像ファイルがあるとする。gif, bmp, jpg等

<実現したい事>
・上記のフォルダー[My Pictures]が開いた状態で、
 画像ファイルを、デルファイで生成されたexeのフォームにドラッグ&ドロップされると、
 自動的に、Image1へプレビューされて、その絶対パスがLabel1へ反映される。


バージョンは、Delphi6パーソナルを使用しています。

※一番の問題点は、たったこのドラッグ&ドロップでの画像プレビューの為に、
3日たっても調べきれなかった当方だとは思いますが、真剣に悩んでおります。
御助力よろしくお願いいたします。
404デフォルトの名無しさん:2005/04/03(日) 18:48:07
 TRadioGroupでリストが15項目ある時、フォントカラーを1番から5番までは青、5番
から10番までは緑、それ以降は黒というようにするにはどうしたらいいでしょう。
405デフォルトの名無しさん:2005/04/03(日) 20:30:05
>>403
困難の分割で、
・フォームへのドラッグ&ドロップを受け取る方法
・画像を表示する方法
を別々に調べて、それを組み合わせる。
これらの方法の説明は、腐るほどWeb上にある。

そのぐらいの応用もできないなら、向いてない気がする…

>>404
RadioGroup1.Buttons[0].Font.Color := clRed;
RadioGroup1.Buttons[1].Font.Color := clGreen;
RadioGroup1.Buttons[2].Font.Color := clBlue;
で、0番目が赤、1番目が緑、2番目が青になる。
406デフォルトの名無しさん:2005/04/03(日) 22:58:48
> RadioGroup1.Buttons[0].Font.Color := clRed;
俺D5なんです。Buttonsプロパティはないですね。
しかたないのでRadioButtonをシコシコ使います。
407デフォルトの名無しさん:2005/04/03(日) 23:04:57
TStringsに文字列を入れて、
各行に特定の文字列があるかどうかを調べてます。
その際、今はこんな感じでやってますが、もっと効率的な方法はありますか?
ありましたら、是非教えてください。
for i:= 0 to StringList.Count - 1 do
begin
 if AnsiPos('hoge', StringList[i]) <> 0 then
  ShowMessage('Hoge!');
end;
408デフォルトの名無しさん:2005/04/03(日) 23:48:23
>>407
ない。
409デフォルトの名無しさん:2005/04/04(月) 00:17:56
それで十分なら、それが一番楽だと思いますよ。
410デフォルトの名無しさん:2005/04/04(月) 00:20:08
そうですか…ありがとうございました
411デフォルトの名無しさん:2005/04/04(月) 02:37:16
もしかして、文字列照合とかやりたいわけ?
そういうのと比べると、AnsiPosやPosは遅いよ。
お使いのDelphiにあるかどうか知りませんが、もし無いなら
http://www.google.com/search?q=Boyer-Moore%96%40&num=50&ie=Shift_JIS&hl=ja&lr=&lr=
でも見て勉強する。
412デフォルトの名無しさん:2005/04/04(月) 02:46:40
AnsiStrPos内部で使われているStrLenに時間がかかるって話をどこかで聞いた。
413デフォルトの名無しさん:2005/04/04(月) 04:05:07
>>403
こんなので試してみた。uses 節に 'ShellAPI' を追加して、TForm1 の private あたりに
 DropMessage(var Msg: TMsg; var Handled: Boolean); を追加する。

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnMessage := DropMessage; // メッセージを処理する関数を指定する
 DragAcceptFiles(Panel2.Handle, True); // ファイルがドロップされるコンポーネントを指定する
 DragAcceptFiles(Image1.Canvas.Handle, True); // この例では、Panel2 の上に Image1 がある
end;

procedure TForm1.DropMessage(var Msg: TMsg; var Handled: Boolean); // メッセージを処理する自前の関数
var
 FName: array[0..255] of Char;
begin
 Handled := True;
 if Msg.message <> WM_DROPFILES then begin // メッセージは別のものだった
  Handled := False;
  exit;
 end;
 try // ファイル名を取得する
  DragQueryFile(Msg.wParam, 0, FName, SizeOf(FName) );
 finally
  DragFinish(Msg.wParam);
 end;
 try // ファイルを開く
  Image1.Picture.LoadFromFile(FName);
  Label1.Caption := FName;
 except
  MessageBox(Handle, '指定されたファイルは開けません.', 'エラー', MB_OK or MB_ICONSTOP);
 end;
end;
414デフォルトの名無しさん:2005/04/05(火) 03:11:39
>  DragAcceptFiles(Image1.Canvas.Handle, True);

DragAcceptFiles にデバイスコンテキスト指定すんのって何?
415デフォルトの名無しさん:2005/04/05(火) 07:40:39
>>414
愛でしょ。
416デフォルトの名無しさん:2005/04/05(火) 08:54:40
TDateTimePickerって、和暦も可能でつか?
その場合、他国語対応というか、その国の暦にするにはどうすれば良いのでしょうか?
417デフォルトの名無しさん:2005/04/05(火) 09:59:05
OS が多国語対応していて、かつ必要な国のサポートファイルをインストールしていれば可能。

すなわち、W2K 以降で、コントロールパネルの地域の設定で適切な言語を設定していれば OK.
418デフォルトの名無しさん:2005/04/05(火) 10:35:44
Winsowsのエクスプローラで、「詳細表示の設定」にあるのはCheckListBoxですか?
その項目を選択したときに、下にある「選択した列の幅」のEditと連動させるのはどうやるのでしょうか?
419デフォルトの名無しさん:2005/04/05(火) 12:20:05
>>418
TCheckListBox.OnClick
420厨房:2005/04/05(火) 12:32:51
>>416
どうしてもできなかったら時差を求めて足したり引いたりすりゃいいと思うww

>>418
その項目をクリックした時の動作を書けばいいじゃんwww
421デフォルトの名無しさん:2005/04/05(火) 12:39:15
>>418
その部分は TCheckListBox じゃない。
TListView の ViewStyle を vsReport, ShowColumnHeader を False,
CheckBoxes を True にすれば同じものができる。
OnChange イベントでフォーカスが変わったことを検出する。
422くそプログラマー:2005/04/05(火) 13:02:22
 何とか出来たっぽいです。
ご協力、深く感謝いたします。
>>405
キーワードによる検索で、確かに似たようなPGは見つかりましたが、(それくらい調べてます)
 初心者には、どの部分だけが必要で、どの部分が不必要なのかの区別が出来にくいのです。
 その辺を、どうかご了承下さい。
しかし、困難の分割という発想は、非常に勉強になりました。ありがとうございます。
 ”ドラッグされたファイルを出すだけ”をひとつの関数等だと思っていた私の固定観念でした。

 あと、向いてないのは分かっていますが、自分で選んだ職業なので、
他の足をひっぱらない様なプログラマーになろうと努力している結果なのです。
ご了承下さい。

>>413
大変にありがとうございます。深く感謝しております。
 分かりやすくコメントまで付けて頂いて感激しております。
 特にuses の'ShellAPI' 追加とか、
try // ファイル名を取得する
  DragQueryFile(Msg.wParam, 0, FName, SizeOf(FName) );
 辺りが、私が欲しいPGをついておりました。
 厚く御礼申し上げます。
423デフォルトの名無しさん:2005/04/05(火) 13:13:24
//---------------------------------------------------
追伸:上記の協力を得て、尚且つ自分で調べた結果、一応効率よく動いたPGです。
    後者の為にも、残しときます。
//---------------------------------------------------
// 画像簡易表示ソフトの勉強
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellAPI, StdCtrls, ExtCtrls ;
type
TForm1 = class(TForm)
Panel1: TPanel; // 絶対パスを表示させる為のスペースの確保
Panel2: TPanel; // 画像 を表示させる為のスペースの確保
Label1: TLabel; // Panel1の上に乗っている。
Image1: TImage; // Panel2の上に乗っている。
Button1: TButton; // フォームを閉じる為のボタン
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
// ドラッグ&ドロップ処理
procedure DropFiles(var Msg: TMessage); Message WM_DROPFILES;
public
{ Public 宣言 }
end;
var Form1: TForm1;
implementation
424くそプログラマー:2005/04/05(火) 13:15:56
procedure TForm1.FormCreate(Sender: TObject);
begin
// *** 初期化 ***
Form1.Caption := '画像簡易表示ソフトのお勉強';
Panel1.Caption := '';
Panel2.Caption := '';
Label1.Caption := '';
Button1.Caption := '閉じる';
// **************

DragAcceptFiles(form1.Handle, True); // ファイルがドロップされるコンポーネントを指定する
end;

// 閉じるボタン
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
425くそプログラマー:2005/04/05(火) 13:17:02
// ドラッグ&ドロップ処理
procedure TForm1.DropFiles(var Msg: TMESSAGE);
var
FName: array[0..255] of Char;
begin
try // ファイル名を取得する
DragQueryFile(Msg.WParam, 0, FName, SizeOf(FName));
finally
DragFinish(Msg.wParam);
end;
try // ファイルを開く
Image1.Picture.LoadFromFile(FName);
Label1.Caption := FName;
except
MessageBox(Handle, '指定されたファイルは開けません。', 'エラー', MB_OK or MB_ICONERROR);
Label1.Caption := 'エラー:指定されたファイルは開けません。'; // 絶対パスの所にエラーを残す
Image1.Picture := nil; // 画像クリア
end;
end;
end.

以上3分割です。
426デフォルトの名無しさん:2005/04/05(火) 15:12:46
type
TMyData = record
FArray: array of integer;
end;
var
MyData1, MyData2: TMyData;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(MyData1.FArray, 10);
MyData1.FArray[9] := 123;
MyData2 := MyData1;
MyData2.FArray[9] := 0;
ShowMessage(IntToStr(MyData1.FArray[9]));
end;
427426:2005/04/05(火) 15:16:15
やりたいことは上記コードでわかって頂けると思います。
レコード型の変数を代入したら、メンバである動的配列がポインタで代入されちゃいます。
最後のShowMessageの結果が123になるようなコピーの仕方を教えてください。
代替案でもかまいません。
428デフォルトの名無しさん:2005/04/05(火) 15:30:01
MyData2 := MyData1;を
SetLength(MyData2.FArray, 10);
Move(MyData1.FArray, MyData2.FArray, 10);
とか
429デフォルトの名無しさん:2005/04/05(火) 15:35:43
>>427-428
ヘルプで「動的配列」を見ろ
それでわからなければ人生やり直せ
430デフォルトの名無しさん:2005/04/05(火) 15:43:27
>>1 を見ろ
それでわからなければ人生やり直せ
431デフォルトの名無しさん:2005/04/05(火) 16:03:10
>>427
こういう強引なやり方もあるよ。

type
TMyData = record
FArray: string;
end;

var
MyData1, MyData2: TMyData;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(MyData1.FArray, 10 * SizeOf(Integer));
PInteger(@MyData1.FArray[9 * SizeOf(Integer)])^ := 123;
MyData2 := MyData1;
PInteger(@MyData2.FArray[9 * SizeOf(Integer)])^ := 0;
ShowMessage(IntToStr(PInteger(@MyData1.FArray[9 * SizeOf(Integer)])^));
end;
432デフォルトの名無しさん:2005/04/05(火) 16:11:29
>>431
すまん、訂正。

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(MyData1.FArray, 10 * SizeOf(Integer));
PInteger(@MyData1.FArray[1 + 9 * SizeOf(Integer)])^ := 123;
MyData2 := MyData1;
PInteger(@MyData2.FArray[1 + 9 * SizeOf(Integer)])^ := 0;
ShowMessage(IntToStr(PInteger(@MyData1.FArray[1 + 9 * SizeOf(Integer)])^));
end;
433デフォルトの名無しさん:2005/04/05(火) 16:21:07
だからヘルプにCopy使えって書いてあるじゃんよ
MyData2.FArray := Copy(MyData1.FArray);
434デフォルトの名無しさん:2005/04/05(火) 17:07:00
>>433
ありがとうございます。見つけました。
435418:2005/04/05(火) 17:28:17
>>419>>420>>421
遅くなりましたが、どうもありがとうございました。
436ななしへたぐらま ◆XcB18Bks.Y :2005/04/05(火) 17:50:32
>>433
Delphi 6ですか?うちはDelphi 5だから残念!

…と思ったら使えました!

Delphi 5のヘルプによるとこういう書式のcopy関数どころか
動的配列に対するCopy関数はSlice関数と同じで関数や手続きのパラメータにしか使えないと書いてあります.
実際にはDest := copy(Src, First, Count)という風に使うことができるようです.
どちらも仕様として書かれていませんので正しく動く保証はありませんが….
437デフォルトの名無しさん:2005/04/05(火) 19:26:37
動的配列と静的配列の違いがわかってない奴が「動的配列つかえ」と指導しているのは問題だろ。
436の言うように、この場合Copy()やMove()は使うべきじゃない。
428はにMove(MyData1.FArray, MyData2.FArray, 1); にしないとアロケーションエラーが起こる。
動的配列は4バイトしか使わないのに40バイトもコピーするから。
配列同士でデータのやり取りをしたいなら
http://www.para.tutics.tut.ac.jp/~ohno/mu/devroom/delphi_qa.html#OPASCAL_Q5
の方法で静的配列を使った方が安全。
438デフォルトの名無しさん:2005/04/05(火) 19:57:32
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 X,Y :Integer;
begin
 Form2 := TForm2.Create(Application);
 X := Left+(Width div 2)-(Form2.Width div 2);
 Y := Top +(Height div 2)-(Form2.Height div 2);
 Form2.Position := poDesigned;
 Form2.Left := X; Form2.Top := Y;
 Form2.ShowModal;
 Form2.Release;
 if Form2.ModalResult = mrCancel then Exit;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to 9 do
 begin
  R[i] := TRadioButton.Create(Form2);
  R[i].Parent := GroupBox1; //GroupBox1は設計時に貼り付け
  R[i].Left := 10;   R[i].Width := 100;
  R[i].Height := 17;  R[i].Top := 15*i+16;
  R[i].Caption := 'RadioButton-'+IntToStr(i);
  case i of
   0..5 : R[i].Font.Color := clGreen;
   6..9 : R[i].Font.Color := clBlue;
  end;
 end;
end;
439438:2005/04/05(火) 19:58:18
↑のコード
RadioButton を動的に作成しているのですが、2回目にフォームを開くとき
  モジュール hogehoe.exeのアドレスXXXXXでアドレスYYYYYに対する読み込み違反
  が起きました。
というエラーが発生します。3回目以降はまた正常に開かれます。何故でしょう?
440デフォルトの名無しさん:2005/04/05(火) 19:59:43
コードが間違ってるからじゃない
441木圭正日月:2005/04/05(火) 20:56:02
どこが間違いかわからないなら黙っててください。
442デフォルトの名無しさん:2005/04/05(火) 21:22:15
>>438
原因は、
  R[i] := TRadioButton.Create(Form2);
の行。
この時点では Form2 に Create したインスタンスは代入されていない。
なので
  R[i] := TRadioButton.Create(Self);
にすればOK
443& ◆xOS3wf.pJg :2005/04/05(火) 21:58:14
>>442
 ありがとうございます。
 self ってヘルプを読んでもよくわからないんですよねえ。
 Createとするインスタンスのオーナーコンポを指しているものと勝手に解釈してるんですが。
 要するに FormCreate イベントだと Form をまさに生成しよう途中だから
 > R[i] := TRadioButton.Create(Form2);
はまずいということですよね。
 ということはら FormShow イベントでなら上記のコードでも FormCreate された後だ
からいいわけですね。
444デフォルトの名無しさん:2005/04/05(火) 22:33:35
>>443
Self は、メソッドを実行しているインスタンスを指します。(クラスメソッドだとクラス)

procedure THoge.DoSomething;
       ^^^^^^
の中なら、THoge のインスタンスです。Owner ではありませんので注意。
Self はメソッドの中ならどこでも使えます。(ちなみに C++ や Java での this と同じ役割)

> 要するに FormCreate イベントだと Form をまさに生成しよう途中だから
Create は、クラスのインスタンスを返す関数と考えるとわかりやすいかもしれません。
Form2 := TForm2.Create(Application);
は、つまり Create が返したインスタンスを、Form2 という変数に代入するという事ですが、
OnCreate は Create の中で呼ばれるイベントなので、OnCreate が呼ばれた時点では
まだ Create は完了してない = Form2 変数にはインスタンスを代入していない
という事になります。

だから、OnCreate の中では、Form2 の中身は nil なのです。(初期値)
445デフォルトの名無しさん:2005/04/05(火) 23:07:17
 ああ! 丁寧な説明、まことにありがとうございます。大変よくわかりました。
 そうかあ。ということは
 R[i] := TRadioButton.Create(Self);
はまさにTRadioButton自身を生成してるんですねえ!
446ミ,,゚Д゚彡 ◆A6VzDeLphI :2005/04/05(火) 23:08:26
 ∫,,,,,,,,,∧,,∧  ぬくぬく季節でネミーデス
⊂,,,,,,,,,つ,,゚Д゚ミつ
ご存知な方、教えてくだされ。
前にも聞いたかもしれません。

いわゆる"列挙型"ってDelphi英語では
どのように表現するのでしょうか。

列挙型を文字列と相互変換する
××ToStr
StrTo××
の××にあてはまる英単語は
何がよろしいのでしょうかと。
447デフォルトの名無しさん:2005/04/05(火) 23:19:11
>446
Enum(eration)って話じゃなくて?
全然違ってたらスマン
448デフォルトの名無しさん:2005/04/05(火) 23:40:56
SubItemsにある数値(String、例えば70)をStrToIntしてWidthに入れたいのですが、下のようなエラーが出ます。
''70
'は整数ではありません'
なぜ整数にならないのでしょうか?
直接数値を代入したり、Editなどから代入すると問題ないようです。
449デフォルトの名無しさん:2005/04/06(水) 00:10:10
>>448
恐らく、SubItems 設定時に、頭に余計な ' が入ってるのだと思われます。
Item.SubItems.Add('70');
Width := StrToInt(Item.SubItems[0]);
だと動きますよね?

#ちなみに、StrToIntDef という便利な関数もあります。
450428:2005/04/06(水) 02:55:52
>>437
Move(MyData1.FArray, MyData2.FArray, 1); だとポインタをコピーするだけで意図する動作じゃないですね。
Move(MyData1.FArray[0], MyData2.FArray[0], 10*SizeOf(integer));ならOKでしょ。
領域確保してコピーするだけなのに何か問題あるのかな〜
451デフォルトの名無しさん:2005/04/06(水) 06:32:01
単なるメモリブロックとして考えた方が楽だと思うぞ。
452デフォルトの名無しさん:2005/04/06(水) 08:59:54
>>433はD7のヘルプから引用したもの。
同じくD7のCopy関数のヘルプより

メモ:S が動的配列の場合,Index および Count パラメータを省略でき,Copy は配列全体をコピーします。

D6までは>>436のいう通り。
そもそもこの件は>>434で終了したものと受け取っている。また、>>434
「見つかりました」と書いているから>>426はD7だと思われ。
453ななしへたぐらま ◆XcB18Bks.Y :2005/04/06(水) 14:17:14
>>437
実は必ずしも使うなという意図では無かったのですが….
少なくとも自分が使うだけなら,かつ不具合が起きても重大な損害が出るのでなければ
copy関数での動的配列のコピーは使っても良いのではないかと思います.

少し私の書き方がまずかったようでごめんなさい.
(それにMove手続きを使うなとは書いていませんょぅ.)

>>452
なるほど,D7からでしたか.
454ななしへたぐらま ◆XcB18Bks.Y :2005/04/06(水) 16:22:38
>>438-439
■アクセス違反になる理由

まず,フォーム変数は内部ではフォームの情報がどこにあるかという情報を持っているだけで
フォーム情報そのものは別の場所の存在しているということを覚えて下さい.
その上でプログラムの流れを追います.

●まずプログラムの起動時,フォーム変数Form2はグローバル変数ですので
 この変数は『どこにもない』(nil)という情報を持っています.

●つぎにフォームForm2の生成

> Form2 := TForm2.Create(Application);

 このコンストラクタによってTForm2型のフォームが作られてその場所が変数Form2に代入されます.

 なおこの時点では変数Form2の値はNilのままです.
> R[i] := TRadioButton.Create(Form2);
 これらのラジオボタンはオーナーのないコンポになってしまいます.

●フォームForm2の破壊

 Form2.ReleaseでForm2は後処理の後に破壊されます.
 ただし変数Form2は引き続きフォーム情報のあった場所を指しています.

 ※ちなみに破壊した場所は読み書きしてはいけません.
  Delphiのランタイムプログラムが別の用途に使っているかもしれませんし,
  用済みになったので場所をWindowsに返しているかもしれません.
  (前者では異常な動作をする可能性がありますし,
  後者ではWindowsの保護システムにより,アクセス違反として処罰されます)

(つづく)
455ななしへたぐらま ◆XcB18Bks.Y :2005/04/06(水) 16:23:50
(>454のつづき)

●フォームForm2の二度目の生成

> R[i] := TRadioButton.Create(Form2);

 変数Form2は破壊された場所を指しています.新しく作る場所ではありません.
 関係ない場所を見に行っているのでおかしな動作になります.
 (アクセス違反になったということはForm2が指している場所がWindowsに返却済みだったのでしょう.)

●対策
 あるフォームの中でコンポを実行時に作るとき,パラメータにそのフォーム自身を指定する場合は
 変数名ではなくてSelfを使います.
 Selfを使う利点はほかにもありまして,たとえば同じ型のフォームを2つ以上作る場合,
 もし変数名を指定しなければならないようならものすごく面倒なことになるわけですが,
 Selfなら同じ型のどのフォームでもSelfで済みます.
456ななしへたぐらま ◆XcB18Bks.Y :2005/04/06(水) 16:32:54
>>438
本題とは無関係ですが,
Form2を実行時に生成してForm1の中央に表示させるなら
Form2のPositionプロパティにpoOwnerFormCenterを指定して

>procedure TForm1.SpeedButton1Click(Sender: TObject);
(中略)
> Form2 := TForm2.Create(self); // ※変数がForm1ならselfはForm1を指す

これだけでOKです.

さらにいえば今回の例ではTFrom2型のフォームはメソッド内で生成して破壊してしまいますから
変数Form2は使わずにフォーム変数をメソッド内で別に用意して使った方が
「メソッド内でしか使っていませんよ」というのがわかりやすくなると思います.

var aForm: TForm2;
(中略)
aForm := TForm2.Create(self);
457偽プログラマー:2005/04/06(水) 18:48:37
フォームにShellTreeView1を貼っただけなのに、下記の警告文が出てきます。

[警告] Unit1.pas(6): ユニット 'ShellCtrls' はプラットフォームに依存すると宣言されています

上記の警告を受けないようにするにはどうすれば良いのでしょうか??
どこかのプロパティを設定しなければいけないのでしょうか?
それとも、何らかのプログラムがひつなのでしょうか?

よろしくお願い申し上げます。
458デフォルトの名無しさん:2005/04/06(水) 18:59:23
>>457
プロジェクトオプションのコンパイラで該当箇所のチェックをオフ。
459デフォルトの名無しさん:2005/04/06(水) 19:09:35
>>457
コンパイラオプションも見れないやつは、デルファイ失格、
パスカラー失格市ね
460偽プログラマー:2005/04/06(水) 19:30:53
>>458-459
 いやーそういう事ではなくて・・・。

 警告ってユーザがミスっぽいからの警告なんでしょう??
なんらかの設定やPGが不足だから出るものだと思っているものですから、
その何が不満で警告が出ているのやらが理解出来ずに苦しんでいます。

フォームにShellTreeView1を貼っただけの状態で、何が不足しているのか。
PG的に何をすべきかのかが解らんのです。

すみません。よろしくご指導下さい。
461デフォルトの名無しさん:2005/04/06(水) 19:36:21
>>460
日本語読めない訳?プラットフォームに依存するっつってんじゃんw
不満なら自分で書けば。
462デフォルトの名無しさん:2005/04/06(水) 19:40:18
くだスレでストレス発散すんなよ
463デフォルトの名無しさん:2005/04/06(水) 20:23:27
警告とエラーは違います。

警告は、一歩間違えるとエラーになりかねない書き方や、
ポインタなどの危険な操作を行ったり、
初期化されてなかったり、返り値が設定されてなかったりと、
まあ、要するにコンパイラの「親切」なわけです。
なので、コンパイルが失敗するわけではありません。

この親切を「おせっかい」と感じる場合は、オプションで切りませう。
464デフォルトの名無しさん:2005/04/06(水) 22:09:34
マウスカーソールの位置でアプリケーションを起動させるには、どうしたらいいんでしょうか?
465デフォルトの名無しさん:2005/04/06(水) 23:13:30
procedure TForm1.FormCreate(Sender: TObject);
begin
Left := Mouse.CursorPos.X;
Top := Mouse.CursorPos.Y;
end;
466デフォルトの名無しさん:2005/04/07(木) 00:40:47
>>457
とりあえず、ソースのinterfaceの手前に以下の2行を追加しろ。警告が出なくなるから。
{$WARN UNIT_PLATFORM OFF}
{$WARN SYMBOL_PLATFORM OFF}
もともとDelphiはWinodws用だったけど、Delphi6からLinuxでも使うようになったので
Windows専用の機能を使おうとすると「この機能はLinuxじゃ使えない」という意味で警告が出る。
467偽プログラマー:2005/04/07(木) 01:11:51
>>461
 書けません・・・ってば。 ワザと言ってるでしょう。少しは>>466を見習って下さい。

>>463
親切丁寧にご指導してもらって、ありがとうございます。
 これはこれで貴重な意見として受け止めております。 ありがとうです。

>>466
 ありがとうございましたっ!! それです。まさに、私はその答えが欲しかったんです。
 いやーっ。神です。貴方はDelphi神です。ココロから尊敬します。
 社の先輩に聞いても、誰も知らなさそうだったんですよ!!
 (最初、意地悪でおしえないと最初思ってたけれど・・・ねぇ。)
下記でなりました!!
unit Unit1;
{$WARN UNIT_PLATFORM OFF}
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ShellCtrls;
type
TForm1 = class(TForm)
ShellTreeView1: TShellTreeView;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
468デフォルトの名無しさん:2005/04/07(木) 01:25:13
ちなみに、面倒なときは、プロジェクトを開いている時に、
プロジェクト→オプション で コンパイルメッセージ タブを選んで
表示したくない警告のチェックボックスを外して OK を押すと、
そのプロジェクトでは、オフにした警告は表示されなくなります。(@Delphi7)

また Delphi を起動して、ファイル→すべて閉じる としてから、
上記の操作をすると、デフォルトの設定となり、
次から新しく作ったプロジェクトで、オフにした警告は表示されなくなります。
469461:2005/04/07(木) 01:25:40
>>467
もちろんワザと言ってます。
プログラミングやってるのに「プラットフォーム」って単語の意味
解ってない人はおかしいですし、検索すればすぐに解決できる
ような事をここで聞いてるからですw

見習えも糞もないですよw
470デフォルトの名無しさん:2005/04/07(木) 01:54:35
>>467
むしろ、わざわざそんな事を訊かれる先輩がかわいそう。
調べるのも能力の1つだよ。
Google で「プラットフォームに依存すると宣言されています」を検索しても
ヒットするし、解決方法まで書いてある。
471デフォルトの名無しさん:2005/04/07(木) 02:37:45
つーか、警告/ヒントを切るのは愚か者の対応。
platform 指令による警告は、Win32 アプリだけ作る分には余計だから、抑止したい気持ちは
わかるから止めないけど、たまにはチェックしたほうが良いよ。

ところで 467 よ。おまえのいう「会社の先輩」は、ここを見ていないと思っているのか?
まったく。
472デフォルトの名無しさん:2005/04/07(木) 05:13:41
先輩キタ━━━━(゚∀゚)━━━━ !!
473デフォルトの名無しさん:2005/04/07(木) 05:32:50
467,471
ここに出入りしている会社って・・・
もちろんソフト屋さんではないよね
474デフォルトの名無しさん:2005/04/07(木) 06:46:04
未だに業務でDelphiが使われているなんて驚き桃の木山椒の木
475デフォルトの名無しさん:2005/04/07(木) 09:43:49
>業務でDelphiが使われているなんて
知られていないだけ。
ガソリンが買えるのも、税金の計算も、公務員の給料も、飛行機の整備がうまくいくのも、
Delphi で作られたアプリとそのメンテナンス会社のおかげ。
476デフォルトの名無しさん:2005/04/07(木) 11:12:54
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
477デフォルトの名無しさん:2005/04/07(木) 15:15:38
a[1] := 0;
a[2] := 0;
a[3] := 0;

これを一発でやる方法を教えてください。
478デフォルトの名無しさん:2005/04/07(木) 15:17:37
>>477
FillChar(a, SizeOf(a), 0);
479デフォルトの名無しさん:2005/04/07(木) 15:19:03
一発ありがとう!
480デフォルトの名無しさん:2005/04/07(木) 15:24:56
TClientSocketとTServerSocketコンポーネントの使用が推奨されないのは
どのような事からでしょうか?^^;
481ななしへたぐらま ◆XcB18Bks.Y :2005/04/07(木) 16:14:59
>>469
『プラットフォーム』と言ってもわからないひとは多いのではないでしょうか.
(Windows用ソフトしか開発していない職場では意味のない言葉でしょうし)
私はかなり昔にCマガジンか何かで知りましたけど.

>>470
2行目以降に同意.
確かにDelphiに限らず,エラーメッセージに関する情報は
それをそのままキーワードにして検索すると見つかることが多いですね.

次スレからテンプレに入れましょうか.たとえばこんなの.
---------
質問の前にGoogleで検索してみよう.
・コンパイラの警告などのメッセージはそのメッセージで検索!
・ヘルプに載っていない関数や手続きはその名前で検索!
 (WindowsのAPIだったりすることも多い)
---------

>>480
それらより優秀なIndyコンポーネントに取って代わられたからです.

Delphiの旧バージョン用のプロジェクトを扱えるように
TClientSocketなどの旧コンポも残されていますが,
新規プログラムを作るのでしたらIndyを使うべきです.
うちはDelphi 5なのでIndyは付いていなくて旧コンポで作っていたのですが
今はIndyに切り替えています.
482デフォルトの名無しさん:2005/04/07(木) 16:24:07
>次スレからテンプレに入れましょうか
そういうのを気にせず質問できるのがこのスレの存在意義だと思う。

という俺も>>457の態度がむかついたのでレスしなかった口だけど。
483デフォルトの名無しさん:2005/04/07(木) 17:22:13
procedure SubForm.FormCreate(Sender: TObject);で
MainFormにあるItem数に応じてEdit.Create(Self)生成しているのですが、
MainFormのItem数が変わってもSubFormのEdit数が変わりません。

SubFormを表示させる度にMainFormのItem数を調べさせればいいと思うのですが、
どうすればいいのでしょうか?
484デフォルトの名無しさん:2005/04/07(木) 18:02:12
>>483
OnShow だと、表示される度に呼ばれるので、
OnShow の中で、前回生成したEditを全て消去して、
新たにItem数分Editを作ればよいのではないでしょうか。
485480:2005/04/07(木) 18:29:29
>>481
なるほど。致命的な不具合があるのかと思ってしまいましたw
次からはIndyコンポーネントを使おうと思います。ありがとうございました。
486デフォルトの名無しさん:2005/04/07(木) 23:36:40
 Delphi で全角⇔半角相互変換をやるのに皆さんは WinAPI の LCMapString を使いますか?
487ミ,,゚Д゚彡 ◆A6VzDeLphI :2005/04/08(金) 01:07:25
>>486
使います。
488デフォルトの名無しさん:2005/04/08(金) 01:25:07
ShowMessageダイアログの位置って決めれますか?メインフォームの中央とか
489デフォルトの名無しさん:2005/04/08(金) 01:44:53
ShowMessagePos ヘルプにあったよ
490デフォルトの名無しさん:2005/04/08(金) 01:47:02
ShowMessageはTFormを継承してたはず。
ダイアログを作っちゃえばいい。
491488:2005/04/08(金) 02:18:57
ども。Posのほうは数値指定なんですね。フォームで作ってみます。
492デフォルトの名無しさん:2005/04/08(金) 03:27:31
ShowMessagePos呼び出し時にフォームの大きさが解らないから、
メインフォーム中央には表示できない。
493デフォルトの名無しさん:2005/04/08(金) 04:13:28
Delphi2005で、Delphi7で使っていたVCLコンポーネントを登録するには一体どうすればいいんですか?
494デフォルトの名無しさん:2005/04/08(金) 13:06:08
>>493
パッケージを作る必要がある
495デフォルトの名無しさん:2005/04/08(金) 13:08:07
パッケージを開いた状態で、プロジェクトマネージャーで右クリックして
インストールね
496デフォルトの名無しさん:2005/04/08(金) 13:58:31
TFontについて質問です。
HandleプロパティにCreateFontで作成したフォントを代入した場合でも、
TFontはそのフォントを自動的に管理してくれるのでしょうか。
インスタンス解放の前に、
DeleteObjectでフォントを明示的に削除する必要があるのかが知りたいです。
497デフォルトの名無しさん:2005/04/08(金) 14:22:05 BE:40356443-
オブジェクトじゃないから開放の必要はない、と思う

詳しい人フォローお願い
498デフォルトの名無しさん:2005/04/08(金) 15:03:14
>>496
VCLソース読んだけど、内部でDeleteObject呼んでる。

(HFont 自体は TResourceManager に格納されていて、
TResourceManager.FreeResource で DeleteObject される。
TFont.Destroy で TResourceManager.FreeResource を呼んでるので、
恐らく解放されるのだと思う)
499デフォルトの名無しさん:2005/04/08(金) 15:15:19
 和暦の表示のやり方でHELPなどを参照して
分かったけれど、

// 西暦 ⇒ 和暦
Edit1.text := FormatDateTime('gge"年"M"月"D"日"', DateTimePicker1.Date);

結果:平成17年4月8日

でも、”H17/04/08”と表示させたいのですが、どうすればいいですか?
特に”H17”等と表示させる方法がわかりません。
500デフォルトの名無しさん:2005/04/08(金) 15:57:44
>>497
>>498
トンクスです!
これで安心してVCLに身を任せることができます。
501ななしへたぐらま ◆XcB18Bks.Y :2005/04/08(金) 16:15:14
>>488-492
CreateMessageDialog関数を使うと簡単に実現できそうです.

(VCLのソースコードでShowMessage手続きをたどっていったら
 内部でこの関数を呼び出しているのを見つけました.
 interface節で宣言されているのでほかのユニットからでも使えます.
 というかちゃんとヘルプにも載っていました orz.)

{★メインフォーム中央にメッセージダイアログを表示する手続き.
  ShowMessage手続きと同じように使えると思います.}
procedure ShowMessageOnMainForm(const Msg: string);
var
 Form: TForm;
begin
 Form := CreateMessageDialog(Msg, mtInformation, [mbOk]);
 try
  Form.Position := poMainFormCenter; // メインフォーム中央に表示するようにする
  Form.ShowModal;
 finally
  Form.Release;
 end;
end;
502デフォルトの名無しさん:2005/04/08(金) 16:17:44 BE:40356443-
>>499
Edit1.text := FormatDateTime('gge"/"MM"/"DD"', DateTimePicker1.Date);
Edit1.Text := StringReplace(Edit1.Text, '平成', 'H', []);

こんなところかなあ〜
もっといい方法知ってる人おながいします
503ななしへたぐらま ◆XcB18Bks.Y :2005/04/08(金) 17:22:04
>>499,502
EraNamesというグローバル変数があるので「これを書き換えれば…」と思ったのですが駄目でした.
どうやらFormatDateTime関数ではこれを使わずに
Windowsから直接,元号(げんごう.『平成』とかのこと)を取得しているようです.

原始的ですが『明治』『大正』『昭和』『平成』をM, T, S, Hに置き換えるしかないかもしれません.
504デフォルトの名無しさん:2005/04/08(金) 17:23:39
>>502
平成しか表示しないなら
Edit1.Text:=FormatDateTime('"H"e/mm/dd',D);
これだけだろ。
505デフォルトの名無しさん:2005/04/08(金) 18:03:48
>>499です。
>>502, 504
 どうもレスありがとうございました。
引数等の問題とか、関数等の問題とかではなく
PG側で回避しなければいけない問題だったわけですね?
下記で上手く行きました!!ありがとうございました。

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
sWork : String;
begin
//『明治』『大正』『昭和』『平成』をM, T, S, Hに置き換える
sWork := FormatDateTime('gg', DateTimePicker1.Date);
if sWork = '明治' then sWork := FormatDateTime('"M"ee/mm/dd', DateTimePicker1.Date)
else if sWork = '大正' then sWork := FormatDateTime('"T"ee/mm/dd', DateTimePicker1.Date)
else if sWork = '昭和' then sWork := FormatDateTime('"S"ee/mm/dd', DateTimePicker1.Date)
else if sWork = '平成' then sWork := FormatDateTime('"H"ee/mm/dd', DateTimePicker1.Date)
else sWork := FormatDateTime('"_"ee/mm/dd', DateTimePicker1.Date);
Edit1.Text := sWork;
end;
506デフォルトの名無しさん:2005/04/08(金) 18:05:32
>>499 です。
.>>503
特に詳しく調べて頂きまして、本当にありがとう!深く感謝してます。
507デフォルトの名無しさん:2005/04/08(金) 21:10:19
PopupMenuが閉じた時に、何か処理を行わせる方法を教えてください。
508デフォルトの名無しさん:2005/04/09(土) 00:03:37
>>507
前そういうの作った時はTPopupを継承したClass拵えて、
新しくメソッド用意して、その中でPopupの表示イベントと隠すイベントを用意した
Popupを表示させる時は常にOnContextPopupからそのメソッドで表示

もっとスムーズな方法ある場合にはスルーしてくれ
509デフォルトの名無しさん:2005/04/09(土) 03:04:21
手動でPopupすればいい。
510デフォルトの名無しさん:2005/04/09(土) 05:12:27
PopupのCloseを検出するのは不可能じゃないけどかなり面倒くさい。

具体的にはどんな処理がしたいんだろう・・。
こういう場合たいてい他にも代替案があるはずだが
511507:2005/04/09(土) 08:11:30
508仕様でやってみます。
512デフォルトの名無しさん:2005/04/09(土) 09:16:13
type
 TPopupMenuX = class(TPopupMenu)
 private
  FOnPopupClose: TNotifyEvent;
 public
  procedure Popup(X, Y: Integer); override;
  property OnPopupClose: TNotifyEvent read FOnPopupClose write FOnPopupClose;
 end;

こんな感じで継承して

procedure TPopupMenuX.Popup(X, Y: Integer);
begin
 inherited;
 if Assigned(FOnPopupClose) then FOnPopupClose(Self);
end;

で手動のPopupでなくても呼ばれるみたいです。
513512:2005/04/09(土) 09:21:36
あっpropertyはpublishedがいい
type
 TPopupMenuX = class(TPopupMenu)
 private
  FOnPopupClose: TNotifyEvent;
 public
  procedure Popup(X, Y: Integer); override;
 published
  property OnPopupClose: TNotifyEvent read FOnPopupClose write FOnPopupClose;
 end;

これをコンポーネントとしてインストールすればTPopMenuと差替え可能
514デフォルトの名無しさん:2005/04/09(土) 10:17:19
var
c : pchar;
i : PInteger;
begin
GetMem(c,sizeof(char)*2;
c[0] := 'a';
c[1] := chr(0);
ShowMessage(c);
FreeMem(c);

GetMem(i,sizeof(integer)*3);
i[0] := 3;
i[1] := 2;
i[2] := 5;
FreeMem(i);

> i[0] := 3;
ここで配列方が必要ですというエラー
コンパイラオプションで変えれるのかなと思いましたがそれらしい項目は見当たりませんでした。
PChar以外でこのようなことは出来ないのでしょうか?
515デフォルトの名無しさん:2005/04/09(土) 10:59:31
>>514
動的配列を使用したほうが良い。

var
 i: array of Integer;
begin
 SetLength(i, 3);
 i[0] := 3;
 i[1] := 2;
 i[2] := 5;
・・・
end;
516デフォルトの名無しさん:2005/04/09(土) 11:19:52
ListItemを右クリックしたときの動作はどう書けばいいのでしょうか?
517デフォルトの名無しさん:2005/04/09(土) 11:30:30
>>514
delphiの演算子に[]がないからPIntegerに対して[]演算できない気が。
pcharについてはstring型の[]が使えるだけのような
518デフォルトの名無しさん:2005/04/09(土) 11:34:17
>>515
ありがとうございます。
動的配列は知っているのですがもしできるならと思い質問しました。
やはりポインタではできないのでしょうか?
519514:2005/04/09(土) 11:35:32
>>517
ありがとうございました。
520デフォルトの名無しさん:2005/04/09(土) 12:02:36
>>518
静的配列のポインタを使うとできる。
割とDelphiでの一般的なポインタの使い方。以下例:
type
TCharArray = array[0..65535] of char ;
pCharArray = ^TCharArray ; //普通はstring使った方がよい。Win32API使うならまた別だけど。
//上と同じ様なpIntegerArrayはすでにsystemで定義されている。
var
c : pCharArray ;
i : PIntegerArray ;
begin
GetMem(c,sizeof(char)*2) ;
c[0] := 'a';
c[1] := chr(0);
ShowMessage( pchar(c) );
FreeMem( c );

GetMem(i,sizeof(integer)*3);
i[0] := 3;
i[1] := 2;
i[2] := 5;
FreeMem( i );
521デフォルトの名無しさん:2005/04/09(土) 12:52:50
ちょっと初歩的なことを質問させてください。

Delphiの文字列変数への代入は
文字列のコピーですよね(違ってる?)。

で、文字列変数AとBの内容を入れ換えたいんですが、
本来、文字列変数はポインタの一種だと思うんで、
何か効率的な入れ換えの方法はないものかと。。。

初心者なもんで頓珍漢なこと言ってたらゴメンなさい。
522デフォルトの名無しさん:2005/04/09(土) 13:13:29
>>521
参照カウントを使ったCopy on Writeらしいので普通に交換すればいいと思いますよ
523デフォルトの名無しさん:2005/04/09(土) 13:18:15
>文字列のコピー
その通り。

>効率的な入れ換えの方法
普通に入れ替え用の手続き書くくらいじゃない。
VCLのstring使う限りあんまり変なことしない方が良いかも。
procedure (var str1 , str2 : string);
var
tempstr:string;
begin
tempstring:=str1;
str1:=str2;
str2:=tempstring;
end;
524デフォルトの名無しさん:2005/04/09(土) 14:17:17
>文字列のコピーですよね(違ってる?)。
じゃ、ないよね?
代入はポインタの複製(かつ参照カウンタのインクリメント)

523 さんのサンプル、うまく動くんだけど、データコピーが二度起きている。
525デフォルトの名無しさん:2005/04/09(土) 14:42:07
F9を押して実行させると
---------------------------
デバッガ例外が発生
---------------------------
プロジェクト Project1.exe が EInOutError クラスの例外を生成しました。
'I/O エラー (6)'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。
---------------------------
OK ヘルプ(H)
---------------------------

と出てしまい、実行できません
さらにOKを押したあとにまたF9を押すと

---------------------------
アプリケーション エラー
---------------------------
EInOutErrorがモジュール Project1.exe の 0005ABC4 で発生しました。
I/O エラー (6).
---------------------------
OK
---------------------------

と出てしまい、同じことの繰り返しになってしまうんです
どうすれば直るのでしょうか・・・
526デフォルトの名無しさん:2005/04/09(土) 14:47:24
バグを退治する
527最弱の初心者:2005/04/09(土) 17:41:27
やっとEXEファイルを作れたのですが
そのアプリケーションを開いた時の
ウィンドウのアイコンは変更できるのですが
デスクトップでのアイコンの変更ができません。
プロジェクト→オプション→アプリケーション→アイコンの読み込み
で変更するのとは違うのでしょうか?
アドバイスお願いします。
528516:2005/04/09(土) 18:16:58
OnSelectItem イベントというのは見つけたんですが、右クリックしたときだけというのはどうすれば……
OnMouseDownなら右クリック指定できるのですがListItemに限定するには……?
529デフォルトの名無しさん:2005/04/09(土) 18:50:03
>516
気合だ
530デフォルトの名無しさん:2005/04/09(土) 19:09:23
>>523
>>524

何か分からなくなった。

var A, B: string;  A := B;
とすると、変数Bの内容(文字列)が変数Aにコピーされるの?
それとも、アドレスの代入なの?

実は、Listに保持したレコード内の2つの文字列の内容を
できるだけ効率的にスワップしたいんだけど。
今んとこ、>>523さんが書いたようなコードで処理してるけど、
何か無駄な処理してるような気がしたもんで。
531523:2005/04/09(土) 19:35:14
>>524
ああごめん、そっちの言う方が正しい。
VCLの文字列はガベコレだったな。
失敬失敬。

そんなんで、レコード型にstringをメンバーとして使うとメモリリークの可能性があるから危険って、
中村先生もMLで言ってたっけ。
532530:2005/04/09(土) 20:30:19
>>531
> そんなんで、レコード型にstringをメンバーとして使うと
> メモリリークの可能性があるから危険って、
> 中村先生もMLで言ってたっけ。

つーことは、レコードではpCharを使って
自分でメモリ管理するほうがいいってこと?
何度もゴメン。
533デフォルトの名無しさん:2005/04/09(土) 20:37:20
釣れますか( ´,_ゝ`)プッ
534デフォルトの名無しさん:2005/04/09(土) 20:58:52
( ,_`ゝ′)
535デフォルトの名無しさん:2005/04/09(土) 21:49:41
レコード型にstring型が含まれているとコンパイラが勝手に
レコード初期化解放関数を組み込んでいたような気が...
CPU窓で見てみればいい。
536531:2005/04/09(土) 22:22:56
一応ソースを挙げとくと、

[Delphi:84737] Re: 動的配列と確保したメモリの開放

だから、興味のある人は、ML見てみてね。
537531:2005/04/09(土) 22:26:10
って、よくよく読み直したら、漏れの早とちりかもしれん。
MLで書いてあることについては、各自で理解してくださいませ。
すみません。
538ななしへたぐらま ◆XcB18Bks.Y :2005/04/09(土) 22:26:39
>>525
おそらくあなたの書いたプログラムの何かが誤っています.
よってどこがどう誤っているかを調べてそれを直さなければなりません.

で,まず,どこが誤っているか.
これはDelphiの統合環境が教えてくれています.
止まったときにエラーが起きた行が紺色になっていませんか?

次にどう誤っているかを調べます.
EInOutError例外はファイルの読み書きに関する関数や手続きで生成される例外なので,
おそらくファイルを開くか何かしようとして失敗したことが予想されますが,
具体的にどう誤ったかは頭で考えるより実際に調べる方が簡単です.

エラーになった(例外を生成した)行に「ブレークポイント」を置いたら
(F5を押せば行が赤くなるはず)
もう一度最初から実行してみてください.ブレークポイントで実行が停止します.
ここでほとんどの変数の値を見ることができますので,
関数や手続きのパラメータがあなた意図したとおりのものかどうかを調べて下さい.
539ななしへたぐらま ◆XcB18Bks.Y :2005/04/09(土) 22:47:30
>>528
リストビューのGetItemAtメソッドなどはどうでしょう.

{★リストビューでマウスの右ボタンが下げられたときのイベントハンドラ.
 マウスカーソルの下に項目があるかどうかを調べて結果を表示します.}
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 Item: TListItem;
begin
 // マウスカーソルが指している場所にあるリストビューの項目を調べます.
 Item := (Sender as TListView).GetItemAt(X, Y);
 // もしなかったら…
 if Item = nil then
  Caption := 'ここに項目はないみたいだぞ'
 // あるなら…
 else
  Caption := format('"%s"という項目らしいぞ', [Item.Caption]);
end;
540ななしへたぐらま ◆XcB18Bks.Y :2005/04/09(土) 22:52:17
>>527
『デスクトップでのアイコン』というのは
タスクバーに表示されるアイコンのことでしょうか?

だとすればフォームのIconプロパティではなくてApplication.Iconの方を変えてみて下さい.
541525:2005/04/09(土) 22:52:23
>>538  レスどうもです
どこにエラーがあるのかなんとか調べてみたところ
あるアプリケーションが正常に終了されていなかったらしく
それを終了させることが出来たので正常に作動するようになりました

どうもありがとうございました
542デフォルトの名無しさん:2005/04/10(日) 00:07:10
>>527
マルチポスト乙(騙りじゃなければ)
543デフォルトの名無しさん:2005/04/10(日) 00:08:19
>>540
マルチポスト先(騙りじゃなければ)で解決済み
544デフォルトの名無しさん:2005/04/10(日) 00:44:52
String型をInteger型にするとき、そのStringをIntにできるかどうか調べる関数ってないですか?
545デフォルトの名無しさん:2005/04/10(日) 00:47:53
>>544
TryStrToIntとかなかったっけ。
まぁtry...exceptでできるっしょ。
546デフォルトの名無しさん:2005/04/10(日) 00:48:07
547544:2005/04/10(日) 00:50:37
var
 s: String;
 i: Integer;
begin
 s := InputBox('整数を入力', '整数を入力してください', '');
 try
  i := StrToInt(s);
 except
  on EConvertError do ShowMessage('整数じゃないです');
 end;

こうするのが最善ですかね。ありがとうございました。
548デフォルトの名無しさん:2005/04/10(日) 00:52:42
>>544
Valを使うと良いですよ。Helpみて
549528:2005/04/10(日) 01:58:54
>>539
どうにかできました。
ありがとう!
550デフォルトの名無しさん:2005/04/10(日) 03:26:10
メソッドの中で自殺(Self.Free)するのは問題があるでしょうか?
551デフォルトの名無しさん:2005/04/10(日) 03:52:42
>>550
VCL内でもやってる。 インスタンスにアクセスしなければ問題ない。
なお、 Self <> nil なるコードも使われている。
552デフォルトの名無しさん:2005/04/10(日) 04:07:43
>>551
ありがとうございました。
安心して自殺させたいと思います。(笑
553デフォルトの名無しさん:2005/04/10(日) 05:25:43
>中村先生もMLで言ってたっけ。
盲信は危険。
554デフォルトの名無しさん:2005/04/10(日) 06:38:11
string型や動的配列型を使うときはrecordではなくてclassを使うべき。
たったそれだけの事だよ。
555デフォルトの名無しさん:2005/04/10(日) 06:55:31
DMONKEYの質問なんですが
返り値が配列型の変数の場合、
どうすれば配列の中の要素にアクセスできるんでしょうか?
以下のようにやってもうまくできないのです

var
 retval: TJValue;
begin
 DMS1.Compile('function f(){ return(new Array("a","b","c")) ;}');
 DMS1.Run;
 DMS1.CallFunction('f', [''], retval);
 ShowMessage(retval.vString);
end;
556デフォルトの名無しさん:2005/04/10(日) 07:25:52
2ちゃんねらに声をかけたところ
およそ700人の猛者がチャレンジしたブラインドタッチ選手権!
驚異のハイスコア現在1位の1057.2点を越えることが出来るか!
まだまだ2ちゃんねるの猛者達のチャレンジを待っている
それがブラインドタッチクオリティ

↓からいけます
ttp://freegame.sytes.net/~take/cgi-bin/typecreate/index.html
557デフォルトの名無しさん:2005/04/10(日) 07:26:26
558デフォルトの名無しさん:2005/04/10(日) 11:05:03
>>252
超遅レスだが、俺は上手くインストールできた。
tbx-2_1-beta1とtb2k-2.1.4を入手・解凍して、パッチを当てる。
ヘルプの記載どおり、ライブラリ・パスを設定して、インストール。
tbxのデモで動作確認。

次にoffice2003themeを入手・解凍して、ライブラリ・パスを設定。
tbxのデモのUnit1のusesにTBXOffice2003Themeを追加。
デモを実行すれば、TBX ThemeにOffice2003が追加されているのを
確認できる。

TBXOffice2003Themeはインストール不要という点が分かりにくいのかな?
559デフォルトの名無しさん:2005/04/10(日) 11:56:46
>>554 について便乗で質問なんですが、
record を使うのと class を使うのでは、
どのぐらいメモリ消費が違うのでしょうか。
また、変数へのアクセス速度についても、
record のメンバーと class のプロパティでは違いがあるのでしょうか。

今、record を使うか class を使うか悩んでいるので、
ぜひ知りたいです。
560デフォルトの名無しさん:2005/04/10(日) 12:39:10
>>559
> メモリ消費
よほど大量にclassを生成しない限り、大して変わらないのでは。

> アクセス速度
アクセッサにごてごて書かなければ、こちらも大して変わらないと思う。
561デフォルトの名無しさん:2005/04/10(日) 12:45:49
>>559
ObjectPascalはどうなってるか知らないがC++なら構造体とクラスは実質同じ
562デフォルトの名無しさん:2005/04/10(日) 13:09:03
>>560-561
安心しました。積極的に class を使いたいと思います。
ありがとうございました。
563デフォルトの名無しさん:2005/04/10(日) 13:12:31
検索について質問があります。

同じ文字列をMemoに直接AnsiPosを使うのと、
TStringListにAnsiPosを使うのとどちらが速いのでしょうか?
564デフォルトの名無しさん:2005/04/10(日) 18:28:06
>>563
Memoの内容を何カ所も検索するなら、StringListにコピーしてから検索。
一回きりならば直接Memo.Linesを探した方が早い。

コピーするにもそれなりのコストがかかります。
565デフォルトの名無しさん:2005/04/10(日) 18:39:16
恥ずかしながら…超初心者的な質問を。
近頃プログラミングやってみようかと思って、とっつきやすそうなDelphiをはじめて、
とりあえず入門用サイトを見ながらテキストエディタとかペイントソフト程度までは作ったのですが、
よくわからん部分が多くて困っとります。
ObjectPascalの命令文一覧というか、単語一覧のようなサイトはありませんでしょうか?
ググってもなかなか見つからないもので。
if文とかfor文とかの構文じゃなく、DefAttributesとかMessageBeepとかのことです。
英単語そのままの意味っぽいですが、どういう単語が使えるのかもわかりませんし。
566デフォルトの名無しさん:2005/04/10(日) 18:47:29
>>565
ない。

ヘルプを読むか、
絶版のアンク著Object Pascalリファレンスブックを買うか、
分かりづらい(けどDelphiをマニアックに使うと大変便利なってくる)オライリーのクイックリファレンスを買うか。
567デフォルトの名無しさん:2005/04/10(日) 18:53:19
>>566 ん〜…使いながらなんとなく覚えるしかないんですかねぇ。
クイックリファレンスとやらは探してみます。
ありがとうございました。
568ななしへたぐらま ◆XcB18Bks.Y :2005/04/10(日) 19:38:23
>>565
・コンポーネント
 コンポーネントパレットのStandard,Additional,Win32,Systemの最初の3つ辺りまでは
 クリックしてF1でヘルプ.
・関数と手続き
 ヘルプのVCLリファレンス→ルーチン一覧(カテゴリ別)
 この中から使えそうなカテゴリのやつを( ´_ゝ`)フーン とかいいながら少しずつ見る.
・Windows API
 MessageBeepなどのWindows APIは数が膨大なので
 リファレンスで一通りチェックするのは意味がないというのが私の考えです.
(その昔,Windows 3.1の頃に電話帳みたいなAPIのリファレンス本を買ったのですがほとんど使いませんでした)

 「○○ってなんだろう?」と思ったらその都度Googleで検索をかけてみるのがよいと思います.
 マイクロソフトのサイトにあるリファレンスもヒットします.

…もっとももう少し初心者向けの環境が整っていると良いのも確かなのですが.
569デフォルトの名無しさん:2005/04/10(日) 19:51:53
・WindowsAPI
↓入れとけ。以上。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
570565:2005/04/10(日) 20:01:18
>>568 >>569 リファレンス本って電話帳並になるんですか…
経験積まなきゃ駄目ってことですね。身の丈に合わせてちまちまと覚えていくことにします。
ありがとうございました〜。
571デフォルトの名無しさん:2005/04/10(日) 23:23:11
別に覚える(暗記する)必要など無いよ。
必要なときに必要に応じてドキュメントを参照すればいいだけ。
572デフォルトの名無しさん:2005/04/11(月) 02:13:10
Delphi 7 を使用しています。
Delphi には interface があるようですが、どうやら COM 用の物らしいですね。
デザインパターンの移植例で、interface を使った物もあるようですが、
Delphi で、Java などのように積極的に interface を使うべきなんでしょうか?
(少なくとも、VCLではあまり積極的には使われていないようですが…)

implements を使った委譲なんかは面白そうなんですが、
実装クラスが TInterfacedObject から派生していなくてはいけなかったり、
何かと制限も多そうに感じます。デメリットや、メリットがあればご教授ください。
573デフォルトの名無しさん:2005/04/11(月) 05:20:38
>Delphi には interface があるようですが、どうやら COM 用の物らしいですね。
これってどこら辺が発祥の話?

>実装クラスが TInterfacedObject から派生していなくてはいけなかったり、
だれかがデマを流している?
574デフォルトの名無しさん:2005/04/11(月) 07:33:37
えーデマなの?詳細キボン
575デフォルトの名無しさん:2005/04/11(月) 07:47:08
デマは言い過ぎかもしれないな。VCL 内では TInterfacedObject を使っているから、
TInterfacedObject を使いつづけたほうが便利「かも」しれない。

しかし TInterfacedObject の実装コードを見ればわかるが大した事はやってない。
「QueryInterface, _AddRef, _Release を定義したクラス」しか要求されていない。
この三つを定義したクラスであれば Interface の実装クラスの基底クラスになりえるし、
逆にこの三つを COM が期待する動作に合わせれば(すなわち TInterfacedObject の実装コード)
TInterfacedObject から継承しなくても COM インターフェースとして動く。

TInterface が導入されたのは D3 だっけ? D4 だっけ?
あのころはほんとに COM サポートだけを考慮していたみたいだけど、
Kylix で Linux 上でいろんなもの(おもにデータベース関連)を動かすために
Interface の実装から COM 依存を取り除いている。
だから少なくとも D7 以降は COM とは関係なく Interface を使える。

くだすれからは離れそうなので、どこかに移動しますか?
576デフォルトの名無しさん:2005/04/11(月) 08:08:51
>>573
> だれかがデマを流している?
DelWikiかな?

(言い訳)
COM専用と書いた覚えは無いけど、お手伝いしてくれた人の記事と
整合性が取れていない部分があるような気も。mOm

>>5757
> くだすれからは離れそうなので、どこかに移動しますか?
ttp://pc8.2ch.net/test/read.cgi/tech/1064766880/l50
または
ttp://onigiri.s3.xrea.com:8080/delphi/index.php?%A5%A4%A5%F3%A5%BF%A1%BC%A5%D5%A5%A7%A5%A4%A5%B9
577572:2005/04/11(月) 12:18:44
皆様丁寧なレスありがとうございます。

>>573
確かに、COM「専用」ではないようですね…
色々な文献を読んでいる時に、勘違いしてしまったようです。
(interface のサンプルのほとんどが GUID を書いていたりなど)

>>575
TInterfacedObject を継承していなくてもよい、というのは大変参考になりました。
QueryInterface なんかは面白そうですね。簡単に多態できそうです。
ただ、惜しむらくは、COM 互換の為か参照カウントがついているんですね。
これはこれで便利なんですが、「Create→Free」の鉄則が変わってしまって、
ややこしくなってる気がします。(気をつければ済む話ですが…)

>>576
DelWiki の interface の項は初めて見ました。参考になります。
では、移動したいと思います。

Delphi でインターフェースを使うのは敬遠していましたが、
挑戦してみたいと思います。皆様ありがとうございました。
578デフォルトの名無しさん:2005/04/11(月) 14:37:15
> ただ、惜しむらくは、COM 互換の為か参照カウントがついているんですね。
DelWikiの方に回避策を追加しました。
579初心者:2005/04/11(月) 14:51:41
失礼します。

procedure TForm1. WriteBmp (Bmp1: TBitmap) ;
begin
.....
end;

↑こんな風に
手続きでBitmapを受渡すことはできないんでしょうか?
580デフォルトの名無しさん:2005/04/11(月) 14:55:15 BE:215232588-
>>579
出来るけどDelphiもデフォルトで値渡しなので
関数内でBMPを変更したい場合は参照渡しにする必要があるよ
仮引数の前にvarを付けると参照渡しになる

procedure TForm1. WriteBmp (var Bmp1: TBitmap) ;
begin
.....
end;
581初心者:2005/04/11(月) 15:34:25
>>580
すばやい回答ありがとうございます。疑問が解決しそうです。
↓こんなのとか、いろいろやってみます。

function TForm1. ListEdit (var MailList: TStringList) : var TStringList ;
begin
.....
end ;
582デフォルトの名無しさん:2005/04/11(月) 15:39:41
>>581
それだとDelphiに怒られる
戻り値の型にvarは不要、詳しくはヘルプ
583デフォルトの名無しさん:2005/04/11(月) 15:42:35
>>579
引数は値渡しになるけど、オブジェクト自体は呼び出し元のを
共有することになる。
従って var パラメータを使わなくても引数の指すオブジェクトの
メンバーにアクセスすることはできる。
var パラメータは、手続き側でオブジェクトを Create するような
特殊な場合だけ使うようにして方がいい。
584デフォルトの名無しさん:2005/04/11(月) 15:50:35
値渡しと参照渡しを理解していない予感
585デフォルトの名無しさん:2005/04/11(月) 17:06:08
HTMLのカラーコードをRGBに変換するにはどうすればいいですか?
586デフォルトの名無しさん:2005/04/11(月) 17:43:07
タイトルバーに現在開いているファイル名を表示したいわけですが、
例えば新規作成のイベントハンドラに

FileName := '無題';
Caption := Format('%s - %s', [ExtractFileName(FileName),Caption]);

と入れて満足してたら…
新規作成をするたびに -無題 が増えるorz
新規作成を連打でもしようものなら
無題-無題-無題-無題-無題-無題…とタイトルバーに表示されることになってしまいます。
ファイルは普通に扱えるようですが、タイトルバーがあまりにもかっこ悪い。
ファイルを開いた場合なども -無題 がファイル名に置き換わるだけです。

一度ファイル名をクリアするなりすればいいのでしょうが、どうすれば…?
頭悪い質問ですまんこってす。
587デフォルトの名無しさん:2005/04/11(月) 17:49:18
>>586
Captionに何が入っているか考えてみれ
588デフォルトの名無しさん:2005/04/11(月) 18:00:05
>>555

uses
 ecma_object;

var
 retval: TJValue;
 a: TJArrayObject;
 i: integer;
 s: string;
begin
 DMS1.Compile('function f(){ return(new Array("a","b","c")) ;}');
 DMS1.Run;
 DMS1.CallFunction('f', [''], retval);

 ShowMessage(retval.vObject.ToString());

 a:= retval.vObject as TJArrayObject;
 s:= '';
 for i:= 0 to a.Count-1 do begin
  s:= s + a.Items[i].vString;
 end;
 ShowMessage(s);
end;
589デフォルトの名無しさん:2005/04/11(月) 18:02:24

  ァ  ∧_∧ ァ,、
 ,、'` ( ´∀`) ,、'`  釣れますか?
  '`  ( ⊃ ⊂)  '`
590586:2005/04/11(月) 18:05:48
…自己解決しました。
>>587さんありがとう。
591デフォルトの名無しさん:2005/04/11(月) 18:05:52
>>586

const
APP_NAME = 'キンタマ';

FileName := '無題';
Caption := Format('%s - %s', [ExtractFileName(FileName),APP_NAME]);
592デフォルトの名無しさん:2005/04/11(月) 23:09:54
国別文字について質問です。

文字列比較の関数、AnsiCompareText()とCompareText()の違いなのですが
ヘルプを見ると国別文字を利用する場合AnsiCompareText()を利用してください
という記載がありました。
国別文字とはいったいなんでしょうか?(シフトJISのことでよいのでしょうか?)
593デフォルトの名無しさん:2005/04/11(月) 23:22:47
>>592
> シフトJISのことでよいのでしょうか?

日本語Windows環境ではその通りです。
より正確にはOSの多バイト文字セット(MBCS)サポート機能に依存します。
594デフォルトの名無しさん:2005/04/11(月) 23:29:26
>593
なるほど、そうすると日本語の処理はANSI〜を
キーワードに覚えればよさそうですね。
DELPHIは難解ですね。
きっとクラスでつまづくんだろうな・・
どうもありがとうございます。
595デフォルトの名無しさん:2005/04/11(月) 23:53:06
UNICODEなら気にしなくて良いのかな。
596デフォルトの名無しさん:2005/04/12(火) 00:20:56
Unicode 文字列(WideString)を型変換なしに扱いたい場合は Wide〜 系の関数群を使います。

AnsiString と WideString は相互に代入互換性がある(コンパイラが自動的に型変換する)ので、
Ansi〜系の関数に WideString を渡したり、逆にWide〜系の関数に AnsiString を渡すこともできますが、
相互変換できない一部の文字は変換過程で失われることになります。
597デフォルトの名無しさん:2005/04/12(火) 05:59:30
>>588
ありがとうございます無事解決できました
598デフォルトの名無しさん:2005/04/12(火) 12:37:10
秘密のテクニック150って本のサンプルを使って勉強してるんですが、
MediaPlayerのサンプルを実行して、mpegを再生しようとすると、
「MICの初期化で問題が発生しました」とエラーが出て、再生出来ません。
AVIファイルは再生出来ます。
何がいけないのか、どなたか教えて下さい。

環境はWinXP
Del7proです。
よろしくお願いします。
599デフォルトの名無しさん:2005/04/12(火) 21:53:17
再生には秘密のテクニックが必要です。
600デフォルトの名無しさん:2005/04/12(火) 21:54:23
というのは冗談として、
そのMPEGファイルは1か2か。
MPEG2だとしたら普通のWMPで再生できるのか、
書きなはれ
601598:2005/04/12(火) 22:32:57
たぶん、MPEG2だと思います。(ビデオ編集ソフトではそう表示されたので。)
windowsのMediaPlayerで再生出来ます。
よろしくお願いします。
602デフォルトの名無しさん:2005/04/13(水) 09:50:14
以下のコードを実行すると、access violation が起こってしまいます。
何故でしょうか?

procedure TForm1.Button1Click(Sender: TObject);
var
p: array [1..2000, 1..2000] of Single;
begin
p[1, 1] := 1;
end;
603デフォルトの名無しさん:2005/04/13(水) 10:27:18
[1..2000, 1..2000] んなことできるんですか?
604デフォルトの名無しさん:2005/04/13(水) 11:01:47
>>602
ローカル変数を入れるスタックサイズが不足している
{$MAXSTACKSIZE 16777216}指令でスタックサイズを増やす
(スタックサイズは動作した大きさ)

ただこのやり方はあまり好ましくないと思うので
データの持ち方を見直したほうがいい
605デフォルトの名無しさん:2005/04/13(水) 14:42:01
すみません。検索ベタでうまく
探せなかったので質問させてください。
あるURLを自動生成して、ボタンを押すとそのサイトを
urlopenに関連付けられたブラウザで独立して開きたいのです。
↑ここでいう独立とはWinExecで他のアプリを
よび出したときのようにという意味です。

606デフォルトの名無しさん:2005/04/13(水) 14:58:31
SetTextCharacterExtraで文字間隔を設定して
二重線のon /offを設定し、Alignmentを右・左
設定できるコンポーネントを作成しているのですが
文字寄せが設定どおりの動きをしてくれません。

原因はSetTextCharacterExtraかなと思うのですが
SetTextCharacterExtraを使用せずに、他の
方法などありますでしょうか?

607デフォルトの名無しさん:2005/04/13(水) 14:59:02
ShellExecuteかCreateProcess
608デフォルトの名無しさん:2005/04/13(水) 15:42:27
以下のようにコード上部で固定されている画面を他画面から開きます。

{$define HOGEHOGE}
//{$undef HOGEHOGE}

この画面を開く際に、define/undefの制御はできるものでしょうか?
例外的にある画面から開く場合のみ
{$ifdef HOGEHOGE}で書かれている部分を実行したいのです。
609デフォルトの名無しさん:2005/04/13(水) 16:03:20
>>605
例えばこんな
ShellExecute(Handle, 'OPEN', PChar('http://www.yahoo.co.jp'), nil, nil, SW_SHOW);
610ななしへたぐらま ◆XcB18Bks.Y :2005/04/13(水) 16:48:22
>>436の補足というか訂正.Delphi 5のヘルプ,『動的配列』のところに
『動的配列を切り捨てるには,Copy 関数に配列変数を渡し,結果を配列変数に代入します。たとえば,A が動的配列である場合,A := Copy(A, 0, 20) は A の 21 番目以降の要素を切り捨てます。』
とあるのをすっかり忘れていました.Copy関数のところの説明と矛盾しているのですね….

>>603
『静的配列』(宣言時に要素の数を指定)なら可能です.

この場合,要素は1だけでなくいくつから始めても構いません.
また整数の代わりに文字型(char)や列挙型(Booleanなどの論理型を含む)でも構いません.
611605:2005/04/13(水) 16:57:15
>>609
うひょー!ばっちりでーす!
あざーーす。
612デフォルトの名無しさん:2005/04/14(木) 06:59:47
>>603
Cとは違うのだよ、Cとは!
613デフォルトの名無しさん:2005/04/14(木) 07:38:31
>>602

var
p: array [1..2000, 1..2000] of Single;

procedure TForm1.Button1Click(Sender: TObject);
begin
p[1, 1] := 1;
end;

または

procedure TForm1.Button1Click(Sender: TObject);
type
PArray = ^TArray;
TArray = array[1..2000, 1..2000] of single;
var
p: PArray;
begin
GetMem(p, sizeof(TArray));
p[1, 1] := 1;
FreeMem(p);
end;
614デフォルトの名無しさん:2005/04/14(木) 07:54:59
どうしてスタックオーバーフローが出ないのかを聞きたいのでは?
615602:2005/04/14(木) 09:36:02
613さん、ありがとうございます。解決しました!!
ローカル変数でなければいいのですね・・・(変な仕様・・・)
下側は何故うまくいくのか、さっぱりです;;
特に、これ。 PArray = ^TArray;
616デフォルトの名無しさん:2005/04/14(木) 09:57:32
>変な仕様・・・
と思うなら、スタックについて勉強してみれ。
617デフォルトの名無しさん:2005/04/14(木) 10:09:09
>>615
スタックはローカル変数用のメモリ格納場所

TArray = array[1..2000, 1..2000] of single
PArray = ^TArray ← Var hoge: TArray
入れ替えても問題無し(こちらの方がわかりやすいか?)
この形(独自の型を定義してその型へのポインタ)は
前方参照というDelphiの決まり唯一の例外              
618デフォルトの名無しさん:2005/04/14(木) 10:50:23
横レスすまそ

> PArray = ^TArray;
> TArray = array[1..2000, 1..2000] of single;

とするのと

> TArray = array[1..2000, 1..2000] of single;
> PArray = ^TArray;

とするのって何か違いがあるの?
わざわざ前者みたいな例外があるってことは何かありそうだけど。
619デフォルトの名無しさん:2005/04/14(木) 11:49:20
その場合は違いは無い。
未定義の型のポインタを宣言できるようになっているのは

PRecord = ^TRecord;
TRecord = record
 Data: integer;
 Next: PRecord;
end;

こういった構造体を定義できるようにするため。
620デフォルトの名無しさん:2005/04/14(木) 11:52:23
>>618
この例外がないとレコード内で自分自身を指すポインタを持てなくなる

配列型もしくはレコード型を指すポインタを作るときは
型宣言の上に記述するのがDelphiの定石
621デフォルトの名無しさん:2005/04/14(木) 12:07:56
技術評論社塚越一雄氏の「Delphi応用プログラミング」に
ここらへんの話は面白く書かれてるよ
622デフォルトの名無しさん:2005/04/14(木) 12:22:59
>>619-621
ほほう、勉強になりますた。
623デフォルトの名無しさん:2005/04/14(木) 14:07:45
教えてください。

Delpho2005 Pro Update1 (.Net切り離し) で作っているのですが、プログラムのアイコンや
exe ファイルのプロパティで確認出来るバージョン情報が全く
変更出来なくなりました。正確にはプロジェクトのプロパティでの変更は
出来て、その変更が res に反映されません。
Project1.res の更新日付はもちろん変わりません。

Delphi6 で作ってたプロジェクトを 2005 に持ってきたんですが、
今更 6 には戻せないので、なんとか res ファイルが更新されるように
したいのですが…。

res ファイルを消したらまた作ってくれるのかなと思って消してみたら
「ファイルが見つかりません」とでてコンパイルも出来なくなりました。
今は他のプロジェクトで作った res ファイルを持ってきて
コンパイルすることで対処しています。

今でも始めから 2005 でプロジェクトを新規作成すると
ちゃんと変更されるので 6 から持ってきたことが原因ではないかと疑ってましたが、
6 から持ってきたプロジェクトでもちゃんと変更されるものもあるようです。
ということで原因がさっぱり掴めずお手上げ状態です…。
624デフォルトの名無しさん:2005/04/14(木) 16:11:41
まずはUpdate2に汁
625デフォルトの名無しさん:2005/04/14(木) 17:31:39
Delphiで特定の周波数の音を出す方法ってないでしょうか?
MIDIだとどうしても中間音などが出せません。
できたら、任意の複数の音も出せると最高です。

スキルがあまりないのでできるだけ簡単に出したいのですが・・・
どなたか教えてください。
626デフォルトの名無しさん:2005/04/15(金) 02:25:50
NT系なら周波数を指定して音をだすAPIがあったはず。
627デフォルトの名無しさん:2005/04/15(金) 09:57:33
Windows.Beep(440, 5000)
これでラの音が5秒鳴る(はず)
NT4、2000、XP専用のAPI
628デフォルトの名無しさん:2005/04/15(金) 12:54:58
問題は鳴らしてる間スレッドが止まることだ>Beep()
629デフォルトの名無しさん:2005/04/15(金) 13:00:47
そこでマルチスレッドですよ
630デフォルトの名無しさん:2005/04/15(金) 13:49:38
音のローレベルのAPIでそんなのがあったような気がする。
631630:2005/04/15(金) 14:00:38
こんなん。でも使うのはそこそこ面倒かもしれない。
ttp://www.sm.rim.or.jp/~shishido/wavtest.html
632デフォルトの名無しさん:2005/04/15(金) 14:17:21
>>631
その方法が王道かと。
というかBeep()だとサウンドカードからじゃなくてマザーボード上のスピーカー出力(ハードウェアエラーの通知等に使用)から出るから激しくおすすめできない。
633デフォルトの名無しさん:2005/04/15(金) 15:30:44
uses に MMSystem を追加して下さい。

//音が鳴るとすぐ次の行へ進む
sndPlaySound('ringin.wav', SND_ASYNC);

//音が鳴り終わらないと次の行へ進まない
sndPlaySound('ringin.wav', SND_SYNC);

//音を繰り返し鳴らせる
sndPlaySound('ringin.wav', SND_ASYNC + SND_LOOP);
//音を止めるには、sndPlaySound('ringin.wav', SND_ASYNC); を実行する
634デフォルトの名無しさん:2005/04/15(金) 15:36:41
>>633
わざわざ ringin.wav を作れというのか
635デフォルトの名無しさん:2005/04/15(金) 15:39:01
220:ド
246:レ
277:ミ
293:ファ
329:ソ
369:ラ
415:シ
440:ド^
636sage:2005/04/15(金) 15:40:47
>>643
そう。
637デフォルトの名無しさん:2005/04/15(金) 15:41:45
間違い。

>>634
そう。
638デフォルトの名無しさん:2005/04/15(金) 18:03:58
>>626-628
皆さんのレスを読むとマルチスレッドにしたら複数の音を出せるってことですね?

マルチスレッドやったことない・・・orz
サンプル探してきてやってみます。
いいのがあればいいが・・・
639デフォルトの名無しさん:2005/04/15(金) 19:34:24
ヒント:フーリエ合成
640デフォルトの名無しさん:2005/04/15(金) 20:39:01
システムカラーが変更されたことを、
TGraphicControlの派生クラス内から知ることはできますか?
WM_SYSCOLORCHANGEDメッセージを捕まえてみようとしたのですが、
どうやらメインフォームにしか送られていないようです。
641デフォルトの名無しさん:2005/04/15(金) 20:59:24
>>640
CM_SYSCOLORCHANGE
642デフォルトの名無しさん:2005/04/15(金) 23:11:18
>>641
うまくいきました!
どうもありがとうございます。
643デフォルトの名無しさん:2005/04/16(土) 00:39:26
ビットを反転させるなら、not演算子ですが、
ビットの配置を逆にする演算子はないですよね…
たとえば 01001011 という数を 11010010 というように逆にしたいんですが。
大量の処理をするため、なるべく効率よく書きたいんですが、どういう書き方が一番いいでしょうか。
644デフォルトの名無しさん:2005/04/16(土) 01:07:47
>>643
キャリーフラグ使ってローテイト命令使えば良い

MOV AL,01001011B

ST:
MOV CX,8
RCL AL,1
RCR AH,1
LOOP ST:

でいいんじゃね?
645デフォルトの名無しさん:2005/04/16(土) 01:52:06
マシン語秘伝の書を思い出した(w
646デフォルトの名無しさん:2005/04/16(土) 11:04:10
DelはCのマクロやインライン関数みたいなのは無いんですか?
647初心者:2005/04/16(土) 11:23:02
マルチスレッドは俺もやた事なかったけど、意外と簡単

ここが一番わかりやすかった
http://www.wwlnk.com/boheme/delphi/techdoc/dad0010.html
これもけっこういい
http://www.borland.co.jp/tips/delphi/dh004/index.html
自分で作りながら覚えるのがいいのでは?
648初心者:2005/04/16(土) 11:24:11
647は
>>638へのレスです
649デフォルトの名無しさん:2005/04/16(土) 19:18:14
>>643 最適化不足ですがこれでどうでしょう?自信ないですが
function ReserveBit(param: DWORD): DWORD;
asm

mov edx, param
xor eax, eax
test edx, edx
je @3
mov ecx, 32
@1:
test edx, 1
jz @2
or eax,1
@2:
dec ecx
jz @3
shr edx, 1
shl eax, 1
jmp @1
@3:

end;

>>644 MOV CX,8 は MOV ECX,8 でないとマズイかも(32bit環境なら)

.netではインラインアセンブラ使えないんでしょうね...
650デフォルトの名無しさん:2005/04/16(土) 19:25:51
ツマンネ
651デフォルトの名無しさん:2005/04/16(土) 19:47:55
テーブル参照のほうがシンプルかつ高速なんじゃないか。たかが256バイトだし。
652デフォルトの名無しさん:2005/04/16(土) 22:27:08
これでどうでしょう?
function ReverseBit(param: DWORD): DWORD;
procedure tbl;
asm
db $00,$80,$40,$C0,$20,$A0,$60,$E0,$10,$90,$50,$D0,$30,$B0,$70,$F0,$08,$88,$48,$C8,$28,$A8,$68,$E8,$18,$98,$58,$D8,$38,$B8,$78,$F8
db $04,$84,$44,$C4,$24,$A4,$64,$E4,$14,$94,$54,$D4,$34,$B4,$74,$F4,$0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC,$1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC
db $02,$82,$42,$C2,$22,$A2,$62,$E2,$12,$92,$52,$D2,$32,$B2,$72,$F2,$0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA,$1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA
db $06,$86,$46,$C6,$26,$A6,$66,$E6,$16,$96,$56,$D6,$36,$B6,$76,$F6,$0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE,$1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE
db $01,$81,$41,$C1,$21,$A1,$61,$E1,$11,$91,$51,$D1,$31,$B1,$71,$F1,$09,$89,$49,$C9,$29,$A9,$69,$E9,$19,$99,$59,$D9,$39,$B9,$79,$F9
db $05,$85,$45,$C5,$25,$A5,$65,$E5,$15,$95,$55,$D5,$35,$B5,$75,$F5,$0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED,$1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD
db $03,$83,$43,$C3,$23,$A3,$63,$E3,$13,$93,$53,$D3,$33,$B3,$73,$F3,$0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB,$1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB
db $07,$87,$47,$C7,$27,$A7,$67,$E7,$17,$97,$57,$D7,$37,$B7,$77,$F7,$0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF,$1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF
end;
asm
mov edx, param
xor ecx, ecx
mov cl, dl
mov ah, [tbl+ecx].byte
mov cl, dh
mov al, [tbl+ecx].byte
shr edx, 16
shl eax, 16
mov cl, dl
mov ah, [tbl+ecx].byte
mov cl, dh
mov al, [tbl+ecx].byte
end;
653ミ,,゚Д゚彡 ◆A6VzDeLphI :2005/04/16(土) 23:01:28
マルチスレッドはAcidFloorのが基本的なんだけど
そこから応用したくなっても
極端に資料が少なくて苦労するんだよね。

ML検索しても資料的価値まで高まっている記事は皆無で
苦労するよ。

こういうところがDelphiのユーザー層の薄さを感じる。

Halbow氏にまとめて欲しかったよ...orz
654ミ,,゚Д゚彡 ◆A6VzDeLphI :2005/04/16(土) 23:03:43
さておき、

D2005の条件シンボル知ってたら誰か教えてくださいまし。

また、将来的にD2006や2007や
DelphiXが出る時に、その条件シンボルを
調べる方法が知りたいっす。

MLログで「HELPで条件シンボルを調べる」とあるが
D2005のHELPにはそんなもの載ってないヨォ...。゚(゚´Д`゚)゜。ウァァァン
655デフォルトの名無しさん:2005/04/17(日) 18:25:01
TEditor に詳しい方に質問(作者がHPに顔を見せないようなので)
 通常の状態からTHTMLFountainを使うため
 TEditor1.Fountain := HTMLFountain1;
とした後の処理がわかりません。ヘルプによると
> Editor1.Fountain プロパティに TFountain 型コンポーネントを接続すると、Editor1.
> ReserveWordList プロパティ値、Editor1.View の各プロパティ値は、Colors.Select を
> 除いてまったく意味を持たない状態になりますのでご注意下さい
ということなので切替前のカラーをグローバル変数で保持して
 TEditor1.View.Colors.Ank.Color := GAnkCol;
 TEditor1.View.Colors.DBCS.Color := GDBCSCol;
のようにしたのですが、この設定が反映しません。
<A HREF="http://www6.airnet.ne.jp/~sone_san/delphi/">Delphian World</A> 
のタグとタグの間の文字列'Delphian World'の色を変更したいのですがデフォルトの黒の
ままなのです。もちろんタグの色などはきちんと設定されます。
 ところが背景色の場合は
 TEditor1.View.Colors.Ank.BkColor := GBackCol;などとしなくてもOKです。タグとタ
グの間の文字列の色を設定するにはどうしたらいいのでしょう? それとも
THTMLFountainそのものがタグ間の文字列の色を指定できないのでしょうか?
656デフォルトの名無しさん:2005/04/17(日) 19:47:32
>>655
Fountain 接続後の色分け処理は、各 Fountain に任されてるから
Editor.View.Colors は無視されるっていう意味じゃないの?

THTMLFountain のソース読んでみたけど、
タグ以外の所は通常のテキスト色にしてるみたい。
タグとタグの間の所を色分けしたいなら、自分で拡張するよろし。
657デフォルトの名無しさん:2005/04/17(日) 19:51:13
DirectSound使えよダァホ共
658デフォルトの名無しさん:2005/04/18(月) 00:00:10
ビットマップの合成について質問です。こちらの環境は、Del6+Win2000です。
二つのビットマップの透過色合成をやりたいのですがうまくいきません。
具体的にやりたいことは、
   ビットマップA      ビットマップB       ビットマップC
黒黒黒黒黒黒黒黒   白水白水白水白水   白水白水白水白水
黒黒黒赤赤黒黒黒   水白水白水白水白   水白水赤赤白水白
黒黒青青青青黒黒   白水白水白水白水   白水青青青青白水
黒赤青青青青赤黒   水白水白水白水白   水赤青青青青赤白
黒赤青青青青赤黒   白水白水白水白水   白赤青青青青赤水
黒黒青青青青黒黒   水白水白水白水白   水白青青青青水白
黒黒黒赤赤黒黒黒   白水白水白水白水   白水白赤赤水白水
黒黒黒黒黒黒黒黒   水白水白水白水白   水白水白水白水白
ビットマップAをビットマップBに合成して、ビットマップCを作りたいのですが、できません。
Bが格納させているImage.Picture.Bitmap.Canvas.Copymodeのプロパティの値をすべて試しましたがダメでした。
Aの黒がそのまま描画されるか青や赤の色が変わってとんでもない色になりました。
ビットマップAはイメージリストに格納してあるのを必要な都度、 ImageList.GetBitmap(0,BitmapA) で取得しています。
描画は、 Image.Picture.Bitmap.Canvas.Draw(0,0,BitmapA) で行っています。
他に何か設定すべき項目があるのでしょうか。よろしくお願いします。
659デフォルトの名無しさん:2005/04/18(月) 00:43:47
ビットマップAの黒が白ならor合成でいいんだがなあ
660デフォルトの名無しさん:2005/04/18(月) 00:46:40
( ゚Д゚) ハァ?
661デフォルトの名無しさん:2005/04/18(月) 00:54:47
スキャンラインを使えばいいんじゃない?
662デフォルトの名無しさん:2005/04/18(月) 00:59:21
TransparentをTrueにするんじゃなかった?
663デフォルトの名無しさん:2005/04/18(月) 01:23:36
BrushCopyがお手軽では
Image.Picture.Bitmap.Canvas.Brush.Style := bsClear;
Image.Picture.Bitmap.Canvas.BrushCopy(Image.ClientRect, BitmapA, Rect(0, 0, BitmapA.Width, BitmapA.Height), clBlack);
664デフォルトの名無しさん:2005/04/18(月) 10:22:39
>>653
> こういうところがDelphiのユーザー層の薄さを感じる。
問題意識があるなら、自分で作れば。
なんか最近文句しか言わんな。ギコ。
665デフォルトの名無しさん:2005/04/18(月) 13:14:41
>>625です。

>>639
フーリエ合成って初心者が扱えるほど簡単に出来るのですか?
簡単なコンポがあるのでしたらチャレンジしてみたいのですが。

>>647
ありがとうございます。見てみます。
666デフォルトの名無しさん:2005/04/18(月) 14:09:08
TImageを継承したコンポーネントを作成していますが、
フォームに貼り付けたコンポーネントをどんな大きさにしても、
以下のconstructorのコードでは「105」となります。
なぜでしょう?

constructor TImageXXX.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
showmessage(inttostr(width));
end;
667デフォルトの名無しさん:2005/04/18(月) 14:22:46
>>666
オブジェクトインスペクタで設定したプロパティの内容は
コンストラクタの実行が完了した後に代入されるから。
668デフォルトの名無しさん:2005/04/18(月) 14:26:14
>>667
では、 「コンストラクタの実行が完了した後に代入された」
値を(この場合width)を参照したい場合、どこでみればいいですか?
アプリ起動直後にITmage全体を塗りつぶしたり、絵を描きたいのです。
669デフォルトの名無しさん:2005/04/18(月) 15:21:43
>>666
Loaded か SetBounds をオーバーライドすればいけるんじゃない。
Loaded はフォームからプロパティが読み出された後に呼ばれる。
SetBounds は Width プロパティの書き込みで呼ばれる。
ちゃんと調べてないので、ヘルプとソースを読んでくれ。
670デフォルトの名無しさん:2005/04/18(月) 15:32:54
Loaded でできました!!
ありがとうございました。
671デフォルトの名無しさん:2005/04/18(月) 15:35:14
> D2005の条件シンボル知ってたら誰か教えてくださいまし。
{$IFDEF VER170}
{$ENDIF}

>また、将来的にD2006や2007や
>DelphiXが出る時に、その条件シンボルを
>調べる方法が知りたいっす。
基本的に 前バージョンに10たしてみる

{$IFDEF VER170}
がはは
{$ENDIF}
んで、構文チェック ひっかかれば。 ビンゴ
672デフォルトの名無しさん:2005/04/18(月) 18:17:45
メニューバーの背景色を変更することは可能でしょうか?
オーナードローでアイテム部分は自由に描画できるのですが、
アイテムのない余白部分がデフォルトの色のまま残ってしまいます。
673デフォルトの名無しさん:2005/04/18(月) 18:31:15
自分で塗るか、システムカラーを変更するしか無い
674672:2005/04/18(月) 18:49:25
>>673
自分で塗るというのは、
WM_NCPAINTに応答するメソッドを実装するということでしょうか?
メニューバーを上書きしているサンプルが見つからないので、
何か参考になるページなど教えていただけるとうれしいです。
675デフォルトの名無しさん:2005/04/18(月) 19:01:00
>>672
ttp://homepage1.nifty.com/wizman/
のExtraMenuとかMenuDecoraterは参考にならんかな?
676658:2005/04/18(月) 19:16:43
>>659-663
回答ありがとうございました。
BrushCopyでやりたいことはできました。
677デフォルトの名無しさん:2005/04/18(月) 19:20:37
FormをDockしたりUndockしたりすると
Form上に配置していたコンポーネントのDataプロパティから
オブジェクトを正しく参照できなくなるのを回避するためにはどうすればよいんでしょうか。

例)
Form2にTreeViewを配置
TreeViewに適当にNodeを追加
NodeのDataプロパティに適当にオブジェクトを参照させる
Form2をForm1にドック
先ほど参照したオブジェクトが参照できなくなる

という感じです。
どなたかご存知の方、教えてください。
678672:2005/04/18(月) 19:54:17
>>675
ExtraMenuをダウンロードしてみましたが、
見やすいソースでとても参考になります。
やりたかったことは何とか実現できそうです。
どうもありがとうございました。
679デフォルトの名無しさん:2005/04/19(火) 11:16:35
CryptってDelphiでも出来ますか?
好きなトリップを探すソフトが作りたいです。
680デフォルトの名無しさん:2005/04/19(火) 13:24:10
bitmapの色数を取り出す方法を探してまして、
bcBitCountを使うまでたどり着いたのですが、
どうやれば色数をとれますか?
681デフォルトの名無しさん:2005/04/19(火) 16:33:01
HTTPゲットとメール送信の使いやすいクラスのユニットファイルって
どこかに落ちてないですか?
682デフォルトの名無しさん:2005/04/19(火) 16:42:35
683ななしへたぐらま ◆XcB18Bks.Y :2005/04/19(火) 16:56:43
>>680
ビットマップの色数といっても
画像の形式(256色形式とか1677万色形式とか)を指す場合と
実際に使われている色の数を指す場合が考えられます.

前者の場合はビットマップオブジェクト(TBitmapクラス)を使って
画像ファイルを丸ごと読み込んでPixelFormatプロパティの値を調べるのが簡単です.
(画像ファイルを丸ごと読み込むことになるのでメモリの無駄遣いになりますが)

自力で読み込む場合はあちこちのサイトに解説がありますのでそれらをご覧下さい.
(今見付けた頁 ttp://www.kk.iij4u.or.jp/~kondo/bmp/ )

後者の場合は基本的に全部のピクセルの値を読み取って数えるしかないと思います.
684デフォルトの名無しさん:2005/04/19(火) 17:11:31
使い方がわかりもはん
685デフォルトの名無しさん:2005/04/19(火) 18:14:57
>>681
Indyもいいけどサイズがでかいですよね。
ttp://www.ararat.cz/synapse/
はコンパクトですよ。
686デフォルトの名無しさん:2005/04/20(水) 00:56:05
>>679
OpenJane Lovelyで書き込みプレビュー見ると、
#で始まるトリップがきちんと◆のトリップに変換されてるから
ソース落として追いかけてみたら?
687デフォルトの名無しさん:2005/04/20(水) 01:34:58
>>686
OpenJane Doeなら
UWriteForm.pasの class function TWriteForm.Trip(const Key: string): string;
でトリップエミュレートしてるよ。
688デフォルトの名無しさん:2005/04/20(水) 01:46:33
質問です。
どっかのサイトで見かけたと思うんですが、
簡単な入力ダイアログを出して文字または数字を得るには
どうすればいいんでしょうか?
フォームを作るまでもない入力なんです。
689デフォルトの名無しさん:2005/04/20(水) 01:49:18
InputBox
690デフォルトの名無しさん:2005/04/20(水) 01:53:51
>>689
ああそれです!ありがとうございました!
691デフォルトの名無しさん:2005/04/20(水) 06:04:39
>>686-687
見てみます。ありがとうです。
692デフォルトの名無しさん:2005/04/20(水) 09:58:55
>>683
ありがとうございます。

今、ピクセルを一つづつ読み取って動かしています。
PixelFormatを勉強したいと思います。
693デフォルトの名無しさん:2005/04/20(水) 15:04:50
パネルと、その上に乗っかっているコンポーネントを
半透明化したいです。できるでしょうか?
694デフォルトの名無しさん:2005/04/20(水) 15:15:02
>>693
フォームのAlphaBlendプロパティをTrue
AlphaBlendValueプロパティの値を変更すれば透明フォームになるよ

詳しくはヘルプ
695デフォルトの名無しさん:2005/04/20(水) 15:22:43
いえ、フォームは普通のままで、パネルだけを半透明化したいのです・・・
696デフォルトの名無しさん:2005/04/20(水) 15:25:52
そんなアプリ使いたくない
697デフォルトの名無しさん:2005/04/20(水) 15:28:17
698デフォルトの名無しさん:2005/04/20(水) 15:29:50
>>693
自分でクラス完全自作しない限り無理
699デフォルトの名無しさん:2005/04/20(水) 15:36:27
>>698
作成できませんか?
700デフォルトの名無しさん:2005/04/20(水) 16:31:38
WinAPIゴリゴリ叩いてCreateWindowから始める必要があるかも

このサイトが丁寧に解説してる
http://homepage2.nifty.com/Mr_XRAY/Halbow/ShousaiIndex.html
701ななしへたぐらま ◆XcB18Bks.Y :2005/04/20(水) 16:41:31
>>692
実際に使われている色数を調べるのでしたら
1)TBitmap.Canvas.Pixelsで調べる.
・各ピクセルの値をRGBで取り出せる.
・どの記録形式でも(PixelFormatの値にかかわらず)同じ方法で取り出せる.
・ただしすごく遅いのであまり実用的でない.
2)TBitmap.ScanLineで調べる
・記録されているものをそのまま読み込むだけなので速い
・記録形式に合わせて読み方を変える必要がある.
・それ以前にWindowsビットマップファイルでピクセルがどのように格納されているかの知識が必要.
 (前出の頁などをご覧下さい)

>>695
ttp://www6.airnet.ne.jp/~sone_san/delphi/cgi-bin/ssi.cgi?miscella.html#MI0053
パネルは半透明になると思いますがhamanaもどきが作れるかどうかはわかりません.
702デフォルトの名無しさん:2005/04/20(水) 16:50:05
>>701
LabelやImageなどはありましたが、パネルはありませんでした・・・
残念。
703デフォルトの名無しさん:2005/04/20(水) 17:45:18
>>699
>作成できませんか?
  _, ._
( ゚ Д゚)
704デフォルトの名無しさん:2005/04/20(水) 17:47:08
705デフォルトの名無しさん:2005/04/20(水) 18:49:57
同じような質問なのですが。

フォームの背景を半透明にして、フォーム上の文字だけを不透明にしたい場合、方法ってありますか?
706デフォルトの名無しさん:2005/04/21(木) 00:33:33
http://uups.ath.cx/sn/src/uups0293.bmp
↑で赤のところをカスタムにして緑のところをクライアントにしようとすると青みたいな感じで下に潜り込んじゃうんだけど、
どうにかならない?
707デフォルトの名無しさん:2005/04/21(木) 00:44:18
>>706
青のとこにalClientのパネルおいて、その上に赤と緑じゃ駄目か?
オレはいつもそうしてる
708デフォルトの名無しさん:2005/04/21(木) 09:08:59
>>704
これには、パネルが無いようです。
709デフォルトの名無しさん:2005/04/21(木) 20:16:09
アプリを複数起動させて、横に並べるとか、重ねて並べるとかの
やり方教えて下さい。
710デフォルトの名無しさん:2005/04/22(金) 07:37:33
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
711デフォルトの名無しさん:2005/04/22(金) 09:38:06
StringGridのoptionでgoRowSelectをTrueにすると行選択できますが
この選択されたときのハイライトの色ってかえられますか?
もちろんwindowsの選択項目の色を変えれば変わりますが。。
任意のStringGridのみ変更したいのです。
712デフォルトの名無しさん:2005/04/22(金) 10:41:06
>>711
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with TStringGrid(Sender).Canvas do begin
if gdSelected in State then begin
Brush.Color := clRed;
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, TStringGrid(Sender).Cells[ACol, ARow]);
end else begin
end;
end;
end;
713デフォルトの名無しさん:2005/04/22(金) 11:11:43
#include <stdio.h>
#define MAXLINE 1000

void reverse(char from[], char to[]);
int getline(char s[], int lim);

int main() {char line[MAXLINE];
char rline[MAXLINE];
int len;
while ((len = getline(line, MAXLINE))>0) {
reverse(line,rline);
printf("%s", rline);}}

int getline(char s[], int lim) {
int c,i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++ i)
s[i] = c;
if (c == '\n') {
s[i] = '\n';
++i;}
s[i] = '\0';
return i;}
void reverse(char from[], char to[]) {
int i,j;
for (i = 0; from[i] != '\0'; ++i);
for (j = 0, i--; i <= 0; ++j, --i)
to[j] = from[i];
to[j] = '\0';
return ;}
↑を実行するとセグメントエラーと出ます。
セグメントエラーってなんですか
714デフォルトの名無しさん:2005/04/22(金) 11:35:42
>>702
canvasはないけど、TPanel.Brush..Bitmapを使えばいけるんじゃないか。
フォームのカンバスにアクセスしてコンポ−ネントの真下の背景を取得して、TPanel.Brush..Bitmapにアサインする。
715デフォルトの名無しさん:2005/04/22(金) 11:51:35
>>713
最初からして違うじゃないか。

#include <stdio.h> X
uses stdio ;     O

#define MAXLINE 1000  X
const MAXLINE = 1000 ; O

716デフォルトの名無しさん:2005/04/22(金) 13:20:23
715がいいこと言った
717711:2005/04/22(金) 13:35:57
>>712
ありがとうございました。うまく動きました!
718デフォルトの名無しさん:2005/04/22(金) 15:41:30
>>714
下記のようにすると、違反が出ます(;´o`)
なんででしょう?

var
Bmp: TBitmap;
DC: HDC;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := Panel1.Width;
Bmp.Height := Panel1.Height;
DC := GetDC(Form1.Handle);
BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, DC, Panel1.Left, Panel1.Top, SRCCOPY);
Panel1.Brush.Bitmap.Assign(Bmp);
finally
Bmp.Free;
end;
end;
719デフォルトの名無しさん:2005/04/22(金) 16:30:32
>>718
Panel1.Brush.Bitmap := Bmp
じゃ駄目かな
720デフォルトの名無しさん:2005/04/22(金) 16:48:49
直接なんでかと言えば11行目の

Panel1.Brush.Bitmap.Assign(Bmp);

の時点での

Panel1.Brush.Bitmap

がnilだからだ
721デフォルトの名無しさん:2005/04/22(金) 19:19:53
709 お願いします。
以前に作ったこと有るんですけど、忘れてしまってぐぐってもわからんです。
722デフォルトの名無しさん:2005/04/22(金) 21:44:14
>>709
君のアプリだけを並べたいのか、起動してるすべてのアプリを並べたいのか
723709:2005/04/22(金) 22:04:53
自分のだけです。
724デフォルトの名無しさん:2005/04/22(金) 23:59:47
自分のだけなら自分で計算してやらないとだめだな。

1.自前のウィンドウメッセージを用意する(またはWM_COMMANDを便乗してもよい)。
2.自前のメッセージをSendMessageで送る(HWND_BROADCASTで)。
3.メッセージを受け取った自前のアプリ内でデスクトップの大きさを調べて(TScreen)
 適切なサイズを計算してwidthとheightを変える。
725デフォルトの名無しさん:2005/04/23(土) 02:11:04
共有メモリが良いのでは?
726デフォルトの名無しさん:2005/04/23(土) 02:25:57
共有目盛りをどうしろと?
727デフォルトの名無しさん:2005/04/23(土) 02:37:05
>>725
超初心者用スレでは敷居が高すぎる
728デフォルトの名無しさん:2005/04/23(土) 02:38:45
共有メモリで各自のtop left width heightを相互参照しつつ
それぞれのウィンドウが自分で調整する・・・・・

じゃないな

共有メモリで起動してる自アプリの個数を管理して
SendMessageでサイズ変更

かね
729デフォルトの名無しさん:2005/04/23(土) 02:39:31
727でつっこみが入ったから
プロセスを列挙して起動してる自アプリの数をカウント

にチェンジ
730デフォルトの名無しさん:2005/04/23(土) 05:59:45
>>709
適当にコンポーネント化してみたよ。
http://www.geocities.jp/nanasiya3/archive/FormArrangers.lzh
インストールして、フォームに置いて
FormArranger1.Cascade;
ってやれば重ねて並べる。
731デフォルトの名無しさん:2005/04/23(土) 06:17:38
for文を書くと処理が終わるまでフォームが固まってしまいます。
何とか回避する手段は無いでしょうか?

初歩的な質問だと思いますが、どうかよろしくお願い致します。
732デフォルトの名無しさん:2005/04/23(土) 06:26:12
>>731
途中で
Application.ProcessMessages;
を入れると吉。
733709:2005/04/23(土) 07:35:51
724-730 ありがとうございます。

>>730 ソース見て勉強させてもらいます。

めちゃくちゃ助かりました。!!
734デフォルトの名無しさん:2005/04/23(土) 08:00:07
Create(Self)で生成したコンポーネントを破棄するにはどうしたらいいですか?
Freeとか書く場所が分からない……。
735デフォルトの名無しさん:2005/04/23(土) 08:27:20
>>734
質問の意図が分からない。
生成したコンポーネントが必要なくなったときに Free すればよい。
736734:2005/04/23(土) 08:59:07
サブフォームを表示したときにEditをいくつか生成して、
サブフォームを閉じたときにEditをすべて破棄して、
もう一度サブフォームを表示したときにEditを生成しなおしたいんです。
OnShowでEdt  :=  TEdit.Create(Self);
OnCloseでEdt.Free;
にしたんですが、破棄されないみたいです。
自分でも混乱していて申し訳ない。
737デフォルトの名無しさん:2005/04/23(土) 09:00:33
>>709
var
 MyWnds: array of HWND;

procedure Arrange(Pattern: Integer);
begin
 case Pattern of
  0: CascadeWindows(0, 0, nil, High(MyWnds) + 1, MyWnds); // 重ねる
  1: TileWindows(0, MDITILE_HORIZONTAL, nil, High(MyWnds) + 1, MyWnds); // 縦に並べる
  2: TileWindows(0, MDITILE_VERTICAL, nil, High(MyWnds) + 1, MyWnds); //横に並べる
 end;
end;

 あと自分のアプリのウィンドウを列挙するコールバック関数(EnumWindowsProc)を
作成すること
738デフォルトの名無しさん:2005/04/23(土) 09:17:09
>>736
サブフォームのOnCreate/OnDestroyで書くべきだとおもうのだが、
それではダメなのか?
もしくは生成/解放しないで、単にVisibleプロパティをいじるとか。
739デフォルトの名無しさん:2005/04/23(土) 10:17:08
親コンポーネントがFormならFormを破棄したときに自動で解放されるんじゃないか
しかしOnShowで生成するとOnShowイベントが発生するたびに何回も生成しまくるわけで
>>738の言うとおりOnCreateで生成しよう
740739:2005/04/23(土) 10:20:53
ごめん嘘
その使い方ならOnShow/OnHideで生成/解放しよう
OnCloseは右上の×ボタン押したりとかCloseさせたときしか起こりません
741デフォルトの名無しさん:2005/04/23(土) 10:27:44
OnCreateってプログラムが起動したときですよね(多分)
メインフォームの状態を見て生成したいので……。
Edit生成するときにNameもつけるんですが、
サブフォーム表示されるたびに生成するのでNameがかぶるらしくて、
閉じるとき(OnHideですか)に生成した分を無かったことにしたい。
---
ちょっと遅かった。情報小出しですみません。
742デフォルトの名無しさん:2005/04/23(土) 10:51:28
OnCreateはサブフォームがCreateされたときだから、
プログラムの起動と同時にサブフォームをCreateするなら起動したときです

OnShowで

 hoge := TEdit.Create(Self);
 fuga := TEdit.Create(Self);

OnHideで

 hoge := hoge.Free;
 fuga := fuga.Free;

としてもダメですか?
複数のEditを作りたければその数だけ変数が必要です。

# サブフォームにあらかじめEditを配置しておけば、
# Show/HideしてもEditを普通に使えますが、
# それでは問題のある場面ですか?
 
743デフォルトの名無しさん:2005/04/23(土) 11:55:52
フレームの動的生成について質問です。環境は、Delphi6プロフェッショナルです。
フレーム定義のユニットが、
unit uFrameTest;
interface

uses $USES_UNIT ;

type
 TframeTest = class(TFrame)
  Label: TTLabel;
 private
 public
  constructor Create(AOwner: TComponent); override;
 end;

implementation
constructor TfraTSinfo.Create(AOwner: TComponent);
Begin
 inherited ;
 Label.Caption := 'this is Test' ;
end;

end.
//収まらないのでその2へ続きます。

744743:2005/04/23(土) 11:56:23
メインフォームのユニットが、
unit uMain;

interface

uses $USES_UNIT , uFrameTest ;

type
 TformMain = class(TForm)
 private
 public
  procedure TformMainf.FormCreate(Sender: TObject);
 end;

var
 mainform : TMainForm ;

end;

implementation
 var pFrameList : array [1..3] of TFrame ;
procedure TformMainf.FormCreate(Sender: TObject);
begin
 pFrameList[1] := TframeTest.create(senf);
 pFrameList[2] := TframeTest.create(senf); //ここでエラーがでます。
end ;

end. //書ききれないので、その3に続きます。
745743:2005/04/23(土) 11:56:43
こういうエラーがでます。
---------------------------
デバッガ例外が発生
---------------------------
プロジェクト pMain.exe が EComponentError クラスの例外を生成しました。
'コンポーネント名 frameTest はすでに使われています'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。
---------------------------
OK ヘルプ(H)
---------------------------
実際にエラーを出しているのは、ユニットClassesの
procedure TComponent.ValidateRename(AComponent: TComponent;
 const CurName, NewName: string);
begin
 if (AComponent <> nil) and not SameText(CurName, NewName) and
  (AComponent.Owner = Self) and (FindComponent(NewName) <> nil) then
  raise EComponentError.CreateResFmt(@SDuplicateName, [NewName]); //ここでエラーがでています。
 if (csDesigning in ComponentState) and (Owner <> nil) then
   Owner.ValidateRename(AComponent, CurName, NewName);
end;
やりたいことは、フレームを動的に生成して、フレームのインスタンスへのポインタを配列に入れて、
生成したフレームへアクセスすることです。
 pFrameList[1] := TframeTest.create(senf);の(self)を(nil)にするとエラーはでなくなりましたがフレームが表示されません。
手持ちの書籍で調べましたが、よくわかりませんでした。
よろしくご教授お願いします。長文失礼しました。
746デフォルトの名無しさん:2005/04/23(土) 11:59:22
begin
 pFrameList[1] := TframeTest.create(senf);
 pFrameList[1]^.Name := 'Frame1';
 pFrameList[2] := TframeTest.create(senf); //ここでエラーがでます。
 pFrameList[2]^.Name := 'Frame2';
end ;

全然検証してないけどこうやってもだめですか。
747デフォルトの名無しさん:2005/04/23(土) 12:01:55
よく見たら ^ 要らないや。
748743:2005/04/23(土) 12:53:07
>>746
回答ありがとうございます。
それぞれのnameプロパティにユニークな名前を設定したらエラーがでなくなりました。ありがとうございました。
749731:2005/04/23(土) 13:09:58
>>732
きちんと回避できました。どうもありがとうございます!
750デフォルトの名無しさん:2005/04/23(土) 13:58:19
教えて下さい。
一つのフォームに複数のListBoxを貼り付けて同時スクロールをさせるには、
ActionListのonUpdateを使うのが普通なんでしょうか?
ListBoxがスクロールする時のイベントとかってないんですよね?

751デフォルトの名無しさん:2005/04/23(土) 14:13:00
752デフォルトの名無しさん:2005/04/23(土) 14:31:50
TBrushについての質問です。
ヘルプファイルにはBitmapプロパティについて、
「イメージが 8×8 ピクセル以上ある場合,
左上の 8×8 の領域のみが使われます」とあります。
しかしこの説明に反して、Bitmapに大きなイメージを設定した場合でも、
Bitmapの全部がブラシ模様として使われるようです(環境はWinXP、Delphi6)。

このことは、OS側の仕様が変わったためと理解してよいのでしょうか?
そうならない場合も想定する必要があるかどうか知りたいのですが。
753734:2005/04/23(土) 19:11:46
>>742
理屈は分かったような気がするのですが、
単純にコンポーネントを削除するような方法は無いのでしょうか?

>あらかじめEditを配置
はしばらく考えてみます。

それともう一つ質問ですが、変数(Edt)を初期化するというのはどうやるのですか?
754デフォルトの名無しさん:2005/04/23(土) 19:59:36
>>753
そもそも何がしたいのか言った方が解決が早いと思うよ。
本当に生成/破棄をする必要があるの?
ずいぶん遠回りしてるように見える。最初の発想に固執してるというか。

一応、TForm の中にある TEdit を削除するにはこんな感じ。(Formのメソッドの中で)

var
i: Integer;
begin
for i := ControlCount - 1 downto 0 do
if Controls[i] is TEdit then Controls[i].Free;
755デフォルトの名無しさん:2005/04/23(土) 20:44:21
恐縮ですが質問です。こちらの環境は、Delphi6ENT+Win2Kです。TFrameのPublicに追加したメンバー変数へのアクセスで困っています。こんな感じです。
//フレームの定義。showstringに代入した文字列をPixに描画する。
Unit uMyFrame
interface
type
 TMyFrame = class(TFrame)
  Pix: TImage;
 private
 public
  showstring : string ;
end; //implementation以降は省略
//メインのユニットにて
uses uMyFrame
var pMyFrame : array [1..50] of TFrame ;
begin
 pMyFrame[1] := TMyFrame.Create(self) ;
 pMyFrame[1].width := 100 ; //これは通ります
 pMyFrame[1].showstring := 'test-mojiretsu'; // ここでエラーがでます。
end;
[エラー] uMyFrame.pas(XXX): 未定義の識別子 : 'showStringl'
publicで定義していてusesもしてあるのに未定義の識別子というのがよくわかりません。
どうすれば、publicで定義した変数にアクセスできるのでしょうか。よろしくお願いします。
756デフォルトの名無しさん:2005/04/23(土) 20:47:40
showString"l"?
757755:2005/04/23(土) 20:54:19
>>756
申し訳ありません。書き間違えました。

正しくは、
[エラー] uMyFrame.pas(XXX): 未定義の識別子 : 'showStringl'  X
[エラー] uMyFrame.pas(XXX): 未定義の識別子 : 'showString'  O
です。
758デフォルトの名無しさん:2005/04/23(土) 21:04:53
>>757
× var pMyFrame : array [1..50] of TFrame;
○ var pMyFrame : array [1..50] of TMyFrame;

にするとか。
759デフォルトの名無しさん:2005/04/23(土) 21:05:22
>>757
var pMyFrame : array [1..50] of TFrame ;
と宣言しているので pMyFrame は TFrame 型の配列変数になりますよね。

そして、
pMyFrame[1] := TMyFrame.Create(self) ;
というのは、TFrame 型変数に TMyFrame 型のインスタンスを入れています。
これが代入できるのは、TMyFrame が TFrame のサブクラス(派生クラス)だからです。
こういった場合、pMyFrame[1] は TFrame 型として扱われるので、
TFrame のプロパティにしかアクセスできません。

これは、ポリモーフィズムと呼ばれる、オブジェクト指向の代表的な考え方です。

pMyFrame を TMyFrame の配列として扱うには
var pMyFrame : array [1..50] of TMyFrame ;
と宣言してください。
760デフォルトの名無しさん:2005/04/23(土) 21:30:13
>>758>>759
回答ありがとうございます。
多態性オブジェクトというのが、調べた本には書いてあったのですが、何のことかピンときていませんでした。
実際のコードでは、微妙に機能の違う派生フレームがあたくさんるので、フレームの設計を見直したいと思います。
761734:2005/04/24(日) 00:56:45
>>754
うー(つд`。)
今の目標は、メインフォームにあるListView(vsReport)の内容を書き換える、です。
アイテムのCaption(とSubItem)を書き換えるところでつまづいています。
サブアイテムの数は一定でないので、適宜Editを生成して、
EditのテキストをItemのキャプションとSubItemにそれぞれ対応させて書き込みたい。

>>754のソースで削除はできたんですが、(助かりました。ありがとうございます。)
1つめのEdtをItemに、2つめ以降のEdtをSubItemに当てはめる方法でまた引っ掛かりました。
1つめのTEditのNameはEdt1にするのですが、Edt1はどうやって呼び出せばいいんでしょうか?

あらかじめ用意すればNameの問題は解決するんですが、
Edtの数が足りなくなったり多すぎたりするのは避けたいです。
762デフォルトの名無しさん:2005/04/24(日) 01:07:16
>>761
やりたいことが見えない部分はあるけど、
数が不定の文字列の集まりなら、TStringsListはどう?
文字列の追加・削除が自由にできるし、かなり使いでのあるクラスだよ。
763デフォルトの名無しさん:2005/04/24(日) 01:12:18
>>761

動的に作成するのなら Name はあまり関係ない。
TEdit の動的配列かリストを作って EditArray[i] や EditArray.Items[i] でアクセスできる。

あと TComponent のデストラクタではオーナーのリストから自分自身をちゃんと削除しているので
TEdit.Free で削除できるはず。
2重開放してないか?

しかしそれ以前に本当にその方法(アイテムの項数に応じて動的に TEdit 作成)が
適切か見直すべきではないか。
不定個の入力ボックスは作る側も使う側も扱いづらいと思う。
764デフォルトの名無しさん:2005/04/24(日) 02:45:31
日本男児ぃー
765デフォルトの名無しさん:2005/04/24(日) 03:04:39
普通そういう時って TStringGrid とか使わないか?
TEdit だと、数が多いほど、どんどんウィンドウが縦長になる。
766デフォルトの名無しさん:2005/04/24(日) 15:41:27
TValueList もな
767デフォルトの名無しさん:2005/04/24(日) 15:49:56
うるせーな、人が名に使おうと勝手だ。
すっこんでろ
768デフォルトの名無しさん:2005/04/24(日) 16:18:27
Button1をクリックした時、選択枠がでますが、あれって消せないものでしょうか? 教えてください。
769デフォルトの名無しさん:2005/04/24(日) 16:22:12
ファイル名を検索→存在した場合絶対パスを返す
という事をやりたいのですがどのように書けば良いのでしょうか。
特定のディレクトリに対してなら出来たのですが、特定のディレクトリ以下
全てを検索するにはどのようにすれば良いのでしょうか。。
770デフォルトの名無しさん:2005/04/24(日) 17:03:16
>>768
すごくがんばれば消せるけどPanelをクリックさせるんじゃダメなんですか

>>769
ディレクトリの中にディレクトリを見つけたらそのディレクトリの中をチェック

function CheckDir(Path: string): string;
var
 ReturnStr: string;
begin
 for 順番にファイルを取得 do
 begin
  if ファイルなら then
  begin
   if 目的のファイル名なら then
   begin
    Result := ReturnStr;
    Exit;
   end;
  end
  else if ディレクトリなら then
  begin
   ReturnStr := CheckDir(そのディレクトリ);
   if ReturnStr <> '' then
   begin
    Result := ReturnStr;
    Exit;
   end;
  end;
 end;
 Result := '';
end;
771デフォルトの名無しさん:2005/04/24(日) 17:04:28
11行目間違えた

function CheckDir(Path: string): string;
var
 ReturnStr: string;
begin
 for 順番にファイルを取得 do
 begin
  if ファイルなら then
  begin
   if 目的のファイル名なら then
   begin
    Result := 目的のファイルの絶対パス;
    Exit;
   end;
  end
  else if ディレクトリなら then
  begin
   ReturnStr := CheckDir(そのディレクトリ);
   if ReturnStr <> '' then
   begin
    Result := ReturnStr;
    Exit;
   end;
  end;
 end;
 Result := '';
end;
772734:2005/04/24(日) 19:17:16
>>762ー766
TStringsList、動的配列、TStringGrid、TValueListEditor(ですよね)勉強してみます。
開放の件は、よく解らないです。しばらく考えてみます。
早く完成させたくて焦ってました。一旦考え直します。どうもありがとう。
773デフォルトの名無しさん:2005/04/25(月) 09:29:14
SpinEditの三角矢印を押した時のイベントはどうすればできますか?
774デフォルトの名無しさん:2005/04/25(月) 09:52:18
>>773です
自己解決 普通に SpinEdit1Change でできました。 お騒がせしました。
775ななしへたぐらま ◆XcB18Bks.Y :2005/04/25(月) 19:05:16
>>768
つ スピードボタン

ちなみにあの点線の枠は『スペースバーを押すとこのボタンを押します』ということを示すものです.
なので,キーボードで操作する場合にあれを消されると困ってしまうのですよ.

スピードボタンはそもそもキーボードでは押せないので
(『マウスキー』を使う場合は別ですが)
この点線枠が表示されることもありません.


>>772
細かいことですがレスアンカーが半角ハイフォン(マイナス)ではなくて半角カナの長音記号になっていますョ.
これはただの飾りではなくてクリックするとそのレス(この場合は762-766)にジャンプする機能を持っているものです.
次からで構いませんのでお手数でも正しく入れて下さるとありがたいです.
776デフォルトの名無しさん:2005/04/26(火) 15:59:45
formの中心にImage1を配置するにはどうすればいいですか? 
777デフォルトの名無しさん:2005/04/26(火) 16:12:31
>>776
もしかしたらちゃんとしたプロパティとかあるのかもしれないけど。。

procedure TForm1.FormResize(Sender: TObject);
var
i1,i2:Integer;
begin
i1 := 0;
i2 := 0;
i1 := (Form1.ClientWidth - Image1.Width) div 2;
i2 := (Form1.ClientHeight - Image1.Height) div 2;
Image1.Left := i1;
Image1.Top := i2;
end;

とかどうかな?初心者なんですみませんm(_ _)m
778デフォルトの名無しさん:2005/04/26(火) 16:13:07
>>776
IDE上でならImage1右クリック→位置→位置合わせ
実行時でなら…OnReSizeにゴリゴリ書くぐらい?
779デフォルトの名無しさん:2005/04/26(火) 16:25:56
>>777 >>778
ありがとうございます。 試してみます。
780デフォルトの名無しさん:2005/04/26(火) 17:14:17 BE:188328487-
>>776
> formの中心にImage1を配置するにはどうすればいいですか?

IDEで中央に配置してImageのアンカープロパティを全部Trueにすれば
フォームのサイズが変わっても中央に置かれるよ
あまりにもフォームのサイズを小さくすると画像がひしゃげたり見えなくなるけど
781デフォルトの名無しさん:2005/04/26(火) 17:16:45
>>780
それじゃサイズを変えただけでおかしくなるんじゃ?
782デフォルトの名無しさん:2005/04/26(火) 17:35:31
776です。
みなさん、ありがとうございます。
しかしながら、うまくいきませんでした。
Image1は サイズが変わるので大きいサイズになると中央より右いったりします。
また、いい案あれば教えてください。お願いします。
783デフォルトの名無しさん:2005/04/26(火) 17:43:49
>>782
Image1のサイズが変わったときに再計算、再配置すれば良いじゃないか
案もくそもないぞ
784デフォルトの名無しさん:2005/04/26(火) 18:00:08
776です。
>>783
一発で何か方法があればと思いまして。申し訳ないです。

>>777さんの方法でうまくいってました。 
ファイルを開いた時には反応しなかったので、
それを修正したいと思います。 
785デフォルトの名無しさん:2005/04/26(火) 22:08:58
デルファイ6で、TImage.Pictureに読み込ませるビットマップについての質問です。
パネルのなかにイメージコンポーネントを配置してクリックすると画像が変化するボタンのようなものを作っています。
これをコンポーネントとはいわないまでもクラスとして動的に生成して使いたいと思っています。
そのイメージコンポーネントに読み込ませる画像なのですが、現在は、LoadFromFileで読み込んでいます。
これをビットマップデータをソースコード中に定数で置きたいのですがどうすればいいのでしょうか。
フォームにイメージコンポーネントを配置して(設計時に画像を読み込ませ済み)、フォームをテキスト形式で表示して、

 object imgTitlePix: TImage
Picture.Data = {
  07544269746D6170361B0000424D361B00000000000036000000280000003000
   (中略)  
  BEE0CCBEE0CCBEE0CCBEE0CCBEE0CCBEE0CCBEE0CCBEE0CCBEE0CCBEE0CCBE38
200E}

から、カット&ペーストしてImage1,picture.data := { String } としましたが、dataというプロパティがないというエラーになってしまいました。
設計時にできていることなので何らかの方法があると思うのですが調べてもよくわかりませんでした。
どなたかご教授ください。よろしくお願いします。
786デフォルトの名無しさん:2005/04/26(火) 22:24:13
>>785
画像をTBitmapでオフスクリーンビットマップとして持つのはだめなのかい?
787デフォルトの名無しさん:2005/04/26(火) 22:24:23
ウィンドウを持たないアプリケーションを作りたいんですけど方法がわかりません。
よくある、タスクバーにアイコンがいて、画面上に画像を表示したり定規を置いたりするやつです。ヒントください。
788デフォルトの名無しさん:2005/04/26(火) 22:37:52
透明なウィンドウにImageを配置するのが一番楽だと思うんだが。
789デフォルトの名無しさん:2005/04/26(火) 22:53:34
Form1のAlphaBrendとValueをいじっただけだと画像や図形まで透過してしまいます。。。
790デフォルトの名無しさん:2005/04/26(火) 22:56:33
delphi6をいれようと思ったら、ライセンスキーを取得のところで、
既存のリモートホストは強制的に切断されたとか言われて取得できません
cookieは全て許可で、JavaScriptも有効にしてるんですが、どうしてかさっぱりわかりません
どうすればいいですか?
791デフォルトの名無しさん:2005/04/26(火) 22:58:30
>>789
そういう風にやるならいじるのは、
TForm.TransparentColor : Boolean と
TForm.TransparentColorValue :TColor
792デフォルトの名無しさん:2005/04/26(火) 23:04:00
>>791
超サンクス!
それ+BorderStyleをbsNoneにして、それっぽくなりました。
793デフォルトの名無しさん:2005/04/26(火) 23:04:51
>>786
回答ありがとうございます。やりたいことをもう少し具体的に書きます。
unit uMyPanel
interface
Type TMyPanel = class(TPanel)
 private
  BaseImage : TImage ;
 public
  constructor Create(AOwner: TComponent); override;
end;

implementation
constructor TfraTSinfo.Create(AOwner: TComponent);
Begin
 inherited ;
 BaseImage := TImage.Create(self) ;
 //ここで画像を設定したいが、ディスクのファイルからは読み込ませたくない。定数でおきたい。
end;
コンストラクターのほかにもクリックしたばあいの処理やフィールドの処理なども組み込みたいのです。
素直にファイルから読み込むしかないのでしょうか。
794デフォルトの名無しさん:2005/04/26(火) 23:11:13
TImageにロードしておけばexeの中にリソースを格納する。
とか言ってみるテスト。

違ったっけ?
795デフォルトの名無しさん:2005/04/26(火) 23:27:15
>>794
設計時にTImageが存在していればそれでいけるんですけど。
このばあい、TMyPanelのコンストラクターの中で動的に生成されるので、事前に入れておくことはできません。
クラスなんで、変な依存関係をもたせたくないので、ディスク上のファイルから読むか定数でおくしかないと思うのですが。
それとも何か他に方法があるのでしょうか。
796デフォルトの名無しさん:2005/04/26(火) 23:44:02
ImageListにイメージを格納しておいて、
そこから動的にMyPanelに引っ張ってくる
とかは?
797デフォルトの名無しさん:2005/04/26(火) 23:46:42
TImageListでいいじゃん。
798ななしへたぐらま ◆XcB18Bks.Y :2005/04/27(水) 00:08:52
>>780
全部Trueにすると四方から引っ張られてしまうっす.全部Falseですね.

>>785
画像サイズが小さければイメージリストとペイントボックスを使ってみては?

フォームのprivate節に
FImageIndex: integer;
というフィールド変数を追加して,

procedure TForm1.PaintBox1Click(Sender: TObject);
begin
 FImageIndex := (FImageIndex + 1) mod ImageList1.Count;
 PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 ImageList1.Draw(PaintBox1.Canvas, 0, 0, FImageIndex);
end;

ただうちの環境では画像を大きくするとどういうわけか
設計時に画面を読み込んだ時点でDelphiが落ちてしまいます.
(64×64はOKで400×600が駄目でした)
イメージリストが使えない場合はリソースファイルを書く.
が,終電が迫っているので時間切れ,申し訳ない.

(どこかにビットマップを読み込むコンポがあるかもしれないのでもしあればそれを使う)
799デフォルトの名無しさん:2005/04/27(水) 00:09:22
>>796-797
やっぱりそうなりかね。
イメージリストの使用やファイルの読み込みもふくめてもう一回考えてみます。
800デフォルトの名無しさん:2005/04/27(水) 10:33:11
>>793
TImageに画像をロードさせた状態で、フォーム上で右クリックして
「エディタで表示」を選択するとヒントが得られると思います。
801:2005/04/27(水) 15:55:11
unit ImageWithBmp;
interface
uses
 Windows, SysUtils, Classes, Graphics, ExtCtrls;
type
 TImageWithBmp = class(TImage)
 public
  Bmp: TBitmap;
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
 end;
procedure Register;
implementation
constructor TImageWithBmp.Create(AOwner: TComponent);
var
 BmpData: string;
 i, iDataLen: Integer;
 P, P_: PByte;
 ST: TMemoryStream;
begin
 inherited Create(AOwner);
 Bmp := TBitmap.Create;
 Bmp.PixelFormat := pf24bit;
 Bmp.Width := 29;
 Bmp.Height := 13;
802神& ◆UFPbBGCO9U :2005/04/27(水) 15:55:41
 BmpData :=
  '424DAE0400000000000036000000280000001D0000000D000000010018000000' +
  '000078040000C40E0000C40E00000000000000000000FFFF00FFFF00FFFF00FF' +
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00FFFF00FFFF0000FFFF00FFFF00FFFF00000000FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF00FF' +
  'FF00FFFF0000FFFF00FFFF00000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00FFFF00FFFF00000000000000000000FFFF00FFFF00FFFF00FF' +
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF00FFFF0000FFFF' +
  '00FFFF00000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF' +
  'FF00000000FFFF00FFFF00FFFF00000000FFFF00FFFF00FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00000000FFFF00FFFF0000FFFF00000000FFFF00FF' +
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF00' +
  'FFFF00FFFF00000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00000000FFFF0000FFFF00000000FFFF00FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF00FFFF00FFFF000000' +
  '00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000' +
  '0000FFFF0000FFFF00000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00FFFF00000000FFFF00FFFF00FFFF00000000FFFF00FFFF00FF' +
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF0000FFFF' +
  '00000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF' +
  'FF00FFFF00000000000000000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF0000FFFF00000000FFFF00FF' +
803神& ◆UFPbBGCO9U :2005/04/27(水) 15:56:21
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00000000FFFF0000FFFF00FFFF00000000FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FF' +
  'FF00FFFF0000FFFF00FFFF00000000FFFF00FFFF00FFFF00FFFF00000000FFFF' +
  '00000000FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000' +
  '0000FFFF00000000FFFF00FFFF00FFFF00FFFF00000000FFFF00FFFF0000FFFF' +
  '00FFFF00FFFF00000000FFFF00FFFF00FFFF00FFFF00000000FFFF00FFFF00FF' +
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00000000FFFF00' +
  'FFFF00FFFF00FFFF00000000FFFF00FFFF00FFFF0000FFFF00FFFF00FFFF00FF' +
  'FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00' +
  'FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF' +
  '00FFFF00FFFF00FFFF00FFFF0000';
 iDataLen := Trunc(Length(BmpData) / 2);
 ST := TMemoryStream.Create;
 GetMem(P_, iDataLen);
 try
  P := P_;
  for i := 1 to iDataLen do begin
   P^ := StrToInt('$' + Copy(BmpData, (i - 1) * 2 + 1, 2));
   inc(P);
  end;
  ST.Position := 0;
  ST.Write(P_^, iDataLen);
804kami:2005/04/27(水) 15:56:58
  ST.Position := 0;
  Bmp.LoadFromStream(ST);
 finally
  FreeMem(P_);
  ST.Free;
 end;
end;
destructor TImageWithBmp.Destroy;
begin
 Bmp.Free;
 inherited Destroy;
end;
procedure Register;
begin
 RegisterComponents('Samples', [TImageWithBmp]);
end;
end.

で、

procedure TForm1.Button1Click(Sender: TObject);
begin
 ImageWithBmp1.Picture.Bitmap.Assign(ImageWithBmp1.Bmp);
end;
805デフォルトの名無しさん:2005/04/27(水) 16:11:43
( ゚Д゚)
806ななしへたぐらま ◆XcB18Bks.Y :2005/04/27(水) 16:53:39
神降臨のあとなので蛇足っぽいのですが,
せっかくなので>>798のつづきでリソースファイルを使う方法も書いておきます.


たとえば"a074a.bmp","a156a.bmp"という2つのファイルを使うとします.
(話を簡単にするためにここではすべてのファイルは同じフォルダにあるとします)

1.メモ帳などのエディタで以下のような内容のファイルを作ります.
 (Delphiの「ファイル」→「新規作成」→「テキスト」でもよい)
--------------- ↓ここから ---------------
10000 BITMAP "a074a.bmp"
10001 BITMAP "a156a.bmp"
--------------- ↑ここまで ---------------
これを"bitmaps.rc"などという名前で保存(拡張子以外は好きな名前で結構です)

2.Delphiの『プロジェクトに追加』でこのファイルを追加します.

3.実行時に Bitmap1.LoadFromResourceID(MainInstance, 10000) という風に読み込みます.
807デフォルトの名無しさん:2005/04/27(水) 16:57:13
自分でgrepdでもやれ死ね
808デフォルトの名無しさん:2005/04/27(水) 17:16:31
>>807
( ゚Д゚) ??
809デフォルトの名無しさん:2005/04/27(水) 17:17:09
GW も間近なのに ToolBar に ToolButton を挿入できません...
ToolButton を Create して Parent や Style や Width や Action の指定を
して先頭(一番左)に追加はできるんですが、SetBounds で位置を移動すると、
移動した位置より左側のの設計時に作成した ToolButton の動作が変です...
何か足りないんでしょうか。(Del7 WinXP)
810デフォルトの名無しさん:2005/04/27(水) 17:34:23
おいぇおいぇおいぇおいぇ
811デフォルトの名無しさん:2005/04/27(水) 17:41:41
ウインドウメッセージの処理について質問があります。私の環境は、Delphi6Personalです。
最小化できないフォームを作りたいのですが、フォームのキャプションを消すという部分は完了しています。
今の問題は、タスクバーにある「デスクトップの表示」を押すと最小化してしまうことです。
自分なりに調べて、こういうコードを書いてみました。
interface
type
 TForm1 = class(TForm)
  private
   procedure WMSysCommand(var Msg : TWMSysCommand); message WM_SYSCOMMAND ;
end;
implementation
procedure TForm1.WMSysCommand(var Msg : TWMSysCommand);
begin
if Msg.CmdType = SC_MINIMIZE then Msg.Result := 0 else inherited ;
end;
このコードですと最小化してしまいます。見当違いの実装をしているのでしょうか。
よろしく御教授ください。お願いします。
812デフォルトの名無しさん:2005/04/27(水) 18:09:35
( ゚Д゚)くだすれ…だよね…レベルたカッ
813デフォルトの名無しさん:2005/04/27(水) 18:39:24
>>809
GW が関係無すぎてワロタ
ToolBarはそういう仕様だと思うけど
ボタンの順番を変えたいだけならLeftをいじくってみれ

>>810
おうぇおいえうぇいえwwwwwwwwっうぇwwwwwwwっうぇ

>>811
デスクトップの表示はそもそもWMSysCommandじゃない
表示ボタン押しても隠れない仕様は邪魔じゃないか?

>>812
くだすれ と 上級者用 の2段階しかないから我慢
814811:2005/04/27(水) 19:02:30
>>813
実は、画面の右端に居座るランチャーを作っています。
バーアプリにして、他のフォームを最大化しても隠れないようにしてあるので、できれば居座りつづけてほしいのです。
フォームのリサイズイベントで対応したほうがいいのでしょうか。
815デフォルトの名無しさん:2005/04/27(水) 19:13:54
TBitmapの範囲を指定して描画するにはどうしたらいいですか
左上0,0右下100,100とかして切り取ったものを表示したいんです
816デフォルトの名無しさん:2005/04/27(水) 19:34:15
>>815
TBitmap.Canvas.CopyRectではだめ?
TBitmapに限らず、画像関係のオブジェクトは、TCanvasプロパティをもっているから、
TCanvasのメソッドでたいていは処理できるよ。
817デフォルトの名無しさん:2005/04/27(水) 20:04:15
>>813 ツールバーをカスタマイズ可能なよーにしいっ GW前までにな
という方がいまして。オレにGW出勤させたければ誰も答えなくてけっこー。
うそ。どなたかご存知の方がおられましたら助けてちょんまげ。
818デフォルトの名無しさん:2005/04/27(水) 20:08:59
動的に生成なんてことするなら、パネルとスピードボタンでやったほうがわかりやすいんじゃないかな。
その可能にするカスタマイズの内容がわからないのではずしているかもしれませんが。
819デフォルトの名無しさん:2005/04/27(水) 20:33:27
あ、回答書くの忘れてた。Left でもだめでした。SetBounds でもだめだし。
具体的には有効なボタンが無効になったり逆になったりするんです。
820デフォルトの名無しさん:2005/04/27(水) 20:37:36
>>818 いえ。多分はずしてません。おっしゃる方法も検討したいと思います。
821デフォルトの名無しさん:2005/04/27(水) 20:43:13
たまにはユーザ側に廻って同業者を困らせてみたいな。
可能な範囲で複雑なコーディングをしなければならない感じの。
822デフォルトの名無しさん:2005/04/27(水) 21:01:42
>>817
ActionBands使え
823デフォルトの名無しさん:2005/04/27(水) 21:21:39
>>822 あ〜、そういう手もあるなー。どうしよーかな。ちょっと疲れてきたなー。
他の仕事も山にあるっつーのに。

>>820 あんたみたいな客には当たりたくないもんだなー(2行目がいまいちよく
わからないけど)。でも中がわかってるから意外に手加減したりしてね。

あ、回答くれた皆さん、ありがとございますです。
824785:2005/04/27(水) 21:25:42
>>801-804
まさしく神降臨ですね。
サンプルのソースまで上げていただきありがとうございます。
サンプルを元に実装にあわせて改造したいと思います。

>>806
今回はあれですがまた機会がありましたら、リソースファイルを使う方法も使ってみたいと思います。

お二方ともありがとうございました。
825デフォルトの名無しさん:2005/04/27(水) 23:08:30
TFindDialogコンポーネントを使ってRichEditの文字列を検索するようにしたいのですが、なかなかうまくいきません。
ソースを晒すので、どなたか間違いや問題点を指摘して頂けると幸いです。

procedure TForm1.FindDialog1Find(Sender: TObject);
var
FoundAt, FFoundAt: LongInt;
StartPos,ToEnd: Integer;
SearchTypes: TSearchTypes;
Found: Boolean;
begin
SearchTypes := [];
if frWholeWord in FindDialog1.Options then
Include(SearchTypes,stWholeWord);

if frMatchCase in FindDialog1.Options then
Include(SearchTypes,stMatchCase);
826825:2005/04/27(水) 23:08:55
with RichEdit1 do
begin
if frDown in FindDialog1.Options then
begin
StartPos := SelStart + SelLength;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, SearchTypes);
if FoundAt <> -1 then
begin
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end
else
begin
beep;
MessageDlg(FindDialog1.FindText + ' は見つかりません。',
mtInformation, [mbOk],0);
end;
end
827825:2005/04/27(水) 23:09:26
else
begin
FoundAt := 0;
FFoundAt := 0;
Found := False;
StartPos := 0;
ToEnd := SelStart;
While FoundAt <> -1 do
begin
FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd - StartPos,SearchTypes);
if FoundAt <> -1 then
begin
StartPos := FoundAt + Length(FindDialog1.FindText);
FFoundAt := FoundAt;
Found := True;
end;
end;
if Found then
begin
SelStart := FFoundAt;
SelLength := Length(FindDialog1.FindText);
end
else
begin
beep;
MessageDlg(FindDialog1.FindText + ' は見つかりません。',
mtInformation, [mbOk], 0);
end;
end;
end;
end;
828825:2005/04/27(水) 23:09:45
以上です。よろしくお願いします。
829825:2005/04/27(水) 23:16:22
書くのを忘れていましたが、Delphi6 Personalを使っています。
830デフォルトの名無しさん:2005/04/28(木) 08:05:22
何がうまくいかないのかよくわからないけど
RichEdit1.SetFocus;
を適当に追加
831デフォルトの名無しさん:2005/04/28(木) 10:30:46
スレッドを作成してそのスレッドからDLLの関数を呼び出した場合、その関数もスレッドと同じ優先度で実行されるのでしょうか?

アイドルレベルで作成したスレッドからDLL内の重い関数を呼び出しているのですが、どうも動作が重くなっているような感じがします。
832デフォルトの名無しさん:2005/04/28(木) 10:46:55
>>831
そりゃアイドルレベルで作成してるからじゃないの?
833831:2005/04/28(木) 10:52:21
>>832
ちょっとわかりにくくて済みません。重いのはメインスレッドの動作の方です。
834デフォルトの名無しさん:2005/04/28(木) 10:58:21
D6ならTThreadのWaitforが遅いっていうバグがあるよ
835デフォルトの名無しさん:2005/04/28(木) 11:40:02
WebBrowserコントロールを取り込んで使ってます。
自分のプログラムだけProxyを別のものにしたいんですが
WebBrowserコントロールだけでは不可能でしょうか?

やり方があれば教えてくださいませ。
836デフォルトの名無しさん
MemoまたはRichEditで矩形選択する方法を教えてください。