1 :
デフォルトの名無しさん :
05/03/11 01:08:15
おつ
乙
begin
7 :
デフォルトの名無しさん :05/03/11 06:21:54
end
獏
キタ━━━━(゚∀゚)━━━━ッ!! 「Delphiリファレンスガイド 6&7対応」
任意のフォルダに新規テキストファイルを作るにはどうしたらいいんですか?
var F: Text; begin AssignFile(F, "C:\Hoge\Huge.txt"); Rewrite(F); Write(F, "テキスト"); CloseFile(F); end; もしくは、TStringList.SaveToFile とか TFileStream を使う。
任意のフォルダに新規テキストファイルをセーブする
あー、さっきまでC書いてたから間違えた… "" → '' で。
15 :
デフォルトの名無しさん :05/03/12 23:36:16
Delphiで、日本語文字列に対し正規表現を使うには どういう方法があるのでしょうか・・・ お願いいたします。
>16 ありがとうございます。ポータルからの検索しかしておらず、見逃していました。すみません。
18 :
デフォルトの名無しさん :05/03/13 01:44:09
パソ歴一週間の超初心者です。EXCELでA1÷A2をA3に表示したいのですが分かりません 誰か救済してください。
また"超初心者"の文字だけ見た来訪者だな! ActiveXの質問ではあるまい。
>>18 EXCELが何を意味するか分かりませんが、
A1,A2,A3がTEditとすると、以下のようにやればできます。
if StrToInt(A2.Text) <> 0 then
A3.Text := IntToStr(StrToInt(A1.Text) div StrToInt(A2.Text));
>>20 Microsoft Excel でしょ。とネタにマジレス。
>>19 A3 に =A1/A2 と書く。とやっぱりマジレス。
22 :
デフォルトの名無しさん :05/03/13 04:43:34
>>21 ありがとうございます。 Microsoft Excelを詳しく教えてくれる板どこにありますか? A3の数値を小数点以下切り捨てにして、かつ最大数を1410までにしたいんですが・・・ 本当にすいませんでした。
24 :
デフォルトの名無しさん :05/03/13 05:16:04
>>23 ありがとうです。あなたたちみんな神です。
.
26 :
デフォルトの名無しさん :05/03/13 06:49:16
OpenJaneやGikoNaviのレスエディタのコンポは同じなんでしょうか? 右クリックメニューがまるで同じなんですけど。
メモ帳と同じ
なんかこのスレ、ノートンが反応するんだけど...
>28
どうも
>>25 のメール欄がUnix.Penguinとみなされるみたい
>>30 > このエディットコンポを右クリックしたときに出てくるポップアップメニューがそれらと同じなら
> 標準のポップアップメニューだと思われます.
そのようです。で、TMemo(というよりその上位のTCustomEdit)も右クリックメニ
ューでIMEのオン・オフと再変換ができるのですがTCustomEditのソース(StdCtrls)
をみてもそれらを実現しているコードが見あたりません。StdCtrls.pasはImm.pasを
usesさえしていません。これはどういうことなんでしょ?
>>30 >
>>28-29 > VBSのラブレターウィルスのコード貼り付けと並ぶ,
> ノートン先生が誤反応させる嫌がらせ行為です.
削除依頼出してきます。
>>31 コンポーネントではなく Wondows の EDIT コントロールのレベルで実装されている。
Wondows
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を使えばいいかだけでも教えていただきたいと思います。 よろしくお願いします。
AppBar アプリにする
>>前スレ1000 利用者がクラッカーでなくても、コマンドラインさえクラッカーが流せば誰でも使えるじゃまいか
クラッカーはクラックしたアプリを流せばやはりだれでも使えるんじゃないの? ところで、デバッガを使ってどうやって「秘密のパラメータ」を知ることができるの かを教えて
怪しいexeを使うよりはコマンドラインスイッチ指定するほうが明らかに利用する奴が多いだろう…てか
誰もそこまで考えてねーだろな。フサギコも二重起動防止を回避できる一つの案としてああいうコードにしてるだけだろうし。
>>40 デバッガ使ったことないんか。APIでブレークすれば引数なんて全部丸見えだ。
> APIでブレークすれば引数なんて全部丸見えだ。 単体のデバッガって使ったことないです。そうなんですか。ありがとう。
デバッガ使わなくても、詳細な情報を取得できるツールはあるよ
> デバッガ使わなくても、詳細な情報を取得できるツールはあるよ うひゃ、そうなんだ。実は、ある言語の勉強のために専用 IDE RAD を使わないで アプリをつくってるんだけど、コンパイラのパラメータの説明はあるんだけど、 理解できないんです。で、実際に IDE RAD を使った場合、コンパイラにどんな パラメータを送っているのかを知りたいと思っていました。 Delphi の場合、IDE で CTRL+F9 でコンパイルしたとき、実際に dcc32.exe にどんなパラメータを設定しているのかを簡単に見るには、どうした らいいか教えてください。お願いします。
> 二重起動防止を回避できる一つの案 二重起動防止のためにミューテックスを使っている場合は、CloseHandle() して ミューテックスを破棄してから、自分を起動すると、パラメータを渡さなくても いいよ。
IDEでコンパイルした場合、dcc32.exeは使わないのでは?
えっ、そうなの? IDE が dcc32.exe でコンパイルしてるんだと思ってた。 じゃなんでコンパイルしてるの? delphi32.exe はコンパイラを持ってない と思うけど、持ってるの、なかに?
48 :
デフォルトの名無しさん :05/03/14 02:28:02
dcc32.exeを削除してIDEでコンパイルしてみ。
dcc??.dllってのがあると思う。
Batが万能とかいうつもりはないが、 > だって自分自身なんだから、適当なコマンドラインパラメータを渡せば > 二重起動禁止ロジックを迂回できるようにすることができるでしょ? なぜ、バッチ? > そうですか? 起動パラメータを使えば起動されるとき二重起動チェックをするかどうか、 > とか、任意秒のSleep()をすることも簡単に設定できますけどね。 iniにしてもregにしても、設定を終了時書いて起動時読むような オブジェクトの永続化(って最近は言うかな?)コードともかぶらなくてすむ。 それに、秘密パラメータやCloseHandleで 二重起動防止解除してたらそれはそれで 起動時の処理コードやデバッグが面倒じゃなくてか?
>>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'って 出てしまいます。
>>52 uses節にComObjを追加
必要なユニットをusesしないと起こる
55 :
デフォルトの名無しさん :05/03/14 15:21:23
>>53-54 アドバイスありがとうございます。
VCLリファレンス。。
そうですね。
これが読めないとですね。。
uses
SysUtils,
ComObj;
としてみましたら上記エラーは出なくなりました!
が、次はEOleSysErrorが出ました。
ここで、VCLリファレンスですね。。
EOleSysErrorとかEConvertErrorとか
EなんたらっていうのはDelphiが出す例外
>>52 のソースが何をしたいか理解できないが
兎に角何かおかしな処理をしてるのだろう
57 :
デフォルトの名無しさん :05/03/14 15:48:20
>>56 ソースは呼び出して閉じてるだけですが
成功すれば、.Navigateでurlを指定して
.document.body.innerHTMLでソースを
取得したいんです。
>>52 のソース打ち込んでもIEが起動しない・・
objIEがUnassignedじゃないんだろうか
if objIE = unassigned then
ShowMessage('バリアント空')
TWebBrowserでも使ったほうがいいんじゃ無いだろうか・・・
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日なんでがんばります!
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
>トライアル期間はあと30日なんでがんばります! Delphi6 Personalで十分じゃないか?
64 :
デフォルトの名無しさん :05/03/14 19:00:42
>Delphi6 Personalで十分じゃないか?
あ!そんなのあったんですねー。
もちろん商用じゃないし。。
インストールしなおします。
で、
>>60 さんのをソースをそのまま
procedure化しました。
メイン関数内で呼び出しに成功しましたが
呼び出し行以降が処理されずに
コンソールごと終了してしまいます。
CoUninitialize;をメインに書くと
次行以降も実行されますが、最後に
EAccessViolation例外エラーがでます。
CoUninitializeをコメントアウトすると
滞りなく動くのですがダメですよね?
>>64 initialization 節で CoInitialize
finalization 節で CoUninitialize
じゃだめなん?
ComObjをusesすれば自動的に初期/終了ルーチンが呼ばれるようになる
68 :
デフォルトの名無しさん :05/03/14 22:05:33
TMediaPlayerなんですが、ビデオCDの画像ファイルの拡張子がdatですと エラーします。拡張子をwmvとかmp2にファイル名を書きかえるとちゃんと 再生できるのですが、CDの動画はおおよそ拡張子がdatになっていますから 困ってます(実用にならない)。皆さんはどの様にされているのでしょう? MCI_sendcommandを使えなんて言わないで下さいね。
MCI_sendcommandを使え
>>69 語るに落ちたな69。mciSendCommandじゃ。愚か者め。だいたい
お前のような出来の悪いのが・・・やめておきます。皆さん
失礼しました。
この件は解決しているようなのですが何方かご存知な方は
いらしゃらないでしょうか?
お 失 こ
むしろ
>>70 が 語るに落ちてますから。 ぷぷ
ありがちですよ。自分もつい最近まで誤用してました。 語るに落・ちる 〔「問うに落ちず語るに落ちる」の略〕何気なく話しているうちに、 うっかり本当のことを言ってしまう。
HTTPダウンロードをするクラスはどこかに落ちてませんか?
77 :
デフォルトの名無しさん :05/03/15 11:48:22
>>65 >initialization 節で CoInitialize
>finalization 節で CoUninitialize
すみません。具体的にどの位置に指定するのでしょうか?
>>77 > すみません。具体的にどの位置に指定するのでしょうか?
だからInitializationとFinalizationの位置だって!
ヘルプより ユニットの構造と構文 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;
procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]); の var Buf;に注意
BlockRead(DataFile, Data^, 100); FreeMem(Data);
ありがとうございます。うまくいきました!
>>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'と指定すれば
できました!
ぱいチンコびろーん ∩___∩ | ノ ヽ/⌒) /⌒) (゚) (゚) | .| / / ( _●_) ミ/ .( ヽ |∪| / \ ヽノ / / / | _つ / | /UJ\ \ | / ) ) ∪ ( \ \_)
別に複雑じゃないが? 共通処理があるのに5関数作るのがヤだったんでしょ。 必要ならシンプルなコードを自分で抽出して 公開して自慢して、他の人からありがたがられるのが よいでしょう。 ...他のスレで書き込めよといいたい。
88の脳の処理能力が低いだけでしょう
およそ9年前の記事に文句をつける人がいるスレはここですか?
92 :
デフォルトの名無しさん :05/03/15 16:10:03
テキストエディタを作っていますが テキストファイル内の文字コードを取得する方法はないでしょうか? 一応、適当に読み込んである文字コードに従ってエンコードして 一致すればその文字コードという方法は思いついたのですが もっとスマートな方法なないですか
TButton.Create(Self) で生成したButtonのprocedure OnClickは、何処に書けばいいんでしょうか。 何か別のスレで聞いたらこっちに飛ばされました…
B := TButton.Create(Self); B.OnClick := Button1Click; ではないかと。 Button1Click手続きは自分で記述する必要がありますよ。
captionに一定文字数以上の文字列が代入されるとき、超した分を「・・・」みたいな感じで省略したいんだが、どうすればいい? ヒントキボン
dクス
ありがとうございます。
すいません。前スレで自身を再起動する方法を見かけたのですが、 別途実行ファイルを用意せずに行う方法ってあるんでしょうか。 興味が沸いたので是非知りたいですッ!
こんな感じでしょうか,,, procedure TForm1.Button3Click(Sender: TObject); begin Application.MainForm.Close; //もしくは、Application.Terminate; WinExec(PChar(Application.Exename), SW_SHOW); end;
いまさらの話題です D7のIDEのメニューバーの件ですが、起動後すぐは、すべてのメニューにアクセラレータキーが 表示されません。・・・・たとえば「ファイル」のみ しかし、何かメニュー操作すると「ファイル(F)」のように表示されます。 それから選択されたメニュー項目はバックがブルーに反転しますが、別メニューを 選んでも前の反転がそのまま当たり前に二三箇所残る場合があります。 みなさんの環境ではどうですか? 別に支障がないけどすこし気持ち悪いです。 My環境は AMDK6-2、300MHz(笑)、PenV、500MHz(笑) OSはWin2000sp4です。メモリは256MBです。
105 :
68 :05/03/15 21:41:07
TMediaPlayerなんですが、ビデオCDの画像ファイルの拡張子がdatですと エラーします。拡張子をwmvとかmp2にファイル名を書きかえるとちゃんと 再生できるのですが、CDの動画はおおよそ拡張子がdatになっていますから 困ってます(実用にならない)。皆さんはどの様にされているのでしょう? MCI_sendcommandを使えなんて言わないで下さいね。
106 :
68 :05/03/15 21:47:31
追加:TMediaPlayerは結構使えるみたいです。
>>92 SJIS EUC JIS の3種類でよければ
1. とりあえず EUC だと仮定する。
2. エスケープシーケンスが出てきた -> JIS
3. $80 〜 $A0 の範囲の文字が出てきた -> SJIS
4 2 にも 3 にも引っかからなかった -> EUC の可能性大
SJIS の半角カナは無視してるけど、大抵はこれで判別可能。
昔書いたソースがどっかにあったはずだけど見つからない…。
>>104 ハードウェアアクセラレータのトコの問題っぽい感じがしますが
2台ともだとすると違うかな...
>>103 こんな事できたなんて・・・!びっくりです。
ありがとうございますッ!
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) ヘルプ --------------------------- と、なるのですが、どうしたらええもんですかと… ・・・スレ?板?違い?
>>88 自慢というか、思い付きでは?
ちゃんとしたアプリケーションでこんなコードは書かないでしょ。
必要ないだろうし。
>>110 ソース見た限りだと、必ず生成するっぽいね。
特に処理しなくてもいいんちゃう?
IDEからじゃなくて、普通に実行する分には問題なし。
ちなみに、そのスクリプトじゃ、helloとは表示されないのはわかってるよね?
'function f(a){ return a;}'
じゃないと。
>>107 遅ればせながらありがとうございます
その手法で認識させて、後は文字コードを指定する機能を設けて
対応していこうと思います。
ブラウザでも文字コードを指定する機能があることから
まだまだ文字コードの自動認識は難しいようですね
115 :
68 :05/03/16 13:00:39
さもしい
QRLabel で印刷しようとしています。 Labelのフォントに取り消し線っていうのがありますが、 線1本なので困っています。 2重線をひくにはどうしたらいいですか?
>>117 親WinControlのWindProc乗っ取ってWM_PAINTで自前で書く
splitterって幅を1にするとドラッグしにくくなるけど、 見た感じでの幅は1で、ドラッグできる範囲を2 とかにするのは不可能?
Delphi7で、TStringListのn行目の文を TSL[n]で取り出そうとするとエラーになるんですが、 どうやってとりだせばよいですか
>>121 Strings[n]
だけどその前に大きな勘違いをしていると思われ。
というか釣られたんですか私?
(・∀・)ニヤニヤ
125 :
デフォルトの名無しさん :05/03/16 19:35:45
DelphiのStringにVBでいうvbNullStringみたいなのって無いのでしょうか?
>>125 '' とか #0 とか array[0..0] of Char = #0 とか?
何に使うの?
∧ ∧
>>125-126 ミ ゚Д゚彡
〜ミ,,,,uuミ
SysUtilsに
EmptyStr: string = '';
と定義されてるぞよ
∧,,∧ センクス
,,ミ,,゚Д゚ミ
>>113 さん
.とミ,,,,,U,,U
EJReturnは無視する冷害にいれました。
この設定使ったの、何年ぶりだろう....
例外が発生しているので
てっきりスクリプトが誤動作orSyntaxErrorでも起こしているのかと思て
スクリプト側はあまり変更テストしていなかったのですが
正常動作を確認しましたです。
ありがとう。
DelWiki追記しとかないと...
>>127 vbNullString はただの空の文字列じゃないよ。
130 :
デフォルトの名無しさん :05/03/16 22:44:34
Delphiへの愛が感じられるスレですね
var FList,GList: TList; Delphi5のTListにはAssignがないのですが FList.Assign(GList); の代わりは for i := 0 to GList.Count-1 do FList.Add(GList[i]); でいいのでしょうか?
それでいいはず。 余談だが、TListのassignメソッドって、デフォルトパラメータが二つもあるんで、 一度、D6以降のヘルプも読んだ方が良いよ 知っておくと応用が楽
133 :
125 :05/03/17 01:10:58
>>126-127 vbNullStringというのを無理矢理Delphiで表現すると、
PChar(vbNullString) = Nil
です。ポインタがNil(=0)になる文字列が使えたら便利だなと思いまして。
DLLを良く使うプロジェクトに現在居る物で。
カラーダイアログの基本色の色変更をしたいのですが、どうすればいいでしょうか?
>>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.
>>135 ありがとうございます。 自分で簡易なパレットを作ってみます。
TListView(vsReport)で選択中のアイテムが何行目か知りたいんだけど どうやって取得すればよいのでしょうか?
すいませんIndexと聞いて某小説を思い浮かべてしまったんですがどうすればいいでしょうか?
シリアルキー解析集「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が、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。
もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?
入札一件もねーじゃん て思ったけど、評価見たら売れまってんな。 うはwwwぼろ儲けwwwwおkwwwww
あふぉ
こいつタイーホされるんじゃないの?
ハングル │ ├−韓国マスコミ今日のホームラン │ │ │ 竹島に続き対馬も韓国領と言い始めたぞ │ プログラム技術 │ ├−くだすれDelphi(超初心者用) │ │ │ ├−コンポ編 │ │ │ └−アプリ編 │ │ │ └−グラフィックス │ プロ野球 TreeViewが維持しているNode.Textをこういう風に出力したいのだけど、どうしたらいい?
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;
tu-ka、
>>144 形式が統一されて無いじゃん
兄弟は
─兄者
│
弟者
なのか、それとも
─┬兄者
│
└弟者
なのか
>>137 ItemIndexでしょ?
~~~~~
いや別に揚げ足取りじゃないけど。
「indexなんて無いよー」ってことにならぬように。
暇なんで作ってみた 形式は後者であると仮定 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;
リロードし忘れるは 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;
TThreadでExecuteを一回完了した後にクラスの状態をそのままにしたまま 何度もExecuteを呼び出せるようにするのは可能でしょうか Resumeは効かないみたいなので…
>>149 おお! サンクス! すばらしい!!
一番最初のノードの処理を少し変更して利用させてもらいます。
>>151 やったことないけど、FreeOnTerminateをFalseにすれば、
Classのインスタンスを保持したまま、何回もExecute実行できないかな?
やったことないなら、日記はチラシの裏に書け
今日のチラシは裏も印刷されていて書けません。どうしたら良いですか?
Delphi製か・・
159 :
デフォルトの名無しさん :05/03/18 18:51:38
コンソールアプリ自体に戻り値を設定するにはどうしたらいいのでしょうか? 他のアプリから結果をリダイレクトしたいのですが。
そういう時の為の標準入出力じゃないのか
>>153 >>155 レスありがとうございます。
Executeを無限ループにしてループ毎にイベント発生させてSuspend、Resumeで再開
こんな感じでそれっぽくできました。 助かりました
Suspend,Resumeは推奨しない。 きちんと同期オブジェクトを使用するか、 Executeのループの中からSynchronizeを使って メインアプリの方の終了フラグかなんかを読みに行きなさい。
同期のため、とは書いてないんだが・・・
パズルの16分割みたいな状態を実現したいのですが、 画像の分割ってどのような方法で分割してるのですか? どなたかご指導ください。
例えばビットマップで横に2分割するときは、元画像の横幅半分のビットマップ 二つつくって、後は該当部分をコピーするだけ。
>>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 が作成できませんでした。
>>168 コマンドラインオプションを全部取ってコンパイルしてみる。
…それ以前にパスが通っていない悪寒。
いや、パスは通っています。 DCC32 > option.txt でオプションを確認したわけですし。 オプションを摂ってコンパイルしても同じでした。
プログラムがダメなんだろ 普通にIDEでは成功する?
プロジェクトの内容にかかわらずエラーが出るって事だよね!? .cfgファイルにおかしな設定をしているのかな。
>>168 コンソール画面からのコピーの方法をご存知ですか?もし知っていたら
致命的エラーの内容を、コピーアンドペーストで間違えずに転記してもらえませんか?
または標準エラー出力をリダイレクトするために
DCC32 abc.dpr 1>stdout.txt 2>stderr.txt
とやってみましょう。もし NT 系 OS を使っているなら。
171 さんの指摘のように、IDE でコンパイルできるかどうかは試してみましたか?
TStringListのStringsに直接アクセスしたいのであらかじめCountの個数を 指定したいのですが、今は下のように書いています。 for i:=0 to n do sl.Add(''); 又は sl.Text:=StringOfChar(#10,n); 特に不便でもないのですが、ほかのやり方はないでしょうか?参考までに。
for i:=0 to n do と sl.Text:=StringOfChar(#10,n); じゃ個数が違うわけだが
今までCを少しとC#を使ってきて、Delphiも使えるようになりたいのだが、 オススメの書籍はあるだろうか?あれば教えて欲しい。
>>177 Delphiの入門本は久しく出ておりませんでしたが、最近、最新版のDelphi2005
用の入門本がカットシステムからでました。
中身は本当に初めてdelphiを使う人向けですので、立ち読みしてご検討して
みてはどうでしょうか。
かなり古い書籍で、まだ入手可能かどうかわかりませんが、
「プログラマのためのDelphi2入門」(ゲーリー・コーレル著/小山裕徳 訳)
東京電機大学出版局
原題「Delphi Nuts&Bolts:For Experienced Programmers Second Edition」
私のお勧めはこれです、最新のDelphiではありませんが、とても分かりやすかった
です。
「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;
もし文字列リスト固有のメソッドやプロパティを使わないのでしたら
つまり単に文字列の値を読んだり書いたりするだけなら
文字列リストではなく配列変数を使うことも検討してみて下さい.
ちょっとずれるけどTStringListのCapacityプロパティってどうやって使うんでしょうね。 変更可能だけどCountより小さくしてはダメで、大きくしても領域を確保してくれない・・・
確保するでしょ。カウントが増えないだけで。
これ以上増えないのがわかっているなら、Capacityに最大値を設定 しとけば無駄な領域確保要らなくなるということでしょ?
実際に使ってる量と確保してる量は違う。TStringList だけでなく、TList なんか にもある。予めバッファとして割り当てておいて、その以下の項目増加では割り当て 直す必要がなくなって、パフォーマンスが改善するってことだ。
Countが増えないだけで確保してるんですか。 例外でるのはCountをチェックしてるからか・・・。 空の文字列返してくると思ってたら例外でたもので。 ありがとう
VCLソース持ってるなら嫁
Classes.pas は誰でも持ってる
んなことはない
189 :
175 :05/03/20 23:12:34
>>180 わざわざサンプルまでありがとうございます。
自分のニーズとしては、
・長さが不定な文字列の、数が不定な(実行時にはわかる)リスト
・文字列の途中に改行があることもある
・1つのリストを複数のTThreadの下位クラスのメンバー入れて複数のスレッドからアクセスしたい
というのなんですが。
type TMyStringArray = array[0..65535] of AnsiString;
type PMyStringArray= ^TMyStringArray;
みたいなのをつくって、GetMem()で配列に必要なメモリを確保して
配列のポインタだけ扱う方法も考えたのですが、
AnsiString型の仕様がいまいち理解できてないのでやめました。
動的配列知らんのか?
> ・文字列の途中に改行があることもある TStringList は使えない
>>189 string 型の動的配列を保持するクラスをつくって、CriticalSection でアクセスメソッド
を保護するといい
初めからほんとの目標を明示しないで見当違いの質問して、結局遠回りするってよくあるんだよな
194 :
175 :05/03/20 23:34:02
>>191 >>TStringList は使えない
使えます。
>>動的配列知らんのか?
もちろん動的配列も試しましたけどヘルプ見ても「暗黙にポインタ」と書いてあるだけなので、
普通の変数のように代入したりしてもいいのかわからなかったので避けていたのですが。
普通に使える。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 クローンのコードはどっかにあったはず。
Addで改行を含む文字列を追加した場合、その改行は考慮されないよ。
おお、そうなんだ。しらんかった。TMemo なんかと勘違いしてた。さんくす
198 :
175 :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の動的配列の細かい仕様が書いてある説明でもあればいいのですが。
静的配列なら領域を確保してそのポインタをやり取りするだけなので、
安全だと思ったのでそちらを使おうとしたのです。
200 :
175 :05/03/21 00:40:46
>>199 ありがとうございます。
TThreadListを使うのかと思っていたのですが、こっちの方が楽そうですね。
参考にさせていただきます。
動的配列の勉強をしているのですが^^; 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;
203 :
177 :2005/03/21(月) 12:14:04
204 :
デフォルトの名無しさん :2005/03/21(月) 22:06:41
>202
早速ためしてみました。
まず、A5000では
>>202 さんのいうとおり実行時エラーとなりました。
また202のソースをコンパイルして確認してみました。
確かに変な数が入ってきますね。(a[5]=22となりました)
以上をふまえてsetlengthは配列で利用する範囲を保障するための
手続きと考えるとすっきりしました。どうもありがとうございます。
マルチスレッドを試してみたんだけど Form1: TForm1; BmpWork: TBitmap; で定義したBmpWorkが他のユニットのスレッドでも使えるけどもプログラムを終了するときにエラー(例外発生)が出る 何ででしょう?
ごめんなさい、publicで宣言したら直りました。
>>205 その前に、その質問の仕方で答えられる人は
そうそういないと思うよ。
煽りでも何でもなく。
どこかwinsockを解説してるサイトとかないですかね? pasとapiを見ながら組むと頭がこんがらがって。 winsocketのapiを解説してるサイトでもいいです。
209 :
デフォルトの名無しさん :2005/03/22(火) 21:26:17
単発ですみません。 Editボックスで横幅いっぱいまで入力したら自動的に 2行目に折り返したりすることできますか?
source codeの行数もしくはstep数を計測するアプリを紹介して下さい。
step数なんて聞くの昭和60年以来だ
>>211 そんな古臭い?最近はfunction pointで計測するのが一般的なのか?
このスレで「アプリを紹介して下さい」なんて書くような奴だもん。
>>213 source codeの規模計測となると言語別の質問すれで聞いた方が良いかと思った
もので。すれ違いだったら無視して下さい。
216 :
デフォルトの名無しさん :2005/03/23(水) 06:34:24
>>215 ありがとうございます。EditじゃなくMemoを使うんですね!
隣のボタンだったけどわかんなかった。。
>>210 step数とは何か、さえ定義付けられれば
簡単にプログラム組めそうじゃね?
ようはテキスト処理だろ?
218 :
208 :2005/03/23(水) 10:57:21
>>198 動的配列についてはヘルプの『動的配列』のところで説明されていますので
良かったらご覧になってみて下さい.
(キーワード検索で『動的配列』と入れればすぐに見つかると思います)
>>201 Delphiでは初期設定では配列の添え字が正しいかどうかをチェックしません.
そのため全然関係ないところのデータを読み書きしようとします.
そこは別のデータの保管に使っていてそれを破壊してしまうかもしれませんし,
何も起きないかもしれませんし,エラーになる場合もあります.
対策としては『範囲チェック』を有効にするのが確実です.
『プロジェクトオプション』(の『コンパイラ』のタブ)に
『範囲チェック』という項目がありますのでここにチェックを入れて下さい.
タイピングソフトを作ってるんですが、tyoとchoとかの切り替えを自動で判別するシステムってどうやればいいんですか?? 教えてくださいお願いします!
>>220 それだけじゃわけわからん。
何を自動で判別して、どうしたいのだ。
222 :
デフォルトの名無しさん :2005/03/23(水) 23:54:10
Delphi6 personalだけで MS-Excelを扱うプログラムって作れますか? 要件は 読んで、書いて、保存くらいの機能です。 参照設定みたいのすれば動くのかな? comobjをusesとやらに追加したらpathを聞いてきた。 今日はじめて使った初心者なのでわかり易い説明お願いします。
他のソフトがファイルを開いているかどうかをチェックするため以下のような 関数を作りました。 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;
224 :
223 :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になってしまいます。なんででしょ?
1.出来る 2.まだ早い 3.何事もチュートリアル(不備があるが)から ※不備=無い機能なのに、使うように書いてある
226 :
225 :2005/03/24(木) 00:04:19
227 :
223 :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;
228 :
222 :2005/03/24(木) 00:11:27
>225,226 どうもです。 明日中に形だけでも作ろうと思ったけど無謀か…。 Del6 perだけでも作れることが判っただけでも助かりました。
>>223 そういうのって普通は、ファイルを読み書きする時に、
ファイルを開く関数の例外処理で判定しない?
>>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です。
>>232 要はtxtファイルをDLしたいってこと?
WininetでDLしたら?
違ったらスルーしてくれ。
234 :
デフォルトの名無しさん :2005/03/24(木) 03:05:48
そういうことです。Wininetっていうのはどれをusesしたら使えます? パレットでは見あたらないのですが。
>>234 使えます。
検索すれば、たくさんサンプル出てくるので
参考にしては?
多少、微妙な所も無くもないけど…。
オレは、ネット関係はWininetで済ませてる。
236 :
235 :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)すればいいことに気付きました。 ありがとうございました。
MSDN(ry
241 :
デフォルトの名無しさん :2005/03/24(木) 10:57:35
Hintの文字列を改行させることってできますか? #13#10とか入れても改行されないで表示されます。。
>>241 オブジェクトインスペクタからだと無理
フォームをエディタで開いてそこに記述するか
ソースにButton1.Hint := 'Hello'+#13#10+'hoge'と書く
244 :
デフォルトの名無しさん :2005/03/24(木) 11:31:31
>>242 すみません。
>>243 さんのおっしゃるとおり
オブジェクトインスペクタでやってました。
>>243 ありがとうございました。ソースに書いたらできました!
DelphiでdotNET2.0とか、Sleipnirとかみたいに ツールバーとかがツヤツヤ(?)したコンポーネントってありませんか? 特にそれがないとだめって事は無いんですけど、なんかカッコ(・∀・)イイ!!
247 :
デフォルトの名無しさん :2005/03/24(木) 13:37:08
フォームの大きさを変えられないようにするには どのようにすればいいんですか?
>>247 Formのオブジェクトインスペクタのプロパティ「BorderStyle」をbsSingleにする。
同じくプロパティ「BorderIcons」を適当にFalseにしてみる。
tb2kのMLにmbTBXLibというTBX対応コンポーネントもあったので、 wikiに書いておきました。
TStringGrid(等)でRange指定するような感じで 配列をまとめてセットするような方法ありますか? cellsで1つずつセットはしたくないので。
>>253 Rows(Cols)プロパティを調べてみると吉。
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; そもそも解釈が何かおかしいとしか思えない結果が返ってきます。 どなたかアドバイスをお願いします。
strsize := SizeOf(test);はstrsize := Length(test)じゃないかな? F.Write(test, strsize);はF.Write(test[1], strsize);じゃないかな? F.Readも同様
あ、F.Readの前にSetLength()で領域確保が必要
258 :
255 :2005/03/25(金) 05:08:41
何か色々わかってきたかも。 SizeOfだと4バイトしか返ってこないですね(ポインタの値が返ってるだけ?)。 test[1]って書いてしまえば、残りの文字列も自動的に書かれるのでしょうか? test[1]ってようするに文字列の先頭ですよね? あと、SetLength()は文字列を格納する変数(例だとtest)に対してやってやればOK?
いや'test'は4バイトだからSizeOfが4でも不思議じゃないですよ。Lengthも4が返るでしょ? 領域の長さと文字列の長さが一致することが保証されていない気がするだけです。 test[1]はtest[1]から長さ分だけで書かれるはずです。 Cで言えばポインタを渡したいところですが、delphiではポインタの値を渡すようで。 SetLengthはtestだけでいいはずです。 strsizeは4バイト領域が確保済みですから。
嘘教えちゃいました?255さんごめん
>>258 > SizeOfだと4バイトしか返ってこないですね(ポインタの値が返ってるだけ?)。
String 型の実体は別のところに動的に確保された文字列の実体を指すポインタ。
だから 32bit の環境なら常に 4Byte。
文字列の長さは Length で。
やばい勘違いしてた。短い文字列では要素数+1が返るんですね。 短い文字列に使ってたからバグってなかった。ほっ
どうして 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;
265 :
255 :2005/03/25(金) 12:36:42
>>264 TWriter、TReader…こんな物があったんですねぇ。
違うデータ(数値とかブーリアンとか)書く時はWriteStringとかを
別のものにすればOKと。
これで何とかなりそうです。
返答して下さった皆様、ありがとうございます。
266 :
デフォルトの名無しさん :2005/03/25(金) 14:17:47
TMemoの実態って何で塚? Windowsコントロールでつよね?
実体とはなんぞや? ウィンドウコントロールとしては Edit コントロール。
実弟
269 :
デフォルトの名無しさん :2005/03/25(金) 17:00:16
あるメモリ領域を動的配列へコピーする場合どの様にするのがDelphi流なのでしょうか? 現状では次のようにやってますが、何だか問題ありそうなのでツッコミ下さると助かります。 SetLength(array, size); CopyMemory(PChar(array), pSrc, size);
270 :
269 :2005/03/25(金) 17:15:32
arrayは予約語でしたね…。読み替えて下さると助かります。
メモリ、ポインタが出てくる時点で、どうやっても同じ。 Windows.CopyMemory の代わりに System.Move を使うくらいかな?
272 :
269 :2005/03/25(金) 17:56:58
>>271 APIやDLLへデータを引き渡す場合、どうしてもポインタでのやり取りになってしまって、
どうも泥臭くなってしまいますね。
ありがとうございました。
質問です。 Delphi5 Enterpriseにて Microsoft Excelのブック保護(パスワード設定)操作を行いたいのですが、 ExcelApplicationとかExcelWorkbookなどを利用すれば良いのでしょうか?
275 :
223 :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?
>>276 メモ帳で開いたら文字化けするって落ち?
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」です。
tu-ka,TWriter は指定した値以外にも勝手に色々書き込むぞ。 もともとシリアライズ化のメカニズムで使用される特殊なクラスだし。 ただ文字列を書き込みたい場合は普通に TStream.Write(S[1], Length(S)) でいいだろ。
もしかして、 Javaの感覚で「Fileへの書き込みにはWriterを」という勘違いが起こっていると言うだけの話?
例えばこんな感じかな。 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を使った記憶が・・ ありがとうございます。それでやってみます。
Writeln
>>286 文字列だったらFileよりTextFileの方が良くね?
それとも、Fileの方がコスト掛からんの?
>>289 > 文字列だったらFileよりTextFileの方が良くね?
そうなんだけど、質問した人はテキストファイルを
「バイナリファイルとして」扱いたいらしい。
TFileStream を使ってる、と上で書いてるし。
そうだね、質問者の先を行くのは失礼だよ
292 :
デフォルトの名無しさん :2005/03/26(土) 17:52:58
TreeView で特定のNode以下だけをsortすることできますか?
293 :
273 :2005/03/26(土) 18:03:50
すいません。。GWってなんの略ですか?
ゴールデンウィーク
295 :
292 :2005/03/26(土) 18:30:53
できました。 自己解決しました。
297 :
デフォルトの名無しさん :2005/03/26(土) 21:47:02
FindWindowでハンドル取得して、 他アプリのビットマップを取得する方法は無いですか? 他アプリのPrintScreenして自分のプログラムのTBitmapに 取り込みたい。SendMessageでPrintScreenしてしまうと クリップボードを壊してしまうから、それ以外の方法で。
>>297 ウィンドウハンドルは取得できたん?
だったら GetDC でデバイスコンテキスト取得して
API か TCanvas で取れる
>>298 はい、他アプリをSendMessageで最小化するとかは出来てます。
GetDCとかよく分かりませんけど、今からググって勉強します。
多分、後は事故解決出切るかと。アリガトウございました。
>>293 ここはグリーンウッドの事じゃないかしら?
>>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;
こういう事? こういう複雑なのは、具体的な流れを想像するとわかりやすい。 ブレークポイントを置いてみて、変数の内容が想像通りになってるかどうかで確認。 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;
Delphi personalの日本語版の最新ってどれですか? 私は今Del6Personalを使ってるんですが、アップグレードしたいんです。
指定したフォルダの中身だけを削除するにはどうしたらいいんですか?
306 :
302 :2005/03/28(月) 00:27:16
>>303 // if Node.GetPrev <> nil then Strings.Append(S + '│ '); 無視しする
うーんとですね。トップノードが複数のときはこんな風になり(これは問題ない)
┌家康
│ ├秀康
│ ├秀忠
│ │ ├家光
│ │ └秀長
│ └義直
├秀吉
│ └秀頼
└信長
├信雄
└信孝
トップノードが1つのとき、家康の頭に何もないだけLevel=1のインデントが余分なので
家康
├秀康
│ └忠直
├秀忠
│ ├家光
│ └秀長
└義直
なってしまいます。これを
家康
├秀康
│ └忠直
├秀忠
│ ├家光
│ └秀長
└義直(尾張)
としたいのです。
>>305 「FindFirstで回して、ファイルだけ削除する」…
以外に何か方法あるのかな。
オレにはソレしか思いつかないな。
>>304 Delphi7 Personal(有償)です。
>>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;
>>308 Del7Personalって無料版はないんですね。
しかたないので有料版を購入しました。
Del2005Personalでも出してくれたら嬉しいんですが。
>>310 ドイツやイギリスではイベントで配布しているようですが・・・
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;
凄く初歩的なので大変恐縮なのですが教えてください。 データ元の配列から数値を取り出し、ソート用配列の先頭から昇順になるよう ソートするプログラムです。下記で実行するとデータが正しく返ってきてくれません。 よろしくお願いします。 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;
宿題は自分でやろうね。
これは・・・配列とか勉強しなおしたほうがいいんじゃね。
>>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;
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;
質問させてください。 dllからFormを動的生成するのはどうしたらいいのでしょうか? 方法を探したりしたんですが全然ありませんでした。
319 :
デフォルトの名無しさん :2005/03/28(月) 23:04:25
>>305 SHFileOperation()
じゃだめ?
>>318 「Delphi 4 プログラミングバイブル」
にDLL内にクラスをつくるための記述があったと思うけど、今手元にない。
全くの初心者です、こんばんは。 これマスターするためには実践しながら勉強するのが一番早いと思うのですが 生憎本当に何もわからないため何を実践すればいいのかわかりません。 勉強用にどんなことすればいいか教えてかださい。
322 :
デフォルトの名無しさん :2005/03/28(月) 23:26:22
>>320 くだすれDelphi(超初心者用)の過去ログを全部読む。
323 :
320 :2005/03/28(月) 23:32:19
とりあえず暇はあるのでくだすれ読めるだけ読んで
>>225 の3とやらを頑張ってみます。
ありがとございました。
降参、教えてください。 他のアプリのハンドルは取得してるのですが、 その他のアプリをアクティブ化するためには、 SendMessageをどう記述すればよいのですか? というよりこういうAPI関係の基礎っぽいことは どうやって勉強するのですか?ググっても分かりません。
>>324 焦んなって。
そんなパッと始めて、パッと出来るようになるヤツなんていないって。
どうしてそんなに急くのか分からん。
地道に検索して、色々試してがんばればいいじゃないか。
それとも釣りか?
そんなこと言ったらこのスレ不要だしw
327 :
デフォルトの名無しさん :2005/03/29(火) 00:01:52
地道に検索して、色々試してがんばってなお分からないから「降参」なんだおr
分かった。SetForegroundWindowだな。 場合によってはタスクバーで点滅するだけで、 望んだ機能にはならんかったけど、 これWinAPIの限界っぽい。
329 :
デフォルトの名無しさん :2005/03/29(火) 01:33:45
ファイルはDeleteFileで削除できますが、 フォルダの削除はどうすればいいですか?
331 :
151 :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;
これでどう
( ´∀前質問したときの名前残ってた…(・ε・)キニシナイ!!で下さい
>>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側から呼び出す。
自分の書いたのから抜き出して変更したので間違ってたらスマソ。
Delphi.NETって使ってない人多そうだから回答来ないかもしれないし、 逆に聞き返されるかもしれないから詳しく書いてみる。 D8の時点では、一つの名前空間に複数のクラスを入れたい場合、 ユニット名=名前空間なDelphiだけの仕様のせいで、 一つのユニットにそれらのクラスをすべて書かなきゃいけなかった。 なので、EXEタイプのアプリ作成ならDelで良くても、 DLLだと、ソース管理が面倒か、名前空間が多すぎるものしか作れなかった。 さて、D2005では、namespace1.class1と、namespace1.class2を、 ユニットnamespace1にまとめて書くには長すぎる場合、 二つのユニットにわけて書けるようになったのかね?
すいませんTTabControlでMultiLineをtrueにすると 複数行タブが表示されるのはいいんですけど タブをクリックするたびにタブが勝手に移動するのがうっとおしいので タブを固定させたいのですがやり方教えてください
ドットエディタみたいな描画パレットに、DrawGridを使った時、 ファイルをロードしてDrawGridに出力するにはどうすればいいですか?
>>337 OnDrawCellでTBitmapのPixelsプロパティの色で塗ればええんでないの。
>>336 ScrollOppositeのヘルプを読んだ上で、好みの動作が実現できないようなら、
StyleをtsTabs以外に変更することで、別のタブ動作に変える。
Windowsの仕様なので、それでも気に入らなければ、好みのタブを自作。
340 :
336 :2005/03/29(火) 12:57:11
>>339 StyleをtsTabs以外にしたら思ってた動作になりました
ありがとうございました
341 :
318 :2005/03/29(火) 12:57:29
342 :
デフォルトの名無しさん :2005/03/29(火) 14:17:29
Indy9のIdPOP3.Connectでエラーを感知するには どうすればいいでしょうか? ヘルプには接続または認証の間に例外が発生した場合, ソケットは切断(Disconnect)されて,例外が再び生成されます。 とありますが、try..exceptを使うのでしょうか? どのように書けばいいのか誰か教えてください。
try connect(5000); except showmessage('だめぽ'); end; でやってる。詳細なエラーを拾うやり方は知らないので デモでも調べてくれい。
>>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がでてから”だめぽ”となりました。
これをデバッガオプションの言語固有の例外として
登録すると表立ってエラーはでませんが、
このやり方って正しいんでしょうか?
>>346 デバッグ時のみの問題なので、無視したいなら言語固有例外で逃げれ
(´-`).。oO(except on e:EIdProtocolReplyError で捕獲できるかも
byte形式のデータの入った配列、例えば hairetu[0] := $82 hairetu[1] := $A0 hairetu[2] := $82 hairetu[3] := $A2 hairetu[4] := $82 hairetu[5] := $A4 があるとして、 これを順番に並べて「あいう」と表示されるテキストとし、最終的にstring変数に入れたいのですが、 どのようなコードを書けば良いのでしょうか…? よろしかったらご教授ください。
>>348 var
hairetu : array[0..5] of byte;
pch : pchar;
str : string;
begin
//ここまでにhairetuに代入済み
pch := pchar(@hairetu) ;//キャストなくてもコンパイル通るかも
str := pch ;
ってなとこかいな。
あ、これじゃヌル文字入ってないからあかんかも。 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 ; のほうがわかりやすいかな。
351 :
348 :2005/03/29(火) 23:47:40
>>349 ,350
素早い反応ありがとうございます!
早速試してみたらうまくいきました。
これで作業を再開することができます。本当に感謝です!
SetString とか使おうよ。
var hairetu : array[0..5] of byte; str : string; begin //ここまでにhairetuに代入済み str := '' ; setstring( str , pchar( @hairetu ) , length( hairetu ) ) ; かね?
354 :
335 :2005/03/30(水) 08:54:25
よろ
2005 をまじめに使っている人は日本にはいない。ということですかね。
>>337 ありがとうございます。 粘ったのですがOnDrawCellの使い方でちんぼつでつ。(-_-;)
6Personalでの質問ですが ShellTreeViewのに、別のパスを文字列として渡して ShellTreeViewのカレントパスを変更したいんですが、 やり方が分かりません。 procedure TForm1.Button1Click(Sender: TObject); begin ShellTreeView1.Path := 'C:\Winnt'; ShowMessage(ShellTreeView1.Path); end; こんな感じでPathを指定してやっても、 変更されずに、現在のパスのままです。 ぐぐってみたらShellCtrls.pas内のTCustomShellTreeView.SetPathのとこに 記述してあるFUpdating := True;をコメントアウトすればいいようなことを 海外の掲示板に書いてあったんですが、試してみてもうまくいきません。 どうすればいいのか、誰か教えてださいです。
shelltreeveiwいい加減なので自分で作り直した それが、俺のpascalスキルが向上したたきっかけだな
360 :
デフォルトの名無しさん :2005/03/30(水) 20:38:05
>>331 お、お、おっ、凄いっす!完璧っす!
自分もこんな風に教えれる人になりたいっす!
>>332 ( ´∀`)σ)∀`)
362 :
358 :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; ここでとまってしまって先へ進めない状態です。 どなたか教えてください、よろしくお願いします。
>>363 WINAPIで各時間のFILETIME取ってきて現在時間-開始時関すれば簡単じゃないか?
TDateとTTimeの足し算がおかしいんじゃないの? EncodeDateTime使って変換すればいいと思うがスマートじゃないよなあ
Del7Personalってフリーでダウンロードできないんですか? キーは入手できるんですが、肝心の本体がありません。
>>366 できません。
以前、海外の雑誌に外国語版が収録されていたとか聞くな。
当然日本語版は存在しない。
お勧めの本あるますか?
言語ガイドとVCLソースとML過去ログ。
tumriwarezertu-hosimasuta
現在、唯一普通に本屋で売ってそうな、この間出たばっかりのDelphi2005本見てきたけど、 モノクロでCD-ROMも付いていないであの値段ってのはな。 Del6の頃までに出た入門者用の本、復刊して欲しいよ。
ソースネクストの 1980円シリーズになったら買うかい?
>>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落としてきたけど そのままじゃコンパイル出来ない なんとかしてよ!
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月ダウンロード開始だってさ
あれ、俺は今日からDelphi2005J Personal6月ダウンロード開始って聞いたぞ!
今日は皇紀2665/04/01。 >381
>>381 あうあう。エイプリルフールじゃなくてホントだとぃぃなぁ。
もう少し待てば何か有るよ。
WideChar型について質問です。 WideChar型の変数に特定のマルチバイト文字を代入したい場合、 コードを指定する以外にシンプルに記述する方法はないのでしょうか? 普通にシングルクオテーションマークで囲んでも、 String型になってしまうため代入できないことに初めて気づきました。 今は非効率的で馬鹿みたいですが、次の方法で代替しています。 WC := PWideChar(WideString('あ'))^;
ないです。 五十歩百歩で WideString('あ')[1] かな
>>387 ありがとうございます。
そちらの方がいくぶんかすっきりしていますね。
それにしても、Delphiでは文字型も文字列型も
同じシングルクオテーションで表現できてしまうのが、
実に気持ち悪いです。
それにしても、日本語ではlikeもloveも 同じ「好き」で表現できてしまうのが、 実に気持ち悪いです。
それにしても、英語ではトロもイワシも 同じ「fish」で表現できてしまうのが、 実に気持ち悪いです。
>>388 ' と " を区別しなくてもよいから慣れると便利。
最大の問題点はそれではなく、WideChar と AnsiChar があいまい、指定できないこと。
C/C++ のように L 付き文字定数を導入できたらよかったのだが
>>391 同意です。
WideChar型、WideString型をダブルクオテーションで囲み、
AnsiChar型、AnsiString型と区別できるようになればいいなって思います。
UTF-8の時代に何言ってんだタコども
ま、文字列と何文字目かを入力して、文字を返す関数を作ろうよ、ということで。
文字列を入力したらその文字列の1文字目をWideChar型で返す関数をつくるとか。
ほんとにDel2005Personalフリー版って出るの?
惜しかったね、4/1限定でダウンロードできたのに。
2005人限定だったのにね
400 :
バグなのか :2005/04/03(日) 07:50:06
TEditに HKKANATOHANK (小文字でもいっしょ) 入力しても HKKANATOHAN までしか入力できません。 右HKKANATOHANK左 のようにするとOKです。ちょっと確認したら他のソフトもそうでした。 ですからブラウザでぐぐりたくてもEditコントロールを使っているので 検索できません。ギコナビなどの窓アプリの書き込みウィンドウでの名前 E-mail 欄でもできません。 ブラウザで見ているこの掲示板の名前、E-mail 欄にはできますが、これは たぶんCGIで作成されているからでしょう。
401 :
400 :2005/04/03(日) 09:15:26
すいません。↑の件はわすれてくだはい(w デフラグを実施したまま使っていたのですが、一部ファイル名等が文字化けしていたので そのせいだと思います。再起動したら直りましたです。
>>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日たっても調べきれなかった当方だとは思いますが、真剣に悩んでおります。 御助力よろしくお願いいたします。
TRadioGroupでリストが15項目ある時、フォントカラーを1番から5番までは青、5番 から10番までは緑、それ以降は黒というようにするにはどうしたらいいでしょう。
>>403 困難の分割で、
・フォームへのドラッグ&ドロップを受け取る方法
・画像を表示する方法
を別々に調べて、それを組み合わせる。
これらの方法の説明は、腐るほどWeb上にある。
そのぐらいの応用もできないなら、向いてない気がする…
>>404 RadioGroup1.Buttons[0].Font.Color := clRed;
RadioGroup1.Buttons[1].Font.Color := clGreen;
RadioGroup1.Buttons[2].Font.Color := clBlue;
で、0番目が赤、1番目が緑、2番目が青になる。
> RadioGroup1.Buttons[0].Font.Color := clRed; 俺D5なんです。Buttonsプロパティはないですね。 しかたないのでRadioButtonをシコシコ使います。
TStringsに文字列を入れて、 各行に特定の文字列があるかどうかを調べてます。 その際、今はこんな感じでやってますが、もっと効率的な方法はありますか? ありましたら、是非教えてください。 for i:= 0 to StringList.Count - 1 do begin if AnsiPos('hoge', StringList[i]) <> 0 then ShowMessage('Hoge!'); end;
それで十分なら、それが一番楽だと思いますよ。
そうですか…ありがとうございました
AnsiStrPos内部で使われているStrLenに時間がかかるって話をどこかで聞いた。
>>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;
> DragAcceptFiles(Image1.Canvas.Handle, True); DragAcceptFiles にデバイスコンテキスト指定すんのって何?
416 :
デフォルトの名無しさん :2005/04/05(火) 08:54:40
TDateTimePickerって、和暦も可能でつか? その場合、他国語対応というか、その国の暦にするにはどうすれば良いのでしょうか?
OS が多国語対応していて、かつ必要な国のサポートファイルをインストールしていれば可能。 すなわち、W2K 以降で、コントロールパネルの地域の設定で適切な言語を設定していれば OK.
Winsowsのエクスプローラで、「詳細表示の設定」にあるのはCheckListBoxですか? その項目を選択したときに、下にある「選択した列の幅」のEditと連動させるのはどうやるのでしょうか?
>>418 TCheckListBox.OnClick
420 :
厨房 :2005/04/05(火) 12:32:51
>>416 どうしてもできなかったら時差を求めて足したり引いたりすりゃいいと思うww
>>418 その項目をクリックした時の動作を書けばいいじゃんwww
>>418 その部分は TCheckListBox じゃない。
TListView の ViewStyle を vsReport, ShowColumnHeader を False,
CheckBoxes を True にすれば同じものができる。
OnChange イベントでフォーカスが変わったことを検出する。
何とか出来たっぽいです。
ご協力、深く感謝いたします。
>>405 キーワードによる検索で、確かに似たようなPGは見つかりましたが、(それくらい調べてます)
初心者には、どの部分だけが必要で、どの部分が不必要なのかの区別が出来にくいのです。
その辺を、どうかご了承下さい。
しかし、困難の分割という発想は、非常に勉強になりました。ありがとうございます。
”ドラッグされたファイルを出すだけ”をひとつの関数等だと思っていた私の固定観念でした。
あと、向いてないのは分かっていますが、自分で選んだ職業なので、
他の足をひっぱらない様なプログラマーになろうと努力している結果なのです。
ご了承下さい。
>>413 大変にありがとうございます。深く感謝しております。
分かりやすくコメントまで付けて頂いて感激しております。
特にuses の'ShellAPI' 追加とか、
try // ファイル名を取得する
DragQueryFile(Msg.wParam, 0, FName, SizeOf(FName) );
辺りが、私が欲しいPGをついておりました。
厚く御礼申し上げます。
//--------------------------------------------------- 追伸:上記の協力を得て、尚且つ自分で調べた結果、一応効率よく動いた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
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;
// ドラッグ&ドロップ処理 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分割です。
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;
427 :
426 :2005/04/05(火) 15:16:15
やりたいことは上記コードでわかって頂けると思います。 レコード型の変数を代入したら、メンバである動的配列がポインタで代入されちゃいます。 最後のShowMessageの結果が123になるようなコピーの仕方を教えてください。 代替案でもかまいません。
MyData2 := MyData1;を SetLength(MyData2.FArray, 10); Move(MyData1.FArray, MyData2.FArray, 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;
>>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;
だからヘルプにCopy使えって書いてあるじゃんよ MyData2.FArray := Copy(MyData1.FArray);
435 :
418 :2005/04/05(火) 17:28:17
>>433 Delphi 6ですか?うちはDelphi 5だから残念!
…と思ったら使えました!
Delphi 5のヘルプによるとこういう書式のcopy関数どころか
動的配列に対するCopy関数はSlice関数と同じで関数や手続きのパラメータにしか使えないと書いてあります.
実際にはDest := copy(Src, First, Count)という風に使うことができるようです.
どちらも仕様として書かれていませんので正しく動く保証はありませんが….
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;
439 :
438 :2005/04/05(火) 19:58:18
↑のコード RadioButton を動的に作成しているのですが、2回目にフォームを開くとき モジュール hogehoe.exeのアドレスXXXXXでアドレスYYYYYに対する読み込み違反 が起きました。 というエラーが発生します。3回目以降はまた正常に開かれます。何故でしょう?
コードが間違ってるからじゃない
どこが間違いかわからないなら黙っててください。
>>438 原因は、
R[i] := TRadioButton.Create(Form2);
の行。
この時点では Form2 に Create したインスタンスは代入されていない。
なので
R[i] := TRadioButton.Create(Self);
にすればOK
>>442 ありがとうございます。
self ってヘルプを読んでもよくわからないんですよねえ。
Createとするインスタンスのオーナーコンポを指しているものと勝手に解釈してるんですが。
要するに FormCreate イベントだと Form をまさに生成しよう途中だから
> R[i] := TRadioButton.Create(Form2);
はまずいということですよね。
ということはら FormShow イベントでなら上記のコードでも FormCreate された後だ
からいいわけですね。
>>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 なのです。(初期値)
ああ! 丁寧な説明、まことにありがとうございます。大変よくわかりました。 そうかあ。ということは R[i] := TRadioButton.Create(Self); はまさにTRadioButton自身を生成してるんですねえ!
∫,,,,,,,,,∧,,∧ ぬくぬく季節でネミーデス ⊂,,,,,,,,,つ,,゚Д゚ミつ ご存知な方、教えてくだされ。 前にも聞いたかもしれません。 いわゆる"列挙型"ってDelphi英語では どのように表現するのでしょうか。 列挙型を文字列と相互変換する ××ToStr StrTo×× の××にあてはまる英単語は 何がよろしいのでしょうかと。
>446 Enum(eration)って話じゃなくて? 全然違ってたらスマン
SubItemsにある数値(String、例えば70)をStrToIntしてWidthに入れたいのですが、下のようなエラーが出ます。 ''70 'は整数ではありません' なぜ整数にならないのでしょうか? 直接数値を代入したり、Editなどから代入すると問題ないようです。
>>448 恐らく、SubItems 設定時に、頭に余計な ' が入ってるのだと思われます。
Item.SubItems.Add('70');
Width := StrToInt(Item.SubItems[0]);
だと動きますよね?
#ちなみに、StrToIntDef という便利な関数もあります。
450 :
428 :2005/04/06(水) 02:55:52
>>437 Move(MyData1.FArray, MyData2.FArray, 1); だとポインタをコピーするだけで意図する動作じゃないですね。
Move(MyData1.FArray[0], MyData2.FArray[0], 10*SizeOf(integer));ならOKでしょ。
領域確保してコピーするだけなのに何か問題あるのかな〜
単なるメモリブロックとして考えた方が楽だと思うぞ。
>>433 はD7のヘルプから引用したもの。
同じくD7のCopy関数のヘルプより
メモ:S が動的配列の場合,Index および Count パラメータを省略でき,Copy は配列全体をコピーします。
D6までは
>>436 のいう通り。
そもそもこの件は
>>434 で終了したものと受け取っている。また、
>>434 で
「見つかりました」と書いているから
>>426 はD7だと思われ。
>>437 実は必ずしも使うなという意図では無かったのですが….
少なくとも自分が使うだけなら,かつ不具合が起きても重大な損害が出るのでなければ
copy関数での動的配列のコピーは使っても良いのではないかと思います.
少し私の書き方がまずかったようでごめんなさい.
(それにMove手続きを使うなとは書いていませんょぅ.)
>>452 なるほど,D7からでしたか.
>>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の保護システムにより,アクセス違反として処罰されます)
(つづく)
(>454のつづき) ●フォームForm2の二度目の生成 > R[i] := TRadioButton.Create(Form2); 変数Form2は破壊された場所を指しています.新しく作る場所ではありません. 関係ない場所を見に行っているのでおかしな動作になります. (アクセス違反になったということはForm2が指している場所がWindowsに返却済みだったのでしょう.) ●対策 あるフォームの中でコンポを実行時に作るとき,パラメータにそのフォーム自身を指定する場合は 変数名ではなくてSelfを使います. Selfを使う利点はほかにもありまして,たとえば同じ型のフォームを2つ以上作る場合, もし変数名を指定しなければならないようならものすごく面倒なことになるわけですが, Selfなら同じ型のどのフォームでもSelfで済みます.
>>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' はプラットフォームに依存すると宣言されています 上記の警告を受けないようにするにはどうすれば良いのでしょうか?? どこかのプロパティを設定しなければいけないのでしょうか? それとも、何らかのプログラムがひつなのでしょうか? よろしくお願い申し上げます。
>>457 プロジェクトオプションのコンパイラで該当箇所のチェックをオフ。
>>457 コンパイラオプションも見れないやつは、デルファイ失格、
パスカラー失格市ね
460 :
偽プログラマー :2005/04/06(水) 19:30:53
>>458-459 いやーそういう事ではなくて・・・。
警告ってユーザがミスっぽいからの警告なんでしょう??
なんらかの設定やPGが不足だから出るものだと思っているものですから、
その何が不満で警告が出ているのやらが理解出来ずに苦しんでいます。
フォームにShellTreeView1を貼っただけの状態で、何が不足しているのか。
PG的に何をすべきかのかが解らんのです。
すみません。よろしくご指導下さい。
>>460 日本語読めない訳?プラットフォームに依存するっつってんじゃんw
不満なら自分で書けば。
くだスレでストレス発散すんなよ
警告とエラーは違います。 警告は、一歩間違えるとエラーになりかねない書き方や、 ポインタなどの危険な操作を行ったり、 初期化されてなかったり、返り値が設定されてなかったりと、 まあ、要するにコンパイラの「親切」なわけです。 なので、コンパイルが失敗するわけではありません。 この親切を「おせっかい」と感じる場合は、オプションで切りませう。
マウスカーソールの位置でアプリケーションを起動させるには、どうしたらいいんでしょうか?
procedure TForm1.FormCreate(Sender: TObject); begin Left := Mouse.CursorPos.X; Top := Mouse.CursorPos.Y; end;
>>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.
ちなみに、面倒なときは、プロジェクトを開いている時に、 プロジェクト→オプション で コンパイルメッセージ タブを選んで 表示したくない警告のチェックボックスを外して OK を押すと、 そのプロジェクトでは、オフにした警告は表示されなくなります。(@Delphi7) また Delphi を起動して、ファイル→すべて閉じる としてから、 上記の操作をすると、デフォルトの設定となり、 次から新しく作ったプロジェクトで、オフにした警告は表示されなくなります。
469 :
461 :2005/04/07(木) 01:25:40
>>467 もちろんワザと言ってます。
プログラミングやってるのに「プラットフォーム」って単語の意味
解ってない人はおかしいですし、検索すればすぐに解決できる
ような事をここで聞いてるからですw
見習えも糞もないですよw
>>467 むしろ、わざわざそんな事を訊かれる先輩がかわいそう。
調べるのも能力の1つだよ。
Google で「プラットフォームに依存すると宣言されています」を検索しても
ヒットするし、解決方法まで書いてある。
つーか、警告/ヒントを切るのは愚か者の対応。 platform 指令による警告は、Win32 アプリだけ作る分には余計だから、抑止したい気持ちは わかるから止めないけど、たまにはチェックしたほうが良いよ。 ところで 467 よ。おまえのいう「会社の先輩」は、ここを見ていないと思っているのか? まったく。
先輩キタ━━━━(゚∀゚)━━━━ !!
467,471 ここに出入りしている会社って・・・ もちろんソフト屋さんではないよね
未だに業務でDelphiが使われているなんて驚き桃の木山椒の木
>業務でDelphiが使われているなんて 知られていないだけ。 ガソリンが買えるのも、税金の計算も、公務員の給料も、飛行機の整備がうまくいくのも、 Delphi で作られたアプリとそのメンテナンス会社のおかげ。
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
a[1] := 0; a[2] := 0; a[3] := 0; これを一発でやる方法を教えてください。
>>477 FillChar(a, SizeOf(a), 0);
一発ありがとう!
TClientSocketとTServerSocketコンポーネントの使用が推奨されないのは どのような事からでしょうか?^^;
>>469 『プラットフォーム』と言ってもわからないひとは多いのではないでしょうか.
(Windows用ソフトしか開発していない職場では意味のない言葉でしょうし)
私はかなり昔にCマガジンか何かで知りましたけど.
>>470 2行目以降に同意.
確かにDelphiに限らず,エラーメッセージに関する情報は
それをそのままキーワードにして検索すると見つかることが多いですね.
次スレからテンプレに入れましょうか.たとえばこんなの.
---------
質問の前にGoogleで検索してみよう.
・コンパイラの警告などのメッセージはそのメッセージで検索!
・ヘルプに載っていない関数や手続きはその名前で検索!
(WindowsのAPIだったりすることも多い)
---------
>>480 それらより優秀なIndyコンポーネントに取って代わられたからです.
Delphiの旧バージョン用のプロジェクトを扱えるように
TClientSocketなどの旧コンポも残されていますが,
新規プログラムを作るのでしたらIndyを使うべきです.
うちはDelphi 5なのでIndyは付いていなくて旧コンポで作っていたのですが
今はIndyに切り替えています.
>次スレからテンプレに入れましょうか
そういうのを気にせず質問できるのがこのスレの存在意義だと思う。
という俺も
>>457 の態度がむかついたのでレスしなかった口だけど。
procedure SubForm.FormCreate(Sender: TObject);で MainFormにあるItem数に応じてEdit.Create(Self)生成しているのですが、 MainFormのItem数が変わってもSubFormのEdit数が変わりません。 SubFormを表示させる度にMainFormのItem数を調べさせればいいと思うのですが、 どうすればいいのでしょうか?
>>483 OnShow だと、表示される度に呼ばれるので、
OnShow の中で、前回生成したEditを全て消去して、
新たにItem数分Editを作ればよいのではないでしょうか。
485 :
480 :2005/04/07(木) 18:29:29
>>481 なるほど。致命的な不具合があるのかと思ってしまいましたw
次からはIndyコンポーネントを使おうと思います。ありがとうございました。
Delphi で全角⇔半角相互変換をやるのに皆さんは WinAPI の LCMapString を使いますか?
ShowMessageダイアログの位置って決めれますか?メインフォームの中央とか
ShowMessagePos ヘルプにあったよ
ShowMessageはTFormを継承してたはず。 ダイアログを作っちゃえばいい。
491 :
488 :2005/04/08(金) 02:18:57
ども。Posのほうは数値指定なんですね。フォームで作ってみます。
ShowMessagePos呼び出し時にフォームの大きさが解らないから、 メインフォーム中央には表示できない。
Delphi2005で、Delphi7で使っていたVCLコンポーネントを登録するには一体どうすればいいんですか?
パッケージを開いた状態で、プロジェクトマネージャーで右クリックして インストールね
TFontについて質問です。 HandleプロパティにCreateFontで作成したフォントを代入した場合でも、 TFontはそのフォントを自動的に管理してくれるのでしょうか。 インスタンス解放の前に、 DeleteObjectでフォントを明示的に削除する必要があるのかが知りたいです。
オブジェクトじゃないから開放の必要はない、と思う 詳しい人フォローお願い
>>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”等と表示させる方法がわかりません。
>>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;
>>499 Edit1.text := FormatDateTime('gge"/"MM"/"DD"', DateTimePicker1.Date);
Edit1.Text := StringReplace(Edit1.Text, '平成', 'H', []);
こんなところかなあ〜
もっといい方法知ってる人おながいします
>>499 ,502
EraNamesというグローバル変数があるので「これを書き換えれば…」と思ったのですが駄目でした.
どうやらFormatDateTime関数ではこれを使わずに
Windowsから直接,元号(げんごう.『平成』とかのこと)を取得しているようです.
原始的ですが『明治』『大正』『昭和』『平成』をM, T, S, Hに置き換えるしかないかもしれません.
>>502 平成しか表示しないなら
Edit1.Text:=FormatDateTime('"H"e/mm/dd',D);
これだけだろ。
>>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;
PopupMenuが閉じた時に、何か処理を行わせる方法を教えてください。
>>507 前そういうの作った時はTPopupを継承したClass拵えて、
新しくメソッド用意して、その中でPopupの表示イベントと隠すイベントを用意した
Popupを表示させる時は常にOnContextPopupからそのメソッドで表示
もっとスムーズな方法ある場合にはスルーしてくれ
手動でPopupすればいい。
PopupのCloseを検出するのは不可能じゃないけどかなり面倒くさい。 具体的にはどんな処理がしたいんだろう・・。 こういう場合たいてい他にも代替案があるはずだが
511 :
507 :2005/04/09(土) 08:11:30
508仕様でやってみます。
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でなくても呼ばれるみたいです。
513 :
512 :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と差替え可能
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以外でこのようなことは出来ないのでしょうか?
>>514 動的配列を使用したほうが良い。
var
i: array of Integer;
begin
SetLength(i, 3);
i[0] := 3;
i[1] := 2;
i[2] := 5;
・・・
end;
ListItemを右クリックしたときの動作はどう書けばいいのでしょうか?
>>514 delphiの演算子に[]がないからPIntegerに対して[]演算できない気が。
pcharについてはstring型の[]が使えるだけのような
>>515 ありがとうございます。
動的配列は知っているのですがもしできるならと思い質問しました。
やはりポインタではできないのでしょうか?
519 :
514 :2005/04/09(土) 11:35:32
>>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 );
ちょっと初歩的なことを質問させてください。 Delphiの文字列変数への代入は 文字列のコピーですよね(違ってる?)。 で、文字列変数AとBの内容を入れ換えたいんですが、 本来、文字列変数はポインタの一種だと思うんで、 何か効率的な入れ換えの方法はないものかと。。。 初心者なもんで頓珍漢なこと言ってたらゴメンなさい。
>>521 参照カウントを使ったCopy on Writeらしいので普通に交換すればいいと思いますよ
>文字列のコピー その通り。 >効率的な入れ換えの方法 普通に入れ替え用の手続き書くくらいじゃない。 VCLのstring使う限りあんまり変なことしない方が良いかも。 procedure (var str1 , str2 : string); var tempstr:string; begin tempstring:=str1; str1:=str2; str2:=tempstring; end;
>文字列のコピーですよね(違ってる?)。 じゃ、ないよね? 代入はポインタの複製(かつ参照カウンタのインクリメント) 523 さんのサンプル、うまく動くんだけど、データコピーが二度起きている。
F9を押して実行させると --------------------------- デバッガ例外が発生 --------------------------- プロジェクト Project1.exe が EInOutError クラスの例外を生成しました。 'I/O エラー (6)' プロセスは停止しています。再開するにはステップ実行または実行を選択してください。 --------------------------- OK ヘルプ(H) --------------------------- と出てしまい、実行できません さらにOKを押したあとにまたF9を押すと --------------------------- アプリケーション エラー --------------------------- EInOutErrorがモジュール Project1.exe の 0005ABC4 で発生しました。 I/O エラー (6). --------------------------- OK --------------------------- と出てしまい、同じことの繰り返しになってしまうんです どうすれば直るのでしょうか・・・
バグを退治する
527 :
最弱の初心者 :2005/04/09(土) 17:41:27
やっとEXEファイルを作れたのですが そのアプリケーションを開いた時の ウィンドウのアイコンは変更できるのですが デスクトップでのアイコンの変更ができません。 プロジェクト→オプション→アプリケーション→アイコンの読み込み で変更するのとは違うのでしょうか? アドバイスお願いします。
528 :
516 :2005/04/09(土) 18:16:58
OnSelectItem イベントというのは見つけたんですが、右クリックしたときだけというのはどうすれば…… OnMouseDownなら右クリック指定できるのですがListItemに限定するには……?
>516 気合だ
>>523 >>524 何か分からなくなった。
var A, B: string; A := B;
とすると、変数Bの内容(文字列)が変数Aにコピーされるの?
それとも、アドレスの代入なの?
実は、Listに保持したレコード内の2つの文字列の内容を
できるだけ効率的にスワップしたいんだけど。
今んとこ、
>>523 さんが書いたようなコードで処理してるけど、
何か無駄な処理してるような気がしたもんで。
531 :
523 :2005/04/09(土) 19:35:14
>>524 ああごめん、そっちの言う方が正しい。
VCLの文字列はガベコレだったな。
失敬失敬。
そんなんで、レコード型にstringをメンバーとして使うとメモリリークの可能性があるから危険って、
中村先生もMLで言ってたっけ。
532 :
530 :2005/04/09(土) 20:30:19
>>531 > そんなんで、レコード型にstringをメンバーとして使うと
> メモリリークの可能性があるから危険って、
> 中村先生もMLで言ってたっけ。
つーことは、レコードではpCharを使って
自分でメモリ管理するほうがいいってこと?
何度もゴメン。
釣れますか( ´,_ゝ`)プッ
( ,_`ゝ′)
レコード型にstring型が含まれているとコンパイラが勝手に レコード初期化解放関数を組み込んでいたような気が... CPU窓で見てみればいい。
536 :
531 :2005/04/09(土) 22:22:56
一応ソースを挙げとくと、 [Delphi:84737] Re: 動的配列と確保したメモリの開放 だから、興味のある人は、ML見てみてね。
537 :
531 :2005/04/09(土) 22:26:10
って、よくよく読み直したら、漏れの早とちりかもしれん。 MLで書いてあることについては、各自で理解してくださいませ。 すみません。
>>525 おそらくあなたの書いたプログラムの何かが誤っています.
よってどこがどう誤っているかを調べてそれを直さなければなりません.
で,まず,どこが誤っているか.
これはDelphiの統合環境が教えてくれています.
止まったときにエラーが起きた行が紺色になっていませんか?
次にどう誤っているかを調べます.
EInOutError例外はファイルの読み書きに関する関数や手続きで生成される例外なので,
おそらくファイルを開くか何かしようとして失敗したことが予想されますが,
具体的にどう誤ったかは頭で考えるより実際に調べる方が簡単です.
エラーになった(例外を生成した)行に「ブレークポイント」を置いたら
(F5を押せば行が赤くなるはず)
もう一度最初から実行してみてください.ブレークポイントで実行が停止します.
ここでほとんどの変数の値を見ることができますので,
関数や手続きのパラメータがあなた意図したとおりのものかどうかを調べて下さい.
>>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;
>>527 『デスクトップでのアイコン』というのは
タスクバーに表示されるアイコンのことでしょうか?
だとすればフォームのIconプロパティではなくてApplication.Iconの方を変えてみて下さい.
541 :
525 :2005/04/09(土) 22:52:23
>>538 レスどうもです
どこにエラーがあるのかなんとか調べてみたところ
あるアプリケーションが正常に終了されていなかったらしく
それを終了させることが出来たので正常に作動するようになりました
どうもありがとうございました
>>540 マルチポスト先(騙りじゃなければ)で解決済み
544 :
デフォルトの名無しさん :2005/04/10(日) 00:44:52
String型をInteger型にするとき、そのStringをIntにできるかどうか調べる関数ってないですか?
>>544 TryStrToIntとかなかったっけ。
まぁtry...exceptでできるっしょ。
547 :
544 :2005/04/10(日) 00:50:37
var s: String; i: Integer; begin s := InputBox('整数を入力', '整数を入力してください', ''); try i := StrToInt(s); except on EConvertError do ShowMessage('整数じゃないです'); end; こうするのが最善ですかね。ありがとうございました。
>>544 Valを使うと良いですよ。Helpみて
549 :
528 :2005/04/10(日) 01:58:54
メソッドの中で自殺(Self.Free)するのは問題があるでしょうか?
>>550 VCL内でもやってる。 インスタンスにアクセスしなければ問題ない。
なお、 Self <> nil なるコードも使われている。
>>551 ありがとうございました。
安心して自殺させたいと思います。(笑
>中村先生もMLで言ってたっけ。 盲信は危険。
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;
>>252 超遅レスだが、俺は上手くインストールできた。
tbx-2_1-beta1とtb2k-2.1.4を入手・解凍して、パッチを当てる。
ヘルプの記載どおり、ライブラリ・パスを設定して、インストール。
tbxのデモで動作確認。
次にoffice2003themeを入手・解凍して、ライブラリ・パスを設定。
tbxのデモのUnit1のusesにTBXOffice2003Themeを追加。
デモを実行すれば、TBX ThemeにOffice2003が追加されているのを
確認できる。
TBXOffice2003Themeはインストール不要という点が分かりにくいのかな?
>>554 について便乗で質問なんですが、
record を使うのと class を使うのでは、
どのぐらいメモリ消費が違うのでしょうか。
また、変数へのアクセス速度についても、
record のメンバーと class のプロパティでは違いがあるのでしょうか。
今、record を使うか class を使うか悩んでいるので、
ぜひ知りたいです。
>>559 > メモリ消費
よほど大量にclassを生成しない限り、大して変わらないのでは。
> アクセス速度
アクセッサにごてごて書かなければ、こちらも大して変わらないと思う。
>>559 ObjectPascalはどうなってるか知らないがC++なら構造体とクラスは実質同じ
>>560-561 安心しました。積極的に class を使いたいと思います。
ありがとうございました。
検索について質問があります。 同じ文字列をMemoに直接AnsiPosを使うのと、 TStringListにAnsiPosを使うのとどちらが速いのでしょうか?
>>563 Memoの内容を何カ所も検索するなら、StringListにコピーしてから検索。
一回きりならば直接Memo.Linesを探した方が早い。
コピーするにもそれなりのコストがかかります。
565 :
デフォルトの名無しさん :2005/04/10(日) 18:39:16
恥ずかしながら…超初心者的な質問を。 近頃プログラミングやってみようかと思って、とっつきやすそうなDelphiをはじめて、 とりあえず入門用サイトを見ながらテキストエディタとかペイントソフト程度までは作ったのですが、 よくわからん部分が多くて困っとります。 ObjectPascalの命令文一覧というか、単語一覧のようなサイトはありませんでしょうか? ググってもなかなか見つからないもので。 if文とかfor文とかの構文じゃなく、DefAttributesとかMessageBeepとかのことです。 英単語そのままの意味っぽいですが、どういう単語が使えるのかもわかりませんし。
>>565 ない。
ヘルプを読むか、
絶版のアンク著Object Pascalリファレンスブックを買うか、
分かりづらい(けどDelphiをマニアックに使うと大変便利なってくる)オライリーのクイックリファレンスを買うか。
567 :
デフォルトの名無しさん :2005/04/10(日) 18:53:19
>>566 ん〜…使いながらなんとなく覚えるしかないんですかねぇ。
クイックリファレンスとやらは探してみます。
ありがとうございました。
>>565 ・コンポーネント
コンポーネントパレットのStandard,Additional,Win32,Systemの最初の3つ辺りまでは
クリックしてF1でヘルプ.
・関数と手続き
ヘルプのVCLリファレンス→ルーチン一覧(カテゴリ別)
この中から使えそうなカテゴリのやつを( ´_ゝ`)フーン とかいいながら少しずつ見る.
・Windows API
MessageBeepなどのWindows APIは数が膨大なので
リファレンスで一通りチェックするのは意味がないというのが私の考えです.
(その昔,Windows 3.1の頃に電話帳みたいなAPIのリファレンス本を買ったのですがほとんど使いませんでした)
「○○ってなんだろう?」と思ったらその都度Googleで検索をかけてみるのがよいと思います.
マイクロソフトのサイトにあるリファレンスもヒットします.
…もっとももう少し初心者向けの環境が整っていると良いのも確かなのですが.
570 :
565 :2005/04/10(日) 20:01:18
>>568 >>569 リファレンス本って電話帳並になるんですか…
経験積まなきゃ駄目ってことですね。身の丈に合わせてちまちまと覚えていくことにします。
ありがとうございました〜。
別に覚える(暗記する)必要など無いよ。 必要なときに必要に応じてドキュメントを参照すればいいだけ。
Delphi 7 を使用しています。 Delphi には interface があるようですが、どうやら COM 用の物らしいですね。 デザインパターンの移植例で、interface を使った物もあるようですが、 Delphi で、Java などのように積極的に interface を使うべきなんでしょうか? (少なくとも、VCLではあまり積極的には使われていないようですが…) implements を使った委譲なんかは面白そうなんですが、 実装クラスが TInterfacedObject から派生していなくてはいけなかったり、 何かと制限も多そうに感じます。デメリットや、メリットがあればご教授ください。
>Delphi には interface があるようですが、どうやら COM 用の物らしいですね。 これってどこら辺が発祥の話? >実装クラスが TInterfacedObject から派生していなくてはいけなかったり、 だれかがデマを流している?
えーデマなの?詳細キボン
デマは言い過ぎかもしれないな。VCL 内では TInterfacedObject を使っているから、 TInterfacedObject を使いつづけたほうが便利「かも」しれない。 しかし TInterfacedObject の実装コードを見ればわかるが大した事はやってない。 「QueryInterface, _AddRef, _Release を定義したクラス」しか要求されていない。 この三つを定義したクラスであれば Interface の実装クラスの基底クラスになりえるし、 逆にこの三つを COM が期待する動作に合わせれば(すなわち TInterfacedObject の実装コード) TInterfacedObject から継承しなくても COM インターフェースとして動く。 TInterface が導入されたのは D3 だっけ? D4 だっけ? あのころはほんとに COM サポートだけを考慮していたみたいだけど、 Kylix で Linux 上でいろんなもの(おもにデータベース関連)を動かすために Interface の実装から COM 依存を取り除いている。 だから少なくとも D7 以降は COM とは関係なく Interface を使える。 くだすれからは離れそうなので、どこかに移動しますか?
577 :
572 :2005/04/11(月) 12:18:44
皆様丁寧なレスありがとうございます。
>>573 確かに、COM「専用」ではないようですね…
色々な文献を読んでいる時に、勘違いしてしまったようです。
(interface のサンプルのほとんどが GUID を書いていたりなど)
>>575 TInterfacedObject を継承していなくてもよい、というのは大変参考になりました。
QueryInterface なんかは面白そうですね。簡単に多態できそうです。
ただ、惜しむらくは、COM 互換の為か参照カウントがついているんですね。
これはこれで便利なんですが、「Create→Free」の鉄則が変わってしまって、
ややこしくなってる気がします。(気をつければ済む話ですが…)
>>576 DelWiki の interface の項は初めて見ました。参考になります。
では、移動したいと思います。
Delphi でインターフェースを使うのは敬遠していましたが、
挑戦してみたいと思います。皆様ありがとうございました。
> ただ、惜しむらくは、COM 互換の為か参照カウントがついているんですね。 DelWikiの方に回避策を追加しました。
579 :
初心者 :2005/04/11(月) 14:51:41
失礼します。 procedure TForm1. WriteBmp (Bmp1: TBitmap) ; begin ..... end; ↑こんな風に 手続きでBitmapを受渡すことはできないんでしょうか?
>>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 ;
>>581 それだとDelphiに怒られる
戻り値の型にvarは不要、詳しくはヘルプ
>>579 引数は値渡しになるけど、オブジェクト自体は呼び出し元のを
共有することになる。
従って var パラメータを使わなくても引数の指すオブジェクトの
メンバーにアクセスすることはできる。
var パラメータは、手続き側でオブジェクトを Create するような
特殊な場合だけ使うようにして方がいい。
値渡しと参照渡しを理解していない予感
HTMLのカラーコードをRGBに変換するにはどうすればいいですか?
586 :
デフォルトの名無しさん :2005/04/11(月) 17:43:07
タイトルバーに現在開いているファイル名を表示したいわけですが、 例えば新規作成のイベントハンドラに FileName := '無題'; Caption := Format('%s - %s', [ExtractFileName(FileName),Caption]); と入れて満足してたら… 新規作成をするたびに -無題 が増えるorz 新規作成を連打でもしようものなら 無題-無題-無題-無題-無題-無題…とタイトルバーに表示されることになってしまいます。 ファイルは普通に扱えるようですが、タイトルバーがあまりにもかっこ悪い。 ファイルを開いた場合なども -無題 がファイル名に置き換わるだけです。 一度ファイル名をクリアするなりすればいいのでしょうが、どうすれば…? 頭悪い質問ですまんこってす。
>>586 Captionに何が入っているか考えてみれ
>>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;
ァ ∧_∧ ァ,、 ,、'` ( ´∀`) ,、'` 釣れますか? '` ( ⊃ ⊂) '`
590 :
586 :2005/04/11(月) 18:05:48
>>586 const
APP_NAME = 'キンタマ';
FileName := '無題';
Caption := Format('%s - %s', [ExtractFileName(FileName),APP_NAME]);
国別文字について質問です。 文字列比較の関数、AnsiCompareText()とCompareText()の違いなのですが ヘルプを見ると国別文字を利用する場合AnsiCompareText()を利用してください という記載がありました。 国別文字とはいったいなんでしょうか?(シフトJISのことでよいのでしょうか?)
>>592 > シフトJISのことでよいのでしょうか?
日本語Windows環境ではその通りです。
より正確にはOSの多バイト文字セット(MBCS)サポート機能に依存します。
>593 なるほど、そうすると日本語の処理はANSI〜を キーワードに覚えればよさそうですね。 DELPHIは難解ですね。 きっとクラスでつまづくんだろうな・・ どうもありがとうございます。
UNICODEなら気にしなくて良いのかな。
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です。 よろしくお願いします。
再生には秘密のテクニックが必要です。
というのは冗談として、 そのMPEGファイルは1か2か。 MPEG2だとしたら普通のWMPで再生できるのか、 書きなはれ
601 :
598 :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;
[1..2000, 1..2000] んなことできるんですか?
>>602 ローカル変数を入れるスタックサイズが不足している
{$MAXSTACKSIZE 16777216}指令でスタックサイズを増やす
(スタックサイズは動作した大きさ)
ただこのやり方はあまり好ましくないと思うので
データの持ち方を見直したほうがいい
605 :
デフォルトの名無しさん :2005/04/13(水) 14:42:01
すみません。検索ベタでうまく 探せなかったので質問させてください。 あるURLを自動生成して、ボタンを押すとそのサイトを urlopenに関連付けられたブラウザで独立して開きたいのです。 ↑ここでいう独立とはWinExecで他のアプリを よび出したときのようにという意味です。
SetTextCharacterExtraで文字間隔を設定して 二重線のon /offを設定し、Alignmentを右・左 設定できるコンポーネントを作成しているのですが 文字寄せが設定どおりの動きをしてくれません。 原因はSetTextCharacterExtraかなと思うのですが SetTextCharacterExtraを使用せずに、他の 方法などありますでしょうか?
ShellExecuteかCreateProcess
608 :
デフォルトの名無しさん :2005/04/13(水) 15:42:27
以下のようにコード上部で固定されている画面を他画面から開きます。 {$define HOGEHOGE} //{$undef HOGEHOGE} この画面を開く際に、define/undefの制御はできるものでしょうか? 例外的にある画面から開く場合のみ {$ifdef HOGEHOGE}で書かれている部分を実行したいのです。
>>436 の補足というか訂正.Delphi 5のヘルプ,『動的配列』のところに
『動的配列を切り捨てるには,Copy 関数に配列変数を渡し,結果を配列変数に代入します。たとえば,A が動的配列である場合,A := Copy(A, 0, 20) は A の 21 番目以降の要素を切り捨てます。』
とあるのをすっかり忘れていました.Copy関数のところの説明と矛盾しているのですね….
>>603 『静的配列』(宣言時に要素の数を指定)なら可能です.
この場合,要素は1だけでなくいくつから始めても構いません.
また整数の代わりに文字型(char)や列挙型(Booleanなどの論理型を含む)でも構いません.
611 :
605 :2005/04/13(水) 16:57:15
>>609 うひょー!ばっちりでーす!
あざーーす。
>>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;
どうしてスタックオーバーフローが出ないのかを聞きたいのでは?
615 :
602 :2005/04/14(木) 09:36:02
613さん、ありがとうございます。解決しました!! ローカル変数でなければいいのですね・・・(変な仕様・・・) 下側は何故うまくいくのか、さっぱりです;; 特に、これ。 PArray = ^TArray;
>変な仕様・・・ と思うなら、スタックについて勉強してみれ。
>>615 スタックはローカル変数用のメモリ格納場所
TArray = array[1..2000, 1..2000] of single
PArray = ^TArray ← Var hoge: TArray
入れ替えても問題無し(こちらの方がわかりやすいか?)
この形(独自の型を定義してその型へのポインタ)は
前方参照というDelphiの決まり唯一の例外
横レスすまそ > PArray = ^TArray; > TArray = array[1..2000, 1..2000] of single; とするのと > TArray = array[1..2000, 1..2000] of single; > PArray = ^TArray; とするのって何か違いがあるの? わざわざ前者みたいな例外があるってことは何かありそうだけど。
その場合は違いは無い。 未定義の型のポインタを宣言できるようになっているのは PRecord = ^TRecord; TRecord = record Data: integer; Next: PRecord; end; こういった構造体を定義できるようにするため。
>>618 この例外がないとレコード内で自分自身を指すポインタを持てなくなる
配列型もしくはレコード型を指すポインタを作るときは
型宣言の上に記述するのがDelphiの定石
技術評論社塚越一雄氏の「Delphi応用プログラミング」に ここらへんの話は面白く書かれてるよ
623 :
デフォルトの名無しさん :2005/04/14(木) 14:07:45
教えてください。 Delpho2005 Pro Update1 (.Net切り離し) で作っているのですが、プログラムのアイコンや exe ファイルのプロパティで確認出来るバージョン情報が全く 変更出来なくなりました。正確にはプロジェクトのプロパティでの変更は 出来て、その変更が res に反映されません。 Project1.res の更新日付はもちろん変わりません。 Delphi6 で作ってたプロジェクトを 2005 に持ってきたんですが、 今更 6 には戻せないので、なんとか res ファイルが更新されるように したいのですが…。 res ファイルを消したらまた作ってくれるのかなと思って消してみたら 「ファイルが見つかりません」とでてコンパイルも出来なくなりました。 今は他のプロジェクトで作った res ファイルを持ってきて コンパイルすることで対処しています。 今でも始めから 2005 でプロジェクトを新規作成すると ちゃんと変更されるので 6 から持ってきたことが原因ではないかと疑ってましたが、 6 から持ってきたプロジェクトでもちゃんと変更されるものもあるようです。 ということで原因がさっぱり掴めずお手上げ状態です…。
まずはUpdate2に汁
Delphiで特定の周波数の音を出す方法ってないでしょうか? MIDIだとどうしても中間音などが出せません。 できたら、任意の複数の音も出せると最高です。 スキルがあまりないのでできるだけ簡単に出したいのですが・・・ どなたか教えてください。
NT系なら周波数を指定して音をだすAPIがあったはず。
Windows.Beep(440, 5000) これでラの音が5秒鳴る(はず) NT4、2000、XP専用のAPI
問題は鳴らしてる間スレッドが止まることだ>Beep()
そこでマルチスレッドですよ
音のローレベルのAPIでそんなのがあったような気がする。
631 :
630 :2005/04/15(金) 14:00:38
>>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); を実行する
>>633 わざわざ ringin.wav を作れというのか
635 :
デフォルトの名無しさん :2005/04/15(金) 15:39:01
220:ド 246:レ 277:ミ 293:ファ 329:ソ 369:ラ 415:シ 440:ド^
636 :
sage :2005/04/15(金) 15:40:47
>>626-628 皆さんのレスを読むとマルチスレッドにしたら複数の音を出せるってことですね?
マルチスレッドやったことない・・・orz
サンプル探してきてやってみます。
いいのがあればいいが・・・
ヒント:フーリエ合成
システムカラーが変更されたことを、 TGraphicControlの派生クラス内から知ることはできますか? WM_SYSCOLORCHANGEDメッセージを捕まえてみようとしたのですが、 どうやらメインフォームにしか送られていないようです。
>>641 うまくいきました!
どうもありがとうございます。
643 :
デフォルトの名無しさん :2005/04/16(土) 00:39:26
ビットを反転させるなら、not演算子ですが、 ビットの配置を逆にする演算子はないですよね… たとえば 01001011 という数を 11010010 というように逆にしたいんですが。 大量の処理をするため、なるべく効率よく書きたいんですが、どういう書き方が一番いいでしょうか。
>>643 キャリーフラグ使ってローテイト命令使えば良い
MOV AL,01001011B
ST:
MOV CX,8
RCL AL,1
RCR AH,1
LOOP ST:
でいいんじゃね?
マシン語秘伝の書を思い出した(w
DelはCのマクロやインライン関数みたいなのは無いんですか?
647 :
初心者 :2005/04/16(土) 11:23:02
648 :
初心者 :2005/04/16(土) 11:24:11
>>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ではインラインアセンブラ使えないんでしょうね...
ツマンネ
テーブル参照のほうがシンプルかつ高速なんじゃないか。たかが256バイトだし。
これでどうでしょう? 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;
マルチスレッドはAcidFloorのが基本的なんだけど そこから応用したくなっても 極端に資料が少なくて苦労するんだよね。 ML検索しても資料的価値まで高まっている記事は皆無で 苦労するよ。 こういうところがDelphiのユーザー層の薄さを感じる。 Halbow氏にまとめて欲しかったよ...orz
さておき、 D2005の条件シンボル知ってたら誰か教えてくださいまし。 また、将来的にD2006や2007や DelphiXが出る時に、その条件シンボルを 調べる方法が知りたいっす。 MLログで「HELPで条件シンボルを調べる」とあるが D2005のHELPにはそんなもの載ってないヨォ...。゚(゚´Д`゚)゜。ウァァァン
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そのものがタグ間の文字列の色を指定できないのでしょうか?
>>655 Fountain 接続後の色分け処理は、各 Fountain に任されてるから
Editor.View.Colors は無視されるっていう意味じゃないの?
THTMLFountain のソース読んでみたけど、
タグ以外の所は通常のテキスト色にしてるみたい。
タグとタグの間の所を色分けしたいなら、自分で拡張するよろし。
DirectSound使えよダァホ共
ビットマップの合成について質問です。こちらの環境は、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) で行っています。 他に何か設定すべき項目があるのでしょうか。よろしくお願いします。
ビットマップAの黒が白ならor合成でいいんだがなあ
( ゚Д゚) ハァ?
スキャンラインを使えばいいんじゃない?
TransparentをTrueにするんじゃなかった?
BrushCopyがお手軽では Image.Picture.Bitmap.Canvas.Brush.Style := bsClear; Image.Picture.Bitmap.Canvas.BrushCopy(Image.ClientRect, BitmapA, Rect(0, 0, BitmapA.Width, BitmapA.Height), clBlack);
>>653 > こういうところがDelphiのユーザー層の薄さを感じる。
問題意識があるなら、自分で作れば。
なんか最近文句しか言わんな。ギコ。
>>625 です。
>>639 フーリエ合成って初心者が扱えるほど簡単に出来るのですか?
簡単なコンポがあるのでしたらチャレンジしてみたいのですが。
>>647 ありがとうございます。見てみます。
TImageを継承したコンポーネントを作成していますが、 フォームに貼り付けたコンポーネントをどんな大きさにしても、 以下のconstructorのコードでは「105」となります。 なぜでしょう? constructor TImageXXX.Create(AOwner: TComponent); begin inherited Create(AOwner); showmessage(inttostr(width)); end;
>>666 オブジェクトインスペクタで設定したプロパティの内容は
コンストラクタの実行が完了した後に代入されるから。
>>667 では、 「コンストラクタの実行が完了した後に代入された」
値を(この場合width)を参照したい場合、どこでみればいいですか?
アプリ起動直後にITmage全体を塗りつぶしたり、絵を描きたいのです。
>>666 Loaded か SetBounds をオーバーライドすればいけるんじゃない。
Loaded はフォームからプロパティが読み出された後に呼ばれる。
SetBounds は Width プロパティの書き込みで呼ばれる。
ちゃんと調べてないので、ヘルプとソースを読んでくれ。
Loaded でできました!! ありがとうございました。
671 :
デフォルトの名無しさん :2005/04/18(月) 15:35:14
> D2005の条件シンボル知ってたら誰か教えてくださいまし。 {$IFDEF VER170} {$ENDIF} >また、将来的にD2006や2007や >DelphiXが出る時に、その条件シンボルを >調べる方法が知りたいっす。 基本的に 前バージョンに10たしてみる {$IFDEF VER170} がはは {$ENDIF} んで、構文チェック ひっかかれば。 ビンゴ
メニューバーの背景色を変更することは可能でしょうか? オーナードローでアイテム部分は自由に描画できるのですが、 アイテムのない余白部分がデフォルトの色のまま残ってしまいます。
自分で塗るか、システムカラーを変更するしか無い
674 :
672 :2005/04/18(月) 18:49:25
>>673 自分で塗るというのは、
WM_NCPAINTに応答するメソッドを実装するということでしょうか?
メニューバーを上書きしているサンプルが見つからないので、
何か参考になるページなど教えていただけるとうれしいです。
676 :
658 :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にドック 先ほど参照したオブジェクトが参照できなくなる という感じです。 どなたかご存知の方、教えてください。
678 :
672 :2005/04/18(月) 19:54:17
>>675 ExtraMenuをダウンロードしてみましたが、
見やすいソースでとても参考になります。
やりたかったことは何とか実現できそうです。
どうもありがとうございました。
CryptってDelphiでも出来ますか? 好きなトリップを探すソフトが作りたいです。
bitmapの色数を取り出す方法を探してまして、 bcBitCountを使うまでたどり着いたのですが、 どうやれば色数をとれますか?
HTTPゲットとメール送信の使いやすいクラスのユニットファイルって どこかに落ちてないですか?
>>680 ビットマップの色数といっても
画像の形式(256色形式とか1677万色形式とか)を指す場合と
実際に使われている色の数を指す場合が考えられます.
前者の場合はビットマップオブジェクト(TBitmapクラス)を使って
画像ファイルを丸ごと読み込んでPixelFormatプロパティの値を調べるのが簡単です.
(画像ファイルを丸ごと読み込むことになるのでメモリの無駄遣いになりますが)
自力で読み込む場合はあちこちのサイトに解説がありますのでそれらをご覧下さい.
(今見付けた頁
ttp://www.kk.iij4u.or.jp/~kondo/bmp/ )
後者の場合は基本的に全部のピクセルの値を読み取って数えるしかないと思います.
使い方がわかりもはん
>>679 OpenJane Lovelyで書き込みプレビュー見ると、
#で始まるトリップがきちんと◆のトリップに変換されてるから
ソース落として追いかけてみたら?
>>686 OpenJane Doeなら
UWriteForm.pasの class function TWriteForm.Trip(const Key: string): string;
でトリップエミュレートしてるよ。
質問です。 どっかのサイトで見かけたと思うんですが、 簡単な入力ダイアログを出して文字または数字を得るには どうすればいいんでしょうか? フォームを作るまでもない入力なんです。
InputBox
>>689 ああそれです!ありがとうございました!
>>683 ありがとうございます。
今、ピクセルを一つづつ読み取って動かしています。
PixelFormatを勉強したいと思います。
パネルと、その上に乗っかっているコンポーネントを 半透明化したいです。できるでしょうか?
>>693 フォームのAlphaBlendプロパティをTrue
AlphaBlendValueプロパティの値を変更すれば透明フォームになるよ
詳しくはヘルプ
いえ、フォームは普通のままで、パネルだけを半透明化したいのです・・・
そんなアプリ使いたくない
>>701 LabelやImageなどはありましたが、パネルはありませんでした・・・
残念。
>>699 >作成できませんか?
_, ._
( ゚ Д゚)
同じような質問なのですが。 フォームの背景を半透明にして、フォーム上の文字だけを不透明にしたい場合、方法ってありますか?
>>706 青のとこにalClientのパネルおいて、その上に赤と緑じゃ駄目か?
オレはいつもそうしてる
アプリを複数起動させて、横に並べるとか、重ねて並べるとかの やり方教えて下さい。
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが、 お礼はDelphiの布教と初心者の救済をお願いします。
711 :
デフォルトの名無しさん :2005/04/22(金) 09:38:06
StringGridのoptionでgoRowSelectをTrueにすると行選択できますが この選択されたときのハイライトの色ってかえられますか? もちろんwindowsの選択項目の色を変えれば変わりますが。。 任意のStringGridのみ変更したいのです。
>>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
715がいいこと言った
717 :
711 :2005/04/22(金) 13:35:57
>>712 ありがとうございました。うまく動きました!
>>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;
>>718 Panel1.Brush.Bitmap := Bmp
じゃ駄目かな
直接なんでかと言えば11行目の Panel1.Brush.Bitmap.Assign(Bmp); の時点での Panel1.Brush.Bitmap がnilだからだ
709 お願いします。 以前に作ったこと有るんですけど、忘れてしまってぐぐってもわからんです。
722 :
デフォルトの名無しさん :2005/04/22(金) 21:44:14
>>709 君のアプリだけを並べたいのか、起動してるすべてのアプリを並べたいのか
723 :
709 :2005/04/22(金) 22:04:53
自分のだけです。
724 :
デフォルトの名無しさん :2005/04/22(金) 23:59:47
自分のだけなら自分で計算してやらないとだめだな。 1.自前のウィンドウメッセージを用意する(またはWM_COMMANDを便乗してもよい)。 2.自前のメッセージをSendMessageで送る(HWND_BROADCASTで)。 3.メッセージを受け取った自前のアプリ内でデスクトップの大きさを調べて(TScreen) 適切なサイズを計算してwidthとheightを変える。
共有メモリが良いのでは?
共有目盛りをどうしろと?
727 :
デフォルトの名無しさん :2005/04/23(土) 02:37:05
共有メモリで各自のtop left width heightを相互参照しつつ それぞれのウィンドウが自分で調整する・・・・・ じゃないな 共有メモリで起動してる自アプリの個数を管理して SendMessageでサイズ変更 かね
727でつっこみが入ったから プロセスを列挙して起動してる自アプリの数をカウント にチェンジ
for文を書くと処理が終わるまでフォームが固まってしまいます。 何とか回避する手段は無いでしょうか? 初歩的な質問だと思いますが、どうかよろしくお願い致します。
>>731 途中で
Application.ProcessMessages;
を入れると吉。
733 :
709 :2005/04/23(土) 07:35:51
724-730 ありがとうございます。
>>730 ソース見て勉強させてもらいます。
めちゃくちゃ助かりました。!!
Create(Self)で生成したコンポーネントを破棄するにはどうしたらいいですか? Freeとか書く場所が分からない……。
>>734 質問の意図が分からない。
生成したコンポーネントが必要なくなったときに Free すればよい。
736 :
734 :2005/04/23(土) 08:59:07
サブフォームを表示したときにEditをいくつか生成して、 サブフォームを閉じたときにEditをすべて破棄して、 もう一度サブフォームを表示したときにEditを生成しなおしたいんです。 OnShowでEdt := TEdit.Create(Self); OnCloseでEdt.Free; にしたんですが、破棄されないみたいです。 自分でも混乱していて申し訳ない。
>>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)を
作成すること
>>736 サブフォームのOnCreate/OnDestroyで書くべきだとおもうのだが、
それではダメなのか?
もしくは生成/解放しないで、単にVisibleプロパティをいじるとか。
親コンポーネントがFormならFormを破棄したときに自動で解放されるんじゃないか
しかしOnShowで生成するとOnShowイベントが発生するたびに何回も生成しまくるわけで
>>738 の言うとおりOnCreateで生成しよう
740 :
739 :2005/04/23(土) 10:20:53
ごめん嘘 その使い方ならOnShow/OnHideで生成/解放しよう OnCloseは右上の×ボタン押したりとかCloseさせたときしか起こりません
OnCreateってプログラムが起動したときですよね(多分) メインフォームの状態を見て生成したいので……。 Edit生成するときにNameもつけるんですが、 サブフォーム表示されるたびに生成するのでNameがかぶるらしくて、 閉じるとき(OnHideですか)に生成した分を無かったことにしたい。 --- ちょっと遅かった。情報小出しですみません。
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へ続きます。
744 :
743 :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に続きます。
745 :
743 :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)にするとエラーはでなくなりましたがフレームが表示されません。 手持ちの書籍で調べましたが、よくわかりませんでした。 よろしくご教授お願いします。長文失礼しました。
begin pFrameList[1] := TframeTest.create(senf); pFrameList[1]^.Name := 'Frame1'; pFrameList[2] := TframeTest.create(senf); //ここでエラーがでます。 pFrameList[2]^.Name := 'Frame2'; end ; 全然検証してないけどこうやってもだめですか。
よく見たら ^ 要らないや。
748 :
743 :2005/04/23(土) 12:53:07
>>746 回答ありがとうございます。
それぞれのnameプロパティにユニークな名前を設定したらエラーがでなくなりました。ありがとうございました。
749 :
731 :2005/04/23(土) 13:09:58
>>732 きちんと回避できました。どうもありがとうございます!
教えて下さい。 一つのフォームに複数のListBoxを貼り付けて同時スクロールをさせるには、 ActionListのonUpdateを使うのが普通なんでしょうか? ListBoxがスクロールする時のイベントとかってないんですよね?
TBrushについての質問です。 ヘルプファイルにはBitmapプロパティについて、 「イメージが 8×8 ピクセル以上ある場合, 左上の 8×8 の領域のみが使われます」とあります。 しかしこの説明に反して、Bitmapに大きなイメージを設定した場合でも、 Bitmapの全部がブラシ模様として使われるようです(環境はWinXP、Delphi6)。 このことは、OS側の仕様が変わったためと理解してよいのでしょうか? そうならない場合も想定する必要があるかどうか知りたいのですが。
753 :
734 :2005/04/23(土) 19:11:46
>>742 理屈は分かったような気がするのですが、
単純にコンポーネントを削除するような方法は無いのでしょうか?
>あらかじめEditを配置
はしばらく考えてみます。
それともう一つ質問ですが、変数(Edt)を初期化するというのはどうやるのですか?
>>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で定義した変数にアクセスできるのでしょうか。よろしくお願いします。
showString"l"?
757 :
755 :2005/04/23(土) 20:54:19
>>756 申し訳ありません。書き間違えました。
正しくは、
[エラー] uMyFrame.pas(XXX): 未定義の識別子 : 'showStringl' X
[エラー] uMyFrame.pas(XXX): 未定義の識別子 : 'showString' O
です。
>>757 × var pMyFrame : array [1..50] of TFrame;
○ var pMyFrame : array [1..50] of TMyFrame;
にするとか。
>>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 回答ありがとうございます。
多態性オブジェクトというのが、調べた本には書いてあったのですが、何のことかピンときていませんでした。
実際のコードでは、微妙に機能の違う派生フレームがあたくさんるので、フレームの設計を見直したいと思います。
761 :
734 :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はどう?
文字列の追加・削除が自由にできるし、かなり使いでのあるクラスだよ。
>>761 動的に作成するのなら Name はあまり関係ない。
TEdit の動的配列かリストを作って EditArray[i] や EditArray.Items[i] でアクセスできる。
あと TComponent のデストラクタではオーナーのリストから自分自身をちゃんと削除しているので
TEdit.Free で削除できるはず。
2重開放してないか?
しかしそれ以前に本当にその方法(アイテムの項数に応じて動的に TEdit 作成)が
適切か見直すべきではないか。
不定個の入力ボックスは作る側も使う側も扱いづらいと思う。
日本男児ぃー
普通そういう時って TStringGrid とか使わないか? TEdit だと、数が多いほど、どんどんウィンドウが縦長になる。
TValueList もな
うるせーな、人が名に使おうと勝手だ。 すっこんでろ
Button1をクリックした時、選択枠がでますが、あれって消せないものでしょうか? 教えてください。
ファイル名を検索→存在した場合絶対パスを返す という事をやりたいのですがどのように書けば良いのでしょうか。 特定のディレクトリに対してなら出来たのですが、特定のディレクトリ以下 全てを検索するにはどのようにすれば良いのでしょうか。。
>>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;
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;
772 :
734 :2005/04/24(日) 19:17:16
>>762 ー766
TStringsList、動的配列、TStringGrid、TValueListEditor(ですよね)勉強してみます。
開放の件は、よく解らないです。しばらく考えてみます。
早く完成させたくて焦ってました。一旦考え直します。どうもありがとう。
SpinEditの三角矢印を押した時のイベントはどうすればできますか?
>>773 です
自己解決 普通に SpinEdit1Change でできました。 お騒がせしました。
>>768 つ スピードボタン
ちなみにあの点線の枠は『スペースバーを押すとこのボタンを押します』ということを示すものです.
なので,キーボードで操作する場合にあれを消されると困ってしまうのですよ.
スピードボタンはそもそもキーボードでは押せないので
(『マウスキー』を使う場合は別ですが)
この点線枠が表示されることもありません.
>>772 細かいことですがレスアンカーが半角ハイフォン(マイナス)ではなくて半角カナの長音記号になっていますョ.
これはただの飾りではなくてクリックするとそのレス(この場合は762-766)にジャンプする機能を持っているものです.
次からで構いませんのでお手数でも正しく入れて下さるとありがたいです.
formの中心にImage1を配置するにはどうすればいいですか?
>>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
>>776 IDE上でならImage1右クリック→位置→位置合わせ
実行時でなら…OnReSizeにゴリゴリ書くぐらい?
>>776 > formの中心にImage1を配置するにはどうすればいいですか?
IDEで中央に配置してImageのアンカープロパティを全部Trueにすれば
フォームのサイズが変わっても中央に置かれるよ
あまりにもフォームのサイズを小さくすると画像がひしゃげたり見えなくなるけど
>>780 それじゃサイズを変えただけでおかしくなるんじゃ?
776です。 みなさん、ありがとうございます。 しかしながら、うまくいきませんでした。 Image1は サイズが変わるので大きいサイズになると中央より右いったりします。 また、いい案あれば教えてください。お願いします。
>>782 Image1のサイズが変わったときに再計算、再配置すれば良いじゃないか
案もくそもないぞ
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というプロパティがないというエラーになってしまいました。 設計時にできていることなので何らかの方法があると思うのですが調べてもよくわかりませんでした。 どなたかご教授ください。よろしくお願いします。
>>785 画像をTBitmapでオフスクリーンビットマップとして持つのはだめなのかい?
ウィンドウを持たないアプリケーションを作りたいんですけど方法がわかりません。 よくある、タスクバーにアイコンがいて、画面上に画像を表示したり定規を置いたりするやつです。ヒントください。
透明なウィンドウにImageを配置するのが一番楽だと思うんだが。
Form1のAlphaBrendとValueをいじっただけだと画像や図形まで透過してしまいます。。。
delphi6をいれようと思ったら、ライセンスキーを取得のところで、 既存のリモートホストは強制的に切断されたとか言われて取得できません cookieは全て許可で、JavaScriptも有効にしてるんですが、どうしてかさっぱりわかりません どうすればいいですか?
791 :
デフォルトの名無しさん :2005/04/26(火) 22:58:30
>>789 そういう風にやるならいじるのは、
TForm.TransparentColor : Boolean と
TForm.TransparentColorValue :TColor
>>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;
コンストラクターのほかにもクリックしたばあいの処理やフィールドの処理なども組み込みたいのです。
素直にファイルから読み込むしかないのでしょうか。
TImageにロードしておけばexeの中にリソースを格納する。 とか言ってみるテスト。 違ったっけ?
795 :
デフォルトの名無しさん :2005/04/26(火) 23:27:15
>>794 設計時にTImageが存在していればそれでいけるんですけど。
このばあい、TMyPanelのコンストラクターの中で動的に生成されるので、事前に入れておくことはできません。
クラスなんで、変な依存関係をもたせたくないので、ディスク上のファイルから読むか定数でおくしかないと思うのですが。
それとも何か他に方法があるのでしょうか。
ImageListにイメージを格納しておいて、 そこから動的にMyPanelに引っ張ってくる とかは?
TImageListでいいじゃん。
>>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 やっぱりそうなりかね。
イメージリストの使用やファイルの読み込みもふくめてもう一回考えてみます。
>>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;
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' +
'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);
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;
( ゚Д゚)
神降臨のあとなので蛇足っぽいのですが,
せっかくなので
>>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) という風に読み込みます.
自分でgrepdでもやれ死ね
808 :
デフォルトの名無しさん :2005/04/27(水) 17:16:31
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
おいぇおいぇおいぇおいぇ
ウインドウメッセージの処理について質問があります。私の環境は、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; このコードですと最小化してしまいます。見当違いの実装をしているのでしょうか。 よろしく御教授ください。お願いします。
( ゚Д゚)くだすれ…だよね…レベルたカッ
>>809 GW が関係無すぎてワロタ
ToolBarはそういう仕様だと思うけど
ボタンの順番を変えたいだけならLeftをいじくってみれ
>>810 おうぇおいえうぇいえwwwwwwwwっうぇwwwwwwwっうぇ
>>811 デスクトップの表示はそもそもWMSysCommandじゃない
表示ボタン押しても隠れない仕様は邪魔じゃないか?
>>812 くだすれ と 上級者用 の2段階しかないから我慢
814 :
811 :2005/04/27(水) 19:02:30
>>813 実は、画面の右端に居座るランチャーを作っています。
バーアプリにして、他のフォームを最大化しても隠れないようにしてあるので、できれば居座りつづけてほしいのです。
フォームのリサイズイベントで対応したほうがいいのでしょうか。
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
動的に生成なんてことするなら、パネルとスピードボタンでやったほうがわかりやすいんじゃないかな。 その可能にするカスタマイズの内容がわからないのではずしているかもしれませんが。
あ、回答書くの忘れてた。Left でもだめでした。SetBounds でもだめだし。 具体的には有効なボタンが無効になったり逆になったりするんです。
>>818 いえ。多分はずしてません。おっしゃる方法も検討したいと思います。
たまにはユーザ側に廻って同業者を困らせてみたいな。 可能な範囲で複雑なコーディングをしなければならない感じの。
>>822 あ〜、そういう手もあるなー。どうしよーかな。ちょっと疲れてきたなー。
他の仕事も山にあるっつーのに。
>>820 あんたみたいな客には当たりたくないもんだなー(2行目がいまいちよく
わからないけど)。でも中がわかってるから意外に手加減したりしてね。
あ、回答くれた皆さん、ありがとございますです。
824 :
785 :2005/04/27(水) 21:25:42
>>801-804 まさしく神降臨ですね。
サンプルのソースまで上げていただきありがとうございます。
サンプルを元に実装にあわせて改造したいと思います。
>>806 今回はあれですがまた機会がありましたら、リソースファイルを使う方法も使ってみたいと思います。
お二方ともありがとうございました。
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);
826 :
825 :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
827 :
825 :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;
828 :
825 :2005/04/27(水) 23:09:45
以上です。よろしくお願いします。
829 :
825 :2005/04/27(水) 23:16:22
書くのを忘れていましたが、Delphi6 Personalを使っています。
何がうまくいかないのかよくわからないけど RichEdit1.SetFocus; を適当に追加
スレッドを作成してそのスレッドからDLLの関数を呼び出した場合、その関数もスレッドと同じ優先度で実行されるのでしょうか? アイドルレベルで作成したスレッドからDLL内の重い関数を呼び出しているのですが、どうも動作が重くなっているような感じがします。
>>831 そりゃアイドルレベルで作成してるからじゃないの?
833 :
831 :2005/04/28(木) 10:52:21
>>832 ちょっとわかりにくくて済みません。重いのはメインスレッドの動作の方です。
D6ならTThreadのWaitforが遅いっていうバグがあるよ
835 :
デフォルトの名無しさん :2005/04/28(木) 11:40:02
WebBrowserコントロールを取り込んで使ってます。 自分のプログラムだけProxyを別のものにしたいんですが WebBrowserコントロールだけでは不可能でしょうか? やり方があれば教えてくださいませ。
MemoまたはRichEditで矩形選択する方法を教えてください。