くだすれDelphi Part9 (超初心者向け)
ひかりのどけき2GET
推奨テンプレ(嘘
kakinotane.s7.xrea.com/dirDelphi/mainmenu.html ここで
一通り練習してみよう。
まずは「基礎から学ぶDelphi講座」を最初から最後まで、実際に入力しながらやってみる。
その後、自作コンポーネントの道の「はじめに」から「クラス参照型について」までやってみよう。
そしたら一通りは動かせるようになるので、
「3分で作ろうアプリケーション」の出来上がりをみて、ソースを見ず考えて作ってみよう。
そしたら、それぞれのVCLの使い方、役立つ関数を覚えていこう
VCLの使い方はココ www.geocities.jp/takamori700/index_03.html
関数はココ www.borland.co.jp/tips/delphi/dh002/index.html
これを全部こなせば、とりあえず一通りのことはできるようになるぞ
>>1-5 ( ・∀・)つ〃∩ オツーオツーオツーオツーヌツールツーポツーヌルポー
>>7 ∧_∧ハゥッ
∧_(Д`; )←
>>7 ( ・∀・) つ
(っ ≡つて ヽ ガッ!
して_)_ノw (_)
フォームにComboBoxを20個くらい貼り付けてるんですが、
9x系だとリソースを大量に食いつぶしてしまいます。
なんかいい方法ないっすかね?
>>9 ソレは「いっぺんに表示する必要」があるの?
分けられるなら、用途別に分けて使い回すとか。
コードは面倒臭くなるだろうけど。
Win2k/XP導入。それが一番簡単だ。
俺は、もう9X系のサポートは打ち切った。制限多すぎるしね。
12 :
デフォルトの名無しさん:03/12/14 00:43
コンボボックス20個使うようなソフトに興味がある
Del厨のセンスは最悪ですねw
リッチテキストエディタを作りたいのですが、行ごとや選択範囲のみにボールドなどの装飾や
フォントサイズの変更はできないのでしょうか?
出来る。
16 :
デフォルトの名無しさん:03/12/14 01:12
>>14 (Delphiインストール先)\Demos\RichEdit
コンボボックス20個ってそれだけで画面の半分以上が埋まりそうだね
>>9 レスが無い所を見ると、「煽られたのでイヤになった」か「元から釣りだった」の
どっちかだろうか?
TEditでウムラウトのついた文字も扱いたいのですが、どうすればいいでしょうか?
20 :
デフォルトの名無しさん:03/12/14 08:13
Delphiでは無理
Delphi6ってXPでも使えますか?
if a = 0 then
処理1
else
処理2
なんで処理1、処理2の後ろにはセミコロン要らないの?
Cから移ってきたんだけど、こういう細かいところが変なので覚えにくい・・・
>>26 セミコロンは文の終わりではなく区切りを表すものと考えて下さい(略
Delphi3Q&A150選 P66より。
>>28 いや、最後が所属ブロックのend;かend.ならいらん。
なんとなく、ほんとになんとなくだけど分かったと思うw
if文全体を「文」として考えるんですよね・・・?
すぐ後ろがend;ならそこで結局区切られるからセミコロンは要らないってことなのかな。
>>26 超マジレスすると、、、
Cのセミコロンは「文末」を意味する。だからセミコロンも文の一部。
Pascalのセミコロンは「文同士の区切り」を意味して、文の一部ではない。
Cのifの構文は、「 if(条件) 文1 [else 文2] 」だから文1の後ろにもセミコロンが付く。
Pascalは「 if 条件 then 文1 [else 文2] 」だから文1の後ろにセミコロンは不要。
ちなみにPascalは本来文がある所に文が無い場合は「空の文がある」と仮定する。
だからendの直前の文の末尾にセミコロンがあると、セミコロンとendの間に「空の文」が
あると解釈される。
だから、then の直後にelseを書いたり、elseの直後にセミコロンを書いたりしても
エラーにはなりません。
case文のコロンの後ろに文を書かずにセミコロンを書いてもエラーにならないし。
自慢房がいますね
そんなことは入門サイトのリンク貼って終わり、得意気になに調子のってんだか。
パパパスカルマスターしたぞー、とか思ってるんじゃね?
∫,,,,,,,,,∧,,∧
>>32わかりやすい説明っすね
⊂,,,,,,,,,つ,,゚Д゚ミつ
質問です。
コンパイルしたExeのファイルバージョンは
オプションダイアログで設定できますが
それと同じ値を"製品バージョン"にも
自動で反映させてあげたいのですが
どうすればいいんでしょうか?
お願いします。
36 :
デフォルトの名無しさん:03/12/14 13:20
C製のDLLをインポートして使うときに
CのヘッダファイルからObjectPascalの関数/手続き宣言を生成してくれるようなツールってない?
SWIGのDelphi版みたいなの。
∫,,,,,,,,,∧,,∧ もひとつー。
⊂,,,,,,,,,つ,,゚Д゚ミつ
SQL鯖2000にTADOなんちゃらを使って接続しています。
SELECTを呼ぶときとUPDATEを呼ぶときで
呼び出し方が違うですが
これを同じ方法で呼び出すことはできますか?
やりかた教えてください。
SQL鯖2000のQueryAnalyzerは
どっちのSQLでもOKだったりするので
いいなーと思います。
>>33 でもDelphi上級者でも平気でendの前のセミコロンは省略可能、とか言ってる奴が居るな。
そして変な例外を作るな!と他言語信者から言われる。
むしろPascalの方がbegin..endもforもifも、全て文という同一概念で扱ってる点では
文法的に美しいのだが。
>>38 最初は、なんでこんなつながりでエラーでないんだよ!
と思ってたけど、慣れると見やすい。
どこが区切りがわかりやすいね。
すみません、「TUIWebBrowser」というフリーのブラウザーのコンポーネントに
ついての質問です。(フリーのコンポーネントの質問でもよいのでしょうか?)
ActiveXの実行などを止めたくて、DownLoadControlプロパティを下のように
設定しています。
browser := TUIWebBrowser.Create(self.WebPanel);
TOleControl(browser).Parent := self.WebPanel;
browser.DownLoadControl := [];
browser.DownLoadControl := browser.DownLoadControl + [CS_NoScripts];
browser.DownLoadControl := browser.DownLoadControl + [CS_NoJava];
browser.DownLoadControl := browser.DownLoadControl + [CS_NoActiveXRun];
browser.DownLoadControl := browser.DownLoadControl + [CS_NoActiveXDownLoad];
ページを表示する
この時点の設定は効くのですが、ページを表示した後から設定を変えようと
下のようにしても反映されませんでした。
browser.DownLoadControl := browser.DownLoadControl + [CS_Videos];
browser.DownLoadControl := browser.DownLoadControl + [CS_BGSounds];
色々検索してみたんですが、C関連のページしか見つからず(QueryInterface
やOnAmbientPropertyChangeを使用していました)、Delphiでの解決方法が
見つかりませんでした。
どのようにしたら良いのでしょうか?よろしくお願いします。
IndyのIdTCPServerをつかってプログラムを組んでいます.
ところがプログラム内部でApplicaiton.Terminateしても.何事もなかったかの
ようにプログラムは動きつづけます(終了してくれません)
直ちに終了させる方法はないでしょうか?
PostMessage(Application.Handle, WM_CLOSE, 0, 0);
を使うとIndy内部でごちゃごちゃと後片付けをやっていてプログラムの終了が
とても遅いです.
やりたいことはバッチファイルで自身の削除コマンドが実行される前に
自身を終了させたいのですが…
>>42 TIdTCPServerがConnectしたままになってないか?
Disconnect済みか?
45 :
デフォルトの名無しさん:03/12/14 19:13
>>34 はぁ?両方ともダイアログで設定できるだろ?数行下の設定すんのに横着すんな!
>>37 はぁ?ADOコンポでどうやってSELECTやUPDATEしてんのか書け!ボケ!
もちろんQueryAnalyzerのもだ。ソース出さずに質問すんな、カス!
>>43 >>44 >>なんでわざわざ自分自身にPostMessageでWM_CLOSE飛ばすの?
えっと終了させたいのでこうしました,これはだめなんですか?
サンプルのほう見てなんとかやってみます
ありがとうございました
スレ違いじゃないと良いんだけど・・・
Delphiで課題出されたんですよ。
別のアプリケーションのウィンドウを監視して、特定の画像が現れたらマウスで追尾するアプリを作れと。。
2ヶ月以内に作れないと大学を干されんばかりの危機的状況なので。
Delphiやディジタル画像処理入門の書籍を読みあさって、Delphiの超基礎とテンプレートマッチング法の理屈までは理解出来たのですが。
いざ作るとなるとどうしたらいいのやら・・・(;´Д`)
C言語とオブジェクト指向がなんたるか程度なら分かりますが、Windowsアプリ開発とやらの経験が一切無くて。どうにもこうにも。
専門用語パリパリの説明でもクソ必死に勉強しますんで、どうかアホ学生の僕を導いて下さい。
今、妄想してる作り方はこんな感じです。是非ツッコミを
1.本体アプリのデザイン
2.別アプリの画面を取得(TScreenで良いのでしょうか・・・)
3.テンプレートマッチング法で特定画像の位置検出
4.マウスの自動操作
長文スンマセン
48 :
デフォルトの名無しさん:03/12/14 20:41
>>47 うーん、これだけだと漠然としていてなんともいえないけど、とりあえず…
1.に関しては、フォームとコンポのデザインてことかな?
今回のような目的ならたぶんButton1個と監視用のTimer置くだけでしょう。
2.に関しては、別のアプリというのが特定のものなのか不特定多数なのかに
よるけど、「必ずアクティブである」という条件なら、Alt+PrintScreenをTimerで定期的に投げちゃえばいいのでは?
プログラミングでの画面キャプチャの仕方は検索すれば出てくる。
3.これは知らんので、頑張ってちょうだい。画像そのものはTPictureあたり見て。
4.マウスの自動追尾ってのがどういうことをしたいのかよく分からないけど、
マウスポインタの位置を変えたいならGetCursorPos、SetCursorPosのWindowsAPIを使うことになる。
いずれにせよ、もう少し仕様を固めてからまた質問しに来た方がいいよ。
たしかに
>別のアプリケーションのウィンドウを監視して、特定の画像が現れたらマウスで追尾するアプリ
の意味がわかんない。
別アプリが何かもわかんないし、特定の画像がどんな画像なのかもわかんない。
特定の画像といっても、動画、アニGif、静止画(フルカラー、256色、16色)とかあるし。
画像だから、動画とアニGifは違うかもしれないけど・・。
あとマウスで追尾というのも、よくわかんない。画像の縁をなめるのか、画像が白黒の円で、
その円周をなめるのか、特定の画像がきたとき、画像の真ん中にポインタがいくのか。
あと、マウスで追尾=マウスカーソルで追尾かどうかもイマイチわからんし。
>>41 レスどうもです。
うーん、配布ページに掲示板が見当らなかったのと、なんとなく作者さんに
直接質問メールを送るのは気が引けたので。もう少し調べてわからなかったら
考えてみます。
それでもうひとつ質問なんですが、
>>40とおなじような事を通常のIEコンポで
行う事は可能でしょうか?
スクリプト実行や画像表示の切り替えと、ページ表示後にも設定を切り替え
られるようにしたいのですが。
>>48 即レスありがとう
1に関しては大体そんなつもりで書きました。
1〜4に挙げたプログラム根幹の部分が出来たら、インターフェースも色々と試行錯誤しようかと思ってます。
(追尾に関する設定を入力可能に出来るようにする等)
2でPrintScreen→ファイル読み込み→マッチング処理は考えてみました。(別アプリは必ずアクティブです)
ただし、可能な限り高速化しろとの事ですので。HDDを通さないように、リアルタイムで画面を取得出来る別の方法を検討中です。
4のGetCursorPos、SetCursorPos。ググッってみました。
恐らく、これを使う事になると思います。ありがとう。。。 WindowsAPI=C言語でいう関数 みたいなニュアンスなんですね。
コンポーネントとプログラム記述方法しか勉強してなかったや。
具体的な事を言うと。
スクリンセーバーの様にフルスクリーンになっている画面を多角形の図形が動き回るプログラムが用意されていまして。
そこで指定された図形を、マウスで高速追尾するというWindowsアプリを作れと。。(Delphi限定!)
48さんのおかげで、マウス追尾のあたりは出来そうです。たぶん。
今、さっぱりわからんのは。
アクティブになっているフルスクリーンウィンドウの画面情報をバックグラウンドのアプリから取得する方法についてです。
リアルタイムの画面描画って、DirectXなんでしょうかね・・・?(;´Д`)
とりあえず、Delphi関数のあたりを勉強しなおしてきます。
>>49 やっぱ言葉不足ですよね。申し訳ないです。
別アプリとは51に書いた通りの様な物です。人工知能の研究の初歩中の初歩をやってます。
特定の画像についてですが、
動画やアニGifといったようなファイルではなく。描画されている画面そのものです。
16色の静止画が画面内をランダムに動き回るのを想像して頂ければ、、、
マウスは、画像の中央を常に追尾するような仕様にするつもりですが。
その細かな方法まで全て質問するのはおこがましいかなと思ったので、省きました(;´Д`)
C言語は一通り勉強しましたので、何とかなるかなぁと・・・。がんばってみます。
今まで、Muleの白い画面でプログラミングしてましたが。
初めてのWinアプリ開発で、情報量の多さに戸惑っています。(笑)
>>52 例えばロボットの目にCCDカメラが仕込まれていて、
そのCCDに特定の物体が描画されたとき、それを目が追尾するという
ようなイメージでいいのかな?(ちといい加減すぎるけどw)
画像解析とか、実際に画像を扱った具体的な処理はわからないけど、
画像をキャプチャ>2色化して判別を用意に>TMemoryStreamに入れる
ようにして取り込んで、該当図形のTopとHeight、LeftとWidthを取得して、
その真ん中にカーソルを配置すればいいんじゃないかな。
ただ、その画像が○の時は追尾して、■の時には追尾しないとかは
難しいかもね。
>>50 ブラウザとかの設定って、設定した後にブラウザの再起動を前提とするような
設定ってあるよね。そういう設定だったら、どうしようもないのかもしれないね。
設定有効後にリロードするようにしたり、(もし可能であれば)設定を有効したあと
に直前に表示した内容をキャッシュしておいて、それを読み込むようにするような
感じじゃだめなの?
>>47 デバイスコンテキスト(DC)経由で画面をキャプチャして逝けってことかな。普通はこの方法。
Windowsの制限上別プロセスからだと完璧なキャプチャはきっと無理でしょう。
それでも、自前でバッファ(ビットマップ)を準備しておけばいくらかは速いです。
工夫すれば画像解析部分をマルチスレッドで並列処理すれば速いかな。
再解析する時、前回の位置付近から行うことで処理量を減らせるとか。
マウスカーソルについてはMouse変数が使えるならラップされているので、それで制御するのもいいかと。
GetForegroundWindowで前面のウィンドウを取得できるが、ターゲットが限定されているならば
出題者にその方法を聞くのもよいかと。課題で窓の取得方法を自分で探させるのは関係ない気がする。
それともソフトウェア工学としてならば、自分で調べて解決できるスキルは必要ですが(笑)
まさかアセンブラ化までしろとか言われてないですよね。
>>54 どうもです。
よくあるタブブラウザーの機能として実装されているのと、似たような処理で
C言語のサンプルがあったので、ページを表示したままでも出来るのかなぁと。
ブラウザーそのものを再生成すると、戻る進むの値も消えてしまうので、出来
ればそのまま反映させたいです。
一応どこか(URLを忘れました)で見つけたCのサンプルはこうなってました。
//画像の表示を無効化
dwDefault &= ~DLCTL_DLIMAGES;
LPOLECONTROL pOleControl = NULL;
LPDISPATCH m_pDispatch = NULL;
m_pDispatch = GetApplication(); //IDispatchインターフェイスのポインタを取得
ASSERT(m_pDispatch);
m_pDispatch->QueryInterface(IID_IOleControl, (LPVOID*)&pOleControl); //OlecontrolインターフェイスをQIします
ASSERT(pOleControl);
pOleControl->OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
if (pOleControl)
pOleControl->Release();
if (m_pDispatch)
m_pDispatch->Release();
Refresh();
「TUIWebBrowser」で真似して作ろうとしたんですが、ここからわからなく
なってしまいました。
var
iDisp: IDispatch;
begin
iDisp := TUIWebBrowser(viewItem.ItemObject).ControlInterface as Idispatch;
//iDisp.QueryInterface(const IID: TGUID; out Obj): HRESULT;
iDisp.QueryInterface(IOleCont, ???)
>>53 そうですそうです、そういった研究の初歩をやってます。
今の段階ではCCDカメラは使っていませんので、追尾する画像はあらかじめ定められています。
(R255 G0 B0 で16×16pixの正方形等です)
ですので、事前に追尾するBitmapを用意して。それと一致した画像を追尾するという方法を使います。
この方法をテンプレートマッチングと呼ぶそうです。(この内容は学術スレっぽいので、スレ違いですね。。)
>ただ、その画像が○の時は追尾して、■の時には追尾しないとかは難しいかもね。
ifやcase文でネットリと記述しようかと思っているんですが、複雑になっちゃうって意味なのかな。。
>>55 デバイスコンテキスト・GetForegroundWindowですね。大変参考になります。
後はコードを最適化しろという事ですね、深く考えてみる事にします。
>出題者にその方法を聞くのもよいかと。
学生を放任する感じの助教授なんです。Delphiでやってみろと一括されただけで…
僕自身、ソフトフェア工学寄りですので、アセンブラ化までは課せられていません。Winアプリ開発です。
スキル・・・身にしみる一言です。(笑)
みなさん有り難う、一文一文。本当に参考になりました。
とりあえず画面キャプチャのあたりを実践しながらやっていこうかと思います。
また来るかもしれませんが、その時は石とか投げつけないで下さいね(;´Д`)
>>56 「何をしてるかも分からないのに、真似するだけ(理解出来てない)」では
理想のもんは出来ないと思うよ。
つーか、「全く理解してないけど、やってみたら出来た」って話はどうよ。
言いたいことは「”TWebBrowserそのまま”でセキュリティ等の切り替えが出来るかどうか?」
ってことでしょ?
答えは「出来ない」だと。
前半が意味不明だな。
要するに「何してるか理解してないで、真似して書いたコード」ってのは
意味があるのかな?と。
>>58-59 うーん、不勉強や調べ足りないと言われると痛いところですが……。
自分のやり方になりますが、先ずは理解できなくても人のコードを真似しつつ
わからないところを徐々に憶えていっているので、意味が無くはないです。
現時点だと、調べ方にも行き詰まってしまってて、調べるヒントだけでも
欲しい所だったので。でも、TWebBrowserでは出来ない事がわかっただけでも
助かりました。ありがとうございました。
>>60 何となく違ったニュアンスで取られたような気もするけど…。
とりあえず「どんなことが出来るのか」ってのは
メソッドやらプロパティを眺めるのも一つの手かと。
「.」打ってさ(藁
>>60 ブラウザ再生成じゃなくて、
設定変更後リロードじゃだめなの?
もしくは、再生成しても、進む戻るを設定できればいいわけ?
>>57 まったく同じ画像を追尾するなら、ある意味楽なんじゃね?
特徴のある画像なら、1pixごと追わなくても、最大で31pixずつ
追跡していけばいいじゃんね。
さらに出現している場所、ある時間で何Pix動くかもわかれば、
その範囲だけみればいいから、よりスピードアップできそう。
具体的な方法がおもいつかないんで、ロジック的な意見で
ごめん。
>>61 フォローすみません。もちろん「.」打って眺めて、ググって調べて一週間
やっとたどり着いたのが
>>56 だったのです。IDispatchみたいに「.」を
打っても出てくれないものもあって中々難しくて……。
>>62 答えるの忘れてすみません。リロードしてもダメでした。
出来れば再生成しないで設定したかったのですが、進む戻るを設定する方法が
あるなら教えて欲しいです。
何月何日以降は起動できなくなるようにしたいのですが
どうやってやればいいのか全然わかりません。
どのようにやればできますか?
>>64 日付を比較しれ。
んである日付より時間が過ぎていたら、Form.Create時に
Exitしれ。
構造体の先頭から任意のメンバまでのバイト数を取得したいんだけど
ANSI Cの offsetof に相当する関数ってないの?
>>47 速度を稼ぐために、まず取得した画像のscanline(行のポインタが返る)を
一気に配列に格納する。んで、
ループ1
各行で(255,0,0)が横に16個連続する場所を探す。
見付かったら
ループ2
縦にずらしていって16×16(255,0,0)か確認。
適合したら座標を出力
ループ1に戻る
画像さえ取れればあとは簡単にできる。
67 :
デフォルトの名無しさん:03/12/15 10:22
共通モジュール用のユニットを作成する場合、ヘッダーは、どう記述したらいいのでしょうか?
>>67 ユニットを作成すれば、自動についてくる。
>>65 わかりました。
親切にどうもありがとうございました。
>>46 メインフォームのCloseメソッドやDestroyメソッドを呼ぶとか。
//MainFrm.Destroy;
PostMessageだと、回りくどいね。
MainForm.Release;
とかしても、TIdTCPServerのTCPServerExecute(AThread: TIdPeerThread);
が送受信の真っ最中で終わってくんないんでしょ。
だから、他の方法を考えてメッセージ飛ばせばどうかな?と思ったんじゃない?
Bitmap.PixelFormat の pfDevice って、具体的には何を指すんでしょうか。
ヘルプの PixelFormat を見ても書いてないんだけど・・・。
pfDeviceビットマップは,デバイス依存ビットマップとして格納されます。
WM_CLOSE受信してもCloseが呼び出されるだけでは?
75 :
デフォルトの名無しさん:03/12/15 22:21
>>47 もっと詳しい情報キボンヌ
できれば別アプリケーションをUPして。
そうしたらオープンソースでマジで作りますよ
これって視覚認識機構から眼球運動変換の解明でしょ?
>>76 大学とかの課題なんでそ?
ヒントとかだけにしてあげたほうがいいと思うけど。
前に研究課題をネットから、そのまま持ってきて問題になったことなかったっけ?
人の楽しみ(課題)奪うのイクナイ
>>75 マルチにマジレスすると、P2Pファイル共有ソフト作りが忙しい。
知ってるテーマでちと熱くなってますが、
「別アプリケーション」の表示される画像とその動きによっては、
学位論文級のテーマです。
提示課題が簡単だったら手伝いません。
ただ、学者であれば如何に効率よく(人間らしく)視標を追うかのアルゴリズムを追求するするべきで、それ以外のWindowsの操作についてはそれほど知る必要もないと思います。
まぁそれと課題の質も見たいというのもありますがw
81 :
デフォルトの名無しさん:03/12/16 00:15
stringlistで最初の行と次の行、あるいはその次の行が同じかどうかをチェック
しようとしているのですが、
for i:=0 to stringlist1.count do
if stringlist1[i]=stringlist1[i+1] then
begin
stringlist1.delete(i);
i:=i+1;
end
end
とやるとi:=i+1のところでエラーとなってしまいます。
このような処理をやるにはどうすれば良いのでしょうか?
whileで繰り返すしかないのでしょうか?
>>81 forのカウンタ変数いじんな。これ鉄の掟。
なのであなたが言ってるそれがスマートな解かと。
for i:=stringlist1.count-1 downto 0 do
//stringlist1.count-1
>>81 とりあえず、そのコードはかなり間違ってるとして、
何がしたいのかいまいち見えない。
for i:=stringlist1.count-2 downto 0 do
if stringlist1[i]=stringlist1[i+1] then
stringlist1.delete(i);
end;
脳内補正よろ
もしかして「同じ行があったらソレは削除」ってこと?
被ってる行が無くなるようにしたいと。
89 :
デフォルトの名無しさん:03/12/16 00:29
>>88 そうっす。
>>85のコードだと行を削除するとその文、countの値が小さくなるから最後のところで
エラーになってしまうのですよ。
>>89 TStringlistのSortのヘルプ読んで。
はい解決。
91 :
デフォルトの名無しさん:03/12/16 00:32
92 :
デフォルトの名無しさん:03/12/16 00:34
>>90 読んだのですけど、並べ替えは書いていますけど同じ内容の行の削除については
書いてないので分からないです。。。
>>85 無茶苦茶行数及び各行の文字数が多い場合は、ハッシュ値求めて比較したほうが早い、
とか余計混乱させることを言ってみるテスト。
>>92 いや、「同じ行を一つにする」ってのがあるから根気よく読んでくれ。
>>81 まず、
iが0からCountまでが間違い。Count-1が正解。
StringListに追加する時点で重複を排除していないのが間違い。重複は追加しない。
For文をカウントする変数を変えるのが間違い。その変数にはさわらない。
For文の終了値を変更する操作をするのが間違い。終了値は変えない。
つか、その文だとiとi+1が同じ時だけ削除してるけど、iとi+2が同じ時は削除しなくても
いいわけ?
ま、それはおいといてStringListをもう一つ用意して、重複していない文字列だけ
その用意したStringListに追加していけばいいだけ。
96 :
デフォルトの名無しさん:03/12/16 00:46
>>94 いや、sortの説明って短いですから間違いないですよ。
Sort メソッドは,リスト内の文字列を昇順で並べ替えます。
procedure Sort; virtual;
説明
Sort メソッドを呼び出すと,Sorted プロパティを False に設定したリストで文字列を並べ替えることができます。Sorted プロパティを
True に設定した文字列リストでは,自動的に並べ替えが実行されます。
注意Sort メソッドは,CaseSensitive プロパティが True の場合には AnsiCompareStr を使って,
CaseSensitive プロパティが False の場合には AnsiCompareText を使って文字列を並べ替えます。カスタマイズした比較演算子を使用する場合には,かわりに CustomSort メソッドを使用します。
いや、「Sortのヘルプだけ」じゃなくてさ。
まぁ、いいや。
他の人のレスを参考にしてくれ。
オレは降りた。
98 :
デフォルトの名無しさん:03/12/16 02:01
スクロールバーと好きなものを組み合わせて作れ。それで作れる。
見当がつかないのは理解する努力が足りないだけ。頑張って仕様を見極める。
そうそう、改造とかそんな簡単なことでき実現できないよ。1から組み立てるべし。
100 :
仕様書無しさん:03/12/16 06:07
Wardとかのアプリの子ウィンドウを独自に作るには、SetParentAPIで簡単に出来ますよね。
逆に、フォームの中にWard等のアプリを埋め込む事って出来るんですか?
101 :
デフォルトの名無しさん:03/12/16 06:46
>>100 OLEか?
SetParentAPIをWordに使えばおk。
こんにちわ47です、沢山のレス有り難うございます。
現在、フォームにボタンとイメージのコーポネントを一個ずつ配置した状態です。
クラス・レコード・Delphiの基礎的な構文を勉強し直してました。
結果、ボタンクリックのイベントでDC経由からデスクトップ画面をキャプチャする所までやっと辿り着けました。
procedure TForm1.Button1Click(Sender: TObject);
var CaptDC : HDC;
begin
CaptDC := GetDC(0);
Image1.Width := 640;
Image1.Height := 480;
BitBlt(Image1.Canvas.Handle,0,0,screen.width,screen.height,CaptDC,0,0,SRCCOPY);
ReleaseDC(0,CaptDC);
end;
次は、EnumWindowsAPIを使って実行中のアプリケーションを一覧を取得し、目的のウィンドウを探し。
ApplicationEventsコンポーネントのOnIdleイベントで本アプリをバックグラウンド動作させ、
キー操作で、 連続キャプチャ←→キャプチャ中止 を制御する所まで進めたいと思っています。
(詳しい方法はさっぱり分からないので、本当にこの方法で良いのか分かりませんが・・・)
とにかく、一歩ずつ進んで行こうかと思っています。。。
>>55さん
DCのアドバイスありがとう、一歩前進出来ました。
>>62さん
ロジック的でも本当に有り難いです。画面情報取得のプログラムが出来てから、色々試行錯誤してみるつもりです。
>>76 恐らく、ご想像の通りのテーマです(笑)
動く物体を見るとき人間は、感覚でその軌跡を追いますが。
AIでは物体の物理軌道を計算し、その軌跡を追うといった感じです。
いずれは運動学・ロボット工学も混ざり、高度なロボット等に応用される物になりますが。
なにぶん若輩なもので、現状で提示されている課題は「簡単」な物です。2次元で、かつソフトウェア内だけでの処理ですので。
まぁ、徐々にエスカレートして行く事になるでしょうが・・・(泣)
さすがに、自分に課せられた課題を全て渡して「やってください」なんて事は出来ません。。。ご好意ありがとうございます。
Delphiでそのアプリとの連携が取れれば、後はObjectPascal構文でのアルゴリズムを考えるだけになるので。
何とかなるかなぁって思い始めてきました。
>学者であれば如何に効率よく...
その通りですよね、、教授達もWinアプリを作れない人がほとんどです(笑)
ただ今回の研究は対外的な意味合いが強く、Winアプリでないといけないそうです。
最初は悩みましたが、ここに書き込んで本当に良かったです。。
とてもあたたかい。
どんな画像が動き回るのか(画像が複数なら全部)を
どこかにうぷしてほしいね。じゃないと、次からは何も
話が出来なさそう。
対外的ってことは、研究室のの作成物として公表するって
ことなんかね。それを研究生にやらせると。
だから教授は(ry
>>102 OnIdleはバックラウンドでもなんでもない。メインスレッドのメッセージキューが空っぽになった時発生するイベント。
バックラウンド処理がしたければ、スレッドを使いましょう。というかスレッド使わないとGUIが固まる。
107 :
デフォルトの名無しさん:03/12/16 16:03
設定を保存するのに、iniファイルとかレジストリとかに値を持ちたくないので、
自分自身のEXEファイルを変更して設定を保存する方法が知りたいです。
変更する設定は、数個だけです。
数バイト程度です。
どうしたらいいでしょうか?
108 :
デフォルトの名無しさん:03/12/16 16:06
delphiのコード支援のように、ホップアップするウィンドウ(ホップアップした後選択できる)
を作るには、formをshowしてマウスの位置に表示(してから、動的に作成したラベルなどに
文字を表示)するのでしょうか?
それとも、もっと別の効率の良い方法があるのでしょうか?
>>107 実行中のEXEに変更を加える事は出来ないので、
どうしてもやりたいなら、自分自身をコピーして、それに書き込み、
ウインドウを閉じる時に自分を削除してコピーをリネームするしか
ないと思う。
>>47 画像提示アプリはDirectX使ってますか?
大きなこと言ってしまったので簡単なサンプルくらいは作ろうかとおもってますが、
DirectX対応となると片手間で作れるほどのスキルがありません。
それと
視標はスムースに動くのかそれともステップで動くのかも知りたいです。
111 :
デフォルトの名無しさん:03/12/16 16:23
>>109 >ウインドウを閉じる時に自分を削除してコピーをリネームするしか
ないと思う。
自分を削除できるの?
削除したあと、リネームとかできるの?
>>111 自分を削除する事は出来ないので
リネームするソフトウェアを起動して、実行中の本体を終了させた後コピーをリネームし
自分も終了する。
だからEXEが二ついるね。(本体とリネームEXE)
(あはは、なんじゃこれ)
自分で試してみればいいじゃん。
ダメだったら、改変専用のexeを作って、終了時にそのexeを
実行させればいいじゃん。
なんでiniやレジストリでダメなのか興味あるね
シリアルとか、デモ用の期間制限とかかね
115 :
デフォルトの名無しさん:03/12/16 16:41
>>114 たかだか 数個の設定のために、余計なファイルがないほうがすっきりするやん。
>>108 Delphi互換のリサイズ可能のポップアップウィンドウを作るならばちょっと難しいです。
フォーカスを受け取らない単純なポップアップウィンドウも実装それなりに面倒です。
ちなみにポップアップは、SetWindowPosでSWP_NOACTIVATEを指定します。
そんでもってWM_MOUSEACTIVATEでMA_NOACTIVATEを戻り値にします。
これでマウスクリックなどではフォーカスを受け取らなくなります。
これだけで実装は終わりではありません。いつ消去するかの実装も必要です。
>>115 いつの間にか実行ファイルの日付やサイズが変わってるのは怖い。
そのために実行ファイルを後から書き換えるより、
iniやレジストリにしたほうが、よほどすっきりしてると
思うのだけれども。
Windowsディレクトリあたりに、わからんように格納して、
アンインストするときには、アンインストーラーに削除
されればいいと思うんだけど。
論争は他でやれヴァカ
>>116 レスありがとうございます。
私の手には負えそうもないので、大人しくFormを使ってやる事にします。
>>108 このネタ以前Delphiマガジンでやってました。
そのとき公開されていたコンポーネント持ってます。
著作権に触れるので大っぴらに公開できませんが、
メールアドレスでも教えてくだされば手渡しします。
ってこれは問題ないですよね??
>>107 以前作ったことあります。
HDを掘り起こせばなきにしもあらずですが…
要ります?
>>121 レスありがとうございます。
自分のメアドをド忘れしたので、帰宅してからメアド晒します。
宜しくお願いしますm(_ _)m
>>107 期待させてスマソン。
見つかりません。
歯がゆいのでもう一度挑戦してみます。
124 :
デフォルトの名無しさん:03/12/16 19:43
変換かかってしまった
< → '>'
< → '<'
>>123 ないならいいです。
どのようにすればいいか、アイデアだけ教えてもらえればそれでいいです。
そんでは途中までとその続きのヒント。
>>107 手順は
1.あらかじめ出来上がったファイルの末尾に領域作成
自分自身(.exe)の最終にデータを保存する為の領域を作っておく(例256バイト0で埋めるとか)
2.終了時に自分のコピーを作成
そのコピーの末尾に対してデータを書き込む
3.バッチファイルを作成
バッチファイルは元のexeファイルの削除と
コピーされたexeファイルの名前の変更と
自分自身を削除を行わせる
という流れです。
>>107 自殺プログラム
procedure TForm1.Button1Click(Sender: TObject);
var
psi:TStartupInfo;
ppi:TProcessInformation;
batname:string;
begin
batname:='test.bat';
mksuicidebat(batname);
GetStartupInfo(psi);
psi.dwFlags := psi.dwFlags or STARTF_USESHOWWINDOW;
psi.wShowWindow := SW_HIDE;
CreateProcess(nil,PChar(batname),nil,nil,false,0,nil,nil,psi, ppi);
close;
end;
procedure TForm1.mksuicidebat(name: string);
var suicidebatText:TStringlist;
path:string;
begin
path:=ExtractFilePath(Application.ExeName);
suicidebatText:=TStringList.Create;
suicidebatText.Add('@ECHO OFF');
suicidebatText.Add(':loop');
suicidebatText.Add('del "'+ Application.ExeName + '"');
suicidebatText.Add('if exist "' +Application.ExeName+ '" goto :loop');
suicidebatText.Add('del "'+ path+name + '"');
suicidebatText.SaveToFile(path+name);
suicidebatText.Free;
end;
あー。
データの読み込みは書き込みの逆の要領でやってください。
やってくれるのであればこれ以上の作業はしません。
できたらソース公開してくれるとうれしいかも。
バッチファイルは 誰が消すんでしょうか?
おーい、完成任せて大丈夫かいな?
とりあえずソース貼り付けてボタン押して味噌
一応、念のため…
デバッグモードでボタン押しちゃだめだよ
>>76 画像提示アプリ自体、手の込んでる物でして。画像が重なり合ったりもしますし。
DirectX8程度の物を使っているはずです。
指標はスムースに動いています。
>>106 ご指摘サンクスです。
書籍にスレッド(TThreadオブジェクト)について書いてあったので、そこのソースを移してコンパイルしまくってます。
実行出来ませんが(;´Д`)。。根本の考え方が間違ってるんだろうなぁ・・。
exeの後ろにデータ付けても、アンチウイルスにひっかかるなんて心配はないのでしょうか?
もちろん試しに作ってみただけなので動作したってだけです。
細かいところまで突き詰めてません。
何なら、空白のリソースつけてそこに書き込んでもいいでしょ?
とりあえず作ってみてから考えたらいかがでしょう。
とにかく凄く怪しいアプリです。
アンチウイルスが好んで指摘しそうな振る舞いをしまくってます。
Delphi6のpersonalのチュートリアルを読みつつ
テキストエディタを作っています。
アクションマネージャーがpersonalでは使えないのは分かっているのですが、
標準アクションクラスも利用できないのでしょうか?
/ヽ /ヽ
/ ヽ / ヽ
______ / ヽ__/ ヽ
| ____ / :::::::::::::::\
| | // \ :::::::::::::::|
>>138 | | | ● ● ::::::::::::::| ショボーン
| | .| :::::::::::::|
| | | (__人__丿 .....:::::::::::::::::::/
| |____ ヽ .....:::::::::::::::::::::::<
└___/ ̄ ̄ :::::::::::::::::::::::::|
|\ | :::::::::::::::::::::::|
\ \ \___ ::::::::::::::::::::::::|
>>135 アンチウイルスは「ソレっぽいコード」をかたっぱしから
照らし合わせてるだけなので、合致すりゃー検知ってことになるんでわ?
>>141 普通は、あるアプリがexeを書き換えることなんてないので、
exeを書き換えようとするだけで反応することもある。
たった数個の設定のためにファイルを残すのを避けるべきか、
たった数個の設定ならexeを書き換えるべきか。
>>142 オレの言いたいことは「全然関係無いexeでも、誤検知される可能性はある」って
ことだけ。
後半の2行は質問者宛だよね?
144 :
デフォルトの名無しさん:03/12/17 05:18
隠しファイルに設定を書き込むのはどぉ?
直接セクタを書き換えるのはどうだろう?
>>143 そそ後半は自分自身の独り言。
確かアンチウィルスによっては、今はしてないかもしれないけど、
ファイルを書き換えようとする行為を監視してて、それがexeとか
だと通常はあり得ないので、アラートを出すものがあったような
記憶がある。
147 :
デフォルトの名無しさん:03/12/17 09:49
それ以前に、実行ファイルを書き換えて設定を保存していたら、Windowsの
権限の設定で、全てのユーザーに実行ファイルの書き込み権限を与えなくては
ならず、現実的でないのでは??
プログラムの設定情報は、レジストリの HKEY_CURRENT_USER 以下に記録するか、
iniファイル等を \Documents and Settings\username\ 以下に記録するかに
してくれ。
(よくexeと同じフォルダにini置くプログラムあるけど、あれ嫌い。CDから実行できんぞ)
>>140 メールありがとうございました。
参考にさせて頂きます!
質問です。
二つのクラスA、Bがあって、それぞれ内部にAはB型のプロパティを持っていて、
BはA型の変数を持っています。
この二つのクラスは、結構規模も大きく、互いの独立性も高いので、それぞれを
個別のユニットで宣言したいのです。
そうすると、interface以下のusesで互いのユニットを参照すると、循環参照だと
怒られます。
このような場合はどうすればいいのでしょうか?
>>149 どっちかのusesをimpliment節以下に記述する
・一つのpasに書くw ←これで解消できたっけ?w
・互いに使う部分を一つのclassとして作成し、個別部分はそのclassを派生する
・それぞれのclass型で変数を持つのではなく、TObjectとして持つ
154 :
デフォルトの名無しさん:03/12/17 13:09
parentクラスから継承してchildクラスを作成
parent型で宣言した変数にchildインスタンスを代入すると
child.methodではなくparent.methodが実行されます
child.methodを実行させたい時はどうすればいいですか?
>>153を読んで思ったけど
クラスAをB型プロパティ抜きで、できるだけメソッドをabstractにしたクラスA'をユニットA'に
クラスBをA型フィールド抜きで、できるだけメソッドをabstractにしたクラスB'をユニットB'に
それぞれ定義する。
クラスAを定義するユニットA、クラスBを定義するユニットBはそれぞれユニットA'とB'を
usesしてクラスA'、クラスB'から派生させる。
内部のB型プロパティ、A型フィールドはクラスB'、A'型とする。
ダメかな?
>>81 やりたい処理が>88の通りでしたら…
stringlist1[0]と同じ文字列がないかをstringlist1[1]〜stringlist1[stringlist1.count - 1]から調べて削除.
(ただし削除すると以後の行が一個ずつずれるので>85のようにstringlist1[stringlist1.count - 1]から逆方向に調べる)
これによりstringlist1[0]とだぶっている行がない事が確定.
以後同様に,stringlist1[なんとか]と同じ文字列がないかをstringlist1[何とかの次]〜stringlist1[stringlist1.count - 1]から調べて削除.
これを繰り返す事ですべての重複がなくなる…はず.
i := 0;
while i < stringlist1.count - 1 do
begin
for j := stringlist1.count - 1 downto i + 1 do
if stringlist1[j] = stringlist1[i] then
stringlist1.Delete(j);
i := i + 1;
end;
ちなみにDelphiのfor文は繰り返し処理を始める前に最終値とループ回数を決めてしまいます.
>81のソースだとたとえば最初に通るときのstringlist1.countの値が10だとすると最終値は10,ループ回数は11で確定します.
ループの中でstringlist1.countの値が変わったとしても無視されます.
繰り返しの一周ごとに値のチェックをやりたい場合はwhile文かrepeat文を使います.
158 :
デフォルトの名無しさん:03/12/17 14:51
freeメソッドで例外が発生します。
新規で作成して
procedure TForm1.FormCreate(Sender: TObject);
var
fs:TFileStream;
begin
fs.Free
end;
これだけで例外が発生します。
d6のパーソナルです
>>158 あなたは感想を書きたいのですか?質問したいのですか?
CreateしてないのにFreeしたら例外でるのはあたりまえ。
今、delphi7のヘルプ、"レコードの可変部分"を読んでいるのですが
このような型はどのようなメリットがあるのでしょう?
ヘルプをみて、コピー&ペーストしてみるも
いまいちつかめません・・・
どなたか、お馬鹿な私に教えてください
//delphi7ヘルプ"レコードの可変部分"より一部引用
type
TShapeList =(Rectangle,Triangle,Circle,Ellipse,Other);
TFigure =record
case TShapeList of
Rectangle:(Height,Width:Real);
Triangle:(Side1,Side2,Angle:Real);
Circle:(Radius:Real);
Ellipse,Other:();
end;
?
161 :
デフォルトの名無しさん:03/12/17 15:10
>>159 freeの説明これがあるんですが
>オブジェクトが nil の場合でも Free メソッドはエラーにはなりません。
>このため,オブジェクトが初期化されていない場合に Free メソッドを呼び出してもエラーにはなりません。
>>161 「fsにnilが入ってることを保証する」という説明はあるか?
というより、警告見ろよ
fsをnilしてから、freeしるw
var
fs: TFileStream;
begin
fs:=nil;
fs.Free;
エラーでなかった
ちょとビクーリ
>>165 Freeの中でnilかどうかチェックしてるだけ。
初歩的な質問だけどプロシージャから抜けるにはどうすればいいの?
C言語のreturnみたいなのはないの?
exit;?
フロー制御ルーチン嫁
>>149-155 クラスBをA型フィールド抜きで、全メソッドをabstractにしたクラスB'をユニットB'に
あとはユニットAでユニットB'をusesしてクラスAを定義。
ユニットBでユニットB'とユニットAをusesしてクラスBを定義、ここでA型フィールド追加。
でいいんでない?
但しこれだと、無意味にユニットが一つ増える、毎回仮想メソッドが呼ばれて
微妙にパフォーマンスが落ちる、という欠点があるか?
(クラスB'をユニットAを間借りして宣言する、というのもアリかな)
まぁ多少ソースが醜くなってもよければ、クラスBのA型フィールドをTObjectで
とりあえず宣言しといて、implementationでユニットAをusesして、毎回キャスト
あるいは一時変数に代入して使う、というのが現実的かも。
バイナリデータを編集できるようにしたいのですがどうすればできますか?
>>171 TFileStreamでいろいろ調べる。
どうしてもTFileStreamを使いたくなかったら、型指定無しのFile型を使って、
地道にAssignFileとかResetとかCloseFileとかやる。
>>171 それだけでは、バイナリデータの書き換えたい所を書き換える、としか言いようがない。
そのデータはどこにあるんだ?メモリ?ファイル?紙?
>>173 紙です。
どうやら TPaperStream を使えば巧くいきそうです。
有難うございました。
174は偽物です。
>>172 TFileStreamですね。
ありがどうございます。
>>173 ファイルからです。
>>175 >174は偽物です。
洒落の通じない奴だな…
178 :
デフォルトの名無しさん:03/12/17 18:43
ウインドウメッセージ使ってOperaの広告を非表示にするコードきぼんぬ。
漏れの使ってるdelphi6 personalにはwinsightが付いてないので広告のハンドルを
取得するコードを書くことが出来ません。 NukeとかHandleXを使えばハンドルを
確認することは出来るんですが… ダメ元で書いてるのでアレだったらスルーでお願いします。
TRichEditのDoubleBufferedプロパティをTrueにすると、
表示されているはずのフォントが見えなくなってしまいます。
(かならず背景色と同じになってしまう)
SelectAllをしてもテキスト色や背景色がまったく変わらず、
DefAttributes.ColorやSelAttributes.Colorをいじっても更新
されません。
ただしキャレットを動かすと、ちゃんとテキストが表示されて
いるように動きますし、コピーもできます。
対処法を教えていただけないでしょうか。
注意:TRichEdit など一部のコントロールでは,自身をビットマップに描画できないものがあります。
こうしたコントロールの場合,DoubleBuffered を false に設定する必要があります。
ヘルプにこんなんありますた。これ?
レスありがとうございます。
>>180 Σ (゚Д゚;)がーん。じゃTRichEditではLine.BeginUpdate/EndUpdateが
無意味な部分のちらつきは抑えられないのだろうか。。。
>>181 Lines.Addで追加する前後で、
いちいちBeginUpdateとEndUpdateやってんじゃないの?
Addする初めに一発、最後に一発すればよろし。
または、いろいろ変換するような作業をしているなら、
いちどTStringListで作業してから、一気にLinesにコピーしれ。
>>182 いえ、Lines(データ)絡みの部分ではなく、まずRichEditを作成して、貼り付ける
(自分の場合はタブ)ところで既にちらつくじゃないですか。(サイズが大きいと
けっこう気になる)
そのへんどうにかならないかなと思ったんです。
MediaPlayerコンポーネントを例を交えながら解説しているサイトなどないでしょうか?
小数点以下の切捨てや四捨五入はtrunc関数を使えばできますが、
小数第何位以下を切り捨て、四捨五入はどうすればよいのでしょうか?
よろしくお願いします。
Trunc(x * IntPower(10, y)) / IntPower(10, y)
四捨五入はSimpleRoundToで一発
>>147 ガ━━(゚Д゚;)━━ン!
オレのソフト、設定が必要なヤツは全部iniファイルでやってるのに…。
>>187 だからiniファイルの位置が問題なんだって・・・
>>188 ガ━━(゚Д゚;)━━ン!
オレのソフトのiniファイル、全部アプリケーションのあるフォルダなのに…。
>>189 だから、ZIPで解答、インストーラー無しで実行可能とかじゃなく、
インストーラーでProgramFilesフォルダ以下にインストされる仕様
なら、それごとCDに焼いて実行しようとは思わないから
いいんだってば・・・・
>>191 だから、そなたが嫌ってる仕様なんだってば(藁
いや、マジで。
そーかー…嫌いな人もいるんだなー。
>>192 いや、CDから実行することは無いんだが、USBメモリをかなり日常的に使っているので、
USBメモリ内のexeがあるフォルダにデータを記憶させられると、別環境で変な動作を
することがあるのが嫌だと。
ちなみに俺はいつも、
GetEnvironmentVariable('APPDATA')+'\Project1.ini'
みたいなファイルに保存してます。
ちなみに %APPDATA% は標準的な状態では
C:\Documents and Settings\username\Application Data
を表してます。
これなら、マルチユーザ環境で使いたい人、インストーラが嫌いな人、CDRから直接実行したい人、
レジストリが嫌いな人、みんなが満足。
iniファイルが嫌いな人は不満足と言ってみるテスト
自分が把握してない場所に勝手にファイルを作られるのが一番嫌いだ
>>174 TPen.Color := clRed; しろよ。
と思いついた頃にはすでに終ってる話題だった・・・。
197 :
デフォルトの名無しさん:03/12/18 09:03
>>195 iniファイルがどこにあるか、アプリで確認できるようにすれば 無問題?
>>197 んで、iniを好き勝手にいじられてバグの原因になったりして。
>>198 そりゃユーザじゃなくプログラマの責任だぬ。
>>193 APPDATAなんて標準で存在しないOSもあんだろが
二つのフォームがあって、片方をドラッグしていったとき、
もう一方のフォームに近づくとピタッと、そのフォームの横
にくっつくヤツありますよね。
例えば、PhotoShopのツールなんかのような。
ああいうのって、どうやれば実現できますか?
202 :
デフォルトの名無しさん:03/12/18 17:29
ボタンにフォーカスが当たれば(クリック可能状態になれば)表示されているアイコンが変わる、
というようなボタンを作成することはできますか?
できますよ
>>201 フォームを動かして手を離したとき、
ある領域内に離したフォーム存在すれば
そのフォームの位置を変更
ってのはどうだろうか、と言ってみる。
>>206 ありがとうございます。
やっぱそんな感じなんですかね
なんか、枠だけ表示させて、ぴたっとくっつけろ
とかいう話になりそうで(゚Д゚;)
なんかいい方法ないでつかね
JAVAからプログラムに入った者ですが、
Delphiデストラクタを利用するコツはあるのでしょうか?
どんどんオブジェクトを他のクラスに渡すと、
いつ、どこで破棄すれば安全なのか
分からなくなってしまうんで。
209 :
デフォルトの名無しさん:03/12/18 23:10
>>202 よくよく考えてみると、
>ボタンにフォーカスが当たれば
って表現はちょっと違う気がする。
それはともかく、「メッセージをトラップしてアイコン変えるコンポーネント」
作るとかかな。
>>210 メーリングリストを読み漁ってたら、TImageを改造したComponentを見つけることができました。
やってることは210さんと同じでした。
> よくよく考えてみると、
> >ボタンにフォーカスが当たれば
> って表現はちょっと違う気がする。
確かに違いますね(汗
どうもありがとうございました。
>>208 >Delphiデストラクタを利用するコツはあるのでしょうか?
使わなくなったとき。スコープから抜けるとき。
>どんどんオブジェクトを他のクラスに渡すと、
これがどういうことなのか具体的に示してくれれば解説できるかも。
手当たり次第色んな組み合わせを試しまくったら解決しました。 どうも。
>>209 お、ありがとうございます。
ちょっと、ソース眺めてみます。
Word:=CreateOleObject('Word.Application');
で、パスも指定してないのにワードが起動でき、
Word.Documents
で、文書にもアクセスできるのですが、
そういう感じに、アクセスされる側のアプリを作りたいのですが、
なにから調べていったらいいかもわかりません。
わかる方がいたらなにか手がかりをください。
216 :
デフォルトの名無しさん:03/12/19 14:43
桁数の大きい数字の計算をする場合どうすれば良いでしょうか?
実数ではなく整数の計算です。
現在は
a : array[0..1000] of int64;
と宣言した配列変数に計算結果を入れて行っていますが、
単純な掛け算や割り算でもif文で桁あふれを検知するコードを作ったり
色々ややこしいので、もっとサクっとできる方法はないでしょうか?
ビット配列なんてどうだろうか?
220 :
デフォルトの名無しさん:03/12/19 15:14
質問があります。
僕はCGI/PerlとPHPはわかるのですがDelphiは初心者です。
今まで趣味でCGIのゲームを作っていたのですが、
サーバ負荷がかかるのと動きが遅いので、
これからはコンパイルできる言語を使って作りたいと思っています。
そこで質問なのですが
インターネット麻雀の東風荘みたいなゲームは
Delphiで作れるでしょうか?
それともそういうのはVC++を使った方がいいのでしょうか?
>>212 関数にパラメータとしてオブジェクトを渡すときです。
リスト等に格納されるなら、生成側で破棄するわけにはいかないし、
逆にリストから渡されてきたものなら、
受け取り側で迂闊に破棄できないと思ったもので。
>>220 >Delphiで作れるでしょうか?
>それともそういうのはVC++を使った方がいいのでしょうか?
お前次第。
>>221 単純に、最後まで使ってる人に破棄をお願いすると。
TListで管理してるなら、Delete(n)する前にFreeを呼び出す。
Delete(n)してもまだ使う(TListの管理外)なら、使い終わったときにFree。
>受け取り側で迂闊に破棄できないと思ったもので。
破棄しても、以降そのオブジェクトを使わず、リストがアドレスを持ってる
だけなけら問題なし。
リストに任せるならTObjectListとかを使う手もある。
>お前次第。
禿銅
>>222 >>223 回答ありがとうございました!
僕次第ということはDelphiは東風荘みたいなのを作るのに
十分な環境を備えているということですね。
Delphiはネットワークプログラミングに向いてないと
どこかで読んだので本当のところどうなのかなと思って質問しました。
レスありがとうございます。
>>217 ビット配列だと、どの辺が
>>216よりも楽になるのでしょうか?
>>219 有用なサンプルありがとうございます。
やはり配列変数を使って、それをループで回して計算する以外に
方法はなさそうですね。
for i := 0 to 100 do
a := 1000000000000000000000000000000000000000 * a;
こんなのがサクっと出来るような便利変数ってコンパイラが進化しても
難しいんでしょうね。
>>222 ありがとうございます。
末端での破棄が基本なんですね。
となると、
procedure f();
var
v:TObject;
begin
v:=TObject.create();
−vに関する加工処理(略)−
(*加工したオブジェクトを他のクラスに送る*)
o1.f1(v);
o2.f2(v);
o3.f3(v);
end;
みたいな手続きは慎重に作ったほうが良いですね。
実際、あまり美しくないですし。
>>226にはげどうだが。
>こんなのがサクっと出来るような便利変数ってコンパイラが進化しても
だからさ、誰かが作らないとことには使えないわけよ。仮にこういう演算を
サポートするコンパイラができたところで、内部的には同じようなことをやってる。
ついでに言えば、こういう多倍長演算ができる言語は存在する。
>>227 それは俺も良く使うけど、やっぱりどこで破棄されるか気をつけてる。
o1,o2,o3内で破棄するか、別の方法を使うかよく考える。
>>227 自分で参照カウンタもどきの仕組みを付けたオブジェクトを作るとか。
>>222 TObjectListと言えば、一つ疑問があるのだが…
いつもTObjectListを使うとき、
var
list: TObjectList;
obj: TMyObject;
//中略
obj := TMyObject.Create;
try
list.Add(obj);
except
obj.Free;
raise;
end;
とやって、Addで例外が発生したときに、確実にobjを破棄しているのだけど、
これだとリストに追加はできたけど、その後に思いもよらないような原因の
エラーが生じた場合にもobjを破棄してしまうようなきがするけれど、このような
場合はみなさんどうしてますか?
DelphiのIDEのメインウインドウ(コンポーネントパレットがあるウインドウ)
以外のウインドウにフォーカスがある時に、キーボードのどのキーを押せば
メインウインドウにフォーカスを移せますか?
すいません
× フォーカスがある
○ アクティブである
です
>>230 その後の部分を更にtryで囲めばいいんでねぇの?
>>223 リストに追加はされたのに、それ以外の原因でAdd内で例外が生じた場合はどうするか、ってことだろ。
>>234 ??
それ(=Addで例外が発生)以外の原因でAdd内で例外が生じるって?
リストに追加された時点でAdd自体は成功じゃ?
揚げ足取ろうとしてるわけじゃないけども。
>>230 addしたとき、indexをもってきて、んでTListからオブジェクトを
破棄すればいいんでねーの?
objの破棄は、それで達成できるんだよね?
237 :
デフォルトの名無しさん:03/12/19 22:30
アプリ起動時に「既に起動しているメモ帳」をSetForeGroundAPIを使って最前面にもってきたいんだけど
うまくいきません。 アプリ起動時でなくアプリ起動後にボタンを押してSetForeGroundAPIを使って
最前面にしようとするとバッチリ動きます。(まったく同じコードで)
アプリ起動時(OnCreate)にはSetForeGroundAPIは使えないの?!
環境:winXP HomeEditon DELPHI6 PERSONAL sp3
同じようなコンポーネントをいくつも動的に作成したくて
MyComp: TMyComp;
CompList: TComponentList;
とグローバル宣言しておいて
var IsMyCompAssigned:Boolean;
〜
IsMyCompAssigned := True;
MyComp := TMyComp.Create(Self);
MyComp.Parent := Self;
//途中で解放していたら、そこを埋めるように作成する。
for i:=0 to CompList.Count-1 do
if not Assigned(CompList[i]) then
begin
MyComp.Name := 'MyComp' +IntTostr(i);
CompList.Insert(MyComp, i);
break;
end;
if IsMy
MyComp.Name := 'MyComp' +IntTostr(i);
CompList.Add(MyComp);
end;
〜
とやってみたんですがダメですた
我に光を
>>237 SetForeGroundで他窓を最前面に出しても
自窓が作成された瞬間、自窓が最前面に出るんじゃ?
>>237 タイマーで、ちょっと遅らせて前にだしたら?
もしくは、自窓を後ろに戻す(できんのか?w)。
>>239 それなら他窓が2番目にくるはずなんすけど底に沈んだままなんす。
ボタンに同じコードを割り当てて実行してみるとちゃんと一番前に出るんだけど・・
>>240 タイマーっすか、sleepは試してみたんすけどこれはどうなのかな、試してみます
>>240 2行目
問題は後ろに戻す作業をどこに書くかだ(w
Createに書いたんじゃ意味ねぇ
タイマーでもダメでした。
var
Form1: TForm1;
hCalc: HWND; {ハンドル}
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
hCalc:=FindWindow(nil,'電卓'); {電卓のハンドルを取得}
//SetForegroundWindow(hCalc);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetForegroundWindow(hCalc);
timer1.Enabled := false;
showmessage('タイマーを実行しました。');
end;
//showmessageはちゃんと実行されたんですが・・(´・ω・`)ショボーン
ShowMessageしなきゃ…
ってマジレスしていいのかな?
>>243 Intervalは?
それと、Timerイベント内では電卓取得してないみたいだけど、その辺りは?
しかもTimer.Enabled:=True;も見当たらない。デフォでTrueかな?
>>245 ShowMessageがでたんだから、Trueでそ。
でも、ShowMessageがでると、自窓が上に
きそうだよね。
Caption変えるぐらいに汁
「きそう」っつーか、必ず来ると思うんだがどうか。
OnShowじゃ無理なんかね。
必ずしもCreateで設定する必要ないし。
>>245 ありがとうございました! 解決しました!!
>Timerイベント内では電卓取得してないみたいだけど
これを追加したらちゃんと動きました、ハンドルを再取得する必要があったんですね('_';
感謝っ!
あとIntervalは10000(10秒)で試したっす。
showmessageもちゃんと起動から10秒後に実行されました。
>デフォでTrueかな
もちろんそうです(^-^
>>244 ShowMessage は SetForegroundWindow(hCalc) の後に実行されるんで
無関係だと思うんすが・・。 一応試してみたけど結果は同じですたよー
>>246 えと、
setforegroundが実行されて電卓が最前面に出た直後にshowmessageも
実行されたんすが最前面には出てきませんっした。
>>249 OnCreateで出来ました、どうもお手数をお掛けしました、すみませんっす。
みなさん感謝っすm(_ _)m
あとテストしたときのコード置いておきますー
var
Form1: TForm1;
hCalc: HWND; {ハンドル}
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
hCalc:=FindWindow(nil,'電卓'); {電卓のハンドルを取得}
SetForegroundWindow(hCalc);
timer1.Enabled := false;
beep; //音を鳴らす
showmessage('タイマーを実行しました。');
end;
ではでは、お世話になりましたーm(^_^)m
>再取得する必要があったんですね('_';
再取得も何も一回も取得してないっしょ(w
SetForegroundWindow(hCalc)
↓
〜合間〜
↓
ShowMessage
この「合間」って、どんくらいの「ミクロの世界」だろうな。
ちとまち。
同じコードでbuttonのイベントのときにうまくいったのはなぜ?
まったく同じコードじゃないの?
>>254 あ・・・、こんな大切なことを書き忘れるとは・・・
Button1の動作をOnCreateに割り当てて実行してたんです。
procedure TForm1.Button1Click(Sender: TObject);
begin
hCalc:=FindWindow(nil,'電卓'); {電卓のハンドルを取得}
SetForegroundWindow(hCalc);
end;
どうもすみませんm(__;)m
今気付いたんですがTimer1を使った場合ってOnCreateは使って
無いんですね、これでも何の問題も無いので構わないんですが。
やっぱりOnCreateでは出来ないのかな、>249さんのおっしゃるように
他のイベントでも色々試してみます、ありがとうございましたっ!
>>244 マジレスするとshowmessageはアプリが背面にあるときにアプリを前面に出すようなことはしない。
>>257 TimerがデフォでTrueのときどのタイミングで発動するかなんて考えたこと無かったな
hCalcは別にローカル変数でいいんじゃないかとオモタ。
複数のメソッドで共有するより個々のメソッドで毎回取得したほうが確実だと
>>259 そだね
理想的には、Formのプロパティとして設定して、もし閉じられていたら
nilを返すようにするのがいいかも。
あと、どうせタイマー使うなら定期的に存在しているか確認して、
もし存在してなければ、Formに何かしらのイベントを発生させて、
処理させてあげる必要があるね。
261 :
デフォルトの名無しさん:03/12/20 17:08
例外発生はDelphi6, Delphi7で確認出来ました
TButtonやTCheckBoxなどの非DBControlは乗るのに・・・
>>263 ありがとうございます。
うーん、検索先全て目を通しましたが
へたれなものでよくわかりませんでした・・・
すみませんが引き続き情報をお待ちしています。
ファイル末尾を削りたいときは
ファイルストリームに読み込んで
SetLength(FS, FS.Size-1);
としたので無問題ですか?
この後Writeしていっても大丈夫でしょうか?
>>265 ためしてみれば良いか悪いかわかるだろ。
なぜSetLengthが出てきたのか謎だが。
超初心者が初心者に教えようとして逆に教えられてしまうスレ。
269 :
デフォルトの名無しさん:03/12/21 07:38
ソケットコンポーネントを使って自分自身にポートスキャンするには
どう書けばいいのですか?
>>269 ループバックアドレス叩くんじゃ駄目なの?
271 :
デフォルトの名無しさん:03/12/21 09:53
winamp2.xxのようにメインフォームにサブフォームが
吸着するようにするにはどうしたらいいんでしょうか?
>>272 これ使えばできそうですね。
情報ありがとうございました。
274 :
デフォルトの名無しさん:03/12/21 13:36
C言語のbsearchに相当するような関数はないですか?
汎用的なリストからの検索関数。
qsortはTListのCustomSortで代用してるんですが。
>>266 えっ、やっぱSetLengthじゃない方法あるんですか…
FS.Seek(-1, soFromEnd);
こうしてWriteしていくのが最善ですか?
なるべく最善の方法でやりたいんで一人でコツコツ試すだけじゃ何とも。
ヘルプも読まずに、仕様無視でコーディングするお前が恐ろしい
>>275 もう一つFileStreamつくって、size-消す数だけ渡して保存しれ
canvasでBegin/EndUpdateするにはどうすればいいのでしょうか
教えてください
訂正
canvasでbegin/endupdateのように
描画タイミングをコントロールするにはどうしたらいいんでしょうか?
WM_SETREDRAW
適当なBitmapのCanvasに描いてから目的のCanvasに転送
>280 >281
ありがとうございます
参考にさせていただきます
Delphi6 Personalなんですが、内蔵エディタのキーバインドって変更できないんですか?
どなたかタスクバーがクリックされた事を検出する方法をご存じの方はいらっしゃいませんか?
ShowMessageの件を検証してみたら、
「1回目は前に来るけど、2回目以降は前に出ない」って
なったんだけど、どーなってんの?
>>286 意味わからん
つか、意味はわかるけど、どういうように書いたのかわからんと、
この場合、返事のしようがないと思われ。
>>287 「タイマーでShowMessage」するだけの話。
1回ShowMessageのダイアログが他のウィンドウの前に来るけど、
2回目以降は前に出なかった。
…ってことなんだが。ま、忘れてくれ。
∧,,∧ まうすふっく使うとええじゃろー
ミ,,゚Д゚彡
>>285 ミ つ旦)~~
〜と,,,~),,~)
ここのソースのDLLを使って
サンプルアプリを参考にすると出来そうですよ。
http://www.nakka.com/lib/mhook/ もう閉鎖されちゃった、ここのサンプルの受け売りです
http://homepage3.nifty.com/kazu-kozawa/ function SetHook(hwnd:LongWord; msg:integer):integer;Cdecl;external 'mhook.dll';
procedure UnHook;stdcall;external 'mhook.dll';
procedure TForm1.FormCreate(Sender: TObject);
begin
SetHook(Handle,WM_MouseHook);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHook;
end;
こうしておくと
procedure WMMouseHook(var Msg:TMessage); message WM_MouseHook;
このメッセージハンドらに
いろんな情報が流れてくるので
タスクバーでボタン押した事もわかるようになるようです。
>>289さん、ありがとうございます。早速明日あたり試してみます。
∧,,∧ mhook.dll、
ミ,,゚Д゚彡 短いCコードなので
ミ つ旦)~~ これをDelphiには焼き直し
〜と,,,~),,~) 出来ないのかしら。
漏れはCわからないから
出来ないですけどねー。
292 :
頭の中が低レベルLv:3:03/12/21 23:49
あんまり暗記力が無いアホでも
何かプログラムが造りたいでありんす
294 :
頭の中が低レベルLv:3:03/12/22 00:08
無理っす
基礎すらしらない
文字一つは書けても単語が書けない英語のテストの状態
>>291 Delphiは共有データセクションをサポートしてないから
メモリマップドファイルを使う必要があって面倒だよー。
Delphi2達人テクニックにサンプルコードがあるよ。もう絶版らしいけど。
ネットでもどこかにサンプルが落ちていた記憶。
296 :
デフォルトの名無しさん:03/12/22 00:37
onClickイベント発生時、シフトキーが押されているのかを知る手段はありますか?
onKeyDownとかなら出来ますが、「シフトを押しながらコントロールをクリックすると・・・」を実現させたいもので。
コントロールをクリックってなんなんだ?
とまぁ、それはおいといて
GetKeyStateとかいう名前じゃなかったかな?
↑・・・じゃなくて、WindowsのAPI、でした
あぁ、名前あってたか。
よかっ…
おまいらちょっと待て。
OnClickのShift引数は使えないのか?
303 :
デフォルトの名無しさん:03/12/22 10:02
Xp+Del6 Entです。
テキストファイルを読んで処理をしたいのですが
ファイルを開く方法として
(1)FileOpne
(2)Assign
(3)Reset
等があるみたいなんです。
(1)のHelpをみると
低レベルのファイルアクセスルーチンです。
通常のファイル操作には,AssignFile,Rewrite,
および Reset を使ってください。
とあります。どれでも動きそうなんですが違いが良く判りません。
よろしくお願いします。
>>303 個人的にはTFileStreamとかTStringListとかの方が好き
とさらに選択肢を増やしてみる。
>>288 そんなことも知らない初心者が他人に教えようとするな、消えろ。
306 :
デフォルトの名無しさん:03/12/22 14:13
307 :
デフォルトの名無しさん:03/12/22 14:21
デルファイってなに?
>>261です
こちらで解決できる情報が得られなかったので
MLに投稿してみようと思います
(作者様には連絡取りましたが、保守は行っていないとのことでしたので・・・)
返信くださった方、ありがとうございました。
>>304 TStringListでやってみます。
どうもです
実は「タスクバー」という表現が漠然として答えるのが難しいといってみるテスト
Spy++あててみて味噌
311 :
デフォルトの名無しさん:03/12/22 20:25
2から始まる連続した数字を3単位でまとめたいんですが、うまくいきません。
例
2 3 4 を 2 としたい。
5 6 7 を 5 としたい。
以下、同様
5以上は、うまくいくのですが、3 4 が うまくいかないです。
>>311 (x - 2) div 3 + 2 じゃなくて?
313 :
デフォルトの名無しさん:03/12/22 20:42
>>312 xが 5、6、 7の時は 5 としたいのです。
(x - 2) div 3 * 3 + 2
315 :
デフォルトの名無しさん:03/12/22 21:25
x - ((x+1) Mod 3)
316 :
デフォルトの名無しさん:03/12/22 22:45
MailのテキストをクリップボードとCommaText経由でstringlistにコピーしているのですが、
改行でくぎられなければならないのになぜかstringlistの[0]に
'Date: Mon, 22 Dec 2003 21:00:05 +0900'#$D#$A#$D#$AMa
と中途半端な行まで入ってしまいます。
このような場合に、改行できちんとくぎらせるようにするにはどうしたらよいのでしょうか?
以下はクリップボードに入れたテキストです。
Date: Mon, 22 Dec 2003 21:00:05 +0900
Mail,1,3
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/
なぜTextを使わないのか
>>317 すみませんが、どういう意味でしょうか?
あっ、すみません。書いておきながら私が思いっきり勘違いをしていました。
Commatextを使用していません。
クリップボードのテキストをstringlistに入れてその中身をstringlist1[0]として
見ようとしているのですが、
>>316に書いたようになぜか改行位置で素直に分かれて
くれません。
改行位置で切り分けるにはどのようにすればよいのでしょうか?
「stringlistに入れて」って、そもそもどうやって入れたんだ?
まあ、stringlist.Text := Clipboard.AsText; でやってみて。
>>305 >そんなことも知らない
なんだ。じゃ、前に出るんじゃないか(藁
>>296 『中村の里』での記述によればマウスの左ボタンをクリックすると
OnMouseDown,OnClick,OnMouseDownの順にイベントが発生するそうなので….
TForm1のprivate節にフィールド変数
FButton1MouseLButtonDownWithShift: boolean;
を追加して…
procedure TForm1.Button1Click(Sender: TObject);
begin
if FButton1MouseLButtonDownWithShift then
ShowMessage('シフトを押しながらクリックしたらしいぞ')
else
ShowMessage('シフトを押さずにクリックしたらしいぞ');
end;
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and (ssShift in Shift) then
FButton1MouseLButtonDownWithShift := True;
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FButton1MouseLButtonDownWithShift := False;
end;
無駄なフラグとフラグ操作はバグの元ですぜ。
実際
>>322は危険が危ない。
既に出てるGetKeyState / GetAsyncKeyState のが安全だし1行で済むでそ。
324 :
デフォルトの名無しさん:03/12/23 00:48
Delphiってどこで落とすの?
シェアウェアなん?
327 :
デフォルトの名無しさん:03/12/23 01:04
330 :
デフォルトの名無しさん:03/12/23 01:10
331 :
松井 ◆...VBh.www :03/12/23 01:14
皆さんはじめまして
突然ですがYAHOOのトップにチャットという項目があるのはご存知ですよね?
そちらのチャットのカテゴリの中に「政治」があります
その政治カテゴリのユーザールームに「創価学会YAHOO支部」という部屋があります
そこの部屋に遊びにきてください
ボイスチャットもフル稼働です
みなさんの中にも創価学会に対するご自分の意見をどんどん言ってください
その宣伝でした
尚、人数制限がありますので(50人)すぐに満室になって入れなくなるので
今これを読みまして興味を持たれた方はおはやめのご入室をお勧めします
>>331 創価学会ってなんですか?儲かりますか?
>>323 GetKeyStateってリアルタイムなボタン押下を返すのかと思ってました(汗.
Windows素人には参考になりますです.
>>321 アプリを起動するとshowmessageしなくても前面に出るんだよ。
知ったかぶりするのは迷惑なのでやめてね、わざと嘘教えてるのと同じだよ。
こういう書き込みがログに残るとそれを見た人まで被害を受ける死ね。
StringGridで中の表の幅を変えたり、フォームの幅を変えても
一番右の行がつねStringGridの端まで続いてるようにする…
(デフォルトじゃサイズ変えちゃうと一番はしの行がとぎれちゃうじゃないですか?)
のはどうすればいいのでしょう?
ちょっと説明わかりにくいかもしれませんがどなたが教えていただけないでしょうか?
日本語版Delphiで、String型からWideString型への代入をすると、
自動的にShift_JISからUTF-16に変換されるのですか?
あとUCS4String型に代入すると、UTF-32になるのですか?
manifestを組み込んだアプリを作成したのですが、
ComboBoxに全角文字を打ち、それをバックスペースで消すとバグが生じます。
これを防ぐ方法を教えてください。
>バグが生じます。
はぁ?
339 :
デフォルトの名無しさん :03/12/23 13:11
「モジュールxxxxのアドレスxxxxでアドレスxxxxに対する読み込み違反」
というエラーが出ます。
mapファイルを見てもそのアドレスは見つかりません。
どうすれば、ソースのエラー該当行を見つけることができますか?
>>339 ブレークポイントを適当に設定しながら探す。
またはデバッグ用のログを吐かせながら絞り込むとか。
>>338 やってみればわかる。まあお前が無知なだけだがw
>>337 俺も対処方法がわからん。Unicode化で一応回避はできるが、それについては説明マンドクセ。
>>342 レスありがとうございます。
ComboBoxに入力した文字をUnicode化するにはどうしたらいいのでしょうか…
参考になるページかヒントを教えてください。
344 :
デフォルトの名無しさん:03/12/23 16:14
このスレの前スレが8じゃなくて7なのはなぜですか?
>>335 グリッドのOnResizeイベントで処理しる!
…といいたいところですが,TStringGridのOnResizeイベントは隠されていて使えません.
しかし,このグリッドが親のコンポにあわせて幅を変える場合(AnchorsのakLeftとakRightがともにTrueの場合)は
そのコンポのOnResizeイベントハンドラで幅を調節します.
たとえばグリッドがフォームForm1の上にあり,AlignがalClientなどの時,
procedure TForm1.FormResize(Sender: TObject);
var LeftWidth, i: integer;
begin // 右端のセルに割り当てられる最大幅を求めてそれが1以上なら幅をその値に変更(1未満なら無視)
LeftWidth := StringGrid1.ClientWidth; // グリッドの内幅から…
for i := 0 to StringGrid1.ColCount - 2 do //dec(LeftWidth, StringGrid1.ColWidths[i] + StringGrid1.GridLineWidth);
dec(LeftWidth, StringGrid1.ColWidths[i]); // 他のセルの幅を引く
dec(LeftWidth, (StringGrid1.ColCount - 1) * StringGrid1.GridLineWidth); // セルとセルの間の線の幅をすべて引く
if LeftWidth >= 1 then
StringGrid1.ColWidths[StringGrid1.ColCount - 1] := LeftWidth;
end;
>>336 一つ目はその通りです.string(AnsiString)型とWideString型は暗黙的に相互に変換されます.
式の中で混ぜて使ったり,string型をパラメータに取る関数や手続きにワイド文字列を渡す事も(その逆も)出来ます.
型キャスト演算子を使う場合も普通のキャストのように『強引に別な型として解釈する』のではなく実際に変換を行います.
procedure TForm6.Button1Click(Sender: TObject);
var
s: string;
begin
s := '自作自演';
ShowMessage(WideString(s)[2]); // 『作』を表示
end;
二つ目はうちのDelphi(バージョン5)にはその型がないのでわかりません,すいません.
>>346 >336へのレスに書いた例はいまいちだったでしょうか….
>>339 エラーが発生した行の変数の値は確認しましたか?この行が表示できる場合はチェックしてみてください.
アクセス違反エラーになるケースで多いのは私の経験だとアドレス0での読み込み違反なら値がnilポインタの参照,
さもなければCreateする前やFreeで解放した後のオブジェクトを参照したときなどでしょうか.
配列変数の存在しないインデックスを参照した場合(ar: array[0..9] of integerと宣言して ar[10]を参照したときなど)
にもアクセス違反になりますが,これはコンパイラオプションで『範囲チェック』を有効にする事で検出できます.
>>346 どうもです。これで安心して使えます。
UCS4String型への直接の代入はできませんでした。
WideStringToUCS4Stringのような関数が用意されているので、それを使うようです。
しかもUCS4String型は単なるUCS4Char型の動的配列?謎が多いです。
ちなみにUnicode系<->JIS系の変換テーブルは、各exeが持っているのですか?
それともOSの機能なのでしょうか?
ソース嫁
>>334 はぁ?何言ってんの?もう一度読み返せ。
352 :
デフォルトの名無しさん:03/12/24 00:48
すみません質問させてください。
↓のページを参考にさせていただき、
ttp://www2s.biglobe.ne.jp/~aks-lab/delphi_part1_4.htm 読み込んだ画像に合わせてフレームを変化するプログラムを作ろうと
したのですが、どうしても、うまくいきません。
デバッグで追いかけてみたのですが、どうやら、
-------------------------------------
//ユーザー定義手続き(画像フォームのサイズ調整)
Procedure TForm2.ImageView(ViewBitmap:TBitmap);
begin
//イメージのサイズの調整
Image1.Height := ViewBitmap.Height; ・・・・ (1)
Image1.Width := ViewBitmap.Width;
//フォーム2のサイズの調整
Form2.Height := Image1.Height + 28; ・・・・ (2)
Form2.Width := Image1.Width + 9;
-------------------------------------
の(1)の段階でImage1.Heightに0以外の値を代入しているのですが
(2)の段階でImage1.Heightがなぜか0になってしまいるようです。
ただ、この現象は、この関数が1回目に呼ばれたときだけ起きるらしく、
2回目以降は、上記の現象は起きず、意図どおりに動作してくれます。
これは何がいけないんでしょうか?
開発環境は Windows2000 + Dlphi6 personal updatePack2 です。
似たような現象をご存知の方がいらっしゃいましたら
是非ご教授お願いいたします。
ぬるぽ
354 :
デフォルトの名無しさん:03/12/24 01:28
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>353
356 :
デフォルトの名無しさん:03/12/24 10:36
>> 355
なにか事前に初期化処理をしなければいけないんでしょうか?
どうもTBitMap.Canvas.Pixels[x,y] に RGBのピクセル値を代入する
場合にも、同様にうまくいかない場合があり困っています。
>>350 うざいなぁ、showmessageがアプリを最前面に出してると思いたいなら
勝手に思っててくれよ・・。
>>337>>343 私は某フリーソフトの作者です。
最近その問題と戦っていたのでちょっと詳しいです。
ComboBoxだけでなく、文字入力できる標準コントロール全部で問題発生します。
ただし、問題が生じるのはXPのみです。
ユニコード化が必要ですが、非常に困難なので、
他人の作ったユニコードコンポーネントを使うべきです。
ttp://home.ccci.org/wolbrink/tnt/delphi_unicode_controls.htm 差し替えできるものはすべて、このコンポーネント群に差し替えるべきです。
しかし、ComboBoxに関しては、オートコンプリートにバグがあり、
オフにしないと日本語を入力したとき問題が生じます。
バグについて何度もメールしましたが、コンポ作者は日本人ではないため、
どう説明しても伝わらず、終いには私が修正したソースを送りましたが、反映されていません。
そういうわけで自前で多少修正が必要です。
何カ所か、stringの長さとwidestringの長さを混同して比較しているところがあります。
全角文字のない国ではこれらを混同しても問題は起こらないというのが、
作者に問題点が伝わらない一因です。
また、日本語IMEを使わないとバグを再現できないということも一因ですが。
で、オートコンプリートがらみでは、最新版とは多少ずれるかもしれないけど、
TntStdCtrlsの1817、1818、1888、1889、1890行目あたりを確認し、
お好きなように修正してください。
我が家のXPではうまいこと動作しています。
>>352 ソースがいけないようです….
イメージコンポのAutoSizeがTrueになっているのに自分でサイズを変更しようとしているのが問題.
> Image1.Picture.Bitmap := ViewBitmap;
とコンポに画像を入れた時点でサイズは自動調整されるのでその後でフォームのサイズを変更すればよいでしょう.
なおフォームのサイズ調整ですが内寸と外寸の差がいくつになるかを決めうちするこのコードも問題です.
フォームの見出しの高さや枠の太さはユーザーが好きなように決められるからです.
WindowsXPに至ってはこれらのサイズのデフォルトすら異なります.
フォームのClientWidth/ClientHeightプロパティを使う方が簡単確実です.
※ちなみに元のコードだと2回目以降の読み込みでも画像サイズが直前と異なると正しく動作しません.
もっともDelphiのもっと比較的新しいバージョンならこんなことをしなくても
イメージコンポとフォームのAutoSizeプロパティをTrueにすれば自動的にフォームのサイズを変更してくれるようですね.
(件のサイトではDelphi3を使っていますがこのバージョンには存在しません)
manifestの不具合って自前で対処しなきゃいけないほどマイナーなの?
普通にTEditで再変換狂うからすぐ気がつくと思うが。
質問です。
複数画面間で共有できる変数型って何でしょうか
教えてください
TBatchMoveの使い方で質問です。
AppendUpdateモードで更新するときインデックスを指定するのはソーステーブルの
IndexFieldNamesプロパティで良いのでしょうか。
>>361 詳しく教えていただきありがとうございます。
AutoSizeをFalseにしたところ正常に動作しました!
なるほど。そういうプロパティがあったのですね。
ClientHeight等も調べて取り入れてみようと思います。
ありがとうございました。
直接Delphiとは関係ないんですが・・・・。
ツールバーを作ったときのアイコンってどうしてます?
やっぱり自作でしょうか・・・(;´Д`)
漢ならいさぎよくShowCaptions:=true
>>358 (´・ω・`)ショボーン
修正以前にそのコンポーネントインストールできなかったよ…
Del6 personalで使える方法キボン
TntUnicode_6.bpgインストールするだけだがなぁ
Formにボタンを配置して、
「A」キーを押した時とかに、
そのボタンが押されるようにする
簡単な方法ないですか?
ボタンを押したのと同じ動作をさせたいのか、マジで押したいのか。
ボタンがへっこまなきゃ嫌なのか、へっこまなくても押したことになればいいのか。
ボタンの押し方がわからないのか、Aキーの感知がわからないのか
aキーも受け付けるのか、フォームがアクティブでないときは受け付けるのか
>>375 押されたのと同じ動作をしたいです。
で、いま調べていたらKeyPreviewと、OnKeyPressをみつけました。
これでなんとかできそうです。しかし、このキーが、Deleteキーとか
カーソルキーだとイベントが発生しません・・・なんでだぁぁ
onkeydo
if key=
button1cli
>>372 >>373 TntUnicode_6.bpgではコンパイルエラーが出るし、
TntUnicodeVcl_R60.dpkもTntUnicodeVcl_D60.dpkも同様でした。・゚・(ノД`)・゚・。
DB関係をはずしてもこのパッケージは設計時には使えませんのエラーメッセージが出ます。
Delphi超初心者向けにもうちょっと詳しくお願いします。
381 :
デフォルトの名無しさん:03/12/25 15:31
画面に線を引きたいのですが、コンポーネントでできますでしょうか?
Canvas.MoveTo( 10, 10 );
Canvas.LineTo( 100, 100 );
これらだと
未定義の識別子 : 'Canvas'
というエラーになってしまいます。
>>381 「何に」線を引きたいのか書いてないのが原因。
フォームに引きたいのか、ペイントボックスに引きたいのか、マジックでディスプレイに引きたいのか。
>マジックでディスプレイに引きたいのか
ワロタ
>>381 Canvasというプロパティが存在するオブジェクトに対して使用しなければ意味がないよん。
TCanvas のインスタンシュを生成して、
Handle に GetDC(0)でシュエしたものを設定し、
スクリーンに線をひく事はシュキました。
この場合、ReleaseDC のインスウは何になるのですか。
var
TC:TCanvas;
begin
TC := TCanvas.Create;
TC.Handle := GetDC(0);
TC.Line(50,20);
//ReleaseDC()
TC.Free;
end;
387 :
デフォルトの名無しさん:03/12/25 20:13
WebBrowserコンポーネントで表示しているページの、FORM欄に文字列を
アプリ側から入力したいのですが、どういった方法がありますでしょうか。
具体的に言うと、WebBrowserコンポーネントで作ったブラウザに
自動ログイン機能を付けようとしているのですが・・・
>>388 真剣に悩んでるので茶化さないでください
>>380 そんな調子じゃ出来る頃にはXPかDelphiがなくなるから安心しなよ
391 :
デフォルトの名無しさん:03/12/25 23:25
Form1 の ListBox のデータを使い、別スレッドでグラフィックを描かせたいのですが、
上手く画面(PaintBox)に表示できるときとできないときがあります。
失敗したときは、TForm1.GamenPaint の CopyRect がうまく出来ないような…?
なんで上手くできるときとできないときがあるのか、教えてくらさい。おねがい。
type
MyThread = class(TThread)
private
TesBuf : TBitmap; ListData : TListBox;
protected
procedure Execute; override; procedure BitmapCopy;
end;
var
Form1: TForm1; GrDat : array[0..4] of TBitmap;
procedure MyThread.Execute;
begin
TesBuf := TBitmap.Create;
with TesBuf do begin
width = xxx; Height = xxx;
<< Form1.Listbox1 を使って色々作画 >>
end;
Synchronize(BitmapCopy); TesBuf.Free;
end;
procedure MyThread.BitmapCopy;
begin
GrDat[0].Assign(TesBuf); Form1.Gamen.Refresh;
end;
procedure TForm1.GamenPaint(Sender: TObject);
begin
<< GrDat.Canvas を必要な範囲だけ PaintBox.Canvas に CopyRect >>
end;
392 :
デフォルトの名無しさん:03/12/25 23:31
>>387 自動でログインさせたいのなら、単にIndyのIdHTTPでユーザー名とパスワードをPOSTすればいいだけだ。
POSTして返ってきたHTMLをWebBrowserに表示させればよい。
>>385 ReleaseDC(0,TC.Handle);
0もハンドルです。
>>319 スレッドの使い方間違ってます。
TForm1にアクセスする時点でスレッドは同期しなくてはいけません。
スレッドが効果を表すのは”単独処理”だけです。
リストボックスにある情報から作図する場合
1.スレッドに情報を送る
2.作図
3.結果を出力
の2のみが別スレッドで扱えます。
他は同期をとってください。
>>387 以前からよくある質問です。
直接書き込む方法は恐らくネット上に上がってません。
実装は非常に困難なはずです。
簡単なのでよければ
クリップボード、仮想キーを使う手があります。
397 :
デフォルトの名無しさん:03/12/26 09:07
>>387 受信したHTMLを書き直して 表示しなおすという手は どう?
HTMLファイルの直接変更で うまくいくのかな?
398 :
デフォルトの名無しさん:03/12/26 10:01
Format文の使い方が よくわかりません。
たとえば integer 型の変数 a を 0か空白をつけて 9桁にしたいのですが、
どうすればいいのでしょうか?
aの中身が 100 だとすると
000000100 というのを取得したい。
もしくは ______100 というのを ( _ は 空白です)
DelphianWorldの
UIWebBrowser51を使ってみたら?
オートコンプリートの機能とかあるし、
ひょっとしたら使えるかも。
Format('%.9d',[100]);じゃだめ?
402 :
デフォルトの名無しさん:03/12/26 13:03
6Personal(Free)でデータベース(Accsess2000)を
操作することが出来ますか?
(標準では無理そうなんですが)
>>402 できます。
くだすれDelphi Part7 (超初心者向け)の[625]にサンプルが有りますよ。
405 :
デフォルトの名無しさん:03/12/26 14:03
パパパスカルマスターしたぞー
年末にパスカル使うぞー
406 :
デフォルトの名無しさん:03/12/26 14:10
407 :
デフォルトの名無しさん:03/12/26 14:26
別スレで相手にされませんでしたので。。。
QuickReportのプレビュー画面の印刷設定が効きません。
回避方法はありまつか?効くようにするか、印刷設定ボタンを消すか、等。
408 :
デフォルトの名無しさん:03/12/26 14:32
>>
407
アンチエイリアス
409 :
デフォルトの名無しさん:03/12/26 18:06
>>1 >お礼はDelphiの布教と初心者の救済をお願いします。
おふだ?
意味がわからん。
410 :
デフォルトの名無しさん:03/12/26 18:49
oreidaro
turareta・・・
411 :
デフォルトの名無しさん:03/12/26 19:23
お礼には 3種類の読み方がある。
おれい
おさつ
おふだ
みなさんありがとうございます。
タイミング悪くディスプレイが逝ってしまったので、すぐには試せないのが残念(今は携帯から)ですが、
やってみます。
ありがとうございました。
413 :
デフォルトの名無しさん:03/12/26 21:01
どなたかお知恵を貸して下さい。
フォームを常時、最も手前に表示させたいんですが、
どこを弄べばいいんでしょうか?
414 :
デフォルトの名無しさん:03/12/26 21:01
>>411 だから?
お前は自分の都合で読み方変えるのか?
普通は文面みて読むだろ
mataturareta・・・
>>394 1.TBitmap、TListbox を持ったスレッドを作る。
2.フォームの ListBox1 から、スレッドの TListBox にデータをコピーする。
3.スレッドの TListBox を使ってスレッドの TBitMap に作画する。
4.スレッドの Synchronize で呼び出した手続きで Form1 に TBitMap を Copy する。
…で、Execute で処理するのは 3 のみってことであってるかな?
あと、同じ関数を TForm とスレッドと同時に呼ぶのは、問題ありなのかな?
>>411 お札...おふだ、おさつ
お礼...おれい
ではないでしょうか
日本語大丈夫ですか?
418 :
デフォルトの名無しさん:03/12/26 22:28
フォントを最小にすると区別が付かなくなるぞ
>>415 ビューがいらないんならTStringList使えば?
>>420 よく考えたら TStringList でも同じように扱えるんですよね。そうしてみます。
422 :
デフォルトの名無しさん:03/12/27 09:05
ま、確かにお礼がDelphiの布教と初心者の救済をお願いします。になるのは変だ。
メッセンジャーについている共有ホワイトボード
のようなものを作りたいのですが、どういうように
考えればいいか、作る方法が思いつきません。
どなたかヒントだけでも結構ですので、教えて
いただけないでしょうか。
>>423 例えばホワイトボードサーバ作って、
サーバはクライアントから描画命令を受け取り描画する。
クライアントはその時点での描画イメージをサーバから取得できる。
とか。
ヒント
ホワイトボードそのものが共有されてるわけじゃない
ありがとうございます。
やっぱり、図形の場合は座標1や描画する形、
フリーハンドの場合は座標の軌跡、
文字の場合は表示を開始する座標と
文字のフォント、大きさや色、
画像の場合は表示する座標と画像そのもの
を相手側に送って処理させるという感じなん
ですかね。
はずしてるかもしれませんが・・・・
>>426 両者の間でイメージの不整合が出ないならそれで全然良いと思うよ。
俺は両者のイメージを同一にするためにサーバは専用に一つだけいた方が良いかなと思ったけど。
431 :
デフォルトの名無しさん:03/12/28 12:01
Delphi Personal 6の英語版ってのはどこでダウンロードできますか?
ボタンを押すとForm1を非表示にしてForm2を出す方法を教えてください
>>432 Form1.Hide
Form2.ShowModal
自己解決しますた
>>433 ShowModalにするとメインスレッドでの処理が全て停止してしまうわけだが
まぁいいか。
おそらく
>>432には関係ないw
Delphiで、「aspでADOを使う感覚で楽にローカルDBを使いたい」、
というのは贅沢でしょうか…
アカデミック縛りがない最後のバージョンなD5Proか、
D6Personalで、ターゲットOSがWin2k/XP。
その環境でAccess2000のmdbを扱いたい。
タイプライブラリのインポートで、MDACのインポートを試してみたけど、
どのMDACのバージョンでもうまく扱えず。
BDEは配布の段を考えると扱いが面倒なので遠慮したい…
ラッパコンポがないか探してみたけど、検索ヘタなもんで見あたらなかった…
色々試したり調べたりで休みを丸々一日潰しちまったい。
なんかいいコンポまたは解説サイトへのポインタだけでかまわないので、
どなたかご教授ください…
440 :
デフォルトの名無しさん:03/12/29 23:00
下記のコード、もう少し早くなりませんか?
X,Yは100から500位までです。
〜Data[i][j] : word
ibl,ibh : byte
for j := 0 to Y-1 do
begin
for i := 0 to X-1 do
begin
ibl := Lo(gpData[i][j]);
ibh := Hi(gpData[i][j]);
str := Chr(ibl) + Chr(ibh);
ibl := Lo(gsData[i][j]);
ibh := Hi(gsData[i][j]);
str := str + Chr(ibl) + Chr(ibh);
ibl := Lo(opData[i][j]);
ibh := Hi(opData[i][j]);
str := str + Chr(ibl) + Chr(ibh);
ibl := Lo(osData[i][j]);
ibh := Hi(osData[i][j]);
str := str + Chr(ibl) + Chr(ibh);
ibl := Lo(stData[i][j]);
ibh := Hi(stData[i][j]);
str := str + Chr(ibl) + Chr(ibh);
a.WriteBuffer(Pointer(str)^,10);
end;
end;
>440
普通にByte3次元配列へキャストするとか。
最初に文字列の長さを計算して、
SetLengthして、str[n] := Char(); で上書きしてくとか。
a.WriteBuffer(gpData[i][j], 2);
a.WriteBuffer(gsData[i][j], 2);
……
でよくない?
443 :
デフォルトの名無しさん:03/12/30 00:38
>>441 どうもです。SetLength〜の方はできました。
3次元配列へのキャストのほうがよくわかりません。
ba : PByteArray
ba := Pointer(gpData[i][j]);
str[1] := Chr(ba[0]);
str[2] := Chr(ba[1]);
ba := Pointer(gsData[i][j]);
str[3] := Chr(ba[0]);
str[4] := Chr(ba[1]);
・・・・・
こんな感じにすると保護違反が出てしまいました。
すみませんが教えていただけませんか?
type
hoge1=array of hoge0
type
hoge2=array of hoge1
つーか、ベンチマークして自分で考えろよ。
まず最初にどの部分がどのくらい時間がかかっているか調べる。
そして時間を減らす(処理量を減らす)ことができる部分がないか調べる。
そしてその調査に基づいて最適化を行う。
順序立てて考えればシンプルに解決。
まあ、一番時間がかかっている部分は実行しなくても明白だが。
データ構造見直して
var Data: array[0..X-1][0..Y-1] of record gp, gs, op, os, st: Word; end;
とでもすれば、WriteBuffer(Data, SizeOf(Data)) で一発。
>>446 はいはい、そうまでしてかまってもらいたいのですね?
>>443さん
ありがとう!
心から感謝。
きちんと動作できるのも確認しました。
TPopupMenuでメニューを追加しています。
Delphi7のヘルプをみると、TMenuItemのインスタンスを次々に作成し、
TPopupMenu.Items.Addしてメニューを追加しているように見えます。
各メニューだけTMenuItemのインスタンスを作成し、PopupMenuに
追加しろということだと思いますが、ここで作成したTMenuItemの
インスタンスは、PopupMenu破棄時にすべて自動に破棄されるの
でしょうか。それとも、すべて自分で破棄するようにしなければいけ
ないのでしょうか。
マニュアルにそれらしき項目がないか、見逃しているようですので、
ご存じの方えられましたらよろしくお願いいたします。
>>451 おお、その手がありましたね。
みたところ、TPopupMenuが保持しているTMenutemをDestroyで破棄しており、
さらにTMenuItemのデストラクタでAddしたものをすべて破棄しているようです。
この手はVCLのソースみれば、一発でしたね(汗
ありがとうございました。助かりました。
MDIアプリケーションでActionMainMenuBarを使っているのですが、
子ウィンドウを最大化したときに元に戻すボタンが表示されずに
元の大きさに戻せません。何かよい方法はありませんか?
元に戻すボタンをつくります
455 :
デフォルトの名無しさん:03/12/31 09:22
TCheckListBoxについて質問します。
チェックリストの項目はitemsのLoadFromFileやSaveToFileのメソッドを使えば
読み書きできますが、チェックデータの読み書きはできないようです。これの読み書き
は皆さんどうやってますか?Checkedプロパティをすべての項目についていちいち調べて
別ファイルに保存するしかないんでしょうか?
>>455 使ったことないからわからんけど、TString型の
インスタンスも持ってるからSaveToFileつかえるけど、
肝心のCheckしてあるかどうかまで保存できないみたいね
いちいちっていっても、そんなに面倒じゃないでそ。
もう一つTStringListあたりをもつ継承Classをつくって、
"Text","True"のようにCSVではき出すようにしたり、
Text
True
のようにはき出したりして、読み込めるようにすれば
いいんでない?それほど難しいともおもえんし。
保存できるコンポもどっかにおちてそうだし。
TStringListの中のアイテムを全部、グリッドの中に入れたいんですが。
for i:=0 to titles.Count - 1 do
begin
Grid.Cells[0,(i+1)] := Titles.Strings[i];
end;
とやると、最後Titleの最後までグリッドの中に入れられません。
for i:=0 to titles.Count do
とやるとリストの範囲を超えているとか言われますし…
どうすればよいのでしょう?
>>457 ごめんなさいちょっと疲れているようです
休みますね…自己解決しました(汗
TCustomFormを継承してコンポを作っているのですが、
TCustomFormのVisibleをみると
property Visible write SetVisible default False;となっていて、
read設定がありません。
その上の親Classをみにいっても、それらしき設定がないんですよね・・・
さしあたり、作成しているコンポでは、property .... read GetVisible()
GetVisible()でresult := inherited visibleで取得できているよう
なんですが、なんか気持ちが悪い・・・
Visibleはどこからもってきてるんでしょうか・・
ちゃんと継承元を調べればわかる。
というか調べなくてもほとんどの人は常識として知っている。
プログラムのアイコンなんですが、アイコンのリソースを入れたくないので
アイコンのリソースを削除する方法を教えてください。
(あのDOSアプリみたいに味気ないWindowsのEXEファイルのデフォルトの
アイコンにしたい)
プロジェクトファイルの{$R *.res}を削除
あけまして どうも おめでとう ございます
あけおめ
466 :
デフォルトの名無しさん:04/01/01 13:45
>>463 ありがとうございます
それとみなさんあけましておめでとうございますm(_ _)m
467 :
デフォルトの名無しさん:04/01/01 17:30
プログラミングに直接関係ない質問で恐縮ですけど、コンポーネントパレットが消えてしまったのですがどうしたら復活しますか?
「コンポーネントの一覧表示」から一列ずつ並んだウインドウは出てくるのですが、それを元通りに横長の状態にしたいです
右クリックで「コンポーネントパレットを表示」とすると、何も置かれていないスペースが出てくるだけです
再インスコすれば楽勝です
INDY9をインストールしたのですがDEMOSをコンパイルしようとすると
エラーがでてきました
>[致命的エラー] MainForm.pas(7): ユニット IdGlobal は異なるバージョン System.RTLVersion によりコンパイルされています
検索していくうちにアップデートを適用したほうがいい、というように書かれていましたので
元々適用していましたが再度確認しました
>Delphi 6 RTL アップデート #3
>Borland Delphi 6 アップデートファイル #2
しかし、結果は同じです
どうすれば正しくコンパイルできるのでしょうか
471 :
名無しさん@お腹いっぱい。:04/01/02 17:14
var image: array[1..10] of TImage;
を使いたいのですが、どうしたら使えますか?
初歩的な質問ですみません・・・。
472 :
デフォルトの名無しさん:04/01/02 19:10
画像(bmp)の任意位置の色コードを取得する方法教えて下さい。
よろしくお願いします。
>>471 for i := Low(image) to High(image) do image[i] := TImage.Create(Self);
で準備完了。Freeもお忘れなく
>>472 bmp.Canvas.Pixels[x, y]
474 :
デフォルトの名無しさん:04/01/02 20:25
アフォですまん
bmp.Canvas.Pixels[x, y]なんだけど
RGB形式にするにはどうすればよいのですか?
ヘルプ読めアフォ
476 :
名無しさん@お腹いっぱい。:04/01/02 21:31
>>473 さん
ありがとうございました!
image := TImage.Create(Form1);
image.Parent := Form1;
でもできました。失礼しました。
478 :
デフォルトの名無しさん:04/01/02 22:02
・ボタンを押すごとに一つずつパネルを動的に生成
・パネルのCaptionには、ComboboxのItemIndexが入っている
このとき、パネルを生成する度にCaptionに表示された数字の昇順に並び替えるにはどうしたらいいですか?
479 :
デフォルトの名無しさん:04/01/02 22:08
はじめました。僕も最近DirectX9.0をはじめました。
開発環境はVC++6.0ですが、何か参考になるサイト、
本などがありましたら教えてください。
よろしくお願いします。
>>478 やりたいことの意味が分からん。もう少し詳しく書いた方がいい。
ごめんなさい、前回の書き込みでラベルと書こうとしたのをパネルと書いていたため支離滅裂なものになってました。
今やりたいことは、トランプを山札から一枚引く度に手札に加えて、手札を昇順に並べ替えることです
Combobox.ItemIndex:引いたカードの数字
label:手札の内容を表示
今はOnclickイベントが発生するたびにlabelを動的に生成し、Combobox.ItemIndexを配列に記録しています。
配列の中で並べ替えは上手くいっているのですが、それをlabelのcaptionに順番どおりに表示する方法が解りません。
解決手段があれば教えていただけないでしょうか?
485 :
デフォルトの名無しさん:04/01/02 23:51
>>472 某Delphi談話室にマルチポスト。
あっちにもレスしとけ。カス。
486 :
デフォルトの名無しさん:04/01/03 00:20
>>485 誤解されてるみたいだけど
いくらアフォでもマルチはしてないです。
487 :
デフォルトの名無しさん:04/01/03 00:24
>>486 ほう。じゃ、誰かが騙ったってことか?
一字一句同じコピペなのに?
489 :
デフォルトの名無しさん:04/01/03 00:29
どうせ信じてもらえませんけど
アフォなんでその某講話室教えてくださいませんか?
誤解がとけたからもういいや
スレ汚してすまん
pixcel[0,0]を透明色を設定した後、stretchDrawを使ったのですが、
98だと赤と青の成分が逆の色が透明色になってしまいます。
XPだと普通に描画するので原因まがよく分かりません。
ちなみに、透明色の赤と青の成分が
同じ(たとえば、紫)だと98でも普通に描画します。
OSの仕様でしょうか?
日本語?
ToolsAPIというのを使えばIDEをかなり拡張できるみたいだが資料が全然ない。
とりあえずGExpertsをいれて我慢すれ。コンパイルすれば日本語通るようになるし。
あれ…?
delphiって無料verがあったような気がしたんですけど
有料しかないんですか?
500 :
デフォルトの名無しさん:04/01/04 05:24
ネットワーク関係の質問です。
クライアントに接続を切られるとサーバーは例外を発生させて
非同期接続の場合「非同期ソケットエラー」とメッセージがでますが、
これの例外が起きたら自動に解消する記述をしたいです。
try finally文を使って頑張りましたが分からなかったので質問します。
ご返答よろしくお願いします。
502 :
デフォルトの名無しさん:04/01/04 14:40
〜の間には何と書けば良いですか?
∧,,∧
ミ,,゚Д゚彡
ミ つ旦)~~
例えば、ADOのDB接続の場合は
begin
try
DataModule1.ADOConnection1.Connected := True;
except
on E: EOleException do begin
ShowMessage('DBと接続できません' + sLineBreak +
e.Message);
end;
end;
end;
こんな風に書くのだけど、これはDB接続不具合の場合。
「非同期ソケットエラー」というのが
どういうエラーになるのかは、漏れにはわからないので
IDEのデバッグモードでEXXXExceptionという表示を
調べて、記述すればいいのではないかと思われ。
>>500 ServerSocket1ClientErrorでErrorCodeに0を代入
505 :
デフォルトの名無しさん:04/01/04 15:35
>>504さんの場合ですと、それが実行された以降
他のクライアントにメッセージを送ることができなくなります・・・。
他の方法はありませんか?
506 :
デフォルトの名無しさん:04/01/04 15:46
あ、すみません。
エラーコードの場合ですと、「非同期エラー」の例外メッセージのうえにある
ボタンを押したことになりません。
ボタンを押すと同様の処理をしたいのです。
何をしたいのか、さっぱりわからんし、
後からやりたいことの追加をされても困る
もっと最初から、いろいろ情報を書いてもらわないと
と書いておくが
Delphiから実行するとexcept処理していても
エラーメッセージがでる。exeで実行すると例外時
にはダイアログがでないという返事でいいのかな。
>>505 自分でボタン押せよ。
というより
何言ってるのかさっぱり分からん。
解読した
>>507はネ申?
509 :
デフォルトの名無しさん:04/01/04 20:11
自分は「非同期エラー」の例外メッセージのうえにある
ボタンを押すのと同等の処理を、そのボタンを押さずにしたいのです。
でもエラーコードやtry except文をいじっても
エラーメッセージが消えるだけで、そのボタンを押す処理と同等の処理を
したことにはなりません。
そのボタンを押すのと同等の処理をするには、どのように記述したらよいですか。
(try except文の使い方によってはできるかもしれませんが、
自分の力ではできませんでした)
>>509 ツール->デバッグオプション->言語固有の例外->追加->例外クラス名を書け
例外メッセージのうえにあるボタンてのがよくわからんのだが・・・
ボタンがわからん以上、ボタンを押すのと同等の処理もよくわからんし。
実装してるSocketもTIdTCPServerなのか、TTCPServerなのか、
その他のコンポなのかによっても違ってくるだろうし。
つか、漏れに知識がなくて、普通の人にはあっさりわかるのかな・・・
512 :
デフォルトの名無しさん:04/01/04 20:40
あ、ごめんなさい。TServerSocketを使っています。
ボタンとは「非同期ソケットエラー」というメッセージのうえにある、
「OK」と書かれたボタンのことです。
515 :
デフォルトの名無しさん:04/01/04 20:45
>>510 自分は初心者なので、それについてよくわかりません。ごめんなさい。
>>515 そうですか。だからと言って避けても仕方がないですよ。
517 :
デフォルトの名無しさん:04/01/04 20:48
例外クラス名ってどうやってしるんですか?
非同期エラーのダイアログを自動で閉じたいけど、
try〜except〜end処理だと、そのダイアログが
でてこないという意味なんかね。
なら正常な動作だと思うんだが。
非同期エラーがでたことをユーザに伝えたくて、かつ
ある一定時間後に自動的に消したいのなら、
except〜end間で、新たに自動的にフォームが閉じられる
ように書くしかないね。
519 :
デフォルトの名無しさん:04/01/04 21:17
質問です。現在アルゴリズムを勉強中の者です。
今使っているテキストが、C++BuilderとDelphiのユーザー向けのものなのですが、
テキストの中にShowArrayコンポーネントを置いて〜という記述を見つけました。
しかし、コンポーネントパレットを探しても見つからないのですが、フリー配布されているDelphi6には
このコンポーネントは無いのでしょうか?
520 :
デフォルトの名無しさん:04/01/04 21:19
>>518さん
はい。そういうことなのですが、
try except文を使用すると、例外はでなくなるのですが、
socket.activeconnectionsの数がへらないのです。
例えば、ユーザーが一人いて、その人がいきなり切断します。
そうするとtry except文が例外を消す。
でもsocket.activeconnectionsからは-1されませんでした。
コレを自動で-1するようにしたいのです。
ボタンをクリックした場合、-1はされました。
お願いします。
521 :
デフォルトの名無しさん:04/01/04 21:21
>>520 exceptの中で、そのClientに対して切断処理すれば
いいんでないの?
普通、予期できるエラーダイアログをユーザにみせる
のはよくないと思うけど。
こんなに早く回答が帰ってくるとは思ってませんでした。
無事にコンポーネントのインストール完了しました。
本当に有難うございました。
524 :
デフォルトの名無しさん:04/01/04 21:41
Tform1.close で serversocket.close 処理したら難なくクリアしました^^;
おさわがせしてすみませんでした。。。
525 :
デフォルトの名無しさん:04/01/04 21:43
>>523 いえいえw
自分の話題が忘れられるとこまるのでww
527 :
デフォルトの名無しさん:04/01/05 11:09
>>502 もう一度文法からおさらいしてみましょう
>>527 いくつも解決案が飛び出しているのに、今更そんな初歩的な煽りをかます意味はあるのか?
何がどうなって解決に至ったのか分からんな
form1を閉じたときにserversocketを閉じたら解決
( ゚д゚)
漏れが日本語能力に欠けているのか?
>>529 exceptで処理をしているならわかるが、閉じるところでなんとか
してるところで、多分なんか間違ってるんだろね
一つ言えるのは、わけのわからん質問の連続で食傷気味に
なっていて、もう指摘する意欲もなかったということだろ。
531 :
デフォルトの名無しさん:04/01/05 19:11
文字列に入った値が有効な日付かどうかチェックする方法を教えてください。
エラーとかを出してチェックする方法以外で。
>>531 でも、例外をキャッチするのが早いと思うぞ。
533 :
デフォルトの名無しさん:04/01/05 19:19
例外だと Delphiで実行中に 止まるから いやなんだよね。
534 :
デフォルトの名無しさん:04/01/05 19:19
それに わざわざ 例外を 起こさせるなんて おかしいよな。
>>534 例外的なデータが入ってきてるんだ。例外が起こってしかるべきだと思うが。
後、
>>533に関しては昨日俺がどこかに解決策を書いた。
536 :
デフォルトの名無しさん:04/01/05 19:42
質問です
リッチテキストコンポーネントで追加した行に色をつけたいと思っているんですが、うまくいきません。
ヘルプをみると、キャレット?の位置が重要みたいなのですが、よくわかりません。
temp:='ほにゃら';
RichEdit1.Lines.Add(temp);
RichEdit1.SelStart:=0;
RichEdit1.SelLength:=Length(temp);
RichEdit1.SelAttributes.Color:=clRed;
こんな感じに書いてみましたが、最初の行しか色が変わりません。
よろしくお願いします。
>>536 0 Length(temp)
↓ ↓
|ほにゃら|
なんで当たり前では?
>>537 えっと、上のコードを何回か繰り返しても、
最初の一行しか色がかわんないんです。
最後にaddした行の色を変える方法ってどうしたらいいんでしょう?
>>538 start := length(RichEdit1.Lines.Text) - length(temp);
length = length(temp);
540 :
デフォルトの名無しさん:04/01/05 22:30
TThread使ってindyでGetしてるんですが、
Terminateに対応する方法がわかりません。
Get待ちの間にTerminatedが監視できないのです。
TerminateThread使って止めるしかないんでしょうか?
TThreadとはいえ、一つの処理で止まるような場合には
やっはりThread内で停止する。つねに、ループをぐるぐる
まわってるわけじゃない。
実際に調べてみたことないし、やったこともないけど、
ぱっと考えつくとこといえば、受信したことをイベントとして
受けるようにするか、スレッドがスレッドを監視するように
するしかないんでないかい?
でも、Indyなら、そういう事象に対応した何かがありそうだけど。
delphi6 personal使ってます。マウスのホイールがOS(Windows)上では動くのに、delphiのexeでは動きません。
なぜでしょう??教えてください。
>>533 止まるのか?
function(day: string):boolean;
begin
Result := True;
try
日付に変換
except
Result := False;
end;
end;
こんな関数つくっておけば?
>>542 おかしいな。俺はホイールを指で前後に回すと動くけどな。
>>539 あああ、わかりました。
これよんで
>>537の意味もわかりました。
行、桁という概念じゃなくて、先頭から何バイト目って考え方だったんですね。
ちなみに
>>359さんの
>start := length(RichEdit1.Lines.Text) - length(temp);
だと、改行コード分ずれるので
start := length(RichEdit1.Lines.Text) - length(temp)-2;
にしました。
ありがとうございます。
Delphiの変数宣言時の初期設定はグローバルスコープ
だけが可能なんでしたよね?プロパティの初期値設定は
publishedスコープで宣言したproperty行の末行に
default {値}
でしたっけ?
違います。
>>549 ありがとう
じゃ、propertyでのdefaultは、プロパティインスペクタに表示される
値が決まるだけ?
結局、すべての初期値はCreateで設定しなければならないのね・・
552 :
デフォルトの名無しさん:04/01/06 13:26
コンポーネントなどのオブジェクトは、デザイン時に初期値をセットできる。
質問させてください
現在、TWAIN機器から画面にビデオ映像を取り込んでいます。
ここでBMPが取得できるので、これを組み合わせてAVIファイルを
作成したいと思っています。さらにWaveファイルも追加(後付け)
しようと検討中です。
いろんなサイトを見ているのですが望むようなDel7で使用できる
コンポや、テクニックを解説しているサイト等がなく苦労しています。
どなたかソースを公開されているサイトや、解説されているサイトを
ご存じでしたら教えていただけないでしょうか。
日本サイトで検索に引っかかるコンポは残念ながらDel7では利用
できませんでした。よろしくお願いします。
555 :
デフォルトの名無しさん:04/01/06 17:48
以下のようなコードで悩んでいます。
TStringListを返す関数で
Freeはどのように行えばよいでしょうか。
MyList := TStringList.Create;
try
//
finally
MyList.Free;
end;
Result := MyList;←問題ないでしょうか?
試してないので実際にやってみて↓
Result := MyList;をfinallyの前に書いて、受け取る側で別の
StringListを作成してAssignする。
または、
Result := TStringList.Create;
Result.Add('');
のようにしていく。
自己フォロー
>
>>359さんの
>>start := length(RichEdit1.Lines.Text) - length(temp);
>だと、改行コード分ずれるので
>start := length(RichEdit1.Lines.Text) - length(temp)-2;
>にしました。
このやり方で組んだら、色をつける位置がちょっちゅうずれる現象が。
いろいろ右往左往しながら書き換えて実験してみたら、
実はワードラップを有り無しで挙動が変わるのがわかりました。
マンドクサ
入力していて太字になるのと、そうでない違いを教えてください・・・
560 :
デフォルトの名無しさん:04/01/06 20:01
エディタオプションで 色を設定している違いじゃないのか?
予約語かどうかなんじゃない?
562 :
デフォルトの名無しさん:04/01/06 23:50
プロセスを起動したいんだけど、WindowsのAPIを使うしか無いのでしょうか。
Delphiが用意した起動用の何かって存在しないのでしょうか。
⊂,,,,,,,,,つ,,゚Д゚ミつ たぶんナイです。
WinExec/ShellExecute/CreateProcess
どれか使ってください。
564 :
562 Delphidびy2日目:04/01/06 23:59
ども
「dびy2日目」って何?
566 :
デフォルトの名無しさん:04/01/07 13:15
デビュー2日目だろ
567 :
デフォルトの名無しさん:04/01/07 17:08
オブジェクトを開放するコードでHPや本で@のようなコードをよく見かけます。ネストが深くなるので私は今までAのようなコードを書いていたのですが、Aの方法はよくないのでしょうか?それともどちらでもよいのでしょうか。
@var
SL1, SL2: TStringList;
begin
SL1 := TStringList.Create;
try
SL2 := TStringList.Create;
try
finally
FreeAndNil(SL2);
end;
finally
FreeAndNil(SL1);
end;
end;
Avar
SL1, SL2: TStringList;
begin
SL1 := TStringList.Create;
SL2 := TStringList.Create;
try
finally
FreeAndNil(SL1);
FreeAndNil(SL2);
end;
end;
>>567 例外処理の理念からすればAより@の方がよいが、その差は TStringList.Create; が失敗したとき
の動作だけとなる。よく見ると TStringList.Create; が失敗したときのことを@は考えていないわけで、
それを考えると@も不完全。
けど、TStringList のコードを見ればわかるけど、これが失敗するときはメモリがほとんどない状態なので
どうしようもない。そこまでクリティカルなコードを書かなければいけないことはほとんどないので
私はAを使う。
もちろん、どんなクラスにも当てはまるわけではなく、例外が起きやすいかどうか。起きた場合に対策が取れるか
どうかなど、そのクラスにあわせた例外処理コードを書くべき。
そのクラスの素性がわからない場合には、@の外側にもうひとつ try をつけるか、
SL1 の帰り値のチェックコードを入れるかな?
569 :
デフォルトの名無しさん:04/01/07 18:07
Delphi7でテキスト処理で困っています。
Postgresにunicodeでデータを格納しています。
ODBC-BDE経由で接続しています。DelphiやSQLエクスプローラーで読み出すと
化けてしまうのですが、どのように対処すればいいのでしょうか。
WideStringでとりだして変換とかやってみたのですがうまくいきません。
他の人が作ったソースを引き継いでやっているのですが、
過去に作成されたバイナリ(D6で作成)ではちゃんと取得できているので、
ソース上で変換をかける必要は無いのかなと思ってます。
LANGDRIVERの設定一発でいけたりするのでしょうか。
またはD6でコンパイルすれば大丈夫だったりするのでしょうか
>>569 どう化けるのかがわからないとなんともいえないね。
>またはD6でコンパイルすれば大丈夫だったりするのでしょうか
環境があるのなら、まずは Try!
「あいうえお」だと「=?=?=?=?=?」です。「メvとかの文字と「?」が
交互にでる感じですね。D6は手元に無いのですが、業務でやっているので
必要なら買おうかと。
ちなみにDBがUNICODEでもSQLエクスプローラーで文字化けせずに表示
できるものなのでしょうか?それができれば出来そうな気が・・
572 :
デフォルトの名無しさん:04/01/07 18:38
>>568 へーTStringList.Create; が失敗するときってあるのね。
じゃ、それを考慮したプログラムを作成しないとダメってわけだ。
ま、それが失敗するようじゃ、終了させたほうがよさそうだけどな。
すいませんインストールするODBCドライバを別のにしたら解決しました。
ありがとうございました
>>572 一応超初心者向けスレッドだからいちゃもんは控えめにね。
(2G - 4) くらいメモリ確保してから、コンストラクタ呼べば、たいていの言語システムは
メモリ確保に失敗するんではないかな?
だから
>それが失敗するようじゃ、終了させたほうがよさそうだけどな。
ってことなので、それを考慮するくらいならほかの事を考えようよ。ってことで
Aでいいんじゃないの。っていっているのだよ。
この判断は TStringList.Create が、まず滅多に例外を起こさないことを前提にした議論なので
それを無視しないでくれ。
>>568 どちらが正しいか悩んでいたので、
教えていただきありがとうございました。
私は、TStringList.Create が例外を起こすということを知らなかったので、
そういうことがあるのだと 初めて知ったのだ。
だから、そういう危険性があるならば、それを回避する処理も当然必要だと
いうだけの話だ。
その例外が発生する頻度は、知らない。
だから、その頻度に関する議論を 私はしていない。
というか、頻度に関することは どこに書かれてあるのか知らない。
574で 見て そうなのかと思っただけだ。
もちろん、
>TStringList.Create が、まず滅多に例外を起こさないことを前提
これが 一般常識ならば、私は その常識を知らない初心者というだけのことだが。
追記
ちなみに うちのマシンでは、メモリが無い状態は、頻繁に起きる。
⊂,,,,,,,,,つ,,゚Д゚ミつ ネストが深くなるので。
という理由ならば
カキカエロ
@var
SL1, SL2: TStringList;
begin
SL1 := TStringList.Create; try
SL2 := TStringList.Create; try
finally FreeAndNil(SL2); end;
finally FreeAndNil(SL1); end;
end;
>577
もしソースを読める(理解できる)のであれば、TStringList.Create がどの程度複雑なことをして
どの程度メモリ等リソースを消費するのか考えて見ましょう。
2G byte のファイルを LoadFile すればまず確実にメモリ不足になりますよね?
そのことと、TStringList.Create が(メモリ不足で)例外を起こすことは分けて考えないと。
「私のマシンはよくメモリがない状態になる」と「TStringList.Create がメモリ不足で例外を起こす」は
同値ではありませんから。
一応、すべての関数/手続き/API は、失敗することがある。と心がけましょう。
次に、失敗/例外が起きたときに、どのくらい致命的なのか。どう対応することが可能なのか。を
考えて見ましょう。
超絶技巧な技を駆使して例外を補足するより、エラーダイアログを出してアプリケーションを終了したほうが
よい場合「も」あります。その判断は例外処理コードにはできません。
>578
それは本末転倒。頓智問答じゃないんだからぁ
⊂,,,,,,,,,つ,,゚Д゚ミつ
頓知問答や本末転倒とは思わないが?
柔軟に考えれば、Aでもそれほど問題がないわけで
俺からみれば、頓知問答は....
ま。いいか。
ネストがいやだから、インデントを削除しました。
ってのは技としてあるからね。
だから否定はしないけど、567 さんがほしがっている回答ではないとおもう。
ま。いいか。
583 :
デフォルトの名無しさん:04/01/07 22:01
テキストファイルの末尾に追加でデータを書き込みたいのですが、C言語のアペンドモードみたいなものはないでしょうか。
普通にWriterで書くと、元々ファイルにあったデータが消える新規書き込みになってしまいます。
スレ間違えました。すいません。
>>583 assignfile / append
ストリームなら
.seek で末尾に移動してから。
587 :
デフォルトの名無しさん:04/01/07 22:30
例外関係でふと思ったのですが
hoge := THoge.Create;
try
except
hoge.free;
raise;
end;
hoge.free;
raise使うときのメモリ開放って
これでいいんですが。
いいんですが。
じゃなくて
いいんですか?
です。
げげ、
今までTry〜Finallyの間でCreateしてた・・・・
そうか、複数Createするとき、最初にCreateしたのが逝くと、
もう一つはインスタンス作ってないから、そこでまた
エラーになるわけか・・・・
>>588 finallyだと
raiseするタイミングがわからないのです。
>>591 その場合は例外をキャッチすればいいのでは?
>>591 hoge := Thoge.create;
try
try
except
raise;
end;
finally
hoge.free;
end;
>>593 ちょっとfinallyについて勘違いしたみたいです。
もっかいhelp読み直して見ます。
595 :
デフォルトの名無しさん:04/01/07 22:47
ゲームのメインループを作る場合、どんなものが一般的なんでしょうか?
・Application.OnIdle + timeGettime + sleepなんかで、一定間隔でイベントが起きるように仕組む
・mmsystemを使って高精度なタイマを作る
くらいしか思いつかないのですが・・・。
DelphiXのTDXTimerなんか素敵だと思ったんですが、今や過去の品ですし。
TTimer使え。
ただしイベントの発生間隔の精度が悪いこと、処理落ちしたときに描画を端折ることを考慮しとけ。
>>595 ms単位で時間が取れる関数+ビジーループというのをどこかで見滝がした。
>>595 TThreadで、ぐるぐるループさせて、
イベント渡してあげればいいんじゃね?
なんのゲームかワカンネけど
>>596 あほか、mmtimerが出てる時点でTTimerなんぞお話にならんって事だ。
>>599 アホはお前。
mmtimerで高精度な間隔を要求する時点で間違ってるだろ。
>>600 高精度と高分解能の区別も付かんのか?
Windowsなゲームにハードリアルタイムなんぞ期待するバカがどこの世界に(略
ありがとうございます。
ひとまず、秒間30回くらいで確実にイベントが起こせれば良いのですが、
TTimerを試すとXP系でも破綻してしまい・・・。(平気で33msが50〜100msくらいに)
"時間測ってsleepしながらのonIdleイベント"とmmtimerが頭の中で戦ってます。
できれば簡単に書きたいので前者かなとも思うのですが、どのくらいの精度が
出せるのかわからなくて、、、う〜ん。
>>595 OnIdleではダメ。まずはスレッドの使い方を覚えれ。
それとタイムスケジューリングはとりあえずGetTickCountを使って見るべし。
begin
while True do begin
Application.ProcessMessages;
Sleep(1);
if 間隔チェック then
begin
UpdateData;
UpdateView; // 描画処理
end;
end;
end;
>>604 sleepの分解能も精度もかなりいい加減なわけだが。
>>605 間隔チェックのところでQueryPerformanceCounter使ってチェックする。
1ループの時間を計ってたとえば30msだったら次は33+3ms後に更新するように調整する。
mmtimer使おうがスレッド使おうが厳密な一定間隔で回すなんて無理。
>>606 昔DOSで似たようなことやったけどCPUがキャッシングしてくれたりして結構愉快になりました。
色々ありがとうございます(ノД`)
精度の高い間隔チェックの方法と、スレッドあたりを勉強してみます。
メインスレッド:描画準備&待機
サブスレッド:時間計測 で、一定間隔でメインに向けて「描け」メッセージを発射するって感じでしょうか。
あぁっそうか、全然ダメですね.... (´・ω・`
ゲームって 入力->計算->レンダリング->フレームバッファ表示
の順に処理して行くんだからその一部を非同期にするメリットはないと思うけど。
これ以上は、どんな描画をするとか、準備にどんぐらい
時間がかかるか、どんな動きをするかとかまでわからんと
答えようがないのではないかと。
>>611 描画ってのは得てして時間がかかるものです。
そうですね。スキルアップのために2Dのシューティングでも作ってみるか的な
考えなので、漠然としすぎてたかもしれないです。
絵の用意と描画はbmpからQuadrupreDでも使って楽にできますから、
> 1. 一定間隔でイベント発生
> 2. その間隔と入力内容をもとに座標計算
> 3. その結果を使って絵を構成して描画
でしょうから・・・問題は「一定間隔を発生する方法」と「描画がもたついて遅れたときの処理」でしょうか。
もうちょっと苦悩してみます(でもこれが案外楽しいw)。
>>614 一定間隔なのは描画と各種判定だけでよい。
そのほかの計算は待ちを入れずどんどんバッファリングしていけばよいのではないか。
>>614 ゲーム開発者じゃないので、間違ってたらごめん。
その例「だけ」でいくと、
描画のところは時間と完全同期じゃなくていいんじゃないの?
1 メインスレッドのループでは入力判定だけ行う
2 別スレッド、またはメインスレッド内で動くべき座標を計算
3 描画オブジェクトは、まったくの別スレで描画を続ける。
つまり描画は描画だけをTThreadがずっとしてて、どこに動く、
どんな描画をするという値を描画スレッドにプロパティとして
渡してあげればいいような気がする。このオブジェクトは、
ある一定期間(Wait)ごとにプロパティの値に従って描画をし
続けると。
必ず、このポイントに動かしたいというような時は、やはり
描画スレッドに何かしらのフラグと移動する座標を渡して
やって、移動しおえてフラグが消えるまで座標計算スレッド
は描画スレッドに値を渡さないとか。
ありがとうございます、描画と計算は分離しちゃっても良さそうですね・・・。
逆に、計算は一定間隔でしてデータを次々詰めていき、描く時間はわからないから
描画はベストエフォート(Max30FPS)で頑張るっていうのもアリかも。
精進します(`・ω・´)
>>617 その両方があっていいかと。
1)入力結果により、すぐに反映させるとき
→あたり判定により爆発とか
いままでのバッファをクリアして、ただちに目的とする動作をする
2)最後まで描画させたいとき
→特定地点まで必ず動かせたいとか
計算結果をバッファにため込んでいく
ただ、その描画する部分の属性をどれだけ作るかでデータの
受け渡し方法や計算する間隔もかわってきそう。
例えば動作に関して言えば、速度は初期速度や加速度、動きに
関しては最終目標到達座標と、そこにたどり着くまでの動き方
(放物線、直線、サイン波)等。
m秒間隔で計算して厳密に動かすというより到達点と動き方等を
描画するスレッドに渡して、あとは勝手に動いてくれってほうが、
計算する側もメインループも負担が軽いでそ。
どんな動きをさせたいかわからんけど、ある一定までジグヅク、
そこから逃げるように去っていくとか、厳密に計算でやるより、
バッファ1 ここ(ある一定地点)までこう(ジグザグ)動いて
バッファ2 ここ(ある一定地点)から逃げるよう(自機のいる座標
と反対方向に)に去っていく
という動作のできる描画スレッドを作ると計算も少なくて楽かも。
var
SL1, SL2: TStringList;
begin
SL1 := nil;
SL2 := nil;
try
SL1 := TStringList.Create;
SL2 := TStringList.Create;
finally
FreeAndNil(SL1);
FreeAndNil(SL2);
end;
end;
こんなんはだめですか
620 :
デフォルトの名無しさん:04/01/08 09:04
おいおい、初心者同士ケンカすんなよなー。
お互い、わからないことばかりなんだから、知らないことがあって 当たりまえ!
621 :
デフォルトの名無しさん:04/01/08 09:09
わざわざ使う関数すべてのソースを確認しているやつなんていないと思う。
だから、TStringList.Createが どういうソースなのか見てるやつなんて
ほとんどいないと思われ。
>>621 全部は確認しなくていいんだよ。
確認していない/できない場合は安全なほうに倒す。この場合は例外処理をちゃんとする。
確認できた場合/自分で作ったので振る舞いが予測できる場合は、省略できるかどうかの
見極めができるということ。実際に省略するかどうかは全体を見て判断するべきこと。
Data1: Pointer; Data2: Pointer; UseData: Pointer;
というようにポインタを設定していて、
if Data1 > Data2 then
UseData := Data1
else
UseData := Data2;
という処理を行いたい場合、どのように比較すればいいか
わかりません(上の例ではエラーがでます)。
比較の方法を教えて頂けないですか?
>>623 ポインタを比較したいのか、ポインタが差すデータを比較したいのか、北を非核したいのか?
>>623 Delphi ではポインタに対して適用できる演算(子)にはかなり制限があります。
C/C++ では、ポインタ = メモリの値ですが、Pascal では「何かを示すインデックス」でしかありません。
そのインデックスに「順序」があるとは限らない。というスタンスをとります。
だから、基本的に = と <> の二つの演算子しか使えません。ほとんどの場合、それで間に合います。
ポインタ型の実際の値は、Delphi では C/C++ と同様メモリのアドレスなので、
>if Cardinal(Data1) > Cardinal(Data2) then
と記すことでポインタ間の大小比較を行うことが出来ます。
>>619 ところでこれって(今まで出た例も)FreeAndNilである必要はあるのだろうか。
SL1.Free;でも十分な気がする。このあとにまだSL1やらを使う処理があるなら別だけど。
.Free で必要十分。
けど AndNil のコストはたかがしれているから、作法として使うことには問題ないでしょう。
629 :
デフォルトの名無しさん:04/01/08 12:40
コストって 何?
cost.
631 :
デフォルトの名無しさん:04/01/08 12:58
cost
━━ n. 値段, 原価; 費用; 犠牲, 損害; 【法】(pl.) 訴訟費用.
> AndNil のコストはたかがしれているから
このコストは 何だろうか?
Free に対して FreeAndNil の AndNil する部分の、
メモリ消費量、処理時間などの「コスト」。
質問です
リアルタイムにライン入力からの音にエフェクトかけるにはどうしたらいいでしょうか?
>>624-626 ありがとうございます。
ポインタが指すデータではなく、ポインタの変数に保存されている
メモリ(?)のアドレスそのものを比較したいのです。
>>626さんの方法で可能なのですね?ありがとうございます。
with文について教えてください
ML過去ログのdelphiの格言に、
「with文を使用するのは控えること」
とあるのですが、よく理由がわかりません
教えてください
with Button1 do with Button2 do
Caption := 'xxx';
with Button2 do with Button1 do
Caption := 'xxx';
で意味が変わってくるし、Captionの行だけ見ると何を操作しているのかわかりづらいから。
withに関連したバグがあることを理解した上で、
多重に指定しなければ普通に使っても問題ないよ。
>>636 ネストさせるとわかりにくいからなんですか
普通に使うように気をつけます
即レスありがとうございました
>withに関連したバグ
どんなバグ?バグはなかったはずだよ。
使い方を間違えると直感的にはわかりづらいコードを書いてしまう。ということだけでしょ?
>>638 withにバグがあるわけじゃなくて、withを使うことにより起こりやすいバグという意味だろ。多分。
>withに関連したバグがあることを理解した上で、
「withを使うことにより起こりやすいバグ」っていうのは単に使い方を間違えているだけだろ?
某 ML の、一部の人のミスケースを持ってきて With 文は悪と決め付けているだけ。
馬鹿が使えばどんな便利な道具もごみに化す。
使い方を間違えるなかったらバグなんて起きないな。
>>642 おまえは日本語がバグってるなw
チョソですか?
>>641 別に悪なんて言ってないが?
道具の使い方を間違えないように気をつけろといっているだけなんだが。
今日の教訓
べんりなcase文も使い方次第でゴミと化す
素晴らしいDelphiも使い方次第でゴミと化す
どんなに素晴らしいスレもカキコ次第でゴミと化す
646 :
デフォルトの名無しさん:04/01/08 20:54
あたりまえ!
647 :
デフォルトの名無しさん:04/01/08 21:03
withは便利だと思うがな。
でもネストさせると訳分かんなくなるから、使いすぎはよくないが。
ちょこちょこっと使う分にはいい感じ。
C#にはwithないから、不便だなと思うときもあるよ。
一部だけ取り出して全体の意をうやむやにする典型
with TStringList.Create do
try
Text := なんかString;
SaveToFile('セーブファイル.dat')
finally
Free;
end;
こういう使い方が出来ると過去ログにあったが、
正直素人にはお勧めできないな。
カンタン!Delphiプログラミングという本を参考書にして今日から勉強してます。
その本のP19、ifという文の解説に
「if a=0 then a :=a+1 else a:=a-1という文はaが1であればaに1足し、
そうでなければaから1を引くという意味」
というのがあったんですが、何がどういう理屈で『aが1であれば〜』となるのか、読んでも理解できません。
if a=0となっているのだからaが0であれば1足しそれ以外は1引くのでは無いのですか?
>>651 なるほど、ではただの誤植なんですね。
ありがとうございました。
みんな641の言う事は信じちゃだめ。
ライン入力の音声を2秒ほど遅らせて鳴らすにはどうしたらいいのでしょうか?
低レベルAPIがどうとか良く分からないんですよ。
2ch の書き込みと同様、ML のログも、頭から信じないようにね。
ちゃんと議論の筋道を読んで理解しましょう。
間違いの無いwithの使い方を理解してからwithを使えばいい。
つーか、文法/効用を理解して典型的な誤用(636みたいな)を知れば
こんなに便利なものは無い。と思うが。
「格言」なんてものを盲信するな。という例ですね
>>658 636の様な使い方で意図した動きにならない場合は
そのコードを書いた人に責任があるのは明確。
with の隠れた問題点はそこじゃない。
ちなみに
with Button1 do with Button2 do
は
with Button1, Button2 do
と出来る。
コードを書いた人に問題/責任のない、with の隠れた問題点とは?
散々外出なうんこ議論はフサスレでやったら?
659 が出て行ったらね。>> 661
>>660 659は「責任がある」とは言っているが、
責任が無いとは言っていないよ。
はいはい。議論できないのなら出てこなくていいよ。
あなたの過去の失敗はあなたの失敗であって、必ずしも一般化できるわけではないからね。
665も解っていない予感…。
withと言えばFindComponentをwithで囲んで泣かされた俺
>>667 それはとんでもない With のバグですね。
>>655 考えてみた
1)
TMemoryStreamを二つ用意する。
マイクから入力されたWaveデータを2秒間交互に保存する。
入力開始から2秒後にTMemoryStreamを交互に再生する。
2)
TMemoryStreamを一つ用意する。
マイクから入力されたWaveデータをTMemoryStreamの一番
最後に書き足していく。2秒後にTMemoryStreamの最初から
普通に再生。
マイクから入力されるデータはWave形式だから、
WAVEFORMATEXで縦横データサイズきっちり決まってる
から、それほど難しくないよーな気がする。
漏れなら1)かなぁ。
>>669 Waveデータの構造は知らないけど、TQueueはダメなのか?
リングバッファを正しく実装できるなら2)
1)でやるなら、バッファ自体は10秒くらいとっておいて処理。当然スレッド作って作業。
>>670 TOrderListの存在を知りませんですた(アセ
Add順とか、番号順に取り出してデータ吸い出せるなら、
それを使うのも面白いかも。
データビット数*周波数*チャンネル数*秒数(だっけ?)で
ループして、新たにTMemoryStream(GetMemでもいいかも)を
追加していき、Waveとして順番に再生、使用したらFreeすれば
よさげでつね。
タブシートにTMemm貼り付けると実行時エラーになるんですがなぜ?
TMemo ? タブシート?
タブシートってのは無いんだけど。
TabSet ? TabbedNoteBook? TabControl? PageControl?
>>676 675 であげたのは、全部標準コンポーネントなんですが...
TMemmがなんなのか説明しない限りはどうにもならないね。
>>675 TPageControl のメンバーの事かと。
あぁなるほど。
>>678 で、TPageControl にページの新規作成でシートを作り TMemo をそこに貼った分には落ちませんでした。と。
674 は TMemm なのか TMemo なのか。TMemo ならもう少し詳しい説明を。
キャプチャーを作ろうと思うのですが、VFWへのDLLを
ラップしたVFW.pasみたいなのって、Borlandからでたもの
ってないのですか?ネットで配布されているようなものには
どうもバグがあるので困ってます。
Borlandからでたものはない。
VFW はままこ扱いなんで、MS もあまり資料公開に乗り気じゃないし。
無視できない API なんだけど新設 API に誘導しなきゃいけないしね。
Delphi に収録されている各種 API の Delphi/Pascal 版の作成は Project JEDI の
人たちの物も多い
ttp://www.delphi-jedi.org/APILIBRARY:356378 の Video for Windows Interface Unit にバグがあるなら彼らにフィードバックしましょう。
>>681 お、ありがとうございます。私が持っているのより日付が新しいので、
もしやと思ったら、やっぱり直っていませんですた・・・
バグではなく、使えるはずの機能が使えないという問題です。
(これもバグといえばバグなのかもしれませんが・・)
function AVISaveVの引数「var ppavi:IAVISTREAM;」なんですが、
これは厳密には構造体へのポインタではなく、構造体を格納する
配列へのポインタなので、複数のポインタをDLLに渡せないという
問題が発生します。
これって報告すべきでしょうかね・・・
そこまでわかっているのなら報告してあげれば?
つーか、報告すべきかどうかなぜ悩むのか?
684 :
デフォルトの名無しさん:04/01/10 16:22
"data11","data12","data13"
"data21","data22","data23"
というようなCSVデータをひとつずつ順に
取り出すには行に対してと、列に対してのTStringListを
ふたつ使っているのですが、他の方法もあったら教えてください。
SL1 := TStringList.Create;
SL2 := TStringList.Create;
SL1.LoadFromFile('Data.csv');
for i := 0 to SL1.Count - 1 do
begin
SL2.CommaText := SL1.Strings[i];
for k := 0 to SL2.Count - 1 do
begin
Writeln(SL2.Strings[k]);
end;
end;
SL1.Free;
SL2.Free;
らくちん。
TStringList,TStrings等Delphiでは頭がTの文字から始まるのが
おおいですが「T」って何の略なんでしょ?
素朴な疑問・・・だれか教えてください( `_ゝ´)
そういったことは気にしない。というのが一番簡単 > 685
Type の略。という説が一般的。
>>687 気になりだしたら夜も眠れなくなるたちなんです(´・ω・`)
Typeですか、ありがとう
function Chinko(i:Byte): Byte;
begin
case i of
1:Result:= 2;
2:Result:= 1;
else Result:= 0;
end;
end;
これを数式で1行に出来ませんか?
知っているがお前の識別子が気に食わない
知っているがチンコバイト。
692 :
デフォルトの名無しさん:04/01/10 23:32
紙2001のように、他のアプリのOLEドラッグの開始・終了時にイベントを起こしたいのですが、
どうやったらいいのかさっぱりわかりません。
フックしてWM_MOUSEDOWN,WM_MOUSEMOVE,WM_MOUSEUPを監視してみましたが、
ドラッグしてるのかどうかまで解らないので、思うようにいきません。
どなたか教えてくれませんか?
693 :
デフォルトの名無しさん:04/01/10 23:43
>>692 気のせいか、前にも見たぞソレ。
デジャブか?
たしか、「ソレの作者に聞け」で終わったハズだが。
>>682 先頭を渡すだけで逝けるだろ。こういう宣言の仕方のAPIは他にもある。
使い方を知らないお前の無知さをバグで片付けるな。
>>693 解決方法ちゃんと出たよ。
OLEドラッグのキャプチャウィンドウで判定する。
>>694 そのポインタを指定すると、型が正しくないといって、
Delphi様にしかられるのでつが・・方法が悪いんですかね。
正しいやり方を教えていただけまつか?
ちなみに、その型を
type
AIAVISTREAM = array[0..1] of IAVISTREAM;
として、Interfaceユニットのfunctionの型をAIAVISTREAMと
変更して、このポインタを渡してあげるとうまくできます。
>>696 694 のようなヤシを相手にしちゃだめ。
「同じポインタなんだから、キャストすればコンパイルできる」
っていってるだけ。
戯言は無視して Jedi にメールしなさい。
プラグインやdll以外でjpeg2000を
利用するいい方法はありませんか?
クグってもなかなか見つからないので。
700
701 :
デフォルトの名無しさん:04/01/11 15:39
すいません。
Delphiの激初心者です。
Delphi7のプロフェッショナルを買いまして、ソフトのサンプルが乗っている本を見て
とりあえずこれ作ってみるかと思って作ってみたのですが
・フォームにTClientSocketを配置
ってのがあるんですが、なぜかコンポーネントがありません・・。
C++ Builderにはあるんですが・・・。
これはどういうことでしょうか?
702 :
デフォルトの名無しさん:04/01/11 15:41
>>701 プロなら確実にある気がします。
コンセントの絵。
ClientSocketがServerSocket.Socket.Connectionsの自分の番号を
知るにはどのように書いたらよいですか?
ClientSocketのヘルプファイルがないため質問しました。返答おねがいします。
>>703 レスありがとうございます。
私もそう思いました。
C++ BuilderではInternetのコンポーネントのところにあるのですけれど、
DelphiのInternetのコンポーネントを見てみたところ、ちょうどその部分がぽっかり
抜けてしまっています。
もしかしてなくなってしまったのか?と思ってしまいました。
すべて調べ上げてみたのですけれど、どうしても見つかりません・・・(泣
誰かにもらいなさい
>>705 消極的だけどコンポーネントのインストールでVCLのソースからインストールしてしまうと言うのもありではないかと。
個人的には非同期ソケットって大嫌いなのでWininetでも使うことを大推奨することが多いですが。
>>705 私のDel7Proにもないよー 仕様かも。
TidTCPServerしか使ってないので、気づかなかった。
でも、VCLにはありそうなんで、手打ちでCreateしてみたら?
[表示][コンポーネント一覧]でもでませんか?
Indyを標準でCD附属させたからショボイのは削除したのでは?
Indy使っとけと言うBorlandの明かな意思表示ですよ。
>>706-712 レスありがとうございます。
なるほど、Delphi7ではなくなっていたのですか。
全くわかりませんでした。
そんなことも調べられなかった自分が恥ずかしいです。
わざわざ調べていただいて大変なご足労をおかけいたしました。
本当にありがとうございました。
713 およびそこら辺のかたへ。> Readme をお読みなさい。
デフォルトでは,
TServerSocket と TClientSocket はコンポーネントパレットにも
インストールされません。これらのコンポーネントを使う必要があ
るときは,bin ディレクトリにある dclsockets70.bpl という名前
の設計時パッケージに入っています。
>>715 ありがとうございます。
パッケージのインストールからdclsockets70.bplを選択して実行したら
コンポーネントが使えるようになってました。
本当にどうもすみません。
DelphiでC++のinline関数みたいな事出来ますか?
Delphiのasmの勉強できるサイトご存知ないですか?
>>717 最適化の過程でやってるかも知れません。
て言うかあのキーワードって最適化の邪魔しないの?
当然邪魔をします。
しかし Delphi のコード生成ブロックが asm 節中のレジスタ使用状態を把握して
衝突しないようなコードが生成されます。
ほとんどの場合インラインアセンブラは速度の追求などのより強い最適化を行うために
使われるので、コンパイラの最適化が抑制されても問題はおきません。
asm 節以外では通常のコード生成が行われるため、副作用はあまりないでしょう。
それでも「インラインアセンブラを使う」ことは「速度が上がる」ことではありませんから
実際の生成コードを確認し、かつ速度を比較したうえで使うようにしましょう。
あ!
719 の「キーワードって最適化の邪魔しないの」を 718 の asm 文のことと誤解しました。
すみません。
ごめん
724 :
デフォルトの名無しさん:04/01/11 23:56
oo4oを使ってoracleのテーブル定義を取得したいんです。
オラクルのヘルプ見るとVBのサンプル見たいのはのってるんだけど、
それをまねてもうまくできないです。
OraMetaDataクラスのAttributeメソッドを使うところで落ちるんですが。
EOleSysErrorってのがでて メンバが見つかりません。ってなってしまいます。
FileStreamをいじる練習をしてて、画像の集合体を作って遊んでいます。
で、SaveToStreamを繰り返すとファイルにどんどん追加されていっておぉ〜とかやってるんですが、
LoadFromStreamを使って先頭から読み出すときは、「ここまで読んだ」というのを自前で管理しないとダメなんでしょうか?
>>725 んーと、ファイルポインタとかファイルハンドルと考え方は一緒なんだけどね。
>>726 了解です。先頭から「何バイト読んだ」を考えながらもうちょっと遊んでみます。
ランダムアクセスするには、考え方変えないとダメそうですね。
>>727 Positionプロパティって無かったっけ?
それで累計バイト数とか取れそうな気が。
そうですね、ありがとうございます。
が、Filestreamがjpeg+jpeg+jpeg...の形式だった場合、一度
TjpegImage.LoadFromStream(Filestream); をやると、positionが
ファイルの最後になっちゃうんですね。ガクッ
>>729 よくわからないが、
OldPosition ;= FileStream.Postion;
TjpegImage.LoadFromStream(Filestream);
FileStream.Postion := OldPosition
でどうでしょう?
困ったね。
size1+jpeg1+size2+jpeg2+size3+jpeg3
で保存して
sizeを取り出しておけばどお?
>>731 それイイ!ね
自分で構造体作って、その内容をSize1に入れて上げる。
Size1には自分の長さとJpegの長さが入っていて、それを
読むと次のJpegの読み出し位置とSize2の頭の位置が
わかるという仕組みでいいかもね。
>>689 function Chinko(i:Byte): Byte;
begin
Result:= IfThen(Byte(i1 - 1) < 2, 3 - i1, 0));
end;
function Chinko(i:Byte): Byte;
begin
Result:= 4 shr ((i1 shr 3) or i1) and 3;
end;
だれか、もっとスマートな書き方よろ。
>>689 function Chinko(i: Byte): Byte;
const Table: array[Byte] of Byte = (
0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
begin
Result := Table[i];
end;
どなたかddddのVer2.12もってるひといませんか?
持ってるがお前の態度が気に入らない
もしよければどこかのホームページにあったのなら
URLおしえていただけませんか???よろしくお願いします。
あぁ、それでいいです
2.13ってDelphi6以降しか対応してないのですか?
Delphi5でインストできませんでした;
javaでいうところのHashMapとかHashTableに相当する標準クラスは
用意されてないのでしょうか?
>>742 Contnrsユニットをくまなく探すのが吉。
Ver2.12ほしいですぅ・・・
>>742 12月号のCマガ読むと多少幸せになれるかも。
>>743 サンクス
TBucketListでいいのかな。あと
javaDocだとクラスのサブクラスにどんなのがあるか
すぐわかるけど、
Delphiのヘルプについてる継承ツリーだと自分の先祖しかわからないですが、
これはポスター見ろってこと?
>>747 なんか変なコード追加してcommitしても良いですか?
749 :
デフォルトの名無しさん:04/01/12 23:09
Formを一番トップレベルでアクティブウィンドウとして表示したいのですが、
どのようにすればよいのでしょうか?
今まではForm2.showで大丈夫だったのですが、処理がだんだん重くなってきたら
Formが表示されるまでの間に他のWindowを表示させたら新しく表示されるFormが
裏に回ってしまってアクティブにならないので困ってます。
>>732 あほ!
sizeは4バイト固定で jpeg のサイズを入れるんだ。
構造体はいらない。
jpeg以外のデータもあるなら、RIFF形式について学べ。
Unicode使いたいならDelphiはやめといたほうがいいよ。
煽りぬきで。
>>751 Tnt は標準ユニットです。US Newsgroup で Unicode 対応は?と聞くと、
Tnt を使え。と帰ってきます。
日本のユーザーグループしか見てないと 752 見たいなコメントしかつかないでしょう。
トリニトロトルエンなんて危なっかしい。
756 :
デフォルトの名無しさん:04/01/13 03:20
FAQかもしれません、適切な過去ログなどありましたら教えてください。
こういうのってありでしょうか?
procedure test;
var
slTest:TStringList;
begin
slTest := TStringList.Create;
if Edit1.Text = '' then
Exit; // 途中で抜ける
:
:
slTest.Free;
end;
つまりCreateされたTStringListは、関数を抜けるときにFreeされるかどうかということなんですけど
このslTestは、CreateされたTStringListの実体そのものなのか、単なるポインタ(と言っていいかどうかわかりませんが)なのか?
実に幼稚な質問ですみませんがお願いします。
Create された Class は関数を抜けるときに自動的にはFreeされない
slTest はポインタでもあるし実態そのものでもある。
C 言語とは異なるものとして、そういうものと受け入れてしまうほうがよいかと。
実際には slTest はポインタとして格納されています。コンパイラが文脈に沿って
ポインタのままか、または実体を参照するのかを判断しています。
>>758 ありがとうございます。
いままでは、必ずFreeをしていたのですが、おりこうさんだったりして?などとスケベ心がでてしまいました。
InsideDelphiを読んでも今ひとつわかりませんでした、助かりました。
すみません、もうひとつ
slTest.Add(sStr1);
slTest.Add(sStr2);
としたとき
slTest.Clear
とすると内部の値は破棄されると考えていましたが、それでよいのでしょうか?
単に内部にコピーされたsStr1,sStr2の値への参照が切れるだけでFreeされるまで存在するってことはないですよね
>>756 procedure test;
var
slTest:TStringList;
begin
slTest := TStringList.Create;
try
if Edit1.Text = '' then
Exit; // 途中で抜ける
:
:
finally
slTest.Free;
end;
end;
ってやるのが常套手段です。
try..と聞くとすぐ例外とセットで語られますが、finally以下は内部でBreakやExitを
呼んだときも確実に実行されます。
>>759 それはライブラリ製作者が考えることで、個々のプログラマが心配することでは無いのでは…
ってのは回答になってませんかね。
>>760 あ、これはアリなんですか。 恥ずかしながらlabelを使ってました。
ありがとうございます。
>>761 大域でCreateしておいて、使うたびにClearしていたら、実は溜まったりしてないかなとか考えてました。
>>759 どの程度の知識があるのかわからないとコメントもしづらいね。
C++ ではない C 言語の知識はお持ちに見えるが...
Delphi において文字列型はガベージコレクタのようなものが実装されているので、
文字列を文字列型として扱っている間はメモリ管理を気にする必要はありません。
TStringList は文字列を格納できますが、Clear メソッドが呼ばれるとそれぞれの文字列への
参照を開放します。もしその文字列を誰も使っていないのならばメモリ上からも開放されます。
>>763 ありがとうございます、理解できました。
長い間使っているのですが、実のところなにもわかっていないというのが現実です。
確かにInsedeDelphiには、Clearで参照を解放するとあったので改めて不安になりました。
ガベージコレクションがあるんですね。
ガベージコレクション「のようなもの」です。
String 型が使うメモリブロックは参照状態を管理されていますが、一般のポインタは
そのようにはなっていません。汎用ポインタを扱う TList などや、String 型をポインタに
キャストして使っている場合などは自分で管理する必要が出ます。
わからなければ使ってはいけない。という物ではないし。
もう少し、他人のコードを読むとよいかと思いますよ。
もし読めるのなら、RTL/VCL コードくらいは読みましょう。
>>765 今その辺を調べてました。ありがとうございます。
ただwindowsの文字列リソースを使っているのか独自に管理をしているのかわかりませんが。
使い方として、自分が間違って使っていないか、いつも気になっています。
>>766 おっしゃる通りです。時間が無くてというのはいい訳ですね。がんばってみます。
>>767 ここは初心者板なので...
なぜ気になるのか。とういうこと自体を、一度気にしてみるといいかもよ
新しくフォームを作るたびに、そのアプリで使用しているフォーム
と重ならない場所に自動的に位置を変更して表示したいのですが
(違うアプリのフォームとの重なりはokです)、自分のアプリが
作成したフォームのない場所を求められる方法ってありますか?
それとも、それぞれの位置とWidthとHeightで手動で計算する
以外には方法がありませんか?
poDefault
771 :
デフォルトの名無しさん:04/01/13 11:38
stringlistを使ってファイルから文字列を読んで、文字列処理をしているのですが、
ファイルサイズが数百キロバイトになってくると処理が数分かかり困っています。
私が、文字列を読んだり書いたりをいちいち繰り返す仕様にしているのが原因
なのですが、高速化するためにファイルをform.createのときに読み込んで文字列変数の
中に入れて処理すれば高速化できるだろう、と考えたのですが、変数の扱い方が分かりません。
同じprocedureの中だと
stringlist1:=tstringkist.create;
try
finally
stringkist1.free;
end;
でできますが、form.createで文字列変数をつくって、他のprocedureで文字列変数を
確実に解放したい場合にはどうしたらよいのでしょうか?
複数のprocedureにまたがってtry文を書こうとしたDQNなのでなにとぞ。。。
普通の初心者はグローバル変数として割り当てるってミスをするのだが...
stringlist1 をメソッド内ローカル変数からクラスのメンバーにする。という説明で
理解/解決しますか?
Form1Createの中でtstringlist.create
Form1Destroyの中でstringlist1.free
変数宣言はTForm1のprivateで
>>772 ClassのPrivateで宣言するのはもちろんだけど、この質問の場合、
destructor DestroyでStringList.Freeするという答えのほうが
近くないかな?
TFormを拡張するわけでもないのにconstructorをoverrideするのは
一般的とはいえない。OnCreate/Destroyでやるのがより一般的。
TFormを拡張してる。っていえばしてるんだが..
>>776 そう言い張りたいならかまわないけど
それならCreateとOnCreateの使い分けの指針を示してくれ。
そんなけんか腰にならんでも。
あんただって、何に対して「より一般的」なのかを提示してないんだから
お互い目くそ鼻くそだろ?
そのFormを継承する必要があればCreate/Destroy
そうでなければOnCreate/OnDestroyでいいと思うのだが、どうだろ?
超初心者向けだからあえて説明
で、まず違いは、Create はコンストラクタ本体。
OnCreate は、T(Custom)Form のメソッドのひとつ。
OnCreate でできることはコンストラクタでできるがその逆は不可能なことがある。
すべてのクラスはコンストラクタを持つが OnCreate は一部のクラスだけにしか存在しない。
OnCreate はコンストラクタが呼ばれた「後」に呼び出される。
だから厳密にはコンストラクタを拡張しているわけではない。(実際にはコンストラクタを直接拡張した場合と
ほとんど同じ動きをするように作成されている)
OnCreate はイベントとしてオブジェクトインスペクタに出てくるから GUI でイベントメソッドと関連付けることが可能。
これは歴史的な理由で機能拡張したフォームを IDE で使うのがめんどくさかったときの異物。
めんどくさいから、オブジェクトインスペクタで設定できるようになった。と考えてもよい。
TForm 以外の普通の暮らすには OnCreate はないから、普通に Create を拡張することになる。
また、そのクラスの性質として初期化が必要なデータなら、クラス作成時に初期化するほうが
コード全体の見通しもよくなる(可読性があがる。ということだ)
781 :
デフォルトの名無しさん:04/01/13 13:11
書き込み時意外はファイルロックしないものとして
あるプロセスでファイル読みとり中に、別のプロセスにより
ファイルの内容が書き換えられた場合、
読み取り処理にどのような影響がでますでしょうか。
たとえばファイルのポインタが矢印の位置で読み取っているときに
別のプロセスに最後のBがCに書き換えられた場合、
↓
@AB
↓
@AC
出力は@ACとなるものなのでしょうか。
かなり遅れましたが…
>>699 どうもです。
要するにゼロから作れ、ということですね?
C++用のソースは結構見つかったので、
そっちの方を解析してみます。
>>783 C++のソースがクラスじゃなくて関数だけなら
BCCでビルドすればDelから呼べるよ。
まぁDLLにすりゃいいんだけど。
785 :
名無しさん@Linuxザウルス:04/01/13 15:29
delphiでフォーカスがあるボタンの、ハンドルやキャプションを
読み取る方法は無いでしょうか?
すいません。
ブラウザを一生懸命作っておりますが、ぜんぜんわからないので教えてください。
URLを指定してそのアドレス先のHTMLファイルを読み出すところまでできたのですが
そこからどうやってやればいいのか、全くわからずつまずいております。
どなたか教えていただけますでしょうか?
あと、そういう解説しているページもありましたら教えてください。
お願いします。
サンプルミロ
789 :
デフォルトの名無しさん:04/01/13 21:39
Delphiの5で開発しています。
Google先生や、Delphi-MLの過去ログ等を参考にしながら、丸いウィンドウ(リージョン)を作りました。
そのフォームにはボタンやパネルなど色々乗っています。
このフォームからマウスが離れた時点でイベントをもらいたいのですが、どうにも上手くいきません。
procedureCMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
などのプロシージャを書いても、フォーム上の部品からは呼ばれるのですが、肝心のフォームから出たときには
呼ばれずに苦労しています。
Delphi-MLの過去ログを見ても意味がわからないヘタレに救いの手を・・・(´・ω・`)
>>781 わかりません。
プロセスが書いた気になってても、プロセス上のファイルバッファが書き換わってるだけとか、ドライバが書くのを待ってるとか、既に読み取りプロセスがキャッシュしているとか。
とにかくそういうのに依存するのは止めましょう。
テストした時はうまく動いても、実際に使う時に常に動くとは限りません。
791 :
デフォルトの名無しさん:04/01/13 23:51
Win2000/XPでプロセス情報などのスナップショットを取得する方法を教えてください。
検索したらNTはダメってのしか見つかりませんでした。
>>780 関連する全イベントを捕捉する必要がある。
>>791 WinXP/2K/NT4でプロセス情報などのスナップショットを取得する方法を教えてください。
ということですか?
>>787 「何が分からない」の?それを書かないと…。
出来たことからの、「先」は何?
確か、2ちゃんねら(?)で「タブブラウザ作成法」を分かりやすく
解説したページがあったと思うけど、今はもう無いのかな?
URLは失念。
後は…蛸薬師さんの所とか。
>>794-796 レスありがとうございます。
はい、ブラウザを一から作りたいと思っています。
HTMLソースを取得してからどうすればよいのか、がわからないということです。
>>797 パーサで解析して表示する。
Mozillaのソースが参考になるのかも。
TMediaPlayerで連続して途切れなくwavファイルをリピート再生したいのですがどうしたら良いのでしょうか?
Timerを使って繰り返して再生しようとしても1回1回の再生の間にどうしてもインターバルができてしまいます。
>>797 IEコンポの存在を知った上で0から作りたいのか?
いまどきそんな無駄なことをする奴は皆無とだけいっておく。
802 :
デフォルトの名無しさん:04/01/14 12:58
803 :
デフォルトの名無しさん:04/01/14 13:56
ポインタについて教えてください。
pTMyClass = ^TMyClass;
procedure MyProcedure_1(pClass: PTMyClass);
procedure MyProcedure_2(pClass: PTMyClass);
上のような宣言をしております。
MyObjのポインタをMyProcedure_1にわたして、
さらにMyProcedure_1からMyProcedure_2にも
ポインタを渡したいのですが、以下のようだと
エラーが起きます。根本的にポインタを理解していない
かもしれませんが、間違いをご指摘お願いします。
var
MyObj: TMyClass;
begin
MyObj := TMyClass.Create;
MyProcedure_1(@MyObj);
MyObj.Free;
end;
procedure MyProcedure_1(pClass: PTMyClass);
begin
MyProcedure_2(@pClass);
end;
procedure MyProcedure_1(pClass: PTMyClass);
begin
end;
Delのクラスインスタンスはすべて参照だよ。
だからいちいちpとか@とかなくていい。
つか入門書嫁。
var
MyObj: TMyClass;
begin
MyObj := TMyClass.Create;
MyProcedure_1(MyObj);
MyObj.Free;
end;
procedure MyProcedure_1(sender: TMyClass);
begin
MyProcedure_2(sender);
end;
procedure MyProcedure_1(sender: TMyClass);
begin
end;
806 :
◆y4sK/BWxfU :04/01/14 14:21
質問させてください。とあるアプリを作ってるのですが、そのアプリがアクティブではない状態でキーボード入力の判定を行いたいです。どうしたら宜しいのでしょうか。
807 :
◆y4sK/BWxfU :04/01/14 14:22
すみません、なんかリターンが認識してないみたいです。
808 :
デフォルトの名無しさん:04/01/14 15:32
ファイルが更新されたかどうかを早く確認する方法は無いでしょうか?
今まではファイルをstringlistに読み込んで長い処理をしたあとで、
元のファイルを別のstringlistに再度読み込み、Countを比較して判断していたのですが、
元のファイルが巨大になってきたら読み込みに時間がかかって困っています。
良い方法がありましたらアドバイスください。
809 :
デフォルトの名無しさん:04/01/14 15:45
StringList1からStringList10まであるときに
StringList1[1]からStringList10[1]までをいっぺんに読みたいんだけど
for文を使って読むにはどうしたらいいの?
for i:=1 to 10 do
begin
s:=StringListi[1];
end;
とやるとエラーになってしまいます。
>>808 FileSizeぐらいじゃだめ?
一字一句間違いないか検査するなら、TFileStreamで比較しても
だめかいや?
>>809 for i := 0 to StringList.Count - 1 do
begin
s := StringList.item[i];
end;
itemsだったかな?
>>809 まちがった・・
StringList[i].items[1];
スマツ
>>809 そりゃコンパイルエラーになる罠。
なんでエラーメッセージを書かないのか不思議だ。
>811
そんなstringlistはない、と弾かれてしまいます。
>>813 ごめんごめん
procedure TForm1.Button2Click(Sender: TObject);
var
StringList: array[0..10] of TStringList;
i: Integer;
s: String;
begin
for i := 0 to 10 do
begin
StringList[i] := TStringList.Create();
end;
for i := 0 to 10 do
begin
StringList[i].Add('test');
end;
for i := 0 to 10 do
begin
s := StringList[i].Strings[0];
end;
end;
これでどうだ。
>>814が正解っぽいこと書いてる(1つ多いけど)からそれ以外で。
>>813 本当にそういうメッセージが出たのか?
>未定義の識別子 : 'StringList'
でなくて
>未定義の識別子 : 'StringListi'
ではないのか?
この違いはお前に教えないといけないことは大きく変わってくる。
前者なら単純に「配列を使え」だが、後者なら「識別子は足し算してもダメ」
というもっと基礎的なことを説明しないといけない。
メッセージは正確に書け。
>>808 ハッシュで比較する
MD5なら20MBpsくらいでできるし、過去スレにもあるし、サンプル蔵にもある
MD5はbitレベルの違いでは同じハッシュ文字列が生成されるとか聞いたことあるんで
更に精度を求めるならSHA1とかでいいかと
タイムスタンプかShellChangeNotifierで十分だろ
>>816 両方読み込むのが前提なら、MD5よりそのまま比較した方が
圧倒的に軽いわけで。
すいません。
はやり自分がバカでした。
一から作ろうとするなんて・・。
IEコンポの使い方を勉強しようと思います。
すいませんでした
だからサンプルミロ
エクセルの表のような、タテ、ヨコのデータをメモリ上に
持ちたい場合の、便利な関数ってありますか?
やっぱり素直に2次元配列が便利ですか?
それとも、TGridあたりを利用したりもするのですか?
TObjectListx2のラッパー
A Boneの書き込みダイアログみたいに、フォームがDeactiveになったらClientHeightを0に
するところまではできるんだが、メインフォームをアクティブにしたときタイトルバーが後ろに
隠れてしまう。SetForegroundWindowしてもだめ。どうしたらいいのかな?
>元のファイルを別のstringlistに再度読み込み、Countを比較して判断していたのですが、
>元のファイルが巨大になってきたら読み込みに時間がかかって困っています。
元のファイルは"比較するためだけ"で読み込まれてるのだと判断したのだが
両方読み込むのが前提なのか……?
まぁstringlistで扱っていることを考えると大したサイズではなさそうだしな
どこかでこれに関するコードを見かけた気がしたんで探してみたが残念
日本語苦手
参考のために教えてください。
例えば、Classや構造体には、わかりやすいように
Tが先頭につきますよね。ClassのPrivate変数には、
fをつけてる人も多いと思います。
他に、例えばString、Integer、ポインタ、配列、オブジェクト
(Form、ComboBox等)、グローバルの場合、publicの場合・・・
これぐらいしか思いつかないけど・・・・、の場合、変数を
修飾する文字を書いたりしてますか?
もし書いている人がいたら、具体的にどのようにして区別を
しているのか参考までにお教えいただけないでしょうか。
>>814 駄目です。未定義の識別子stringlistとなります。
たしか、例えばLabel1からLabel10まで内容を
for i:=1 to 10 do
begin
Label[i].caption:=Capdata[i];
end
とかで、forみたいな方法を使って簡単に書く方法があったと思ったのですが、
どうすれば良いのでしょうか?
>>824 >>808が両方読み込んでいるようだから
>>816のMD5による比較の話が
出てきたはずなのだが、だったら直接比較した方が早いというのが俺の主旨。
読み込む必要がなく、ファイルサイズはタイムスタンプでチェックしたいだけ
なら当然
>>810や
>>817で十分というのは理解してる。
>>826 「駄目です」って
>>814はコンパイルしてもエラーが出ない。だから
お前が間違ってるわけだ。
たぶんFindComponentのことだと思うが、Labelの場合は使える。
しかし、お前のやりたいStringListの場合は使えない。
>>828 stringとstringsを間違っていました。きちんと動作できました。
失礼しました。
>>814さんもありがとうございました。
>>808 悪意を持って更新検知プログラムを騙そうとされることが無いなら、MD5よりもCRCの方が
圧倒的に早いぞ。
ファイルサイズ、更新時刻、CRCチェックで十分ではないかな?
>>825 特に書いてません。DelphiVCLソースを見ても特に決まりはありません。
↓これは昔からの慣習です。
--------
例えば、Classや構造体には、わかりやすいように
Tが先頭につきますよね。ClassのPrivate変数には、
fをつけてる人も多いと思います。
--------
>>825 Delphiにはそのような蛸な習慣はありません。
>>825 Delphi自体が相当に型チェックにうるさい言語なのであんまりあんまり気にしない。
ポインタにはPを付ける慣習もあるが、別に強制じゃないし。
834 :
デフォルトの名無しさん:04/01/14 22:12
808です。皆さんたくさんのレスありがとう。残業で遅れました。
今はファイルが更新されていないかどうかが分からないのでそれだけのために
再度ファイルを読み込んでいます。
元々のファイルが更新された場合、ファイルサイズが増える方向にしか変わらないので
ファイルサイズあるいはタイムスタンプをチェックするだけで十分です。
ファイルサイズあるいはタイムスタンプをチェックするにはどうしたら良いのでしょうか?
すいません、質問させてください。
初心者どころか入門者レベルの質問なのですが、
ボタンをクリックしたら別ウィンドウを開かせたいのです。
マニュアルを調べてみたのですけれど何がなんやらわからなくて困っています。
どなたかご教授お願いします。
Form2.Show/ShowModal
839 :
デフォルトの名無しさん:04/01/14 22:58
>>837 procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
end;
>>838-839 ありがとうございます。
できました。
Form2は「新規作成」から追加したのですが、それでOKでしょうか?
このような質問に答えていただき、まことにありがとうございます。
begin
1〜;
2〜;
※
3〜;
4〜;
end;
2文と3文の間(※)に数秒間のインターバルを空けたいのですがどうすれば実装できますか?
sleep()を使うとアプリが数秒間固まるだけで望んだ動作を行いませんでした。
あと3文の実行を、別の場所で変動している数が特定の値になるまで待つ、
というコーディングの仕方を教えてください。お願いします。
while expr do
begin
Application.ProcessMessages;
Sleep(1);
end;
すいません。
先ほどForm2の開き方を教えていただいたた者です。
なぜか保存して、また開いてコンパイルしてForm2を呼び出してみると
エラーが出てしまいます。コンパイルしたのにEXEファイルも作られないのです。
お分かりになる方、お願いします。
「ユニットを使う」ってのは、テンプレに書いといた方がいいかもな。
あと、「エラーが出る」って時は「どんなエラーか」ってのを書くと。
>>844 ありがとうございます。
エラーは
プロジェクトProject.exeがEAccess Violation クラスの例外を生成しました。
'モジュール 'Project.exe'のアドレス00459A66でアドレス000002F4に対する書き込み違反が起きました'
というエラーです。
私にはさっぱり・・・。
助けてください。お願いします。
>>845 ちょっと落ち着いて。
参照してないフォームにアクセスしようとしたんじゃない?
でも、新規作成で作ったフォームで、一度は開くことができて、
んで保存して、再び開いてみるとエラーってのは、普通だと
想像できないよね・・・
その間に何かいじったりしてないかなぁ。
「出来ました」とは書いてるけど、「フォーム2を開くことが出来ました」とは
書いてないような…。
>>845 Form2が自動作成の対象になってないとそういうエラーがでるよ。
プロジェクト−オプションで自動作成の対象にするか
もしくは、開く前に
Form2:=TForm2.Create(Self);
とやって、用が済んだら
Form2.Release;
とやるのが普通かな。
851 :
デフォルトの名無しさん:04/01/15 07:00
すみません質問させてください delphi7
tMemoコントロールのGetTextBufについて質問させてください
var P:pAnsiChar;
begin
GetMem(P,M_ITEM_01.Gettextlen+2);//2を足してるのは保険
M_ITEM_01.GetTextBuf(P,M_ITEM_01.Gettextlen);
M_ITEM_03.SetTextBuf(P);
//Pの内容に加工してファイルに出力するルーチン
FreeMem();
end;
memoの内容に改行がはいると
Gettextlenの値がメモに書き込まれている実際のバイト数より少なく、試しに
M_ITEM_03.SetTextBuf(P);により別のメモに書き出して実験sたところ
データの尻が切れます。
Gettextlenは当てにならないのでしょうか?
ヘルプにはTEXTプロパティを使えと書いてあるのですが
TEXTプロパティはtCaption型なのでメモリの上にまとめて展開いにくいと
思うのですがどうなのでしょうか?
それとも私がポカしているのでしょうか?
>memoの内容に改行がはいると
>Gettextlenの値がメモに書き込まれている実際のバイト数より少なく、
再現しないので、そのテキストを例示してくれ。
>TEXTプロパティはtCaption型なのでメモリの上にまとめて展開いにくいと
>思うのですがどうなのでしょうか?
試した上で言ってるのか?
853 :
デフォルトの名無しさん:04/01/15 09:00
>>808 >今まではファイルをstringlistに読み込んで長い処理をしたあとで、
長い処理ってなんだ?
読み込むだけならば
StringList1:=TStringList.Create;
StringList1.LoadFromFile('FileName');
とすれば 読めるだろ。
あと if文で StringList1<>StringList2 とかチェックしてやればいいんでは
ないのか?
>あと if文で StringList1<>StringList2 とかチェックしてやればいいんでは
ぉ〜ぃ
856 :
デフォルトの名無しさん:04/01/15 14:37
>>852 レス有難うございます。問題のテキスト列ですが
改行が4つ以上含まれると再現します。
>>TEXTプロパティはtCaption型なのでメモリの上にまとめて展開いにくいと
>>思うのですがどうなのでしょうか?
>試した上で言ってるのか?
これは試し方が不足していました。
自己レスっぽいですが、GetTextufは諦めて別の方法でやります
検証ありがとうございました
>>856 諦めるならいいけど、再現しないのが気になる。
問いたい
問い詰め
たい
小1時間
問い詰め
たい
これでGetTextLenは52になる。D7Pro+W2k。
>>857 漏れは何を問いつめたいのか気になる
何を問いつめたいか、問いつめたい 小一時間問いつめたい
>>846-849 ありがとうございます。
Form2はきちんと自動作成になっていました。
でも、さっき帰ってきてもう一度試すと次はちゃんと開くことができました。
エラーもでません。
昨日のエラーはいったいなんだったのでしょうか?
Windowsがおかしかったのでしょうか?
・・・不思議です。
860 :
デフォルトの名無しさん:04/01/15 18:44
>>857 こちらでも(小一時間)実験しました
(小一時間)テキストは末尾の改行を含むと52ですね。ウーム...
もしよろしければ、半角と全角を混ぜてみて検証してください
862 :
デフォルトの名無しさん:04/01/15 19:28
>>857,858
おまえら、つめたいやっちゃなぁ〜
メニューにDelphiのIDEみたいに「開き直す」を付けたいんですが
簡単にできるコンポーネントか仕組みありますか?
自分で管理して動的にメニューアイテム生成(または書き換え)して付け足さないといけないですか?
864 :
デフォルトの名無しさん:04/01/15 22:18
2chブラウザにあるタイトル/レス/取得時間/板の部分ってどのコントロール使ってるでしょうか?
>>864 何というブラウザか教えてくれないと…。
OpenJaneの場合ならListView。
866 :
デフォルトの名無しさん:04/01/15 23:27
「ありますか?」→「ある」/「無い」
「出来ますか?」→「出来ない」/「出来る」
好きなの選べ。
867 :
デフォルトの名無しさん:04/01/15 23:55
Delphiのポインタ操作について教えてください。
Pointer型のPbufferから10バイト目の値を取得するにはどう書けばいいんでしょうか?
CのようにPbuffer+10とやるとエラーになってしまって困ってます…
Pointer(PAnsiChar(Pbuffer)+10)
とか・・・
>>869 Delの場合、Pointer型に対する加減算は出来ない上逆参照も出来ない仕様になっている。
やるとしたら別の型付きポインタにキャストするしかない。PCharならばCライクな加減算が出来る。
それ以外のポインタ型の場合はInc/Decしか使えない。
逆参照はできるよ。
うまくいきました。thx!!
できません。
できるよ。
できます。実例をどうぞ。
var
p: Pointer;
begin
GetMem(p,10);
with TFileStream.Create('hoge.bin',fmCreate) do try
WriteBuffer(p^,10);
finally
Free;
end;
FreeMem(p,10);
end;
動きません。
動くよ。
どっちよ。
やってみろ。
879 :
デフォルトの名無しさん:04/01/16 09:16
ひとつ伺いたいことがあって筆をとらせていただきます。
Delphi6のパーソナルを使っているのですが、
TStringListを使ってテキストファイルを読み込むことはできたのですが、
テキストを書き込むことはどうやってやるのでしょうか。
Textname := 'sample';
Alltext[0] := 'この文章は';
Alltext[1] := 'サンプルに';
Alltext[2] :' =なってます';
のように格納されていて、
Textnameである、sampleに拡張子をつけてsample.txtに
Alltext[0]から[2]を1行ごとに書き込もうと思ってるのです。
StringList := TStringList.Create();
for i := 0 to High(AllTest) do
begin
StringList.Add(AllTest[i]);
end;
StringList.SaveToFile(TextName + '.txt');
StringList.Free;
補正してくんろ。
StringList.SaveToFile();ってのがあったのですね。
さっそくやってみましたらできました。
ありがとうございます。
ふつー、LoadがあったらSaveもあるんじゃないかとヘルプを探すものだが。
Load という言葉の意味が解らないのかも知れぬ。
超初心者向けなんだからお手柔らかに願いしますよm(__)m
ここは初心者上がりが超初心者を馬鹿にしたり見下しながら教えてやると言う暗黙の趣向
TStringList/TStringsは最頻出クラスだから
一度全メソッド・プロパティ斜め読みして
どんな機能があるか位は覚えておいたほうがいいよ。
機能を全部使ってみるサンプル書ければなおいいけど。