1 :
デフォルトの名無しさん :
2007/12/28(金) 09:48:27
テンプレ Q.turbo delphiとturbo c++は今でも共存できますか? A.↓
|
└―┐ ┌─―┐
┌─┼┐ ┌┐│┌─┼┐
└─┘└─┼┘│└─┘│
┌┼─┘ │
>>1 さん乙ですぅ
└┘ │
┌──────────┘
│
↓
↑ 乙です
>>3 使いたくなったら消して
別の入れなおせばいいじゃん
すいません、どこで聞けばいいかわからないのでここで質問させてください。 できれば適切なスレに誘導して頂ければ幸いです。 Delphiのドキュメントを作ろうとしてDoxygen + GraphViz + pas2doxを使用しているのですが 最新のVerにしたらうまく動かなくなりました。 Doxygen 1.5.4 GraphViz 2.16.1 ドキュメント自体はできるのですが、GraphVizで生成する図ができません。 Doxyfileの設定は DOXYFILE_ENCODING = SHIFT_JIS OUTPUT_LANGUAGE = Japanese INPUT_ENCODING = SHIFT_JIS で設定してあり、DOTファイルはUTF-8で出力されています。 具体的には Problems running dot: exit code = -1 command='dot' arguments='"aaa.dot" -Tpng -o "aaa.png"' とエラーが出ています。 ただし、手でdotファイルを作成するとうまくいきます。 dot "aaa.dot" -Tpng -o "aaa.png" (dot.exe:456): Pango-WARNING **: couldn't load font "Freesans.ttf Not-Rotated 10", falling back to "Sans Not-Rotated 10", except ugly output Warningは出るけどファイルはできている。 どなたか生成できてるよという方教えてください。
mousedownイベント用メソッドのButtonパラメータとShiftパラメータは どっちでも右マウスボタン押下か左マウスボタン押下かを判別できるけど どっち使っても同じこと?
>>8 え、codegearオッチャでいいのですか!?
>>10 うん。こっちは初心者向けなんで、あっちの自称含めた長老組のお仕事として投げた方がいいよ。
右押しながら左とかだとShiftじゃ判別できない。
だれかVirtualExplorerEasyListviewっていうコンポ使ってませんか? リポート表示にして例えば「更新日時」コラムクリックしてソートしても フォルダを移動したら元に戻ってしまうんです ソース見てもよくわからない……
たぶん何回も質問されたであろうが聞く。 TControlのRefreshはRepaintを呼び出してるらしいが、Refreshの存在意義は何?
実装的にも仕様的にも同じなんだから好きな方使っとけ。 よくは知らないが分裂したのには何か歴史的経緯でもあったのかもしれないな。 VCLではRefreshの方が多く使われてるな。 Repaintも中途半端に使われてるが。
派生クラスだとコントロールが持ってるデータ更新したりしてるかもしれん
>>17 Repaintは仮想だがRefreshは静的なんだよなこれが
全俺が泣いた
Q:TStringListでReadOnly:=trueみたいにするか、セルを選択できないようにする方法はありませんか? A:↓
TStringListをReadOnly? TListBox か何かの間違い? Enabled:=false では気にいらないんだよね
はい。 枠を選択できないようにしたいんです。 なぜかって言うと、選択した枠の中の字が反転して背景と同じ色になって見えなくなるんです。 見るだけだし、選択枠無くそうかな、と。
セルとか言ってるから TStringGrid じゃないかな。 ここはいつからエスパー養成所になった?
//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { TGridRect rect; rect.Left = 0; rect.Top = 0; rect.Right = 0; rect.Bottom = 0; StringGrid1->Selection = rect; } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow, bool &CanSelect) { CanSelect = false; } //---------------------------------------------------------------------------
ごめんなさい、TStringListじゃなくてTStringGridでした…
>>24 ごめんなさい、C++読めないです。
代入しかしてないやんけ!
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin CanSelect := false; end; procedure TForm1.FormCreate(Sender: TObject); var rect: TGridRect; begin rect.Left := StringGrid1.ColCount + 1; rect.Top := 0; rect.Right := StringGrid1.ColCount + 1; rect.Bottom := 0; StringGrid1.Selection := rect; end; こうやらないと左上が波線でっぱなしだったお/ ,' 3 `ヽーっ
>>27 ありがとうございます。
試してみたのですが、確かにセルが消えて質問どおりの答えが得られたんですが、
ちょっと質問のしかたが悪かったようです。
StringGrid1、StringGrid2、StringGrid3の三つのStringGridを一つのフォームに貼ってるんですが、
この場合に例えばStringGrid2を選択すると、StringGrid1、StringGrid3の選択セルの中の字が反転してしまい、(背景色と字の色が同じになり)字が見えなくなってしまうのです。
(セルの背景色・白、選択してないセルの文字色・黒、フォーカスを離れたStringGridの選択されていたセルの文字色・白)
だから選択セルを無くせば反転もしないか?とおもって選択セルを無くすよう試みたんですが、ただ破線が表示されないだけでやっぱり文字色が反転してしまいます。
ですから、問題を解決するには「フォーカスを離れたグリッドの選択されていたセルの文字色」を黒に指定できれば解決できると思うんですが、わかる方、いらっしゃいませんか?
>>28 TStringGrid.OptionsのgoRangeSelectはfalseになってるかい?
>>29 今falseにしてみたんですが、同じ症状が出ます。
StringGridがフォーカスを失うと字が反転してしまいます。
>>28 新規作成で、StringGridを3つ貼り付けて試してみたが、
(propはgoRangeSelect := Falseのみ、あとはデフォルト)
文字色は反転されないね。
StringGridのイベントにコードがあるなら、それが原因じゃない?
Delphi7、WindowsXPHomeでやっています。 一度XPManifestoをはっつけたことがあるので、これが干渉してるのかな?とか思ったりしてます。 全部はがして貼り直したんですが、やっぱ反転してしまう。困った。 もう少し試行錯誤してみます・・・
新しいプロジェクト、新しいフォーム上でやってみたら?
TBitmapをpf8bitで256色モードにした場合、 パレット番号を指定して描画する方法ってないでしょうか? TColorのヘルプを読んでも24bitで指定してパレットに近い色を 自動的に選択するという方法しかないようい見えるのですが。
36 :
35 :2008/01/04(金) 14:37:27
LineToやPolyLineで描画したいです。
DelphiのVCLは windowsAPIの程度の良いラッパーだから windowsがソレを提供してない以上、自分でやらないといけません。 256色モードという事はバイト単位にピクセルと見なして 自作のLineToを作ればいけます。 Bresenhamの線分描画アルゴリズム やDDA で検索して頑張って下さい
39 :
35 :2008/01/04(金) 16:44:05
>>37-38 やはり自力ですか。
Bitmap全体のピクセルを塗り分けるときはScanLine+SSEで書いたのですが、
描画部分が少ない直線は面倒だなと思ってました。
Bresenhamでやってみます。ありがとうございました。
たんにパレット番号と色の対応がつけばいいんじゃないの? 簡単だよ。
ここでいいのかわかりませんが、 Delphi6に付属のInterbaseについて質問です。 データベースへの接続に要する時間が、30秒くらいかかるのですが こんなもんでしょうか。 それとも普通はもっと短時間で接続されるのでしょうか。
>>41 データベースファイルの拡張子をgdbから他の拡張子に変える。(現行のinterbaseでは.idb推奨らしい。firebirdはfdbを推奨)
リモートならIPアドレスではなくホスト名が渡されるようにする、とか。
ご意見ありがとうございます。
>>42 やってみましたが、変わりませんでした。
>>43 サーバーの登録でローカルサーバーを選んだので、リモートサーバーでは
ないと思います。
IBConsole上から、ローカルサーバーを登録して、データベースエリアスとして、
サンプルのemployee.gdbを登録しているだけなのですが。
Delphi7からDelphi2007に乗り換えたのですが、ライブラリパスの扱いが違うのでちょっと困っています。 設計時には、ライブラリパスが通っているものにはアクセスできるのですが、 実行時は、ライブラリパスに追加しているにも関わらず、「***.dcu」が見つからないと怒られてしまいます。 プロジェクトオプションで「検索パス」に追加するとこの問題を回避できました。 しかし、プロジェクトを作る度に追加するのは面倒で仕方ありません。 Delphi7ではこのような問題は無かったので、なんとか以前のように使えないでしょうか。 何かご存じでしたらアドバイスお願いします。
□デフォルトチェックを入れたか、ツールオプションだったか 適当にどっか弄ったように思うけど、結局Delphiのバージョン戻してしまった方がスッキリしたりしたんで
無料で使えるDelphiの最新版はdelphi6personalですか?
>>45 デフォルトに設定するだけだよ
旧Delphiでも一緒
Updownコンポで値が2→13→24→32→…という風に値が変わるようにしたいのですがうまくいきません。 Minに2, Incrementに11を指定すると上のようにできるなるかと思ったのですが実際には 2→11→22→33→…と変わってしまいます。 何か簡単に解決する方法はないでしょうか。それとも自前で作った方が早いでしょうか。
Turbo には UpDown コンポがないんだよな・・
>Turbo には UpDown コンポがないんだよな・・ いや、間違い。SpinEdit がないんだった。
>>50 associateしないでOnClickで処理。
delphi7でActionListを使ってショートカットキーを割り当てているのですが、 これの重複のチェックをすることってできますか。それとも目視で確認する しかないのでしょうか。
一発では無理じゃね。 ShortCutToStr(TAction.ShortCuto)をTStringListに突っ込んでチェックするのが手っ取り早いと思う。
>>55 あーなるほど、そういう手があるか。ちょっと試してみる。ありがとう。
うーん、なんとかして Delphi 6 か 7 の製品版を手に入れたいんだが、なんとかならんかのう
今更Vistaにろくに対応してないのを入手してどうするんだ
60 :
デフォルトの名無しさん :2008/01/09(水) 03:06:45
全角の文字列を
>>59 さんみたいなアマゾン等のアドレスについている
%E3%83%9C%E3%83%BC〜…みたいな文字列に変換したり戻したりしたいのですが
どうしたらできるのでしょうか。
また、この変換は一般的になんと呼ばれているのでしょうか。
呼び名がわからず検索できないでいます。
URLエンコード/デコード TIdURI.PathEncode/Decode
64 :
61 :2008/01/09(水) 15:33:50
連投失礼します。 usesにIdURIを追加し、TIdURI.PathEncode/Decodeを使って見たのですが PathEncode あ → %3042 URIdecode %3042 → 042 となってしまい、エンコードした後、元に戻せなくなります。 また、「%xxxx」の形式でなく、「%xx%xx%xx」という形式にしたいのですが TidURIのプロパティをいじって見てもできそうにありませんでした。 調べて見たところ、HTTPAppと言うユニットもあるようなのですが Delphi.NET2005では使えないようでした。 (ヘルプを見る限りWin32だと大丈夫のようです。) 文字列を「%xx%xx%xx」の形に変換し、 かつ元に戻せるようにするにはどうすればいいでしょうか。
TIdURI.URIEncode/Decodeだべ
おっと、TIdURI.URLEncode/Decode か
67 :
61 :2008/01/09(水) 15:46:49
言葉足らずですいません。 URLencodeも使って見たのですが結果は同じでした。
んなバカな。俺の環境ではちゃんと出来たぞ。 コード晒してみ
69 :
61 :2008/01/09(水) 16:03:28
フォームにテキストボックス3個と ボタン1個を貼り付けただけですが…。 --- procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := TIDURI.urlEncode(Edit1.Text); Edit3.Text := TIDURI.urlDecode(Edit1.Text); end;
Edit1をデコードしてどうする。エンコード済みが入ってるのは2だろ。
71 :
61 :2008/01/09(水) 16:30:17
デコードだけのテストもかねていたので Edit1にエンコードした文字列を入力して変換していたこともあったので…。 混乱を招いて申し訳ないです。 なお、Edit1をEdit2にしても改善はされませんでした。 細かい症状としては、 「〜google.co.jp/search?q=あいう」 をURLEncodeすると 「〜google.co.jp/search?q=%3042%3044%3046」 となり、これをURIDecodeすると 「〜google.co.jp/search?q=042044046」 となってしまいます。
$3042って"あ"のUNICODEでは? $30 が "0" で、 それに42が続くから、 042 に変換されるのだと思う。
だれかわかるかた、教えてください。 Turbo DelphiのTTcpClientコンポーネントで、接続して送信まではいけたのですが、 受信の方法がわかりません。 サーバーからはデータが送信されているはずなのに、OnReceiveイベントが発生しないです。
>>73 とりあえずEtherealなりで通信がきちんとなされてるかチェックしる
くだらない質問で申し訳ないんですが、Cで言うINT_MAXみたいな変数の範囲を知る定数 もしくは関数は無いのでしょうか?
high(integer)
その他にもMAXINTだったかなんだったか そういう定数は宣言されてた気がする。
>>76-77 high関数は初めて聞きます
定数もMAXINTでビンゴでした
ありがとうございました!
Delphi5を使用しています 統合環境下で実行するとまれにフォーム上のコンポーネント(Label,Panel等)のサイズとフォントのサイズが一律に縮小されてしまいます 各コンポーネントのLeft,Topも同様にあわせて縮小された形になります 実行を終了させるとフォームデザイナ上では設計どおり何も変更されていませんが、一旦Delphiを終了させてプロジェクトを再読み込みすると縮小されています このような状況は初めてなのですが、原因は分かりますか?
TForm.AutoSize?
AutoSizeとは違うようです Formのサイズは変わらずに、Form上のPanelやButtonのLeft,Top,Width,Height,Font内のSizeが小さくなっています さきほどは縮小といいましたが、Leftの値がマイナスになっていることから ”縮小”ではなくて”数値の減少”の方が正しいような気がします
>>51-53 レスが遅くなってごめんなさい&ありがとうございます。
UpDownコンポをただのボタンと割り切って使うわけですね。
Delphi 2007を使用しています。 Vistaの機能であるタスクバーサムネイルに対応しているという話だったのですが、 作ってみたアプリを最小化してみると、タスクバーのサムネイルはこれまで同様 アイコンのみしか表示されません…なんか設定が必要なんでしょうか??
それDelphi製だけの現象? フォームアプリやダイアログはWindowsのお作法にきっちりのっとってないから いろいろ挙動が変なんだよな。
>>79 >>81 です
これが原因と特定できた訳ではないのですが
「Form1からThread1を作成,Thread1からForm1をオーナーとしてForm2を作成」
するときにSynchronize内でForm2を作成するようにしたところ不可解な現象が収まりました
そりゃVCLまわりは基本的にメインスレッドにやらせないと固まるよ。
>>85 だけじゃなんとも言えないけど、
Synchronize使うよりも、Thread1からForm1にメッセージを投げて
Form2の操作もしてもらった方がいいんじゃないかなぁ?
って俺がSynchronizeを使ったことがないだけなんだけど。
えええ、TThread使っててSynchronize使ったこと無いのか!? それは極めて少数派で参考にならないような。
>Synchronize使うよりも、Thread1からForm1にメッセージを投げて やってることがまったく同じな件
>>89 同じ?
PostMessageならメインスレッドを待たずに済むと思うが。
ああ、描画側の処理ね。それは同じだと思う。
初心者そっちのけどころか害にしかならない公開オナニーはGCスレでどうぞ
ガベコレスレ?
GameCube
Google Calendar
96 :
デフォルトの名無しさん :2008/01/14(月) 15:08:41
ある文字列がほかの文字列の(大文字と小文字を区別しない)部分文字列かどうかを調べるのに 関数を使用しようかと思ったのですが、何だか沢山あってどれを使っていいのか分かりません。 AnsiContainsText AnsiMatchText 部分文字列比較でない関数 AnsiSameText CompareText WideSameText 頭にAnsiがついてる関数がいまいちよく分かりません。どんな意味があるんですか? あと2バイト文字が混ざった文字列でMidStrなどを使うと変な文字列が返ってきたりするので Wideな文字列で扱いたいんですが、MidStrに相当するような関数ってありますか?
98 :
96 :2008/01/14(月) 15:27:45
どうもです。 全角を扱う場合はAnsi〜の関数を使う方が良いってことですか? 調べると「現在のロケールに基づいて〜」とかよく見かけるんですが。 日本ではShiftJISで扱われるんでしょうか・・・
Ansi〜はsjisを正しく処理すると考えておけばいい。 文字列関数はAnsi, i, Text/Strで多少類推は出来るが基本丸暗記だな。 文字列周りは混沌としすぎだ。
100 :
96 :2008/01/14(月) 16:23:03
分かりました、そうします。 ありがとうございました。
>>85 DelphiのライブラリのVCLは、マルチスレッドでの使用を考慮していないので、
Synchronizeメソッドを使うなり、自前でロックするなりしないと挙動不審になる。
後者の自前ロック方式は、前者よりも面倒だが自由度は上がる。
SyncObjs の TCriticalSection などを使う。
ただし、Webで情報を探すなり、使うときはマルチスレッドの本を一度よむなりして、
一度テスト的なアプリケーションで実験しておいた方が無難。
いきなり本番で使うのはさけた方がいい。
Synchronize みたいに馬鹿でも使えるようになってない。
まぁsynchronizeは糞だよな
>>90 PostMessageだと非同期になるので、スレッド間のデータのやりとりで結局調停だ必要になる
だからPostMessageで渡せるデータだけになる。
ポインタ渡しなんかは注意が必要で、安全に送れるのは整数くらいだな。
if FOnClick <> nil だと文法上「変数FOnClickの値がNil」じゃなくて 「メソッド FOnClick() を呼び出した結果がNil」になっちゃうから Assignedってのが必要になったんだと思ってたけど、そういう話?
具体的に誤動作するコードキボンヌ
@つけんとあかんなあ
素人過ぎる質問ですみません。 TreeViewを左クリックすると自動的に展開されてしまいます。 左クリックで選択、右クリックもしくは+をクリックで展開させるようには簡単には行えませんか? また、AutoExpandをfalseに設定しているのに兄弟ノードをクリックすると元のノードが閉じてしまいます。 勝手に閉じないようには設定できないのでしょうか?
ちゃんとウィンドウズの作法に従えよ
>>105 あれ?そうだっけ?
メソッドポインタは、@いらないからね、確かに
>>106 俺もいまいち不明
Shift-JISやUTF-16の文字コードを取得したいのですが そのような関数はありますでしょうか。 関数('あ','Shift-JIS') = 2422 関数('あ','UTF-16') = 3042 になるようなものがあれば嬉しいです。
WideCharに入れて、Ord 関数で整数にしてから16進数変換する AnsiCharの場合も同じだけど LeadBytes ならもう1文字取って 256倍して加算が必要
function widechar2int(c: widestring): int64; begin assert(length(c) = 1); result := ord(c[1]); end; function sjis2int(c: string): int64; begin assert(length(c) = 2); result := makeword(ord(c[1]), ord(c[2])); end;
>>112-113 書き忘れたのですが、.NETなので微妙に挙動が違うのか
Shift-jisのコードの前半2桁と後半2桁が入れ替わったので
以下のようにしました。
//UTF-16での文字コードを取得
function utf16code(c: String): String;
begin
assert(length(c) = 1);
result := INTtoHEX(ORD(c[1]),4);
end;
//Shift-JISでの文字コードを取得(cには全角文字を1文字のみ入れる)
function sjiscode(c: Ansistring): String;
var
tmp : String;
begin
assert(length(c) = 2);
tmp := INTtoHEX(makeword(ord(c[1]), ord(c[2])),4);
result := tmp[3]+tmp[4]+tmp[1]+tmp[2]; //なぜか順番が逆転しているので修正
end;
これで望むような動作になりました。
親切に教えてくださってありがとうございました。
115 :
デフォルトの名無しさん :2008/01/16(水) 14:39:41
関数の戻り値の設定方法はCとPascalじゃ大きく異なるよね どちらも一長一短だと思うんだけどcase分やif分で何度も begin Result := true; Exit; end; をやるのは冗長すぎるよね? Cだと return true; で完結に済むのに・・・ ひょっとして、私が知らないだけ?
>>74 遅くなりました。
通信はきちんとなされていました。
その後、いろいろ調べたり試したりしたのですが原因不明のまま。
しゃーないので、自前でスレッド書いてそこでReceiveln呼び出して受信するようにしました。
>>115 何度もreturn するんなら
procedure ExtCode(ret:boolean);//関数内関数の定義
begin
result:=ret;
abort;
end;
begin
try //例外の受け取り
case xx of
1: ExitCode(true);
2: ExitCode(false);
....
end;
except end;
end;
とかさ
というか、想像だけど途中終了するのは全部エラーで、帰り値でfalse を返したいとかじゃないの?
だったら 先頭で result:=True にして、途中は exit だけでいいと思うんだよ。
戻り値の設定と戻る動作を一発でやる方法はない。 実際冗長に感じる場面は何度も出てくるが我慢するしかない。
Vista使うと実行時にIDEを最小化・復帰するときのばたばたとしたウィンドウの再描画の処理が高速化される?
>>117 Resultには何度でも代入できますし読み出すこともできますから
この特長を積極的に使う方が簡潔なコードになりますよね
>>115 関数を抜ける前にtrue,falseに合わせて同じ処理をさせたい場合
goto文が役に立ちますよ
初心者がBASICからC,Pascalに移行するにあたって最初にすることはgoto文の封印ですが
goto文を適切に使わずに封印したままってのも初心者が陥りやすい罠です
VCL のどこかで goto 文を使ってるところある?
>>122 ナッツアンドシェルには、
1箇所だけ使っているところがあるって書いてあった。
昔の話なわけだけど。
その1箇所も多重ループからの脱出なんだとさ。
そういうわけで、むやみやたらに使うなと書いてあった。
じゃ、VCL も初心者がつくったのかもねw
今検索したけど GetMem.INCの function SysFreeMem(p: Pointer): Integer; しか存在を確認出来ず
TWebBrowserの、リンク先へ飛んだときの「カシャッ」って音は消せないんでしょうか?
コンパネのサウンドの設定
構文解析じゃgoto文が有効って話はCマガのプローガも言っていたな。 まぁ、使いもせずに盲目的にgoto文を否定しているヤツはgoto文を使わない方がいい。 そんなヤツのソースは汚いし、goto文の使いどころも分かるわけが無い。
ウゼェよ・・・ こんな低レベルなネタのときだけ大挙して沸いてくんな低能ども
まったくだ
>>123 > そういうわけで、むやみやたらに使うなと書いてあった。
まあ、まともな解説書なら、そう書いてあるだろうね。
>>121 > goto文を適切に使わずに封印したまま
Delphiで、「goto文を適切に使」う例って、何があるの?
gotoは隔離スレでやってくだしあ
どっかほかでやれ
TIdHTTPでSSLを使用したい場合は、どうすればいいのでしょう? Could Not load SSL Liblaryと表示されてしまいます。 TIdHTTPのIOHandleとTIdSSLIOHandlerは、関連付けしています。
>>134 ssleay32.dll、libeay32.dllを用意しないといけなかったような希ガス。
136 :
134 :2008/01/18(金) 01:21:12
TQueryで Query.ParamByName('testColum').AsString := 'testData ' と末尾に空白を入れたいのですが登録されません ソースを追っていても正しく入力されていますが SQLモニタで確認したところSQL実行時には削られているようなのです 何か回避手段がありますでしょうか? ちなみに' testData'の先頭空白はOKでした
試してないけど'"testdata "'はダメかな?
駄目でした・・・ 普通に"testdata "とダブルクォーテション付きで登録されました。
DBにもよるけど、VARCHARなやつは普通TrimRightされたような形で取り出される(と思っておいたほうがいい)。 どうしても空白文字を保持しておきたいなら(Ansi)QuotedStrしたものを格納してAnsiExtractQuotedStrで 元に戻すか、BLOBに格納するか、かな。
Turbo Delphiでの質問です。 AssignfileとResetで'C:\WINDOWS\pfirewall.log'を読もうとしたのですが出来ませんでした。 仕方がないのでreadfileでreadlnもどきを作ったのですが遅いのです。 なんとか速くする方法はないでしょうか? function read_ln (fh:Thandle; var buf:String):Boolean; var cha : Char; var size : Dword; var CR : Boolean; begin result:=true; buf:=''; CR:=false; repeat readfile(fh,cha,1,size,nil); if size=0 then break; if CR and (cha<>#10) then begin setfilepointer(fh,-1,nil,FILE_CURRENT); break; end; buf:=buf+cha; if cha=#13 then CR:=true; until cha=#10; if (size=0) and ((buf='') or (buf=#13)) then result:=false; buf:=trimright(buf); end;
まずはAssignFile版のコードを晒してはどうだろうか
TStringList.LoadFromFileじゃ駄目なの?
ログが大きくなってくると、 全部読み込んじゃうTStringListは使いづらいということかいな
ちなみに>142が遅いのはReadFileが1バイトずつ読んでいるからで、ここをバッファリングするようにすれば それなりになるような気もする。
147 :
142 :2008/01/20(日) 16:13:16
レスありがとうございます。
Assignfileのコードは以下のような感じです。
var f : Textfile;
var tx : String;
begin
Assignfile(f,'C:\WINDOWS\pfirewall.log');
Reset(f);
while not eof(f) do
begin
readln(f,tx);
{txへの処理}
writeln(tx);
end;
end.
これだとEInOutErrorが出るのです。
LoadfromfileでもEFOpenErrorが出てうまくいかないのです。
Assignfile版ですがcopyfileでpfirewall.logをコピーして読むという手で一応対処したのですが
もっといいやり方がないかなと思いましてここで質問しました。
>>146 まとめてlogを読み込んで後で改行コード毎に分割するって感じかな。
自分でファイルポインタを作って管理する形か。
その方法も検討してみます。
適切なフラグを指定してCreateFileでオープンしてTHandleStreamに渡して そこからLoadFromStreamする。
>>147 試してみましたが、ファイルの読み込みはできますね。
writelenでI/Oエラー(105)になりますが、この関数ってテキストファイルに書き込む
関数じゃないでしょうか。
f2: TextFileと宣言し、AppendまたはRewrite、writeln(f2, tx)とすれば動きました。
がこういうことではない?
今時、Assignfileはありえない
151 :
142 :2008/01/20(日) 19:33:55
>>148 ありがとうございます。LoadFromStreamというのを使って出来ました。
var fs : TFileStream;
var loadtxt : TStringList;
fs:=TFileStream.Create('C:\WINDOWS\pfirewall.log',fmOpenRead or fmShareDenyNone);
loadtext.LoadFromStream(fs);
>>149 え?こちらでは読み込もうとするとエラーになるんですが。なんでだろう?
あとwritelnの方ですがRewrite等はいらないです。
要はlogを読み込んで処理をし画面に出力するだけですので。
>>150 勉強不足ですね・・・ゴメンチャイ
CloseFile(f);
>>141 SQLサーバー相手です。
で、varchar相手だったのですが、Text型に変更し
AsMemoを使用したらなんとかなりました。
有難うございますー。
それにしても邪魔な仕様だなぁ
TADOConnectionを使ってmdbに接続してるのですが、実行クエリを呼び出すメソッドはありませんか? Executeでプロシージャ名を書いてもエラーが出てしまいます。
StringGrid1からStringGrid2へドラッグドロップする方法がわかりません。 ググッってみたらすごく長いコードが出てきて解析できませんでした。 例えばグローバル変数String1に値を入れて運ぶ、基本的なものを誰か教えてください!
>>155 procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
C,R:Integer;
begin
StringGrid1.BeginDrag(False,4);
end;
procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept:=Source=StringGrid1;
end;
procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
var
C,R:Integer;
begin
StringGrid2.MouseToCell(X,Y,C,R);
StringGrid2.Cells[C,R]:=StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row];
end;
>>156 ありがとうございます
>procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
>var
>C,R:Integer;
>begin
>StringGrid1.BeginDrag(False,4);
>end;
これ、内部でC,Rを使っていないのに、どうして宣言するんでしょうか?
>>150 Assignfileの代わりにはなにを使うのが今風ですか?
釣りだと思わないで教えてくだされ
TStreamと愉快な仲間たち
>>157 単なるゴミだろ。
それぐらいは察してやれ。
単に空気読めていないだけかもしれんが、わざわざ重箱の隅を漁るようなことはするもんじゃない。
相手が不愉快になるだけ。
>>160 素人にはわからん。俺も意味あるのかと思ってたし。
>Accept:=Source=StringGrid1;
この式もif以外に=が使えるんだ〜って勉強になったさorz
ここに勉強にくる連中ってそういうレベルよ。めんどくさがらず、教えてね♥
162 :
157 :2008/01/22(火) 07:59:50
>単に空気読めていないだけかもしれんが、 リアルでわからなかったYO!
163 :
156 :2008/01/22(火) 10:42:23
>>157 > これ、内部でC,Rを使っていないのに、どうして宣言するんでしょうか?
すまない、最初はマウスの位置で有効なセルを判定するつもりで
書いてたんだが、そこまで必要ないかと思いやめたんだわ。単にゴミということで!
164 :
157 :2008/01/22(火) 13:07:28
>>163 いえいえ、凄い助かりました。
ご好意、ありがとうございます。
>>161 定数や変数が値を持つように Source=StringGrid1 みたいな式(条件式)も値を持ちます。
式の値はboolean型(論理型)です(だから論理型変数Acceptにそのまま代入できる)。
式が成立するときはTrue、しないときはFalseです。
今回の例ではSourceとStringGrid1が同じオブジェクトを指しているときにTrue、そうでなければFalseです。
IEの進む・戻るボタンにあるような、右のタブをクリックするとメニュー が表示されるボタンを実装する方法はありますか? D5を使用しています ToolBar2000を使用すれば行けそうですが、VisualStyleとの相性も ありそうですし、当方はVistaの環境が無いため、できるだけシンプル に実現したいと考えています
事故解決しますた!
TToolButton.Style := tbsDropDown;
169 :
デフォルトの名無しさん :2008/01/23(水) 12:36:19
仮想デスクトップツールでスクリーンを切り替えると Delphi製アプリの最小化したウィンドウが左下に残ってしまうんですが、 ソースのないアプリはともかく自前のアプリでそれを防ぐ方法はないですか?
Form1に投げられたWM_SYSCOMMANDのSC_CLOSE, SC_RESTORE, SC_MINIMIZE, SC_MAXIMIZEをApplicationにリダイレクトしてみては? 実験してないけど。
171 :
デフォルトの名無しさん :2008/01/23(水) 22:08:54
TLabelにファイルパスを表示したいんだけど、MinimizeNameが使えない 自前で書こうにもTextWidthが拾えないから書けない どれが一番手っ取り早い? ・TCustomControlでゴリゴリ書く ・TStaticTextでウィンドウハンドルを取得しWindows.GetTextExtentPoint32 でTextWidthを取得。後はゴリゴリ書く ・その他
>>171 ・TLabelにファイルパスを表示したいんだけど、MinimizeNameが使えない
・自前で書こうにもTextWidthが拾えないから書けない
このふたつの前提が間違ってることを認識する方が手っ取り早い
>>171 ラベルコンポ(TLabel)はCanvasプロパティが使えますので
MinimizeName関数もキャンバスのTextWidthメソッドも使えます。
False を返して欲しいのに Trueが返ってきてしまいます。 文字列の比較でうまく行ってないようなのですが どう書き換えたらよいでしょうか? for文周りが問題だとは思いますが何が間違ってるのかわからないんです procedure TForm1.FormCreate(Sender: TObject); begin if (hantei('string')) then Form1.Caption := 'ok'; end; function Tform1.hantei(hoge: string) : Boolean; var i : Integer; begin for i := 0 to 2 do begin if (hoge = 'string') then begin Result := False; break; end end; Result := True; end;
175 :
デフォルトの名無しさん :2008/01/24(木) 00:19:44
breakの挙動をヘルプで調べろ ついでにexitも調べろ ついでにブレーク張ってステップ実行することも覚えろ
>>173 TLabelはCanvasプロパティを持っていないとばかり思い込んでいました。
サンクス!
クライアントのOSがVistaかどうか判別する関数とかありますか? Vistaかどうかで処理を変えたいのですが・・・
>>174 breakはfor をbreakするだけだからね 関数の中身は
begin
for i := 0 to 2 do begin
Result:= not (hoge = 'string');
if not Result then exit;
end;
end;
こう書いたらどう?
>>177 GetVersionExがNT6.0返してきたらVista
Win32PlatformやらWin32で始まるグローバル変数を見ればよし。
>>179 自分ならこう書く
function Tform1.hantei(hoge: string) : Boolean;
var
i : Integer;
begin
Result := False;
for i := 0 to 2 do
if (hoge = 'string') then Exit;
Result := True;
end;
だから、何で3回も比較してるの?
185 :
183 :2008/01/24(木) 17:46:50
確かに言われてみればそうだね・・w function Tform1.hantei(hoge: string) : Boolean; var i : Integer; begin Result := hoge = 'string'; if Result = False then Exit; for i := 0 to 2 do begin (何かしらの処理) end; end;
↑ミス Result := hoge <> 'string';
187 :
デフォルトの名無しさん :2008/01/24(木) 17:58:13
ただのサンプルを必死にチューニングとか・・・
宿題スレ池
190 :
188 :2008/01/24(木) 19:41:50
ごめん、Rubyスレと間違えた orz
結局174が一番素直なコードだったという
? 意味もなく3回も内部で繰り返して、 意味もなくresultにfalseを入れているのに?
プロジェクトソース(*.dpr)に、Form1などで使うグローバル変数を含めることはできますか? できる場合、プロジェクトソースにどのように変数宣言したらよいのでしょうか?
できません
例え一文でも理由がなければbegin...endは省略しないでください。 判定はTrueの式で行ってください。
>>193 ようするにdprなローカル変数は定義出来るけど
他のユニットはdprをuses出来ないからどうしようもない。
もちろん、Form1のメンバーにポインタを入れて、参照させるとかなら出来るけどね
だから、.PASだけのユニットを作って、それを皆が参照すればいいんじゃないの?
>>195 を補足すると
ようするに
>>174 の問題は、
1、全くムダに3回ループしてる (たぶん比較したいのが3つあったのだろ)
2、一致してる時にfalseを返そうとしている
3、にもかかわらず、常にtrueを返すように後で行っている
論理の一貫性が無いと、
>>185 のように論理を読み間違われ易い
3つの文字列のドレかと一致するかという判定なら
for i := 0 to High(master) do begin
Result:= master[i] = hoge;
if Result then break;
end;
3つの文字列のドレでもないという判定なら
for i := 0 to High(master) do begin
Result:= master[i] <> hoge;
if not Result then break;
end;
こうなるけど、判り難くなるでしょ?
breakの挙動を調べる為だけのゴミコードをネチネチ添削するスレはこちらでございますか?
神経質だな
Abortってあまり多用されないものですか?
コンソールアプリ作る時は、処理途中で、コレハダメだという状況なら使ってるけどな。 GUIアプリだと、そういうわけにはいかないけど
多用はしないが処理のキャンセル時に多重ループ、多重呼び出しを一気に抜けられるから普通に使うよ。 フォームアプリの場合とりあえずAbort投げとけば エラーダイアログ等を出さずに通常の状態に制御が戻るようになってるし。
>>200 別のものと勘違いしてそう。
Abortって、EAbort例外を出す手続きでしたっけ?
強制終了は、Halt。
>>193 私も
>>195 と同意見で別にユニットを用意してそこに集約させる感じですね.
ちなみに私の場合、アプリ全体に関する情報はグローバル変数の代わりにデータモジュールを使っています。
諸々の情報はデータモジュールのプロパティとして持たせています。
Abortしらんかったw
みなさんBDEで使うsqlora8.dllはどのバージョンを使ってるんでしょうか?
失礼、忘れてください。 しかもバージョンも書いてなかた。
Abortはこんな時によく使うんだが変だと言われた。 SL := TStringList.Create; try if testbool then abort; {何かいろいろな処理} finally SL.Free; end; AbortのところでExitしたいが開放しないとあかんな〜ってな時
>>207 try〜finallyの間ならexitしても必ずfinally〜endは実行されるのでその配慮は無意味
( ゚д゚ ) 変てそういう意味かw ありがとん
try-finally節でのExitは専用の例外を発生させる処理に変換される
212 :
174 :2008/01/25(金) 22:07:36
みなさんレスありがとうございます。 breakで抜ける範囲を間違えてしまっていたのが問題だったんですね。 >3回ループ 既に書かれてる方がいますが、 書きたい処理では3回(というかStringの配列全部)判定する必要がありました 問題の切り分けのために数字のみに置き換えたのですが、 そのことを書いておくべきでした。すいません…。
213 :
デフォルトの名無しさん :2008/01/25(金) 23:15:17
下のコードを実行するとエラーが発生してしまいます strl に Items を参照渡しして それを Free しちゃってるからだからだと理由はわかったのですが どの解決方法を取るかで悩んでいます strl.Free をここで呼び出さずに終了時のDestroyで呼ぶのと 配列の個々の値をforループで渡すのとどちらがDelphiの流儀に沿っているでしょうか? もしくはもっと良い解決方法がありましたら教えてください procedure TForm1.AddTest(str: string); var strl : TStringList; begin strl := TStringList.Create; try ComboBox1.Items.Add(str); strl := TStringList(ComboBox1.Items); strl.SaveToFile('test.txt'); finally strl.Free; end; end;
言ってることが違う違う。 コード自体がめちゃくちゃ。 strl := TStreingList.Create; で確保したインスタンス(すなわちオブジェクト)のアドレスが、 strl := TStringList(ComboBox1.Items); で、他のインスタンスのアドレスに代入され直されて、どこからもアクセスできない位置に消えちゃってる。 しかも、このキャストはおかしい。 Delphiにおいて、クラス変数は参照渡しなのでな。 ここらへんを理解できると中級者以上なので、ここらへんの詳しい説明はこのスレでは難しすぎるので書かない。 そのかわり、以下に正しいサンプルを書いておく。
>>213 × strl := TStringList(ComboBox1.Items);
○ strl.Assign(ComboBox1.Items);
とか。
根本的に何か間違ってる。 begin ComboBox1.Items.Add(str); ComboBox1.Items.SaveToFile('test.txt'); end; でいいんじゃね?
procedure TForm1.AddTest(const str: string); //その1 var strl : TStringList; begin strl := TStringList.Create; try ComboBox1.Items.Add(str); strl.assign( ComboBox1.Items );//その2 strl.SaveToFile('test.txt'); finally strl.Free; end; end;
こんな感じ。
もっと簡単に書くと、
>>216 の人が書いているのでおk。
クラス変数においては、代入は、アドレスの代入なんよ。
すなわち、
strl := TStringList(ComboBox1.Items);
というのは、ComboBox1.Itemsのアドレスを代入することになってしまう。
で、中身をコピーしたいときはどうするかというと、
たいていのクラスでは、assignメソッドが用意されているので、これを使うと大抵うまくいく。
あと、文字列を渡すメソッドを作るときは、その文字列を変更する必要が無い場合は、 procedure TForm1.AddTest(const str: string); ってなconstを付けた書き方をしてやると、わずかに動作が速くなるので、Delphiのマニュアルでも推奨しているはず。
>>214-218 ありがとうございます
Assignなんて便利なメソッドがあったのですね
一番楽かつ意味もわかりやすい
>>216 を使わせていただくことにします
>>219 なるほど、そんな小技があるのですね
早速使えるところに使ってみることにします
>>211 しらなかった。
内部実装はそうなってるのか・・・
俺は構造体以外には、const 引数は速度目的では、あんまりつかわんなあ と思いつつ、ソース見たら、弄るな危険の保険の意味で値型にはconstつけまくってた
まあ、Delphiの文字列は参照カウント付きだからな constつけて参照カウント気にしなくていいよと明示してやるのは、 コンパイラにも開発者にもわかりやすくてよいな
何言ってんだ?constつけても参照カウントは増えるぞ 渡す際に参照カウントを増やさないのはout
sizeofってCと違って関数っぽいから、実行時に毎回関数呼ぶの?
んにゃ、実際の関数じゃないはず。 コンパイルしたら定数に置き換わるような。
速度気にするならCPU窓でチェックしろと
>>211 目から鱗が落ちた
じゃ、例えばスレッド作成してTerminatedプロパティをポーリングしている場合
finnaly節にメモリの開放とか書いちゃってExitで抜けるのは使い方?
try節の中で例外とかスローしていないんだけど。
nihongode ok
>>211 よく使っているので、まさかそんな実装のはずはないと思って確かめた。
Delphi2007で内部処理を確認したけど、決して例外を生成しているわけではなく、
まずsystemのtryfinallyexitという関数を呼び出し、そこからfinally〜endの部分を呼び出している。
もし例外を生成するような実装だったら、繰り返し処理だと遅くて使い物にならないよ。
例外処理はものすごくコストが高いから。
いくらなんでも例外は生成せんだろ。 except節は実行しないし。
tryfinallyexitはインストールされた例外フレームを呼び出す処理だけど? コードも読めないのによくでたらめ言えるね。
スレが荒れる話題となったgoto文の処理があるんだけど 関数を抜ける場合にtrue,false,errに合わせて処理を行ってから抜けさせたい 場合は、goto文の代わりに例外処理が使えるの? 現状だとgoto文を使わない為冗長になりがち(同じ処理が何度も出てくる) なんで、コストが問題なければ例外処理でやっちゃったほうがコードが すっきりすると思うんだが・・・
例外使うならerrだけにして、true/falseは関数内関数にして、その関数でtrue/falseを返すのも 方法かもね
OSの例外処理と、言語組み込みの例外処理をごっちゃにしているなこのスレ。 とにかく、このスレの話題ではない。
>>240 Delphiで用意されている例外処理はどっちなんだ?
両方
>>238 構文でしかないから、使いやすければ使えばいい
例外という名前のために誤解されやすいけど、エラーのために存在してるものではないし
例外にコストがかかるとか言う馬鹿に限って仮想メソッドはなんの躊躇いもなく使う 不思議なものだ
なぜこいつらは初心者スレを荒らし続けないと気が済まないんだろう。 専用スレ立てなよ。
自前で作った関数を複数のユニットで共有するにはどうすればいいのでしょう? VB.NETのモジュールみたく、ぶっこんどきゃクラス間で共有できるようなことがやりたいのですが。
その関数の書かれたpasファイルをusesに追加する。
自前の関数のforward宣言をinterface部に書いておいて、別のユニットのuses節にそのユニット名を書けばいい。
>>244 いや、例外にコストがかかるのは常識らしいよ
Delphi6なんたらバイブルっつー分厚い本にもそんなこと書いてあったような
>>245 結局、try節のexitからは、例外処理は呼び出されていないでFAだな。
そもそもこのスレ向きの話題じゃないんだかれ、もうこの話題は避けてくれよ皆の衆。
>>250 きっと自分で実験したことがないんだよ。
例外処理と仮想メソッドの負荷には同等に並べらないほどの歴然とした差があるんだから。
>>251 正解はOSの例外処理が呼び出されている
不正解。荒らすな。
例外処理が遅いだって? お前らの書く糞みたいなコードよりよっぽど速いから安心しろw
不正解。荒らすな。 不正解。荒らすな。 不正解。荒らすな。 不正解。荒らすな。 不正解。荒らすな。
メンヘラーズ大活躍
>>245 >そもそもこのスレ向きの話題じゃないんだから、もうこの話題は避けてくれよ皆の衆。
確かにそうだけど、初心者ほど気になる人は気になる話題だったかと。
>>290 じゃあ、説明すると
try
// 直近の例外の位置が fs:[0] に対して更新される(リンクリスト方式)
// そこにfinally位置のアドレスが登録される
if ? then
exit; //ここで call @TryFinallyExit 7行の命令
//TryFinallyExitで 呼ばれた関数内で fs[0]に登録された 例外位置のサブルーチンコールがされる
//eixtで抜けない場合は、例外を元に戻して、finally部のret命令で
//finally 〜 end の次部分を通るようにスタックを準備
finally
ここが実際はサブルーチンになる。
end;
だから、自前でfinallyの部分のサブルーチンを呼び出すのと同じ程度+αだけ負荷が増ええてる。
内容が一番新しいできれば日本語のWin32APIの.hlp形式のヘルプが欲しいんですが 入手できる場所があったら教えてください。
失礼
>>260 だから、フラグを見るだけとか立てるだけのように、
極端に処理の中身が短いなら、確かに多少コストアップになるけど
それなら、わざわざtry finally を使う程もないわけで
>>207 のように、
メモリの確保、開放のように、ソコソコの負荷をどっちかでかけてるなら、
これくらいの負荷は屁でもない。
あるいはセマファーの開放のように、必ず消したいならフラグ1つの為に
であってもfinally を使うのは利益になる。
なんかまた初心者を混乱させるようなことを言っている奴がいるな。 まとめ。 ・try finally節のexitは、例外を生成していない。 ・繰り返しの中で、if節で分岐させる代わりに例外投げるようなのは馬鹿。 例外投げるってのはたくさんの処理をする重い処理だから。 仮装関数の比ではない。 ・try finally自体はどんどん使ってOK。 ・このスレで、try finallyのなかにexitを書いて重くなるとか問題視している奴はいない。
質問者不在のアスペルガー健忘症ループはまだまだ続きます。
例外を投げると重いというのは、ようするにインスタンス作成が重いって事。 例外の機構そのものは、仮想メソッドより少し重いが動的メソッドより軽い。
>>268 > 例外を投げると重いというのは、ようするにインスタンス作成が重いって事。
違う。
だから、違うとだけ書くから、またレスが続く事になる。
しっかり説明して、問題を終わりにしろよ。
>>265 の言ってる
>・try finally節のexitは、例外を生成していない。
という文脈での例外は、 Exception.Create のようなインスタンス作成と
RaiseException というWindowsAPIの呼び出しが行われる例外。
RaiseExceptionそのものは、それほど重い処理ではない。
C言語でいうSETJMP/LONGJMPと同じ類の処理だ。
メモリを確保する処理の方がどちらかというと重い。
だから
>>268 はそう表現したのだろう。
高度な話題から低級な話題に戻して悪いんですが const MASK $CC; var b: BYTE; と宣言した状態で b := not MASK; もしくは b := not BYTE(MASK); だと”範囲外の定数式です”と叱られ b := BYTE(not MASK); もしくは一旦代入する b := MASK; b := not b; だとOKなんですが b := not BYTE(MASK); がダメな理由が理解できません
MASKが型なし定数(真の定数)なのでnot BYTE(MASK)はIntegerで計算されるから。
ありがとうございます。 この場合、真の定数はBYTEへのキャストが行われないと考えていいのでしょうか? またnot MASKがBYTEにキャストできるのはnot演算子によってInteger型になったため真の定数では無く キャストが行われたと考えればいいのでしょうか
もう一つ質問です 先のパターンでは const MASK: BYTE = $CC と型付で指定すれば事が足りますが case b of MASK: とは使用できなくなります この場合は真の定数として宣言しておいて、代入するときには毎回 キャストを行うのが一番スマートなのでしょうか?
-Byte(1) も同じだね。 単なるコンパイラのバグというか、そこまで考えてなかったよって事だろ。
>275 深いルールがあった訳じゃないんですね。 分かりやすい説明ありがとうございました!
型の格上げルールに従ってるだけ。-も演算子だからね。 >274 caseで使うためにはconst MASK = $CC;と定義しておいてb := BYTE(not MASK);とするのがいいと思われ。
>>275 それは範囲が0..255のbyte型に-1を代入しようとしているのでエラーが正しい。
つーか宣言時にconst MASK = Byte($CC);とすれば良い
蹴散らされてよっぽど悔しかったんだなあ
子供には、「走っちゃダメ」というより、「歩こうね」と言わないと
今更蒸し返すなバカ
Delphi言語は優秀だけどDelphiユーザーは無能ばっかだな
Delphiの将来性に不安を感じたら何に乗り換えたらいい? 当然Delphi並みに生産性の高いもので。
Windows環境なら現時点でDelphiが最高だね。 これから先、どうなるかは未来が判らない以上判らない。 どうしても駄目だと思うような状態になってからあがけばいいんじゃないの? その時は質問しなくても答えが出てるだろうからね。
VBのDictionary オブジェクト JavaのHashMap に当るものってDelphiにありますか? ちなみに7です
基本的にDelphiには連想配列は無い。 自作してたりする人はいるけど。
わかりました Tstringlistを並べて代用してみます 有難うございました
7のパーソナル版ってもうダウンロード出来ないんですよね?
そもそも配布してない確か。
Contnrsユニットの TBucketList, TObjectBucketListで使えないなら作るかパクル。
ToolButtonをEnabled=false;にしたときに自動生成されるグラフィックが 微妙なんで差し替えてます Enabledに代入とImageIndexに代入を同時にやろうとするとチラ付くので BeginUpdate等を利用したいのですが、残念ながらprotectedで隠蔽されています この場合、クラスを継承してpublicで公開してツールパレットに登録 しなおすのが一番簡単な手段になるのでしょうか? たったコレだけのことでコンポーネントの作成、登録、フォーム上に配置 されたToolButtonの作り直しってのは手間だと思うのですが・・・
>>296 こりゃまた面白い方法ですね
他人にソースを配布するときに使えそうです
ところでポトペタって何の略ですか?
ぐぐっても出てこなくって・・・
>>297 ポトっとドラッグ
ペタっとドロップ
略じゃないな。
パワーポイントみたいにGUIを作る仕組みのこと
>>296 ポトがドラックってのが理解不能なんですが・・・了解しました
ポトっと落とすとペタっとくっつく、かと思ってた
ポトリペタリ
WindowsSDKの英文くらいは読めるようになろうぜ‥‥
304 :
295 :2008/01/29(火) 08:57:02
TToolButtonのイメージ差し替えですが、Enabled連動なら単純に TToolBar.DisabledImageってのがありました
Delphi で出来て C++Builder で出来ない代表的なことって何?
PopupMenuが呼び出されてキャンセルされた場合にイベントを拾う方法ってある?
>>305 Delphiのコンポーネントが使えない。
>>305 Object Pascalで書けない。
ソース配布のコンポは使えるぞ。
Pascal Unitもプロジェクトに放り込んでおけばコンパイル/リンクされる。 チュートリアルのエディタ程度ならBCBで新規作成 > Form1.cpp/h削除 > Delphiで作ったフォームを追加 > ビルドで普通に通る。
>>308 >>309 VCLのソースはDelphiのモノだったよ
今は知らないが、そもそもBCBのCは一旦パスカルにコンパイルしていたハズ
313 :
デフォルトの名無しさん :2008/01/29(火) 12:46:24
>>305 高速コンパイル。
ファイルの数を少なくすること。
ここでの質問。
314 :
305 :2008/01/29(火) 12:54:30
あまり重要なことって無いのね。 集合型も使用頻度多くないしなぁ。 結局言語の違いだけでDelphiで出来ることはBCBでも出来るってことかな。
>>313 ファイルの数を少なくすることってなんだ
>>312 C++のままコンパイルのはず。Pascal型クラスとして宣言されてるインスタンスはPascal型のモデルでコンパイルされてるだけ。
>>306 EXITなんとかってメッセージが飛んできた気がする
>>314 コンパイル速度は結構重要じゃないか?
小物ばかり作ってたらあまり恩恵はないかもしれないが
>>314 C/C++とDelphiはどちらも同じ祖先を持つ、かなり近い言語ですよ。
あと、DelphiはBuilderのobjファイルをリンクできるから。
>>315 Cはヘッダファイルとわかれるし、プリコンパイルドヘッダとか増える。
>>319 それは項目が選択されたときも発生していませんか?
321 :
319 :2008/01/29(火) 20:02:20
コンボボックスにあらかじめ80個近くのItemを追加しておく時に便利なやり方はないでしょうか? combobox1.additem('りんご') combobox1.additem('バナナ') のように1個ずつ記述していくしかないですか?
プロパティエディタから設定できんか?
const TableData: array [0..79] of String = ('りんご', 'みかん', ...); procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin ComboBox1.Items.BeginUpdate; try ComboBox1.Items.Clear; for I := Low(TableData) to High(TableData) do begin ComboBox1.Items.Add(TableData[I]); end; finally ComboBox1.Items.EndUpdate; end; end;
>>323 プロパティーのItemsから出来ました
>>324 配列?を使えばいいのですね
お二方どうもありがとうございます.参考にさせていただきます
326 :
デフォルトの名無しさん :2008/01/30(水) 02:02:18
ComboBox1.Items.CommaText := 'りんご,みかん,・・・'; が出来るかも。
テキストファイルで持つだろう
delphiはアドインをパッケージという形で提供できるけど BCBはDLLしか無いのですか。
>>328 今時パッケージを別に配付するメリットってある?
>>329 昔はメリットだったけど今はメリットじゃないことって何がある?
>>330 ナローバンドの時代はファイルサイズが重要でした。
買収?かなんかされる前に登録したユーザーの情報変更はどうなってるんでしょうか サポートは英語になってるし、とりあえずメールマガジンだけでも停止するかと思ったら、 会社名などの記入を要求してくるではありませんか
Shift+Alt+矢印で列選択モードになるんですが、どうやって解除すれば いいんでしょうか? Delphi5 DOS_IDEです
>>331 サイズの問題はメリットじゃなくなったとは言えないと思う
未だにファイルサイズは小さい方がいいとか思い込んでる奴は少なくないし
DelphiのIDEって微妙に奥が深いな F2キーとF11キーとCtrl+Shift+I(U)を 知っただけで生産性倍になったと思う
Ctrl+K L だったかもしれん。 忘れた。
フリーカーソル殺しコンポにTabブロックインデント機能があるおかげでブロックインデントは範囲選択>Tab/Shift+Tabでやってるなぁ
TurboDelphiを使ってて質問なのだが、TTcpClientで指定するRemortHostはプライベートIPか?
別にプライベートIPでも
>知っただけで生産性倍になったと思う 本来は、ちゃんとドキュメントで知らせるべきものなんだ だから 知らせないので生産性が半分になってる のが正解
>>336 複(単)数行が選択された状態でCtrl+Shift+I(U)で合ってる。
IndentとUnindentだね。
>>336 F2とF11ってなんだkっけ
Ctrl+Shift+I(U)は、範囲内のインデント(アンインデント)だよな
俺は CTRL+KI CTRL+KU 派
Cみたく「{」と「}」のカーソル移動が Delphiの「begin」と「End」には無いんでしょうか?
Alt+[]でできない?
出来ませんでしたが<Delphi7 配備されてるんですか?
BCBのIDEは{...}も(...)もカーソル移動できるけどDelは(...)しかできないみたいね
「(」「)」間は出来ました 「begin」と「End」はできなさそうですね ありがとうございました
Delphiでコンソールアプリを作っているんですが, プログラム(自分自身)のパスはどうやったら知ることができますか? 環境は,Delphi 6 Personal, Windows XP HE SP2 です.
ParamStr(0)
353 :
350 :2008/01/31(木) 17:28:28
>>351 ,352
ありがとうございます!無事できました!
コマンドライン引数を使うんですね。
ここでParamStr派とApplication.ExeName派の争いが!
コンソールアプリに Application オブジェクトはないわな・・・
はいはい
つーかコンソールでForms使う意味って何? サイズがでかくなるだけでメリットなくね?
うん。 Application.Exenameを使いたいだけのためにFormsユニットをusesする必要は無い。
↓スタート!
361 :
デフォルトの名無しさん :2008/01/31(木) 20:45:09
コンソールアプリと行っても、通常のウィンドウアプリなんだからねっ!
と行っても
MoneyLook
もDelphiせいだお
バックアップツールを作っております。 更新日時でファイルの更新を確認しておりますが、sambaにコピーした ファイルと元のファイルの日付が一致しません。 どうしたらいいですか?
SetFileTime では駄目なの?
Delphiの問題でなく、sambaの問題では?
smbd走らせてる方のPCの時刻、TZは正確に設定されてるん?
369 :
365 :2008/02/01(金) 16:39:54
ずれと言っても1秒以下なんです。
1秒の誤差はNTFSの仕様がどうのって話じゃなかったっけ
「samba タイムスタンプ 秒」辺りでぐぐれば?
>>371 ありがとう。2秒の誤差を許容することにします。
秒単位で精査しないといけないバックアップデータってどんな仕様だよ
374 :
デフォルトの名無しさん :2008/02/02(土) 12:18:09
DSpackを使っていらっしゃる方はいらっしゃいませんでしょうか? 前回、ここでお尋ねした未定義文字エラーはとれたのですが、 今度はpackageをinstallすると、Filtergraphが未定義とでます。 このせいではないかというのはないでしょうか?
ツリービューに、 type TTestNodes = Class(TTreeNode) ・ ・ ・ end; で独自のプロパティを持った継承ノードを追加したいのですが、どうすれば良いのでしょうか? AddNode(独自のノード,親ノード,User.nick,nil,ComCtrls.naAddChild); かなと思っていろいろやってるんですけど、どうもうまくいかない、、、 どうか、よろしくお願いします。
>>374 DSpack は知りませんが、パッケージをインストールするとき、
ソースをコンパイルするから、単に変数Filtergraphの宣言が見つからないのでは?
あるいは、FFiltergraphにするとうまくいったり。
delphiでプログラムを作りたいだけなんです。 本体をDLしたは良いんですけど、シリアルを求められて起動できないんです。 趣味レベルなので無料版を使いたいです。 ボーランド製品登録ウィザードというダイアログで入力を何度も求められます。 メールでコードギアから送られてきたものを入力し、txtファイルをアップしたところ、認証できませんとなりました。 どうすればいいでしょうか? 簡単なテキストエディタが作れればそれで良いので デルファイのバージョンとかも古くてもいいです どなたかおしえてください
Turbo Delphi (Delphi10)のライセンスでDelphi6 Personalインスコして認証しようとしてないか?
>>377 すいません、
いまいちちょっと使い方がわかんないです。
var NodeClass: TTreeNodeClass
とあるので、NodeClassをなんかしてやればいいのかな?とは思うんですがさっぱり。
すいません、もうちょいおねがいします。
>>379 あ。
バージョン確認してアンインスコ考えて見ます
Turboは登録完了メールに添付されてるreg???.txtを環境変数USERPROFILEのディレクトリ(通常はC:\Documents and Settings\ユーザ名\)に置けばキーの入力とか求められなかったはず。
あ
NodeClass := TMyTreeNode;
>>384 どもです。そこまではエラーなくいけました。
ただ、継承して突っ込んだnodeの独自プロパティへの値の参照、代入が出来ないorz
.netの派生クラスみたにいかねー(涙)
(node as TTestNodes).FooBarでどうよ。
>>386 いけました。
格納後のプロパティの値の呼び出しも問題ありません。
ありがとうございやす!!
キャストも分からないのに継承とかすごいな ものすごいバグ含んでそう
ヘルプも読めないのか最近のゆとりは
>>389 オブジェクトインスペクタを眺める作業に戻るんだ
Lines
また明日からオブジェクトインスペクタをひとつづつ眺める作業が始まるお
ITProEXPO行ってきたけど、CodeGearブースがビックリするほど小さくて悲しかった・・・。 VBからDelphiにシェアが移ればいいのに・・・と、VB6から移行した俺は思う。
Delphi1本で年商3200万の俺は結構頑張ってると思う。
俺の場合はVSと併用で5000万弱だな Delphiでオッケーっていう案件あんまりないから併用というかほぼメインだけど…
ちなみにオレは年50万くらいのシェア作者… 企業相手にしてえけど信用が…
せめてスレタイを読む国語力は欲しいところ
399 :
デフォルトの名無しさん :2008/02/04(月) 21:00:08
dUnit(9.3.0) をビルドしようとしたのですが、makeでこけてしまいます。 > make --win32 Makefile:20: Rules.mak: No such file or directory make: *** make: --win32 is no longer supported. Stop. Makefileを見ると、確かに、 20行目に include Rules.mak という記述があるのですが、 この Rules.mak というファイルは、どこで生成されるものなのでしょうか?
あなたのパソコンです
401 :
399 :2008/02/04(月) 21:24:09
Delphiの案件しか受けないから年収1200万しかないけど 気が楽だから俺はそれで十分。
アピりたいお年頃か
検索条件の指定にComboboxを使用していて、 何も選択されていないとき(ItemIndexが-1)は全て表示、 条件を選択したときは指定した検索条件で表示させたい。 ComboboxでStyleプロパティがcsDropDownListのとき、 一度どれか選択すると、ItemIndex=-1を選択できなく なってしまうのですが、どうすればよいでしょうか。 例えばItemIndex=0に'全て'とか入れておくしかないでしょうか?
>>406 OnKeyDownとかでItemIndexを-1に設定すればいいのでは。
つかItems[0]を'全て'がオーソドックスかな。
>Delphi1本で年商3200万の俺は結構頑張ってると思う。 Delphi2007の売り上げより多いんじゃないか?
411 :
デフォルトの名無しさん :2008/02/06(水) 07:03:38
> 376 変数Filtergraphの宣言が見つからないのでは? あるいは、FFiltergraphにするとうまくいったり。 お返事ありがとうございました。Tfiltergraphが定義されていないからですが、 パッケージのinstall方法が間違っていました。 パッケージをinstallする時に、全て閉じてからしたら大丈夫でした。 ありがとうございました。..す、すみませんでした。
マウスクリックした場所にキャレットくる設定って消せないんでしょうか。
WM_LBUTTONDOWNでinheritedしないとか。
すいません・・・・ Delphiのエディタの事です。
>>414 たぶんだけど フリーカーソル無効化 したいのでは? このキーワードで検索してみて
416 :
デフォルトの名無しさん :2008/02/07(木) 01:01:52
Rect型について質問です。 代入する時に、 rect := Rect(1, 2, 3, 4); などと4つ一度に代入しているものをよく見かけるのですが、 自分でやると、エラーになってしまいます。 (エラーのメッセージは、「演算子またはセミコロンが必要です」というものです) ちなみに、個々に rect.left := 1; rect.right := 2; …… と代入することはできています。 Rect()で一括で代入するにはどうすればいいでしょうか?
rectとRectで識別子がぶつかってるからエラーになる。 r := Rect(1,2,3,4); にするか rect := Types.Rect(1,2,3,4); でいけるはず。
Pascal系のDelphiは大文字小文字を区別しない。 よって、var rect: TRect; とやれば、Rectは変数として扱われる。 Rectの後に、; がくるはずなのに〜ってエラー。 rect := Bounds(1, 2, 2, 2); でもいいね。
質問させてください。 PageControlのあるTabSheetだけを開けないようにするにはどうすればいいでしょうか? TabSheet.Enabled:=falseとしただけでは編集できないようになるだけで開けて中が見えてしまうし、 Visible:=falseとしても一度閉じてまたそのSheetを開けると出てきてしまいます。
420 :
416 :2008/02/07(木) 01:36:38
>>417 さん、
>>418 さん
なるほど〜〜。大変納得がいきました。
どうもありがとうございます。m(__)m
VSに入っているVS2008ImageLibrary.zipのビットマップアイコンが神過ぎる件
>>419 OnChangingでAllow := False
>>419 TabVisibleというプロパティがあってだなぁ・・・
BDEに代わるTDbfというフリーのコンポーネントを 発見したのですが日本語の説明ってないのでしょうか?
Delphi6 EnterPriseを使用しています。 IBServerPropertiesのFetchConfigParamsの サンプルプログラムを走らせてみたのですが、 ISCCFG_IPCMAP_KEYが未定義の識別子で、コンパイルが通りません。 何かユニットが不足しているのでしょうか。 ちなみにUsesは下記のとおりです。 よろしくお願いします。 Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IBDatabaseInfo, DB, IBDatabase, IBServices, IBExtract, ComCtrls;
ISCCFG_IPCMAP_KEY をフォルダ内で検索しる。
>>425 おお、Lazarusの方にはあったのですね。
おそらく Delphi でも似たような感じでしょうから参考にして見ます。
GKAVIってコンポ使ってるひといない? 動作がよく分からん・・・
433 :
デフォルトの名無しさん :2008/02/09(土) 02:30:50
よろしくお願いします。 TBitmapの画像をgifimage.pasで保存すると、 256色で保存されてしまいます。 グラデーションなど、微妙な色合いをGIFで保存するには どうすればいいでしょうか?
256色という制限はGIF使う限りどうにもならない。 おとなしくPNG使っとけ。
435 :
433 :2008/02/09(土) 02:41:27
Readlnで入力待ちをしつつ、裏でスレッドを立てて処理をするというような コンソールアプリケーションを考えているのですが、 スレッドの処理が終了したら入力待ちを解除して終了するにはどうすればいいでしょうか?
437 :
433 :2008/02/09(土) 05:09:44
すみません、続きです。 TBitmapの画像をPNG(TPngObject)で読み込んでも、 同じく256色に減色されてしまいます。 どうすればよいでしょうか? (以下ソース) // pngにロード pngImg.assign(form1.image1.picture.bitmap);// グラデーションの画像を読み込む // そのまま出力 form1.image1.picture.bitmap.Assign(pngImg);// ←256色(?)に減色されてしまう
438 :
433 :2008/02/09(土) 05:14:12
すみません、即効で自己解決しました。 (GIFのチェックをしていた時にpixelFormatを8ビットに変更したのを直し忘れてました…) 失礼しました。
>>436 スレッド同士がコンソール入力で通信したいの?
そうじゃなくてキーボード入力をReadlnで待つのなら難しいんじゃないかな
こんな関数でキーボードが押されたかどうか判定してから読むようにしたら?
function KbHit: boolean;
var
pirBuffer: array[0..9] of INPUT_RECORD;
hdl: THandle;
lpcRead: DWORD;
i: Integer;
begin
Result := false;
hdl := GetStdHandle(STD_INPUT_HANDLE);
if integer(hdl) < 0 then exit;
Result := PeekConsoleInput(hdl, pirBuffer[0], length(pirBuffer), lpcRead);
if Result then
for i := 0 to lpcRead - 1 do
with pirBuffer[i] do
case EventType of
KEY_EVENT: //Event.KeyEvent
if Event.KeyEvent.bKeyDown then exit;
end;
Result := false;
end;
自身にEnter送ってみるとか
なるほど。 function PostConsoleInput(s: string): boolean; var pirBuffer: array of INPUT_RECORD; hdl: THandle; lpcWritte: DWORD; i: Integer; begin Result := false; hdl := GetStdHandle(STD_INPUT_HANDLE); if integer(hdl) < 0 then exit; setlength(pirBuffer, length(s) * 2); for i := 0 to High(pirBuffer) do with pirBuffer[i] do begin EventType := KEY_EVENT; Reserved := 0; with Event.KeyEvent do begin bKeyDown := (i and 1) = 0; //偶数の時true wRepeatCount := 0; wVirtualScanCode := 0; AsciiChar := s[1 + (i div 2)]; wVirtualKeyCode := ord(AsciiChar); dwControlKeyState :=0; end; end; Result := WriteConsoleInput(hdl, pirBuffer[0], length(pirBuffer), lpcWritte); end; として PostConsoleInput( #13 ); で改行が送れるな
442 :
デフォルトの名無しさん :2008/02/09(土) 12:18:52
ビットマップのオブジェクトを生成した後、 他のイメージオブジェクトで読み込みたいのですが、 次の方法だと読まれません。 var bmp1: TBitmap; begin bmp1 := TBitmap.Create; bmp1.Canvas.TextOut( 10, 10, 'ABC' ); Form1.Image1.Picture.Bitmap.Assign( bmp1 );// ←これでは読み込まれない(空になる) bmp1.Free; end; どうすればいいでしょうか?
bmp1 のサイズが
444 :
442 :2008/02/09(土) 13:55:28
>>443 あぁ〜そうでした……。orz
ありがとうございました。
Delphiで作業中、何故か、常にフォームが手前に来るようになってしまいました。 (表示→フォーム/メニューの切り替えをクリックしてもフォームが奥にいかない) 仕方ないので、コードを書く時は、フォームを閉じるボタンで毎回閉じてます。 どうすれば元に戻るのでしょうか???
目的のプログラムにコマンドを送って そこから計算結果を格納するGUI WRAPPERを作りたいのですが そんなことやるのに参考になるサイトとかありませんか?
>>446 コンソールアプリのラッパ?
名前なしパイプ
CreatePipe+SetStdHandle
で検索してゆくといいよ
>コンソールアプリのラッパ? まさしくその通りです。 ありがとうございます。検索してみます!
450 :
デフォルトの名無しさん :2008/02/10(日) 04:37:37
メモリ開放のタイミングについて質問です。 あるビットマップ画像を得る関数、 function getBmp(): TBitmap; を作ったとします。 (使い方は、form1.image1.picture.bitmap := getBmp(); などとします) ソースは次の様になります。 function getBmp(): TBitmap; var bmp: TBitmap; begin bmp := TBitmap.create; bmp.width := 100; bmp.height := 100; bmp.canvas.textOut(5,5,'ABC'); result := bmp; //bmp.free;//★ ←この行を入れてしまうと、値が返らない end; ここで質問があります。 DELPHIでは、 「createしたオブジェクトは、使い終わったらfreeしなければならない」 とよく書いてあります。 しかし上記の場合、freeしてしまうと、直前のresultの値も破棄されてしまうようです。 こうした場合、freeはどのタイミングで行えばよいでしょうか?
あーあれだな たぶんBitmapの中身を渡してるんじゃなくてポインタを渡してるとかそういう話だな ↓詳しい人頼む
var bmp: TBitmap; .. bmp = getBmp(); form1.image1.picture.bitmap := bmp; bmp.Free;
453 :
デフォルトの名無しさん :2008/02/10(日) 05:08:31
454 :
450 :2008/02/10(日) 05:59:59
>>451 戻り値に画像を取る関数を色々試しているのですが、
画像に関しては、どうも参照渡し(意味は自信ないですが…)されてるように思います。
>>452 ありがとうございます。
1〜2行目は、「グローバル変数化する」ということでしょうか…?
それとも、任意のprocedureの中に書くという意味でしょうか?
また、
>>450 にある関数getBmp()の中の変数bmpは、このままだとローカル扱いだと思っていたのですが、
この関数内ではfreeせずに、他のprocedureでfreeする(できる)ということでしょうか?
質問ばかりですみません…。
>>453 変数bmpが「ローカル扱い」かつ「ポインタ(?)扱いでない」ならば、
>>450 の関数の最後でresultに代入したら不要になると思ったのですが…。
>>454 bmp := TBitmap.Create;としたとき、bmpに入るのはTBitmapインスタンスの実体ではなく、
TBitmap.Createで生成された物の "場所を指し示す情報" が入ってるだけ。
なのでResult := bmp;としたとき、コピーされるのは場所の情報だけで、実体そのものがコピーされるわけではない。
だからその場でbmp.Freeとすると、Resultが指し示す場所も同じなのでそちらも破棄されたことになる。
ただ、今回の場合form1.image1.picture.bitmap := getBmpと、すでにあるものを変更したいということなので、
procedure hogeBmp(Bmp: TBitmap);
begin
Bmp.Width := 100;
...
end;
とした上で、
hogeBmp(form1.image1.picture.bitmap);
と書けばいい。
456 :
デフォルトの名無しさん :2008/02/10(日) 06:36:13
>>454 DelphiにはGCがついていないので、
getBmp(): で生成したTBitmapのインスタンスは、
たとえ、getBmpから抜けたとしても勝手に解放されないです。
ですから、getBmpを呼び出してresultを得た側で、
使い終わったら解放処理(Free)を書く必要があります
グローバル変数かローカル変数かは関係がないです。
単なる入れ物なので。
たぶん、他の言語をやったらして、混乱しているかと思います。
・Delphi の class のインスタンスを入れた変数(というかなんというか)は、全部参照
・GCがないので、自分で解放が必要
この感じだと他のところでも、解放し忘れとかありそうだから心配です。
OnFormCreateででも、
ReportMemoryLeaksOnShutdown := True;
を入れておくとメモリリークを報告してくれますよ
457 :
456 :2008/02/10(日) 06:55:10
なんか、目の前の問題にとらわれて、はずした roz
Cでは文字列関係で頻出の問題なんだがな。 ゆとり教育はポインタに弱い子を作り出してるのかな。
459 :
450 :2008/02/10(日) 08:37:32
>>455 さん、
>>456-457 さん
どうもありがとうございます!
とても参考になりました。
どうやら、他の言語とごっちゃになっていたようです。
(あらためて、GCって便利なんですね…)
また勉強し直します。
こういう場合は、bmpは使わず、最初から、 Result := TBitmap.Create; とし、 Result.FreeはGetBitmap内ではせず、 Hoge := GetBitmap; 〜Hogeの使用〜 Hoge.Free; とやる。
なんか458って頭悪そう
TBitmapで左上を基点とするDIBを作りたいんだけど無理? Heightに負の値ぶち込んでもなんともならねぇ
GExpert入れたらコンパイルの進捗ダイアログの前に何か一瞬表示されるんだけど、あれって何?
465 :
デフォルトの名無しさん :2008/02/10(日) 18:56:40
TBitmapは左上が基点ですけど・・・
466 :
デフォルトの名無しさん :2008/02/10(日) 18:59:40
あ、もしかして、DelphiのDIBってBITMAPINFOHEADER.biHeight にマイナスに入れてないのかな? だったら、確かに左下が基点になるね
467 :
デフォルトの名無しさん :2008/02/10(日) 19:23:27
DIB試したけど、左上が基点になるぞ?
中身の事だろ。ScanLine[0] > ScanLine[1] だ。
biHeightには一応負の値をぶちこんでるみたいですね ScanLineに関してもbiHeightが負の場合で場合分けしているんであながち 完全に非対応って訳ではなさそうですが・・・
470 :
デフォルトの名無しさん :2008/02/10(日) 21:25:44
ん?ScanLineなら、ScanLineを使ってる限りは問題ないはずだが
471 :
デフォルトの名無しさん :2008/02/10(日) 21:26:35
> ん?ScanLineなら、ScanLineを使ってる限りは問題ないはずだが 意味不wwすまん メモリの並びが逆列になるのは、ScanLineを使ってる限りは問題ないはずだが
ScanLineはメモリ上で上下反転してるのを説明するのに用いただけ。 ScanLineを使ってるからどうという話じゃない。 質問者はメモリ上で上下反転してるのが気に食わない理由が何かしらあるんだろ。
473 :
デフォルトの名無しさん :2008/02/10(日) 21:55:43
だから、ScanLineで済む話
まぁ、ScanLineで済むケースしか思い浮かばない
>>470 >>473 にとってはどうでもいい話だろうな。
質問からしてScanLineは知った上で何か不満があるのかと思ったどな。まぁ質問者じゃないと分からんか。
476 :
デフォルトの名無しさん :2008/02/11(月) 09:55:33
private { Private 宣言 } test: array[1..6,1..6] of integer; と宣言した二重の配列に一度に値を代入するって事は出来んのでしょうか? 0,0,0,0,0,0 ←これを 配列testに一度に入れたい 0,1,1,1,1,0 test:=(0,0,0 .... こんな風でも駄目だし... 0,1,1,1,1,0 0,1,1,1,1,0 0,1,1,1,1,0 0,0,0,0,0,0
(Sender: Tobject)引数の典型的な使用方法ってのを教えてくださいませんか? ドシロウトですみません。
典型的かはどうかは知らないが一例 同じような処理をするが、ただパラメータ(整数)が1個違うだけの ボタンが複数ある場合。 Tagにそのパラメータを入れておき、OnClickは共通。 中では TButton(Sender).Tag を参照して処理。 TButtonとOnClickに限った話ではなく、他でも使える手
>>476 2次元配列は、1次元配列の配列です。
1次元配列の要素は ( 1 , 2, 3 ) というように表現出来るので、これを入れ子にします。
( ( 1 , 2, 3 ), (4,5,6) ,
というように
>>477 with ( Sender as TControl) . do begin
と、この間に、そのコントロールに関する処理を書く
end;
としておけば、コントロールの名前を変更しても影響しないし
複数のコントロールで同じ処理をさせたい場合にもそのまま使える
>>476 testをグローバル変数にすれば、宣言時にできる。
>>477 Senderとは、イベントの送り主のこと。
procudure TForm1.Button1Click(Sender: TObject);
begin
Form1.Caption := Button1.Caption; // こうするとButton1専用だけど、
Form1.Caption := (Sender as TButton).Caption; // こうすればButton1に依存しない。
// こんな使い方もある
if Sender = Button1 then
ShowMessage('Button1が押されました')
else if Sender = SpeedButton2 then
ShowMessage('SpeedButton2が押されました')
else if Sender is TMenuItem then
ShowMessage('メニュー項目です');
end;
482 :
デフォルトの名無しさん :2008/02/11(月) 12:55:34
>>479 ,481
レスどうもです。
配列testをグローバルにしたりもしたんですが出来ません。
testを小さくして
test: array[1.3,1..3] of integer;
の時では
test[][]:=((0,0,0),(1,1,1),(2,2,2));
としても
式の必要な場所に']'があります と怒られてしまいます。
>>482 test: array[1.3,1..3] of integer;
じゃなくて
test: array[1.3] of array[1..3] of integer;
でいけるはず
>>476 の場合は
test: array[1..6] of array[1..6] of integer =
(
(0,0,0,0,0,0),
(0,1,1,1,1,0),
(0,1,1,1,1,0),
(0,1,1,1,1,0),
(0,1,1,1,1,0),
(0,0,0,0,0,0)
);
>>482 >>483 の方法は
初期化の場合と定数でしか駄目です。
だから、const で定義した定数を代入するか
定数でなく変数も含んだ配列を一度に入れたいなら
配列パラメータ オープン配列パラメータ
で代入するしかありません。
ヘルプを見て使い方を調べて下さい。
オープン配列パラメータにして、配列サイズより短い場合は0で埋めるような
関数を作っておいて
HogeSet([1,2,3,4]);
みたいに呼び出します
485 :
483 :2008/02/11(月) 13:45:20
すまん勘違い。privateか。 484さんの言う通り別で準備して代入がいいですねorz
>>480 >コントロールの名前を変更しても影響しないし
コントロールの名前がどう関係してるのか説明しる!
TrackBarみたいなコンポーネントを自作したいと考えています ツマミの横をクリックしたままにするとリピートで1マスづつ移動する 機能を実装したいと考えています リピート自体はタイマーを使用すれば何とかなるかな?とは思いますが ・タイマーイベントで呼び出されたときのカーソルの位置とコントロールの位置関係 ・クリックしたままコントロール外にカーソルが移動した場合の処理 ・コントロール外から戻ってきたときの処理 をどうすべきか悩んでいます 何か良い方法はありませんか?
>>488 タッチパッドなんかで同じ位置で押したままとかが難しいからさ
OnClickかMouseDownでフラグ立てて、MouseUpまで
ボタン押してる間はズレてもいいという事にした方が使い易いと思うよ。
俺は CM_MOUSEENTER/CM_MOUSELEAVEでマウスカーソルの形状を変えて
マウス形状を変えてる間にMouseDownが来たら別のマウスカーソル
にして、ボタンを離すまで有効にしてる。
>>486 コントロールというかコンポーネントだな。
コンポーネントのNameプロパティを変更するとフィールド名も変わるのでコードも変更する必要があるが、
Senderは変わらない。
コードも自動で変更されないの?
>>491 最近のバージョンじゃないと無理じゃね?
じゃ、名前をコーディングの途中で変えたらエライことになるな・・・ VS だと自動で変更してくれるが。
2007とかはリファクタリング機能ついてるから変更できるはず
VS は普通の変数や関数の名前でさえ、変更すると同じファイル内での全変更を することができるようなオプションがそのつど選択できる。
だから重いのか
procedure hoge(var w: WORD; var wd: WORD); asm xor eax,eax; mov w, ax;//Err mov w, eax;//OK mov wd, eax;//OK end; とするとmov w, ax;で'型の不一致'と出ます どういったルールではじかれるのでしょうか?
一行目は procedure hoge(var w: WORD; var wd: DWORD); の誤りです
wがPWORDとして扱われている、とか?
500 :
デフォルトの名無しさん :2008/02/12(火) 23:04:06
>>499 だな、var は内部的にはポインタだから、
WORDじゃなくて、Pointer(DWORD)になってるんだろう
ID Managerみたいな感じのを作りたいんだけど、 他アプリ(例えばブラウザ)にあるテキストボックス内の キャレット位置を取得するときってどうすれば良いんだろう?
503 :
502 :2008/02/13(水) 15:58:00
事故った。スレ汚しすまん
コントロールにマウスを移動したときに出るポップアップに 画像を表示させたいんですけど何か方法ある?
THintWindowのCanvas内に好きなように描く。
日経ソフトウェアの「Turbo Delphiではじめる Windowsプログラミング」を買ってDelphi言語に入門しようと思ってるのですが 近くの書店に無く、Amazonにもコメントが無いので、実際に手にとった方の感想を聞かせていただきたいのですが、どうでしたか? 自分はC言語でそれなりに書ける状態で ・CUIで簡易アドレス帳や近似計算を実装できる ・ポインタはある程度理解してるが、時々勘違いする ・全関数を把握してるわけではないので、リファレンスを参考にする必要あり こんな状態です。こんな人間は上記の本を理解できそうですか? また入門に適してそうな書籍がありましたら、教えてください。
>506 充分でしょw
>>506 目次見ると、目次に載っているようなアプリを作りたい人向けのような気がします。
この手のアプリはその手の知識が無いと、まったく作れないからね。
@クラスを継承し、Create,Freeやらができるようになった。 A先日Canvasをかじった。 くらいの、ま、ド素人です。 >THintWindowのCanvas内に好きなように描く。 このレスに触発されて、やってみよう!と思い、MyHint: THintWindowと宣言して、MyHint.Canvasでごちゃごちゃと弄って、それをApplicationのTHintWindowでできたプロパティに結びつければ、思うように描画できるはず、と思ったのですが, まずTApplicationを見たらTHintWindownのプロパティがない!(HintColor、HintHidePauseなどはありますが。) どこのCanvasを操作すればいいんでしょうか??
>>509 クラスのメンバーではなく
HintWindowClass というグローバル変数があります
これに THintWindow を継承したクラス型を代入します
で、描画はPaintをオーバーライドしてその中で。
>>510-
>>512 ありがとうございます。
家に帰って取り組んでみたいと思います。
Formのクライアント領域のTop,Leftが、スクリーンのX,Yのどこにあるのか、正確に取ることはできませんか?
ClientToScreen
そのものズバリなのがあったんですなorz
Delphi6でDesignEditorsユニットに「proxies.dcuが見つからない」とエラーがでます ググってみたところ requireにdesignide.dcpを追加すれば直るらしいのですが requireってのが何かが調べても分かりませんでした・・・ designide.dcpを含むdclusr.dpkをコンパイルしてみましたが結局改善しませんでした どなたか対処が分かる方いませんでしょうか?
フォームにポップアップメニューを乗っけただけのソフトを作りたいのですが、 常にポップアップメニューを表示させる方法ってありませんか?
>>517 *.dpk を右クリックで編集を選んで編集する
requireにdesignide.dcpを追加
>>518 ポップアップするからポップアップメニューと呼ばれてると思うんですが
ボタンを自分で似たような外見に描画したら?
>>521 そうなんですよね。矛盾してるとは思ったのですが、
ポップアップメニューの動作が一番しっくりきたので…。
でも今ふと考えたら解決策が有りましたw
ありがとうございました。
StayOnTopにしてButton自分で並べるか MainMenu/ToolBarにメニュー並べてClientWidth,ClientHeigt最小にしておけば似たようなものが出来そうだな。 ToolBarならShowCaption := True, AutoSize := Trueにしておいて。
自作コンポーネントでオブジェクトインスペクタに表示するプロパティの 初期値を変えたいのですがどのようにすればよいでしょう? 具体的には published property Date: TDate read FDate write FDate; のように書いていて、このコンポーネントをフォームに貼り付けたときに かってに今日の日付が入るのですが、初期値は『何も無し』にしたいのです。 他の人が作ったコンポーネントで一見同じように書いているのに 何も入らないのがあるのですが、自分にはどこが違っているかわりません・・・
TPopUpにはVisibleプロパティが無いようなのですが、手動で隠したいときはどうすればいいんですか?
MenuItemのvisibleをfalseにする
『何も無し』ってTDate型はないと思うが
C:\folder\aaa bbb ccc ddd eee などと1つのフォルダに複数のフォルダが格納されている時に folder内にある全てのフォルダ名一覧(aaa、bbb、cccなどの一覧)を取得したいのですが どのように処理すればよいでしょうか? FindFirstを使ってやってみましたが 上手くできませんorz どうか教えて下さい m(_ _)m
ふつーはFindFirstでやる。コード晒せ。
>>524 プロパティエディタを作れば、オブジェクトインスペクタに表示するものを
コントロールできたかな。
531 :
528 :2008/02/16(土) 00:05:26
var kekka: TSearchRec; if FindFirst(DirPath,faDirectory,kekka) = 0 then begin Showmessage(kekka.name); end 正直FindFirstの使い方よくわかってません^^; よければ教えて下さい
ヘルプ嫁。FindFirst-FindNext-FindCloseの組み合わせな。Delphi FindFirstでぐぐってもストライクだ。
ありです^^ .txtや.jpegといった拡張子指定のワイルドカード(*.*)が使える 一般ファイルでは上手くいくのですが フォルダではうまくいかなかったので質問しました。 もう少し調べてみます
一旦Freeで開放した後、もう一度Freeで開放するとアクセス違反で落ちてしまうので memorystreamにデータが入っている時のみ Freeで開放したいんですけど、どう書けばいいんでしょう?
>>534 createあるいは代入する前にnilを入れておく。
中身がnilだとFreeでは無視される。
536 :
デフォルトの名無しさん :2008/02/16(土) 05:46:19
>>534 解放するときは、全部
FreeAndNil(Obj);
でおk
537 :
536 :2008/02/16(土) 05:47:51
ごめん。よくよんでなかった。
>>536 は流して
MemoryStreamのオブジェクトを解放したいの?
それとも、MemoryStreamをメンバとしているオブジェクトを解放したいの?
前者なら、
>>535 >>536 でおK
>>535-537 できました。どうもありがとうございます。
nilを入れるって便利ですね
>>536 のFreeAndNilは、Freeしつつnilも同時にやってくれるから、慣用句として覚えておくとよいですよ。
>>531 var
sr: TSearchRec;
begin
FindFirst('d:\*.*', faAnyFile, sr);
repeat
if (sr.Attr and faDirectory)=faDirectory then
Writeln(sr.Name);
until (FindNext(sr) <> 0);
end.
これでd:\にあるディレクトリ表示されると思うけどどうかな
さらにシステムファイル(faSysFile)を判定したいならsr.AttrをfaSysFileでandしてみるとか
エクスプローラでやるように C:\hogehoge\hoge を切り取り処理で D:\Newhoge\hoge とコードを使って移動させたいのですが どんな関数を使えばできますか? よろしくお願いします
>>542 すべてのメモコントールが1つのタブシートの上に載ってない??
つまり、親コントールが1つのタブシートになってる。
コントールを配置する時、タブシート切り替えてから、配置すればよろし。
ついでに、TActionListを使うといいかも。
>>541 ExtractFile*とかの関数でドライブレターとか切り出せばよろし。
Extractって打ってctrl+space押してみな。
ええ??
>タブを切り替えるごとにメモスペースも切り替わる
>>543 に書いたように、タブごとに、メモコントロール置けば、実行時にタブ切り替えて自動的に
変わるでしょうーーーーーーーーーーー?というか、フォーム設計時の補助のグリッド状の点が見えるけど、
ページコントロールの大きさ小さくない??もっと広げてその上に置け。
>起動したらタブ1のメモが開いている状態
コードでやりたいなら、フォームのOnCreateイベントに、PageControl.ActivePageIndex := 0とか書け。
もしくは、コンパイル前にタブ1をアクティブページにしておけば、そのまま反映される。
日が暮れるな。
いきなりタブ数が変わるアプリは難易度高いよ。とりあえずこんな感じ。 実行時に作り出すからオブジェクトインスペクタじゃ設定できない。 procedure TForm1.CreateTab1Click(Sender: TObject); var tab: TTabSheet; memo: TMemo; begin tab := TTabSheet.Create(PageControl1); tab.Parent := PageControl1; tab.Align := alClient; tab.Caption := Format('タブ%d', [GetTickCount]); memo := TMemo.Create(tab); memo.Parent := tab; memo.Align := alClient; memo.Lines.Add(DateTimeToStr(Now)); // タブを登録する tab.PageControl := PageControl1; end; procedure TForm1.CloseTab1Click(Sender: TObject); begin if PageControl1.ActivePage = nil then Exit; PageControl1.ActivePage.Free; end; procedure TForm1.ShowMemoInfo1Click(Sender: TObject); var memo: TMemo; begin if PageControl1.ActivePage = nil then Exit; memo := PageControl1.ActivePage.Controls[0] as TMemo; ShowMessage(memo.Lines.Text); end;
ありがとうございます。 やってみます。 最後にみなさんはDelphiに人生で初めて触れたとき どう学びましたか? Delphi知ってる人が近くにいたとか、仕事上仕方なく必死になったとか、専門学校とか書籍とか
仕事上仕方なく必死にならないと新しく言語を学ぼうとは思わんな いきなり妙なプログラムのメンテを丸投げされてみればすぐわかるようになる
ええっ?こんなソフト作んの??えええ〜!てなときも燃えるかも メンテはやだな絶対
やりたいと思ったときにNiftyのフォーラムがあった 本もたくさん出てきた タイミングが良かったかな
DOSで作ってた自作のシェアウェアを、Windowsに移植しようと必死だった。 面白かったなぁ。あんな興奮は人生でもそうそうなかった。
>>541 フォルダの移動なら、MoveFile か ShFileOperation で出来ないかな。
>>548 友達と競い合って何かを作ってました。
すんません [Pascalエラー]E1026ファイル'Main.dfm'が見つかりません というエラーがメッセージに表示されるようになりました。 ヘルプをみても検索に掛からず、修正方法がわかりません。 どうすればよいか、ご教授お願いします。
Main.dfmがないんだろとしか言い様が無い
該当ファイルはプロジェクトマネージャ上で名称変更しました。 エラーが出るようになって前の名前に戻したのですが、今度は名称変更後のファイルがないと言われorz
delphiのコードから 外部のプログラムを実行できますか?
>>548 BasicMagazineのBasicのゲームの移植や、
別言語でソース公開されているゲームの移植で覚えた。
あとは Delphi本がけっこうあったので。
32bit Power programing ?だっけ、よく登校中に読んでた
専門学校とか大学は、基礎だけで即実践なことは教えてもらえないので
結局自分でやる必要があるよ
ソフトウェア工学科あたりに行けばみっちり教えてくれるんじゃないの? プログラマならそういう学科で学ぶべきですよね。
独学でやっちゃるぜってくらいの奴の方が 教えてもらいにいくかねって人よりもよくできる。 実際、情報学科のかなりの人はやる気ない。
情報学科行っても独学できるんだから、問題ない。 関係ない学科へ行くと、そっちの勉強に時間がとられるからお勧めしない。
でもプログラミングで最後に必要なのはプログラミング能力でない部分の引出しだったりするんで 関係ない学科の方が望ましいんだよ。
>>561 そのスタンスでは、ソフトウェア工学科へ行っても無駄に終わるよ
みんな騙されちゃだめ。
>>564 が事実なら情報処理系学科の存在意義が無くなる。
独学とOJTで何とかなるとか思ってコンピュータサイエンスが軽視されるから 事務の派遣と同レベルのドカチン作業員しか国内にいなくなるんだよ。
>>548 プログラミングでわからないことがあったときは
>>551 氏と同じでNIFTYでかなりお世話になりましたが
Delphiでプログラムをどう作るかという意味では独学でした。
独学とかいうとかっこよさそうですけど
最初の何年かはトンデモプログラミングになってしまいました。
(たとえば文字列グリッドに幅0の列を作ってデータを忍び込ませたりとか…)
よい建物を造るためにはよい建築技術のほかによい設計技術が必要なように
プログラミングでも良い設計技術が必要だと感じています。
(でもオブジェクト指向設計の本は無駄に難しいのが多くて…)
>>566 プログラミングは語学と同じで手段だと思うのですよ。
たとえば英語がペラペラでもそれで海外の人と語れるものがないとダメなんですよ。
汎用機みたいな巨大なプロジェクトならともかく
パソコンソフトだと「何を作るか」を考える力のほうが重要だと思います。
でもまぁ今時仕様からフローおこす奴なんていないけどな
あるよ(笑)
CADを見てるとわかるけど、プログラムを書くだけじゃダメ いかに軽量で使いやすい物を作るかが要求されるけど、それ以前に「どの分野で使うCADか」という知識も要求される 家だったり車だったりで全く方向性や要求される機能が異なってくる でも、そんな分野をいちいち覚えられるかボケェ!となるので、最近は使い手(顧客)を開発チームに迎えてプログラムを組む事例が増えてきてる オープンソースでもメインでプログラム書いてるのは、大抵その分野の知識がある人だけど、ユーザーが「こんなのほしい」と要求を出すのも大事 結局プログラム書く側も使う側もコミュニケーションを取ることが大事
573 :
557 :2008/02/17(日) 16:28:40
関数名を教えて下さい>.<
WinExec(PChar(PRGLine), SW_SHOWNORMAL)
いくらなんでも今時WinExecというのは。 CreateProcessとかじゃねーかやっぱり
ShellExecuteもありかな。
>>566 実際ないと思う。良書さえあればそれでいい。
情報科行ってた人もそう言ってる。
所詮大学で習う内容なんてたかが知れてるし、
院の知識は専門的すぎてピンポイントでしか役に立たないから、
会社を選ばないと役に立たないし、
そもそも新卒の知識なんてそこまで当てにはしてないし。
ただ、入った会社が酷いと、変な知識植え付けられるかもね。
別のコントロールに入力されたキー情報を別のコントロールに転送したいと 考えています 例えばTEditにコントロールがあるときにカーソル操作だけはTreeViewに転送とか・・・ Selectedプロパティをいちいち変更するのは大変ですし、'*'などで一度に 展開だとかの制御までこなすのは複雑になるので、ちまちまコードで対応 するよりはキーコントロールを転送するのが早いかと思いまして・・・ KeyDownを呼び出せれば一番楽なんですが、すべてのコンポーネントを 設計時から派生させるのもどうかな?と行き詰っています
FormのKeyPreviewとか?あるいはショートカットにしておくとか?いずれにせよ簡単には できない≒やらないほうがいい、という類のことではないかという気も。
転送元.OnKeyDown 転送先.Perform(WM_KEYDOWN, Ord(Key), 0); Key := 0; 転送元.OnKeyUp 転送先.Perform(WM_KEYUP, Ord(Key), 0); Key := 0;
>>581 をををっ。これまた凄く汎用性がある方法ですね!
転送元でKey:=0を放り込んでいるのは自分のとこで処理させないためなのかな?
ありがとうございました!
>>581 の方法で全く問題は無いハズなんですが、転送元がSetFocusで
フォーカスを得ている場合は”カーソルキーだけ転送できない”
厳密に言うならば”カーソルキーの操作だけOnKeyDownがが発生しない”
ようです
OnMouseWheel*イベントを拾うためにOnMouseMoveでSetForcusで得ているの
ですがこの方法自体に問題があるのでしょうか?
SetFocusをかけないとOnMouse*イベントが拾えてもOnMouseWheel*が拾えない
ってのも理解できてませんが・・・
プログラミングがしたいのに、プログラミングをやらない学科に進むのは
単なる天邪鬼。
大学も会社もよく調べた上で選択しましょう。
>>583 カーソルキーはダイアログ向けの特別なキー入力処理が行われていたはず。
OnMouseMoveでSetForcusは変。
Application.OnMessage の利用を検証してみて。
>>578 自分が行ってそう感じたわけではなく、ただ人からの伝聞で判断してるようじゃ
存在意義がないなんてこと言えないんじゃないか?
そもそもコンピュータサイエンスってのは言語を覚えてひととおりプログラムが書けるっていう
土方のやってる作業とは中身も目的も違うんだけど
いや、だから、いまはプログラミングの話で、コンピュータサイエンスは 関係ないから、大学の学科は関係ない、ということ。 すきなことは趣味にすべし、職業にすると不幸。
そろそろ隔離スレで
おいおい、ここが隔離スレだろ
現役の学生です 情報工学系の学科では「計算機で何ができるか?」が主流のテーマなので言語は問わずにソフトが組めることが必須 確かに講義として習う過程では基本的な近似計算アルゴリズムなどを習ったり、現在の計算機アーキテクチャや将来的にどう進歩するかを学ぶ程度 一方で開発演習科目でいかに創意工夫できるかで、得られる成果物が大きく変わってきます 与えられたことだけをするのか、その先へ踏み込んで要求+αを実現できるかで経験が全く異なる 大学のカリキュラムが悪いか学ぶ気が無かったか、原因はわかりませんが独学でやるよりも引かれたレールの上で楽に基礎を学べてバカができるのはいいかもしれません ふと思ったけどDelphi言語で飯は食える(就職はある)のかな?
>>584 Application.OnMessageでWM_MOUSEWHEELを拾っても得られるMsg.whndは
フォーカスが与えられたコントロールのものになってしまいます
また、MouseDown同様に処理を行う場合はMouseWheel内部でSetFocusを
行うため、結局の所MouseMoveでSetFocusをするのと変わりないかな?
と思っていました。
X-Windowみたいな動作はWindowsでは控えるべきなのかな?
で、WM_MOUSEWHEELメッセージをカーソル位置のコントロールに投げたいの
ですが、深い位置にあるコントロールを拾い出すのはControlAtPosで順番に
探し出すしか無いのかな?
Explorerでファイルを右クリックしたときに出るメニューを自作のアプリでも出したいんですが 一発で出せる関数はないんでしょうか? procedure ShellCtrls.InvokeContextMenu(Owner: TWinControl; AFolder: TShellFolder; X, Y: Integer); でできるかと思ったらTShellFolderに依存してるので切り出せなさそうです。 以前Niftyのサンプル蔵で見たような気もしたんですが…
シェルエクステンションとしても組み込まなくても コマンドラインでやりとりするんじゃ駄目なの? それだったらレジストリいじるだけでできるけど。
ぜんぜん話がかみ合ってない飢餓
595 :
デフォルトの名無しさん :2008/02/18(月) 14:28:12
自作プログラムの起動時にあるキー(例えばCtrlとか)が押されていたら 起動時の処理を変更するようなことをしたいのですが、GetAsyncKeyStateで キーの状態は取得できるのですが、キーを押したままスタートメニューから起動すると 起動したアプリのウィンドウが最前面になりません。起動後にSetForegroundWindowを 使っても無理でした。何か良い方法はありませんでしょうか? Delphi7+WinXP
597 :
デフォルトの名無しさん :2008/02/18(月) 17:57:21
Delphi7でダミーのデータベースを作ってQRerpotで印刷したいのですが、 ダミーのデータベースを作るところからこけています。 var img:array of Timage; mmo:array of Tmemo; procedure TForm1.Button1Click(Sender: TObject); var inum:integer; img:array of Timage; mmo:array of Tmemo; begin ClientDataset1.active:=false; Clientdataset1.filename:='h:\Delphi_project\US1\USreport.xml'; Clientdataset1.FieldDefs.clear;
598 :
デフォルトの名無しさん :2008/02/18(月) 17:57:47
with clientdataset1.fielddefs.addfielddef do begin name:='UScomment'; datatype:=ftmemo; end; with clientdataset1.fielddefs.addfielddef do begin name:='USpict'; datatype:=ftGraphic; end; // mmo[1〜5]、img「1〜5」に入れてたデータをデータセットに入れたいのですが clientdataset1.createdataset; for inum:=1 to 5 do begin if img[inum].picture<>nil then begin ClientDataSet1.append; ClientDataSet1.FieldValues['UScomment']:=mmo[inum].lines; clientdataset1.append; clientdataset1.FieldValues['USpict']:=img[inum].picture; end; end; clientdataset1.close; end; ..で実行すると、 ClientDataSet1.FieldValues['UScomment']:=mmo[inum].lines; でエラーとなって、VariantとTstringsには互換性がありませんとでます。 datatypeをftwidestringとかに変えてもダメなのですが、こうしたらいいとかご教示お願いできませんでしょうか?
TStringsじゃなくてTStrings.Text入れれば? TMemo.Linesは文字列リストであって文字列じゃない。
600 :
デフォルトの名無しさん :2008/02/18(月) 18:48:24
>599 さっそくのお返事、ありがとうございました。おお!! mmo[inum].textにしたらエラーが消えました。 が、今度は clientdataset1.FieldValues['USpict']:=img[inum].picture; で、再度、variantとTpictureには互換性がないとでます。 あと、エラーはとりあえずここだけです。 よろしくお願いします。
画像はBLOBじゃないと無理じゃね?
TPictureの中身をどうシリアライズするかも問題だろな
BLOBにファイルイメージそのまま格納すれば、TBlobStreamで直接TJPEGImageとかで扱えそう
複数の画像を読み込んでスライドショーの用な形式で表示させようと思ってます jpgファイルはImageListでは扱えないのでしょうか? もし扱えないなら良い関数はないでしょうか? 教えて下さい
つTJPEGImage
質問ですが、 画面に表示されるプログラムのアイコン(自身)をあるフォルダにくると埋め込まれた違うアイコンにしたいのですが、 どうすればよいでしょうか?
適当なタイミングで Application.Icon.LoadFromFile('myicon.ico') or LoadFromStream で変えられる。 exeのリソースに埋め込んだものを呼び出すのはようわからん。
>>608 TResourceStreamで読み込んでApplication.Icon.LoadFromStreamでいいんじゃね?
>>604 > 複数の画像を読み込んでスライドショーの用な形式で表示させようと思ってます
> jpgファイルはImageListでは扱えないのでしょうか?
画像全部読み込むつもりか?それだけ重くなんだぞ
ファイルパスだけにしておけ
Image1,2の二つをはっつけて 一方を表示している間にもう一方を非表示にして次の画像を読み込むのが手っ取り早い
Delphiで新規作成すると パッケージ ユニット VCLフォームアプリケーション フォーム って出てきますが、これらって具体的にどういう違いがあるのでしょうか?
パッケージ = 複数のコンポーネントをまとめたライブラリ ユニット = ソースファイル(Cにおけるunit1.c+unit1.hに相当) VCLフォームアプリケーション = VCLフレームワークを使用したアプリケーション、Delphi/BCBの標準的な開発手法 フォーム = ウィンドウやダイアログ
>>591 APIの勉強もしよう。
>>595 試したところ、エクスプローラー(ファイルマネージャ)のせいみたい。
デスクトップのアイコンから起動すれば、手前に表示される。
どうしてもと言うなら、タイマーを使って、キーが離されるまで待ってから
手前に表示してみては?
>>608 それだと見た目のアイコンが変わらなかったです・・・。
>>595 Delphi プログラム実行時のコマンドライン引数を取得して分岐
Windows ショートカットを別々に作成(Ctrl押しより楽でしょ?)
とDelphi超初心者の私なら逃げます
>>616 もしかしてデスクトップやエクスプローラで見た時の exeファイルのアイコン?
それだと、小さいプログラムを作っておいて、そのプログラムから
BeginUpdateResource/UpdateResourceで
実行ファイルのリソース書き換えが必要になるよ。
619 :
595 :2008/02/19(火) 09:37:58
>>617 その手は使ってみました。インストーラーで引数の違うショートカットアイコンを二つ
登録して分岐するようにしてうまくいったのですが、WIndowsのスタートメニューに
よく使うアプリのアイコンが列挙されますよね。そこのアイコンが勝手に入れ替わったり
戻ったりと変な挙動するもんで、アイコン一個で起動時に分岐できないかと相談しました。
>>615 もう少し試してみます。
アイコンのプロパティーから、ショートカット→アイコンの変更... だったりして。
>>557 自分でライブラリないなら、Delフサのユーティリティでも使えば?
確かプロセス起動関連あったはず。
622 :
621 :2008/02/19(火) 11:41:12
623 :
デフォルトの名無しさん :2008/02/19(火) 16:25:03
> 601,602,603 ありがとうございました。自分なりにBLOBを調べてみましたが、 BMPではできてもJPEGではできなかったりと難しそうですね... QReportでの出力はあきらめて他の方法を探す事にします..
>>618 レスありがとうございます。
やはり簡単にはいきませんか・・・。
ちょっとリソースでググって色々調べてみます。
ありがとうございました。
メモスペースに行番号を表示させる機能ってどうすれば良いでしょうか? TeraPadのような行番号表示と、行番号をクリックでその行が反転する機能も知りたいです
誰かにアドバイスをしたいと思っていますが、ここでの質問が高等すぎて 答えられません 私でもアドバイスできるよな激初心者用のスレがあってもいいと思うの ですが、どう思いますか?
たしかに「超初心者」の質問ではないような
習い始めの初心者というのは出来る事出来ない事も判らないから ホントの超初心者の質問は思ったより高度になりがちって事さ
>>625 夢のない話で申し訳ないのですがシェアウェアのTEditorを買って使うのが現実的な解決策でしょう。
メモコンポやリッチエディットコンポにいくら手を加えても満足のいくものは作れないでしょう。
Windowsは出来合いのテキスト編集装置を並べるだけなら簡単ですが
それ以上のことをしようとするととたんに敷居が摩天楼(死語かw)のように高くなります。
そもそもTEditorがシェアウェアで商売になるのはそれだけ作るのが大変だからです。
StringGridでショボいエディタもどきを作るというのも今考えましたが
行番号表示と特定行の反転表示はできても
その行を編集しているときに反転表示できないのをどうするか…
TEditを1個貼っておいて、普段は非表示にしておき、 編集中だけTEditをその位置にピッタリ合わせて表示するというのがVB時代からのテクニックだな
ファイルをフォルダごと削除したいのですが RemoveDirだとフォルダ内にファイルがあると削除できません ファイルはどんな関数を使ってDeleteしたら良いですか? また良い方法あったら教えて下さい よろしくお願いします
BDEを使用してデータベースに接続したTDatabaseオブジェクトを DLLに渡してDLL側でデータベースの操作をしたいのですがうまくいきません。 以下試したこと ・接続済のTDatabaseをDLLの引数で渡してDLL側でTQueryを作成、DatabaseNameプロパティを設定する ↓ TQuery.Openを実行した際にデータベースのログオンダイアログが表示される ・接続済のTDatabaseをDLLの引数で渡し、 DLL側のSession変数を引数のTDatabase.Sessionと置き換えて データベースの操作が終わった後に元に戻す ↓ アプリケーション終了時にアクセス違反 ・アプリケーション側で作成・初期化済のTQueryをDLLの引数で渡す ↓ TQuery.Openを実行した場合は問題ないが、 TQuery.ExecSQLを実行するとアプリケーション終了時にアクセス違反 環境はDelphi5+SQLServer2000です。何かいい方法があれば教えてください。
TreeViewの項目のDnDによる並べ替えって全部自分で書かないといけないんですか? 受け入れ可能かどうか(自分の子に移動しようとしていないかも含めて)の判定とか移動とか全部。
うn
>634 そういうのはあんまりお勧めしないけど、やりたいなら普通のDLLじゃなくてパッケージにするのが吉。
639 :
634 :2008/02/20(水) 17:53:01
色々試してみた結果、DLL内部にTDatabaseオブジェクトを作成して
データベースに接続させれば期待通りの動作ができました。
TADOConnectionならインスタンス直渡ししても大丈夫だったのに
TDatabaseだとおかしくなるのが不思議。BDEが絡むせいですかねぇ
>>637 当初の目的がDLLで機能を追加できるプラグイン的なものを作るというものだったので
LoadPackageを使えばパッケージでも大丈夫かなと思ったのですが、
LoadPackageを使ったサンプルコードが見つからずに挫折しましたorz
>>638 今までTStringListやら独自に作成したクラスを渡したりしたDLLを作って
問題なく動作していたのですが、やっぱりやめた方がいいですか?
一応DLLも呼出元アプリケーションもDelphiで作ったもの以外は動作保証外としています
turbo delphiを使ってます。 TTabControlにコンポーネント貼った後、タブを切り替えたときに 貼ったやつを消したいんですが、すべて消す命令が見当たりません。 全コンポーネントをvisible=falseにするのでしょうか? そんなわけないと思うんですが・・・ そして消した後、新しくコンポーネントを貼るにはどうすればいいですか? 最初のタブに貼ったコンポーネントが邪魔になったりしないのでしょうか?
基本的にDLLでクラス渡しちゃだめ 理由は、Delphi6プログラミングバイブルとかいう分厚い本に色々書いてあった DLLは、あくまで関数ポインタとリソースしか渡さんようにするのが無難
>>640 TTabControlは、名前と裏腹に簡単にタブのシステムを作るものじゃない
そういうのはTPageControlだったかな
>>642 そうなんですか・・・
ttabcontrolでぐぐっても切り替えについて出てこないわけだ orz
Delphi初心者です アプリを作っていて、デフォルトはタブ1個なアプリです。 新規作成タブを押したら新規にタブを作成するのと 削除機能を各タブに持たせるにはどうすればよいのでしょうか? IE7を100%マネています。
645 :
デフォルトの名無しさん :2008/02/21(木) 00:31:51
メタファイルを作る練習をしているのですが、何も表示されません。 どこが変なのでしょうか?お助けください。 paintbox1をFormに貼り付けたあと、 procedure TForm1.FormCreate(Sender: TObject); var s:String; MF:TmetaFile; MFC:TMetaFileCanvas; ACanvas:TCanvas; begin PaintBox1.Align := alClient; MF:=TMetaFile.Create; ACanvas:=Paintbox1.Canvas.Create; try MF.MMHeight:=1480; MF.MMWidth:=1000; MFC:=TmetaFileCanvas.Create(MF,ACanvas.Handle);
646 :
デフォルトの名無しさん :2008/02/21(木) 00:32:52
try SetMapMode(MFC.Handle,MM_LOMETRIC); MFC.Brush.Color:=clWhite; MFC.Rectangle(0,0,800,-1400); MFC.Font.Height:=70; MFC.Brush.Style:=bsClear; S:='Hello World'; MFC.TextOut(50,-50,S); finally MFC.Free; end; ACanvas.StretchDraw(Rect(0,0,100,-100),MF); finally MF.Free; end; end; end. なぜ???
>>626 知りたいことはあるんだがこのスレ敷居が高くて聞けない感じ、な人もいるかも。
恥を忍んで・・・
procedure hoge(var i:Integer);
と
procedure hoge(i:Integer);
の違い教えて
(var i:Integer); の時は、i の値がプロシジャー内部で変更された時に 外部から変更後の値にアクセス可能。(i:Integer); の時は渡すだけ。
参照渡しと値渡しってやつだね
Hoge(var i:Integer); は実際にはポインタで渡されている。 つまり、Hoge(i: ^Integer); もしくは、Hoge(i: PInteger);の意味。 procedure Hoge(var i:Integer); begin i := 10; end; procedure Hoge(i: PInteger); begin i^ := 10; end;
>>639 そういうふうにすると、コンパイルオプションが違うだけで変な事になるのでやめたほうがいい。
当然コンパイラのバージョンやVCLのバージョンが違うと動かないと考えた方がいい。
1、Exe側でDLLの作った TStringListを受け取っても、
自分ではアクセスしない事。だからPointer型とかTObject型で受け取る事
2、Exe側から中身を見たい時は DLL側に関数を作ってやる事。
DLL側に function GetString(StringList:TObject ; LineNo:Integer):string;
のような感じでアクセスする関数を作ってそれを呼び出すようにすると
バージョンが違ってもアクセス出来る
DMonkeyってDLLかなんかに切り出しておいてDLLがあったら スクリプト機能を利用するという感じにはできないのかな。 今の時代にはたいしたことないとは言え組み込むとEXEが1M超えるんだよな。 どうでもいいけどStickypaperという付箋アプリでDMonkey対応していた。
654 :
639 :2008/02/21(木) 14:21:00
よく考えたらVCLのバージョンで実装が違うクラスも結構あるし、 オブジェクトをそのまま渡して使うやり方はまずかったですね。 早速修正することにします。 そこで改めて質問があるのですが、DLLにクラスメソッドのポインタを渡して コールバック関数のようにDLL側からEXE側のクラスメソッドを呼び出しても大丈夫なのでしょうか?
>>654 素直に、メソッドをグローバル関数でラップしてやってそれをコールバックするのが無難
それは大丈夫。 Senderとかの引数でDLL側のクラスを渡さなければ
Delphiのメソッドポインタは8バイトですぜ あれとあれのセット。
>>654 メソッドポインタの仕様まで変更される事はないわけで
DLL側からEXE側のメソッドを呼び出すのに問題は生じない。
ただし、その引数でDLL側のオブジェクトを渡すと仕様変更される可能性があるので駄目
Del7でほぼ空のプロジェクトでアイコン設定すると [エラー] RLINK32: Out of memory! というエラーが出るようになってしまったんだけどどうすれば直りますか? メモリは500MB以上空いてます。
>>644 をお願いします。
メモ帳にタブ機能を持たせたいんです。
基本のデータ型を使うならメソッドポインタは使っても大丈夫なんですね。
これで何とかなりそうです。ありがとうございました。
>>660 ページコントロールを使ってるなら↓のコードで増やせますよ
procedure TForm1.PageControl1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Sheet: TTabSheet;
begin
if PageControl1.IndexOfTabAt(X, Y) = 0 then begin
Sheet := TTabSheet.Create(PageControl1);
Sheet.PageControl := PageControl1;
end;
end;
でもメモ帳でタブ機能なら、やっぱTabControlだろーな TabControl1.Tabs.Addぢゃないかな そんでMemo1.clearとか
>>661 >基本のデータ型を使うならメソッドポインタは使っても大丈夫なんですね。
俺は微妙だと思う。
あんまりやらん方がいいと思う。
後々になって、クラスの定義でメソッドが仮装メソッドとかに変更するケースとか考えると危険な気がする。
>>655 の言うとおり、関数でラップする方が恐らく安全。
クラスを直接使ってはいけないから、仮想メソッド呼び出しを書いてはいけない。 というか、メソッドもDLL側でメソッド呼び出しを書くと、DLL側にメソッドがリンクされてしまう。 でも、メソッドポインタ経由なら基本的には大丈夫。 というか、メイン側のメソッドをDLL側から呼ぶにはメソッドポインタを使うしかないと思う。
普通はコールバック関数にすると思うが。 やっちゃいけないのはクラスのメソッドのポインタ経由の呼び出し、じゃないかな。
>>665 そのポインタに設定する処理をexe側で行えば大丈夫だよ。
クラスのメソッドがバーチャルでも、exe側がメソッドアドレスを解決してDLL側が
ポインタ経由で呼び出すなら問題はない
今後のDelphiでメソッドポインタの取扱がかわらんという保証は無いからなあ DLL使うならやっぱり関数にしといた方が無難ちゃいますか
ラッピングするなりして、DLLでいつも通り関数で渡せば 相手はDelphiじゃなくてもVCでもABでもなんでもいいという利点もあるしね。
コールバックさせたい場合、メソッドポインタを分解して ポインタ一つとコールバック関数で渡して、呼び出す時にまたポインタ返せって事だろうけど そこまで手間かける事もないんじゃない? ソレをやりたいなら、やりたい人が中継するDLLを作ればいいんだしさ。
そんなにオブジェクト共有したケりゃもうインターフェース挟んじゃえよ
>>669 もしくは、
functrion hoge( instance : pointer ; etc... ):integer;
begin
TClass(pointer).hogemethod(etc...);
end;
ってなラップした関数をDLLからエクスポートするとか
普通に考えれば、DLL でクラスのオブジェクトを渡したい状況とは、 実際にはDLLにする必要がない場合か、DLLにする理由なんかない場合が ほとんど。だって、パッケージを共有しないかぎりオブジェクト内の あらゆる参照(プロパティーやメソッド)が EXE 側の対応するオブジェクトの それと一致する保障なんかないし、共通パッケージを使わなければならないなら そもそもDLLにする必要なんかない。
そりゃそうだ
>>645 描画するタイミングの問題です。
ペイントボックスのOnPaintイベントハンドラで描画してください。
1. MFをローカル変数ではなくフォームのフィールド変数にする
(FMetafileみたいに誰が見てもすぐにわかる名前にするのが良い)
2. フォームのOnCreate(またはコンストラクタ)でメタファイルオブジェクトを生成して中身も作成。
3. ペイントボックスのOnPaintでPaintbox1のキャンバスに描画
例) PaintBox1.Canvas.StretchDraw(ACanvas.StretchDraw(Rect(0,0,100,-100),MF);
4. フォームのOnDestroy(またはデストラクタ)でメタファイルオブジェクトを破棄
※なお元のソースコードにあるAMetafileは無意味です。
メタファイルの参照デバイスコンテキストを画面にする場合、
つまり画面表示だけが目的なら0を指定すればOKです。
例)mfc := TMetafileCanvas.Create(aMetafile, 0)
Windowsは画面のキャンバスに描画した内容は覚えていません。
画用紙に鉛筆でウィンドウを描いて消しゴムで消すのをイメージしていただくとわかりやすいと思いますが
Windowsではそういう風にしていくつものウィンドウを描いています。
そのためアプリは最初にウィンドウが表示(描画)されたときと
一旦隠されたウィンドウが再び表示されたときにいちいち自分で描画しなければなりません。
(ボタンやエディットボックスなどはWindowsが自分で描画するのでアプリの方で描画する必要はありません)
ペイントボックスやフォームではその描画を行うのがOnPaintイベントです。
(イメージコンポではその描画を内部で行っているので
プログラマーはWindowsの内部処理を意識しなくて済んでいるのです)
675 :
デフォルトの名無しさん :2008/02/22(金) 00:42:33
いくつかのブラウザでタスクバーも全部隠す「全画面化」機能ってありますよね あれをDelphiで実装するにはどうすれば良いんでしょうか?
>>662 さん
スクロール位置保存とか選択範囲とか考えだすと、
メモ帳でタブ機能でもPageControlの方が楽じゃないかな。
∧,,∧
>>675 さん
ミ,,゚Д゚彡
,;゙ ミ
〜ミ,,,,,UUミ
BorderSyle、bsNoneにして
タスクバー含まない領域の大きさにして
あげるのではないでしょうか?
http://delfusa.main.jp/delfusafloor/opensource/delfusalibrary/20070828160200/WindowUnit/WindowUnit.pas.txt function NoneTaskBarDesktopRect: TRect;
このあたりを使えば楽そうですが。
思ったけど、DLLでオブジェクトうんぬん悩むなら、 実行時パッケージ?だかなんだかを使えばいいんじゃないのかな? これなら、オブジェクト使いまくりでも大丈夫なはず。 もちろん、バージョン変えたらあかんが
>678 俺もそう思うんだが >639 だそうで。
4点教えてください。 1.Turbo DelphiってVISTAでも動きますか? 2.Turbo DelphiでSQLサーバのDBをみれますか? 3.Delphi 2007 for Win32 ProfessionalではSQLサーバのDBは見れないのですか? 4.Delphi ってエンドユーザプログラム向きの言語ですか?
1.はい(保証外) 2.はい 3.いいえ 4.はい
>>671 ソレをやったら、hogemethodはDLL側に作られてるわけでEXE側のhogemethodは呼ばれないのでは?
メソッドポインタのレコード型を渡す関数をDLL側で公開しておいて
EXE側でメソッドポインタをセットアップし
DLL側で、メソッドポインタ間接で呼び出すしたらいいと思うけど
本体にクラスを定義するのなら、 メソッドをラップした関数のポインタをDLLに渡してコールバックさせろということになるな。 結局、メソッドポインタをexeからDLLに渡して実行ってのは賛否両論だな。 俺も将来メソッドポインタの仕様がかわらんという保証は無いと思うし、 stdcallな関数ポインタでラップすれば、Delphi以外の開発環境製のDLLでも使えるしで、 直接メソッドポインタを渡すような仕様には賛成しないな。
メソッドポインタの仕様が将来変わるって、 .NETのように複数の関数をつなげられるような仕様になるって事か? まあ、そうなったバージョンはWin32では使わないだろうから心配するな。 杞憂って奴さ。
前半4バイトと後半4バイトの意味が逆になるだけでも…ってそんなのも杞憂だろうけど。どこまで考えるかは本人次第か。
ファイルから文字列を読み込んで、一行ずつ先頭に空白が何個あるか調べたいんだけど、 どうやれば良いんだろう。 if (x行のi文字目 != ' ') then break else kuuhaku++; みたいな感じのを毎行やりたい。 ファイルの読み込みはどうやったら良いんだろう? また文字列の型は?
だから、昔Delphiでランタイムが必要になるって顰蹙をかったアレを使えばいいんじゃねーの?
var f: textfile; s: string; begin assignfile(f, 'test.txt'); reset(f); while not Eof(f) do begin readln(f,s); for i := 1 to length(s) do if s[i] != ' ' then begin writeln(i-1, ':', s); break; end; end; closefile(f); end;
>>686 簡単に行いたいならTStringList.LoadFromFileを使用すればOK
後はTMemoと同じように扱える
ファイルが見つからないときEFOpenErrer例外が発生するのが嫌なら
FileExsistsで事前に調べればOK
>>688 ありがとうございます!出来ました。
まだファイルの入出力について理解が出来てないみたいです。
もうちょい勉強してみます。
>>689 TStringListを使った場合、i文字目というのはどういう風にしたら良いんでしょうか?
>>689 × FileExsists
○ FileExists
デフォルトプロパティの話は別にして、 var sl: TStringList; なら if sl.Strings[i][1] = ' ' then でi行目の1文字目が空白かどうか判別可能 注意点として、Strings[i]はプロパティであるため sl.Strings[i][1] := 'a'; みたいに代入することは無理 これは Inc(Form1.Width); が不可能なのと一緒です 編集したい場合は一旦stringにコピーして、編集後に戻してやるのが 手っ取り早いです
>>692 ありがとうございます。
二次元配列みたいな感じで良いんですね。
以前エラーが出たのは代入しようとしたらからですね…それで引っかかって…。
みなさんありがとうございました。
FormのWinControl.DoubleBufferedにTrueを突っ込んでもBevel, Labe, Imageなんかがまだチカチカするんだけど これ以上はどうにもならない?
すみません、質問です。 現在、TWebBrowser でアプリケーションの作成を行っているのですが、 そのアプリで表示させている Web ページ のフォーム(?たとえば Google の検索ボックスなど)に 入力する場合、IE などであれば、オートコンプリートで、入力補完されるのですが、 TWebBrowser ではオートコンプリートが効きません。 何か改善方法ご存知の方いらっしゃいますか?
>>694 どんな設計・実装で何をした時にちらつくのか
s := sl[i]; とやれば、 sの先頭に空白が何個あるか調べればいいだけ。 分けて単純化して考えよう。
698 :
デフォルトの名無しさん :2008/02/23(土) 04:00:30
リッチエディットについて質問です。 『太字のABC』など、「書式情報付きの文字列」を、 「リッチエディットに代入可能な変数」(string型?)で表現するには どうすればいいでしょうか? 例) s := '<b>ABC</b>';// ←HTML方式なので実際には間違いですが、イメージ的にはこの様にしたいです richEdit1.lines.add(s);
RichEdit をつかって Webページを表示したり、HTML エディタを作ろうとか 考えているなら無理だからね。
>>698 太字にして保存してみたらいいんじゃね?
>>698 richEdit1.lines.add(s);
richEdit1.SelAttributes.Style := [fsBold]; //太字あり
richEdit1.lines.add(s);
richEdit1.SelAttributes.Style := []; //太字なし
こんな感じ?
703 :
698 :2008/02/23(土) 11:10:59
>>699 HTMLエディタほど複雑ではないのですが、無理でしょうか…。
>>700 rtfファイルを他のエディタで開いてみました。
書式情報らしき記号はあったのですが、訳が分かりませんでした…
>>701 ありがとうございます。
シンプルなものはそれで大丈夫なのですが、
今回は予約語を太字にしたいので、置換の処理を使うとなると難しいです。
(私の書き方が足りなかったです)
>>702 ありがとうございます。まさにこれかも、です。
HTMLは例えのつもりでしたが、
まさか実際にHTMLを経由させるやり方があるとは思いませんでした。
TConversionやTRichEdit.DefaultConverterは初見なので、
これから調べたいと思います。
704 :
702 :2008/02/23(土) 17:49:32
あれ、元のデータがHTMLって訳じゃなくて、フォーマットは問わないのか。 それなら最初からrtfフォーマットでデータを用意して、それそのままTRichEdit.Lines.LoadFromStreamすればいいよ。 例としては、こんな感じで。 procedure TForm1.Button1Click(Sender: TObject); var Str: TStringStream; begin Str := TStringStream.Create('{\rtf Plain \par {\b Bold} \par {\i Italic}}'); RichEdit1.Lines.LoadFromStream(Str); Str.Free; end;
StringGridでセルの幅を 入力された文字列の幅(一覧の最大幅)に合わせたいのですが 文字列の表示に必要な幅を求めるにはどうしたらよいでしょうか? Canvas関数のTextWidthでは幅がピクセル値になってしまい StringGrid.ColWidth:= TextWidth('文字列') では上手く出来ません(幅が狭くなる) ピクセル値をクライアント幅の単位に直す関数ってありましたっけ? それともなんか良い方法があるんですかね? どうぞよろしくお願いします
706 :
698 :2008/02/23(土) 21:31:12
>>704 そんな手があったとは…。まさにやりたかったことです。
ご丁寧に、どうもありがとうございました!
>>705 それでいいと思うが・・つか、両端にマージン取れよ。
708 :
デフォルトの名無しさん :2008/02/23(土) 23:30:27
> 674 お返事、ありがとうございました。出張中で確かめられませんが、 帰ったら確かめてみます。本当にありがとうございました。
>>705 Canvas.Fontにフォント代入しとけ
>ピクセル値をクライアント幅の単位に直す関数ってありましたっけ? クライアント幅ってなに?
>>677 ありがとうございます、教えて頂いた通りにすればうまくいきました。
TImage 内で RECTで指定されてる範囲内のみをJPEGで保存するにはどうすれば良いでしょうか? TJPEGImage の LoadFromStream を使うような気がするのですが使い方がわかりません…。
ビットマップオブジェクトを1つ用意して幅と高さをイメージコンポの指定範囲と同じにする ↓ イメージコンポの指定範囲をイメージコンポのキャンバスのCopyRectメソッドで 上のビットマップオブジェクトにコピー ↓ JpegオブジェクトのAssignメソッドで上のビットマップの内容をコピー …寝起きで動作確認していませんがこんなのでどうでしょう?
Formatって%05dとかやっても00005にならないんですが、 文字列のフォーマットって何か他に方法ないんでしょうか。
%.5Dか%5.Dじゃない?どっちかは忘れた。
>>714 ヘルプのFormatのところをよく読め(旧バージョンなら「形式文字列」のところな)
おおう。 失礼しました。ありがとうございました。
>>695 IDocHostUIHandlerの実装が必要です。
EmbeddedWBのソースが参考になると思います。
たまにソースコードの最後がend.からnd. になってprocedureがeprocedureになるんだが なんで?(Delphi2006)
心霊現…
>>719 Ctrl + Shift + C でクラスを定義するときにたまーになるね(D7)
フォームのサイズが時々勝手に変わってるような気がするのも 心霊g
フォームの保存形式が勝手にUTF-8になって文字化けしたりとか
cファイルをobjにコンパイルしてリンクするとき、 cファイルが例えばprintfを使うときはどうすればいいのでしょう? objファイルにprintfのルーチンをリンクすることが出来ません。
ほかはできてるのか?
C側で使ってる全部をリンクしないといけない。 printfのようにように浮動小数点を含んでいるとその範囲は広大になる。
>objファイルにprintfのルーチンをリンクすることが出来ません。 そもそもここがおかしい
Delphi.NET, VCL.NETって全部UNICODEベースなの? TNT使うならこっちのがいいのかな。
731 :
デフォルトの名無しさん :2008/02/25(月) 11:14:59
TWebBrowserについて質問なのですが、 横幅が510以下くらいになると、何故か画面に映らなくなってしまいます。 スプリッターで幅を可変にしたいのですが、困ってます。 何か解決方法はありませんか?
>>725 ttp://www.rvelthuis.de/downloads.html のmsvcrt.pasなどを利用してmsvcrt.dllを利用する。
もしくは下のような宣言を{$L xxx.obj}の上か、usesしている
別のユニットに書けばできる……はず。
function _printf(fmt: PChar; args: Pointer): Integer; cdecl;
var
buffer: array[0..1023] of Char;
begin
Result := wvsprintf(@buffer, fmt, @args);
write(Copy(buffer, 0, Result));
end;
733 :
732 :2008/02/25(月) 15:11:23
732はCopyの使い方が変だった。 write(buffer); と書くだけでよし。
734 :
725 :2008/02/25(月) 16:10:56
>>732 printfを使ったcのファイルをobjにしてdcuにリンクするときに問題なのです。
素直にDLLにする
今までINI<->変数<->設定ダイアログのコンポーネント<->INI という煩雑なデータのやり取りしてたけど INI<->メインフォームに置いた設定タブのコントロール にしてアプリは直接FilePathEdit.Textとかから値読み出すとめっちゃ実装が楽になるな。 使うほうもモーダルなダイアログいちいち開かずにすむし。
739 :
732 :2008/02/25(月) 16:46:20
>>734 「printfを使ったcのファイルをobjにしてdcuにリンクする」場合だから、
pas側でprintfを宣言し、c側の関数にそのpas側で宣言したprintf
を利用させてやる でOKだと思ったのだが……
動的なメニューの作成について質問です。 1 ,2 ,3 ,,4 ,5 ,,6 ,,,7 と保存されているファイルを読み込むと 1 ト2 ト3 4 ト5 6 7 というようなメニューが作れるようにたいんですが、どうすれば良いのでしょうか? メニューの追加はわかるのですが、サブメニューの追加方法がわかりません。
742 :
725 :2008/02/25(月) 22:58:15
>>739 失礼しました。 cからpasの関数を呼び出せないと思ってたので。
でも、やってみたら出来ました。 APIの呼び出しも uses Windows で出来ました。
>>740 dcuファイルに、.LIBファイルをリンクできるのですか?
>>741 MenuItem1.Items.Add(MenuItem2);
Delphiでファイルサイズを小さくしたい時にパッカー以外で何かありますか?
kol
var I: Int64; RepeatCount: Longword; begin for I := 0 to RepeatCount - 1 do end; なんで、Int64型の制御変数使えないの? いちいち、while文で書き換えなきゃいけないの? なんで、Delphiコンパイラこんなにウンコなの?
IA32命令を吐くコンパイラなので、Int64型の変数をループ変数に使うのは非効率だからです
非効率なりに対応すればいいと思うが。
Delphi5でボリューム名を知りたいんですが GetVolumeNameForVolumeMountPoint をサポートする関数等は用意されていないんでしょうか?
ググレカス
>>745 kol使うとIndyとか他のコンポ使えなくないですか?
やはりすべてAPIで書く以外にないんでしょうか・・・。
753 :
デフォルトの名無しさん :2008/02/26(火) 16:25:02
フリーのエディタのコンポーネントを探しています。 最低限、欲しいのはアンドゥ機能です。 何かいいのありませんか?
>>755 APIの名前がわかっている場合は
APIの名前とDelphiで検索すると高い確率でヒットしますね。
いきなりブレークポイントが効かなくなるときがあります F9押したらその行が緑色になって止まってくれません コンパイラオプションを変えたかしらと正常なプロジェクトと全く同じにしてもダメでした 「ブレークポイント 突然」でググッてもVisual Studioの場合しか有効な情報はありませんでした どなたかお願いいたします
>757 いつもの最適化の話じゃないんだよね?Delphiのバージョンによっては同一のプロジェクトグループの 異なるプロジェクトに同一名の(パス違いの)ユニットがあるとIDEが混乱することがあるんだけど、 そういうことでもなく?
>>743 なんか根っこから間違えてたみたいですね。
ありがとうございました。
>>757 実行中に各行の横に青い丸が出るだろ。あれが付いてない行は
実行対象外なのでブレークポイント張れない。
コンパイルオプション変えたあと再構築はした?
OnDrawCellイベントの中でDrawGridのセルにDrawGrid.Canvas.TextOutで文字を書いても、実行してセルを選択すると選択枠の下になって文字が消えてしまいます。 どうすればいいんでしょうか?
764 :
763 :2008/02/27(水) 13:42:31
自己レスです。 OptionsのRangeSelectの値をいじってたら思うように行きました。
765 :
749 :2008/02/27(水) 13:55:47
>>755 なるほど!納得しました!
ありがとうございました
ListViewのRepot形式のColumnsにきっちり対応した描画サンプルコードってどこかにないですか。 デフォルトの描画をベースにOwnerDrawしたいんですが。
>>766 ListViewのオーナードローはやめとけ。俺は途中で挫折した・・・
今日開くと治っていまして原因はまたもや(いろんなプロジェクトでタマになる)
>>758 そのソースはD5でしたのでグループは使っていません
>>761 F9押すときまでは張れると言いますか行の色もOKな色になるんです
で、実行ファイルが始まったとたんに色が変わります
また今度なったら再構築してみます
ありがとございまいたm(..)m
毎日一定時刻にある処理をするプログラムなんかを書く場合、 timerで適当な時間ごとに割り込んで、時刻をチェックするという ような方法がベストなんでしょうか? 指定時刻にイベントが発生するようなものはないですか?
「指定時刻」をどうやってチェックするんだい?
ゼンマイ式の外部機器による物理的なスイッチによる割り込み
指定時刻まで何ミリ秒かを計算してIntervalに突っ込むか 起動自体はatコマンドかタスクに任せたら。
タスクだと、登録時にIDとかパスワード聞いてきて面倒なので。 (定期的にパスワード変えさせられる環境なんで特に。) そうですね。計算してintervalにセットが一番スマートそうですね。 intervalの値ってlongint位はイケるんでしたっけ?
真面目にやるなら時刻調整が入った時にタイマー直す必要があると思うけど 検出法って一定時間ごとにチェックする以外にあるのかな?
それが気になるなら1秒ごとに呼べばいいよ。 負荷なんて高が知れてるし。
>744 {$SETPEFLAGS 1} // Fixed image. Image doesn't contain reloc table
TStringGridで固定セルをセル結合(DrawCellで)したみたのですが 描画には成功しましたものの グリッドを選択(行選択)すると青背景選択されなくなりました。 どなたか良い思案をお持ちでしょうか?
フォーカスが当たっていたらCanvas.Brushの色を変えて自分で選択されているように描画する
おお 出来ました。有難うございます。 DrawCellのStateでgdSelectedを捕まえたらうまくいきました。 ちなみにgdFocusedだと行選択なので左端しか該当しなかったのは驚き・・・。
Kolを使ってファイルサイズ小さくしたいのですが、これって他のコンポは使えなくなってしまうのでしょうか?
ポトペタしたいという話ならそのとおり ただし自分で生成すればその限りじゃない
782 :
デフォルトの名無しさん :2008/02/28(木) 20:39:46
外部のライブラリなどからC++のクラスオブジェクトのポインタをもらって、 そのメソッドをDelphiのプログラムから使う事ってできますか?
上の方で少しでていたけど、タイマー(TTimer)の負荷ってそんなに 問題にならないくらいのモノなの? 自分、ファイルを自動実行するアプリとか、できるだけTTimerのCreate を増やさないようにしてたんだけど、意味なしだったのかな?
BCB使うとか。 COM使うとか。
>>783 頻度による
秒やミリ秒と時間事や1日1回では雲泥の差
>>782 呼び出し規約があっていて仮想関数でなければ呼べそうな気もするけどどうなんだろう
マウスカーソルを上から下に動かすだけで、 ウィンドウをちょっとドラッグするだけで数十数百のメッセージが乱れ飛ぶ環境で 毎秒発生する程度のTimerイベントケチっても焼け石に水。 とりあえず一番楽な方法で実装して重い部分からパフォーマンスチューニングをしていったら タイマーに手をつけることはまずないだろうな。
>>781 あとインストールはできたのですが、KOL使った実行ファイルを作ろうとコンパイルしたら、
以下のようなメッセージがでました。
[致命的エラー] AAAA.dpr(6): ファイル 'ExptIntf.dcu' が見つかりません
ググったんですが、わかりません、解決方法ご存知の方いますでしょうか?
@Delphi6 Personal
>>767 遅めのレスですが私も同意見です。
・ヘッダーコンポ+リストボックス
・ヘッダーコンポ+グリッド
・ヘッダーコンポ+グリッド
・グリッド(単独)
のどれかで代用した方がずっと楽に出来ると思います。
Turbo Delphi Explorer 2006 をダウンロードしたんですけど、なんかインストール時に登録してくださいとかいわれて メールに添付されたtxtファイルをあてようと思ったらメールに添付ファイルなんてついてこなかったんですが どうすればいいんですか? 向こうから来たメールにはシリアルナンバーとキーのみがありまして txtファイルなんてきてないんです
テキスト保存
>782 やめとけ。パッケージを使うのでなければDLLとのやりとりはCのインタフェースに限定するのが望ましい。
>>784 BCB使ってもTObject派生じゃないと互換性ないよ。
>>786 まず、C++の名前は型保証の為の文字列がくっついているからコレを解釈しなければいけない
呼び出し規約といっても、オブジェクトを示す隠れた引数があるから
これを含めて上手くあわせられるかな?
そして、C++側でDLLにクラスのメンバーをエクスポートしてもらわないといけない。
色々考えると、extern "C" で呼び出し関数を作って
それをエクスポートして貰う方がズーっと楽という結論になると思うよ
Indyとsynapseではどちらがおすすめですか? synapseの方が軽そうな気はするのですが悩んでます。
悩むんなら、googleで検索して自分の助けになりそうな資料が多いほうを選んだらどう?
634あたりからのDLLのコールバックの話を見て俺もやってみようと思ったんだけど コールバック関数内でクラスメソッドを呼び出そうとすると アクセス違反が出てどうもうまくいかない。 今やってるやり方は以下の通り 1.DLLにDLLをラップするクラス(以下ラップクラス)のポインタとコールバック関数のポインタを渡す 2.DLLで受け取ったラップクラスをそのまま引数にしてコールバック関数を呼び出す 3.コールバック関数で受け取ったポインタをラップクラス型にキャストして ラップクラスが保持するメソッドポインタを呼び出す(ここでアクセス違反エラー) ちなみに受け渡すポインタをPointer型からTObject型に変えても駄目だった。 何が駄目なんだろう?
>>799 全然判らん。 コードで表現してくれない? どっちをDLL側に書いたかEXE側に書いたか明記して
801 :
799 :2008/02/29(金) 14:09:39
>>800 失礼。関数を呼び出しているところを抜き出してみたので頼みます。
//DLL
type
TCallBackFunc = procedure(Sender: Pointer); stdcall;
procedure CallEvent(Sender: TObject; FuncPtr: TCallBackFunc); stdcall;
begin
FuncPtr(Sender);
end;
//ラップクラスユニット
type
TCallBackFunc = procedure(Sender: Pointer); stdcall;
TCallEvent = procedure(Sender: Pointer; FuncPtr: TCallBackFunc); stdcall;
TDllLoader = class
private
CallEvent: TCallEvent;
mNotifyEvent: TNotifyEvent;
public
procedure RaiseEvent(Sender: Pointer; Event: TNotifyEvent);
end;
procedure CallBackFunc(Sender: Pointer); stdcall;
implementation
802 :
799 :2008/02/29(金) 14:10:00
//ラップクラスユニット続き procedure CallBackFunc(Sender: Pointer); stdcall; begin TDllLoader(Sender^).mNotifyEvent(nil); //ここでエラーが出る end; procedure TDllLoader.RaiseEvent(Sender: Pointer; Event: TNotifyEvent); var hLib: HINST; begin hLib := LoadLibrary('DLLTest.dll'); @CallEvent := GetProcAddress(hlib, 'CallEvent'); mNotifyEvent := Event; CallEvent(Sender, CallBackFunc); FreeLibrary(hlib); end;
803 :
799 :2008/02/29(金) 14:10:54
//ラップクラス呼出元 // usesでラップクラスのユニットを宣言済 procedure TForm1.Button1Click(Sender: TObject); var loader: TDllLoader; begin loader := TDllLoader.Create(); loader.RaiseEvent(@Self, Button2Click); loader.free(); end; procedure TForm1.Button2Click(Sender: TObject); begin if Sender = nil then ShowMessage('CallBack Event') else showmessage('Button2 Clicked'); end;
804 :
799 :2008/02/29(金) 14:12:34
以上です。これでForm1のButton1をクリックすれば"CallBack Event"とメッセージが表示されると想定していました。
2箇所間違えているよ 1、 × TDllLoader(Sender^).mNotifyEvent(nil); //ここでエラーが出る ⇒ TDllLoader(Sender ).mNotifyEvent(nil); //ここでエラーが出る クラス型はポインタだから ポインタの参照をしないでいい 2、 × CallEvent(Sender, CallBackFunc); ⇒ CallEvent(Self , CallBackFunc);
標準のものを更に高機能にしたShellTreeView/ListViewってないですか?
loader.RaiseEvent(@Self, Button2Click); でポインタのポインタを渡しているのに、受け取り側で TObject になってるのはおかしい。 procedure CallEvent(Sender: TObject; FuncPtr: TCallBackFunc); stdcall; こうして、 procedure CallEvent(Sender: Pointer; FuncPtr: TCallBackFunc); stdcall; こうするべき。 if Sender <> nil then (TObject(Sender) as TDllLoader).mNotifyEvent(nil); 型チェックと例外処理はきっちりやっておかないとダメですよ。 変なものを渡せないように、Pointerでは無くて、 type THoge = record end; HHoge = ^THoge; なんてやるのもいいかもね。 OpenGL.pasではやってたと思う。
808 :
799 :2008/02/29(金) 19:30:13
>>805 、807
クラス型はタダのポインタだということを忘れてた(ノ∀`)
指摘の通り修正したら思ってたとおりに動きました。ありがとう!
アカウントを持っている場合 "Turbo Delphi Explorer" 若しくは "Turbo Delphi for .NET Explorer" を選択すると ログイン画面が表示されるのでログインしてください。 すると、自身のメールアドレスが表示されるので [submit] を選択します。 これで、Turbo Delphi がダウンロードできるページへ遷移され、 Borland から Turbo Delphi の起動に必要なファイルが添付されたメールが送られてきます。 添付されてこないんですけど。 インストール番号とインストールキーは発行されたけど 大体これ正確にはシリアルナンバーと認証キーでしょ? 名称一致してない・・・以下転載 これは自動的に生成されたメッセージです - このメールに返信しないでください Turbo Delphi 2006 Explorer Edition インストール番号: インストールキー: Login Name: @.jp Trial Login Password: 名: te 姓: te トライアル版使用許諾情報を再送いたします。上記の Serial Number と Key を使用して、CodeGear 製品トライアル版の使用許諾を行ってください。 CodeGear 製品をお使いいただき、ありがとうございます。CodeGear のコミュニティには弊社の製品を使用してソフトウェアを開発する世界中のデベロッパーが参加しています。コミュニティへ参加してくださったことを歓迎いたします。 CodeGear チーム一同
すみません。 これからDelphiを学ぼうと思うのですが、定番の入門書とか勉強コースのようなものはありますか? ちょっと大き目の本屋に行ってもDelphiのちゃんとした本というか、そもそも体系的な本が見当たらないのです。 ネットの情報等で勉強するしかないんでしょうか? さしあたっての目標は、自分が使ってる2ちゃんねるブラウザのソースを読めて、 自分なりの機能を付け加えるようにできることなんですが。 自分はC→Javaと始めて、プログラミング初心者の基礎はそれなりにある程度です。 Win32とかはわかりません。
>Win32とかはわかりません ワロタwwww
入門書をえり好みできるほどの種類はないから Amazonで見つかったのを買っちゃうしか。
UIがOrchisのようなソフトを作りたいのですが、 あのメニューみたいのはどういう風に実装してるんでしょうか?
>>713 レス遅くなりました、頑張ってみましたが
CopyRectの使い方が間違っていると怒られちゃいます
RがJPEGで保存したい選択範囲です。
正しくはどうかけばいいんでしょうか?
jp :=TJPEGImage.Create;
try
bm :=TBitmap.Create;
try
bm.Width := R.Left - R.Right;
bm.Height := R.Top - R.Bottom;
Image1.Canvas.CopyRect(R, bm.Canvas, Image1.Canvas.ClipRect);
jp.Assign(bm);
jp.Compress;
jp.SaveToFile('C:\foo.jpg');
finally
bm.Free;
end;
finally
jp.free;
end;
>>818 すいません、TCanvas.CopyRectの説明が間違っておりました。
このメソッドはほかのキャンバスから部分転送するメソッドですから
「(転送先である)ビットマップオブジェクトのキャンバスのCopyRectを使う」
が正しいです。
たとえばイメージコンポのキャンバスの範囲Rを新規ビットマップに切り出すなら以下のような感じです。
bm.Canvas.CopyRect(Bounds(0, 0, bm.Width, bm.Height), Image1.Canvas, R);
なおエラーになる(実行時に例外が生成される)件はこれとは別で
幅と高さを求める計算式が間違っているために値が負の数になってしまったことが原因です。
(数の大きい方から小さい方を引くようにするかabs関数で絶対値をとってください)
例外は高さを代入するときに生成されるのを確認しました。
コードを修正される前に必ず実際に1行ずつ実行して
この時点で例外が生成されるのを確かめてください。
一連の処理コードの一番上の行にF5でブレークポイントを置いてから実行してください。
このブレークポイントで止まりますから、ここからはF8で1行ずつ進めてください。
実行時にエラーになる場合、大事なのはまずどこで発生するかを突き止めることです。
>>806 VirtualTreeView のサンプルでそういうのあったよ。
それを改造してみるというのはどうか。
Delphi7です。 SimpleRoundTo(2.55,-1) としたら2.6が帰るもんだと思ってましたが 2.5が帰ってきました。ワタシ、何かぼけてますでしょうか?
SimpleRoundTo(1.145, -2) ==> 1.14 SimpleRoundTo(1.155, -2) ==> 1.16 SimpleRoundTo(1.165, -2) ==> 1.17 SimpleRoundTo(1.45, -1) ==> 1.40 SimpleRoundTo(1.55, -1) ==> 1.50 SimpleRoundTo(1.65, -1) ==> 1.60 誤差が絡んでるのかもしれないけど挙動が謎過ぎる・・・
バンカーズラウンディングだろ
RoundToがbankers' rounding、SimpleRoundToが普通の四捨五入だと思ってた。
思ってたかどうかなんか聞いてない。 実際のソースはどうなってる?
828 :
826 :2008/03/02(日) 08:05:34
あ、俺が調べるの?
>>821-825 とは別人なんだが。
説明を簡単にするために正の数、ADigitが0という条件だと
SimpleRoundToは0.5足してTrunc。
RoundToはRoundを呼び出してるだけ。
System._ROUNDがRoundの実体だとすると、FISTPという命令を使ってる。
これがどういう丸めなのかがよくわからない。
ヘルプにはRoundはBanker's Roundingだと書いてある。
829 :
826 :2008/03/02(日) 08:30:28
Truncの実体がSystem._TRUNCだとすると 0方向に丸める(=正の場合切捨て)よう設定してからFISTP、に見える。 asmはよくわからないので、詳しい人お願い。
というか普通に a := Trunc(b + 0.5); でいいやん。変なとこで悩むな。
831 :
826 :2008/03/02(日) 09:25:18
var a, b, c: Double; begin a := 0.1; b := Trunc(0.25 / 0.1 + 0.5) * a; c := Trunc(0.25 / a + 0.5) * a; end; b=0.3 c=0.2 なんで?
>>815 YPT HandleXで見てみましたがわかりませんでした…。
常にメニューが開いた状態というかなんというか…
あれはどうやれば良いのでしょう?
質問します Webサイト(Java)の中のEdit(みたいなの)にデータを書き込むような外部アプリはDelphiでクライアント側に作れるのですか? 作れるとして、それはどう言うカテゴリーの技術を調べれば良いですか?
>>832 自前で作ったら?Toolbar2000が独自にポップアップメニューの描画を
やってるはずだから参考にするといい。
字面どおりにブラウザのEditにデータを突っ込みたいだけなのか それとも2chブラウザのようにWebブラウザがやっていることを そっくりそのままDelphiで代替したいのか。
>>833 Javaのエディトボックスは制御できるんだろうか?
キー送るだけならできるだろうが
>>835 外部からブラウザを制御出来るなら最高です。
やりたいことは、会社の労務管理用のWebアプリへの実績入力です。
サイトで(1)日付の指定(2)社員の選択(3)実績値の入力(4)予定値の入力、を社員数回繰り返します。
社員は部署のDBに一度データを入力してそれを担当がも一回本社Webシステムに入力してますから毎朝虚しくなります。
本社Webと部門DBの接続などもちろん却下されてます。
>837 ActiveXの操作だけで済むならWSHで十分かも。 いろいろ細かくやりたいなら Delphi+DMonkeyで ActiveX操作をDMonkeyに任せるとすごい楽できる。
WebスクレイピングでもOKっぽいから、 RubyとかPythonのMechanize使うのもいい手かも
Rubyはまだいい方ですがPythonはちょっと・・・・
841 :
デフォルトの名無しさん :2008/03/02(日) 14:58:32
>>838 DMonkeyと言うのを使えばなんとかなるかもしれない、そう言う意味に解釈しました。
ありがとうございました。
ダメ元で勉強してみます。
sage
JavaっていってるんだからActiveXじゃねーだろ。 DMonkeyはちょっと謎過ぎる。 入力自動化ならDelphiのフォームやテキストエディタでテキストでデータを書き込んで AutoHotkeyとかでブラウザに渡すのが手っ取り早いんじゃね。
844 :
デフォルトの名無しさん :2008/03/02(日) 18:49:20
あるゲームの画面上に文字を出したいのですが、一瞬しか表示されません。 やってみたのは、 TextOut(DC,0,0,'■',2); で、DCは指定のウィンドウハンドルを指定しています。 無限ループでやると長く表示されますが、ループの中に他の処理を入れると点滅したりしてしまいます。 あと、この文字に対してクリックしたらある処理を行うなどのイベントを作成することはできるのでしょうか? 上手く説明できてませんがよろしくお願いします。
SimpleRoundToで検索すると、非対称丸めって言葉が見つかりますが、
銀行丸めのことですか? Roundが銀行丸めと思ったけど。
銀行丸めなら偶数になるから、こうなるはずでは?
SimpleRoundTo(1.165, -2) ==> 1.17 (1.16のはず)
SimpleRoundTo(1.55, -1) ==> 1.50 (1.6のはず)
>>844 OnPaintで文字を描画すれば、必要なときに自動的に再描画されますよ。
文字のクリックは、文字を書いた長方形を覚えておき、
OnMouseDownで長方形の中かどうかを判別する。
非対称丸めが何の事かわからないのに勝手に銀行丸めで理解できる頭が羨ましい
>>845 なんでそこまでしてSimpleRoundToを使う必要があるんだ?
自分の好きな丸めルーチンを作ればすむことでは?
848 :
デフォルトの名無しさん :2008/03/02(日) 19:47:38
数週間前、メタファイルの作り方を教えていただいて無事、文字や 長方形は出力できるようになったのですが、メタファイルに画像を 貼り付けられません。そもそも画像(JPG、BMP)を貼り付けられるのか どうかも分かりません。最後の行でエラーになります。 よろしくご教示お願いします。 procedure TForm2.PaintBox1Paint(Sender: TObject); var Fmetafile:TMetafile; FmetafileCVS:TMetaFileCanvas; ACanvas:TCanvas; pic_file2:string; pic:Tgraphic; begin Fmetafile:=TMetaFile.Create; ACanvas:=Paintbox1.Canvas; pic_file2:='d:\gazou\test.bmp'; pic.LoadFromFile(pic_file2); try FmetafileCVS:=TMetaFileCanvas.Create(Fmetafile,0); try SetMapMode(FmetafileCVS.Handle,MM_LOMETRIC); FmetafileCVS.StretchDraw(Rect(0,0,200,-140),pic);
>>834 ありがとうございます。
自前で用意する…すごく難しそうですが、頑張ってみます。
850 :
845 :2008/03/02(日) 19:58:01
>>850 ヘルプにSetRoundModeで設定した丸めモードの影響を受けるって書いてあるぞ
結論としてはDelphiは四捨五入が出来ないということでよろしいか
四捨五入ってのは世界的には使われていない trunc使えば簡単にできるからてめぇで作れって事
え?
算数で習ったのは四捨五入だけでしたけど。 マイナスの時にどうしたかは忘れました。
857 :
826 :2008/03/02(日) 20:57:07
SimpleRoundToの個人的まとめ。 正解かどうかわからないので、必要な人は追試してください。 ・SimpleRoundToは意図した結果が得られない場合(ADigit<0 ?)がある。 ・Truncは引数に変数を使った式を与えると意図した結果が得られない場合がある。 ○a := 10; Trunc(0.25 * a + 0.5) / a; ○Trunc(0.25 / 0.1 + 0.5) * 0.1; ×a := 0.1; Trunc(0.25 / a + 0.5) * a; //SimpleRoundToの中がこれ ・引数に指定する計算式の結果を一度変数に代入してから、Truncに与えれば大丈夫そう。 ○a := 0.1; b := 0.25 / a + 0.5; Trunc(b) * a; ・Floorも内部でTruncを使ってるので同様。 ・Ceilは内部でTruncを使っているものの大丈夫そう??
859 :
デフォルトの名無しさん :2008/03/02(日) 21:08:10
>>845 ありがとうございます。
概念は理解したつもりなのですが、他のウィンドウに貼り付ける方法がよくわかりませんでした。
このペイントボックスはそういうことができるのでしょうか?
860 :
デフォルトの名無しさん :2008/03/02(日) 21:11:32 BE:291790962-2BP(1111)
ようは b := 3 * a; c := Trunc(0.29999...) * a; なわけだ
>>844 他のゲーム画面にとなると、ちと面倒
DirectX使っているゲームなら、
FrapsみたいにDirectXのAPIのっとりしないといけない。
ただ、切り抜いたウインドウとして上に重ねたいだけなら、
リージョンつかっていけるはず
これだと、ゲーム画面直接というわけにはいかない
863 :
844 :2008/03/02(日) 23:00:31
ウィンドウの順番を変えればいいのかと思い、 まず、TFormのTransparentcolorをTrueにし、透明色をフォームの色と同じにしました。 次に SetWindowPos( FindWindow('TForm1', nil),HWND_TOPMOST,0,0,0,0,SWP_NOSIZE); SetWindowPos( FindWindow('WMPlayerApp', nil),HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE); というように、TFORMを一番上、ゲーム画面をその次にしました。(例としてメディアプレイヤーの全画面表示にしました。) これでボタン以外は透明になり、ゲームの画面と重ねることができたのですが、 全画面のゲームのため、フォームのボタンをクリックするとデスクトップ画面に戻ってしまうことと、Tformが点滅してしまいました。 全画面を解除せずにボタンをクリックしたり、点滅を解除することはできないのでしょうか。
864 :
844 :2008/03/02(日) 23:03:59
>>862 ありがとうございます。
乗っ取りというのと、リージョンというの調べてみたいと思います。
>>863 難しいよ。全画面アプリは自身のウィンドウが非アクティブになったときに
送られるメッセージを捕まえて画面を元へ戻している。自分がやったときは
ウィンドウプロシージャをHookしてメッセージが伝わらないようにしたけど。
866 :
デフォルトの名無しさん :2008/03/03(月) 00:15:52
>>865 あ、最前面の取り合いだから点滅していたのですね。
難しいですねorz
TMenuItem.Create(self);すると、selfは未定義だよハゲって言われる。 確かにハゲてる。もうダメかもわからん。頭が溶けそう。意味がわからない。
procedure AddMenu(Sender: TComponent); begin TMenuItem.Create(Sender); end; procedure TForm1.Button1(Sender: TButton); begin AddMenu(Self); end; みたいにやればうまくいくかもよとエスパーしてみる
VistaのアドレスバーのVCLはどこにありますか?
>>868 エスパーありがとう。基本がわかってないからつまづくんだろうか。
メニューを動的に作りたくて四苦八苦してる…。
ttp://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200712/200712_07120044.html ここの一番下のレスを参考にやってみて、フォームにボタン二つ乗っけてコピペしたら行けたから
じゃあちょっと書いてみるかと下のコードを「仕分け入力」の下に追加したらいきなりダメになった…。
宣言のとこにmenu4を追加して
Menu4 := TMenuItem.Create(Self);
Menu4.Caption := 'うんこっこ';
Menu4.OnClick := Button2Click;
Menu3.Add(Menu4);
オンマウスというか、うんこっこを開いた時点で、なぜかButton2Clickになってメニューが増やされる。
>>848 暗黙的に省略されたとおぼしきコードを足して実行してみたところでは
エラーの発生は再現できませんでした。
最後の行というのはStretchDrawのところだと思いますが
どういう例外メッセージがでているのか教えていただけると助かります。
> そもそも画像(JPG、BMP)を貼り付けられるのか
TGraphicを継承したグラフィックオブジェクトなら基本的に何でも貼り付けることができます。
ただし縦横それぞれ数千ピクセルもあるような巨大なビットマップだと
うまくいかないかもしれません。
872 :
デフォルトの名無しさん :2008/03/03(月) 07:16:22
> 871 >最後の行というのはStretchDrawのところだと思いますが >どういう例外メッセージがでているのか教えていただけると助かります。 ありがとうございます。もう、仕事に行く時間なので、夜、UPさせていただきます。 よろしくお願いします。 >暗黙的に省略されたとおぼしきコードを足して実行してみたところでは 省略していないつもりですが..どのようなコードを継ぎ足されたのでしょうか?
873 :
デフォルトの名無しさん :2008/03/03(月) 10:50:03
>843 謎というのはActiveX操作のときのバグっぽいものを指してる? なら、DelWikiにあるパッチを当てると何とかなるよ。 または、数日前に irvine の作者さんが CVS 更新してくれたみたいだからそれを使うか。
>>831 b := Trunc(0.25 / Double(0.1) + 0.5) * a;
で同じにならないか? 0.1のままだとExtended型になる。
>>858 違う。
>>867 シャンプーが合っていないのかも。
めかぶを食べると良いらしい。
非対称型の丸めとは、正と負で非対称の意味。 だから、正の無限大に丸めるのと、負の無限大に丸める方法は非対称型になる。 逆に、0方向に丸めるのは対称型の丸めになる。
GExpertのProcedureListみたいな感じでユニット、ファイル名を文字で絞り込んでジャンプする機能って無いんですか?
if reb then result := not result; を論理演算一発でやるのはどうすればいいですか?
Result は Boolean型?
こうかな result := result xor reb
Reb Result → Result True True False 1 True False True 2 False True True 3 False False False 4 Result := Reb xor Result;
サンクス。 xorなんてはじめて使うかも。
882 :
デフォルトの名無しさん :2008/03/03(月) 20:30:38
> 871 >どういう例外メッセージがでているのか教えていただけると助かります。 メッセージは プロジェクトProject1.exeがEAccessViolationクラスの例外を生成しました。 アドレス7361766Eでアドレス7361766Eに対する読み込み違反がおきました。 プロセスは停止しています。再開するにはステップ実行または実行を選択して ください。 と、でます。よろしくお願いします。
FmetafileCVS.StretchDraw(Rect(0,0,200,-140),pic); で EAccessViolation が出るなら、普通に考えて、 FmetafileCVS か pic 変数が無効。 事前にFreeしちゃってません? Createしてなかったら、未初期化変数を使ってるってWarningが出てるはず。
885 :
デフォルトの名無しさん :2008/03/03(月) 21:12:04
>picを初期化してないとか じ、実はその警告もでています。でも、 初期化の仕方がわからなかったので そのままにしてました... pic:=Tgraphic.create; とか書いても 警告:クラス’Tgraphicのインスタンスを作成していますが、このくrすは抽象メソッドTGraphic.LoadFromStreamを含みます というのが多量にでて、無視して実行しても EAbstractErrorクラスの例外を生成しました Abstractエラー というのがでてしまうので。どうやって、初期化すればいいのでしょうか??
var pic: TPicture; begin pic:= TPicture.Create;
>>885 警告は飾りで出されてるわけじゃないんだし、
最低条件としてそういうのは質問時に提示しないと。
よく分からない場合は勝手な判断で省略せずに全部書き出すこと。
>>819 ありがとうございます
Bounds関数というのがあるのですね。
今回は開始位置が 0, 0 だったのでRectでもうまく動きましたが
心に留めておきます。
デバッグについては思い込みで変更を行い
今回のようにはまってしまうことが良くあるので
気をつけたいと思います
889 :
741 :2008/03/04(火) 03:52:11
行き詰まりました…。サブメニューから戻れず、延々とサブメニューを作ってしまいます…。 何かヒントをください…。
890 :
デフォルトの名無しさん :2008/03/04(火) 04:43:04
> 886,887 ありがとうございます。ただ、 var pic: TPicture; begin pic:= TPicture.Create;としますと、 FmetafileCVS.StretchDraw(Rect(0,0,200,-140),pic); でTgraphicとTpictureは互換性がないとでてしまうのですが....
>>889 です。なんとか出来ました…馬鹿みたいです。ありがとうございました。
>>891 解決したときは何が問題だったか書いてくれると
同じ症状でぐぐってここにたどり着いた人が
悲しい思いをしなくてすむかも
ですよ
>>890 pic.create
pic.LoadFromFile
pic.Graphic
Turbo Delphi Explorerをインストールしたいです。 ・インストールに必要なファイルは3つ ・無料会員登録必須 ・CodeGearから送信されてくるメールに記載されているキーとパスで認証 ・最後に製品登録(添付ファイルを使うことで認証される)する でもメールでは添付ファイルが添付されてこないんですけど、なんでですか? 自動返信メールの設定ミスだと思うんですけど。 他の製品の場合、添付ファイルはちゃんと添付され、かつ本文にも添付ファイルと 同じ内容の文が記載されていました。 なんで無料版だけ添付ファイルもメール本文にも製品登録コードがないんですか
SimpleRoundToの質問をしましたものです(
>>821 です)。
色々な回答を頂き、また
>>826 さんには色々と調べていただき、本当に
ありがとうございました。質問を投稿してからすぐにゴタゴタ&半デスマが
ありまして、ようやく帰宅しました。
結局SimpleRoundToは使えないとの結論に至りまして、くろねこさんなどの
サイトを参考に関数を作って対応することにしました。
ワタシの場合は小数点以下のみで負数は対象外なのですが、
汎用的な関数があってもいいかなって気もしまして、ちょっと考えて
見たいと思いますが、結構この分野、奥が深い感じですね〜(数学苦手)
897 :
デフォルトの名無しさん :2008/03/04(火) 20:17:37
> 893 ありがとうございます。 pic:Tgraphic; begin FMetafile:=TMetafile.Create; ACanvas:=PaintBox1.Canvas; pic.create; pic.LoadFromFile('d:\test.jpg'); try FMetafileCVS.Create(FMetafile,0); try SetMapMode(FMetafileCVS.Handle,MM_LOMETRIC); FMetafileCVS.StretchDraw(Rect(0,0,200,-100),pic.graphic); としてみましたが、最後の行で未定義の識別子’graphic'とでます。 pic.LaodFromFile(..);の下に pic.graphic としても、未定義の識別子とでます。最後の行はどういう意味でしょうか?
パスを表す'c:\windows'と'C:\Windows'が同一であるかを判定する関数ってどれ? AnsiStrIComp?
SameFileName
>>897 なんか前よりひどくなってるが、もしかしてコピペじゃなくて手打ちでもしているのか?
>>897 var
pic: TPicture;
begin
pic:= TPicture.Create;
pic.LoadFromFile(
FmetafileCVS.StretchDraw(Rect(0,0,200,-140),pic.graphic);
おわったら
pic.free;
end;
903 :
デフォルトの名無しさん :2008/03/05(水) 00:38:35
ファンクションに、二ついんすうを渡して、二ついんすうを返すことってできますか?
procedure foo(arg1, arg2: integer; var mul, sum: integer); begin mul := arg1 * arg2; sum := arg1 + arg2; end;
ひきすうね。 引数についてはprocedure、functionとも好きなだけ渡すことができる。 procedureは値を返すことはできない。functionは戻値(もどりち)をひとつだけ返すことができ、 その値がfunction呼び出しの結果になる。 ただしいわゆる「参照渡し」(Call by reference)を使うことで呼び出し元が持っている変数の内容を 呼び出し先で参照、変更することができ、これを利用して複数の値を呼び出し元に返す、という 方法がある(ちなみに普通の引数は「値渡し」(Call by value))。 procedure Foo(X: Integer; var Y: Integer; var Z: Integer); begin Y := X * 2; Z := X * 3; end; procedure TForm1.Button1Click(Sender: TObject); var V: Integer; W: Integer; begin Foo(4,V,W); // V=8,W=12になって出てくる end; FooのY/Zについているvarをはずすとcall by valueとなりFoo内での代入の効果は 仮引数Y/Zにたいしてのみ働き、呼び出し元までは波及しない(Y/Zとも不定値となる)。
type THogeRec=record a:integer; b:double; end; function foo(x,y:integer):THoge; begin result.a=x*2; result.b:=x/y; end;
ウィンドウハンドルからアイコン取得するのってどうやればいいんですか。 モジュールのパスから取得するのは出来たんですが これだとApplication.Icon.Assignするようなアプリのアイコンが取れません。
プログラム実行中常に使いたい画像がある場合は TBitmap.Create; して finally 節で何もせずに Form.Destroy で Free を呼ぶ この方法で良いんでしょうか?
909 :
デフォルトの名無しさん :2008/03/05(水) 06:42:22
> 902 う、う、うっ、ようやく神にあえた。やりました!!。 Tgraphicのところに、Tpictreuのをもってくるとは!! 思いもつきませんでした。 ありがとうございました。
>>908 そのフォームのメンバーならそれでいいと思うよ
そうじゃないなら initialization でCreateして finalization でFree
if A <> '' then begin if B = 'あいうえお' then begin 処理1 end else begin 処理2 end; end else begin 処理2 end; こういう風に、AがtrueかつBがtrueの時に処理1を実行して、 Aがfalseの時と、AがtrueかつBがfalseの時に処理2を実行したい場合にはこういう風に同じ処理を書かないと駄目なんでしょうか? 何か上手い方法ありますか?
A B × × 処理2 × ○ 処理2 ○ × 処理2 ○ ○ 処理1 つまり A and B が処理1 if ( A<>'' ) and ( B='あいうえお' ) then begin 処理1 end else begin 処理2 end;
>>912 複数の条件を使えるのですか。
ありがとう。ためになりますた。
結果的に一つの論理式になればいいのだから、いくつでもかわない。
>>907 どっかでひらた
// ウインドウハンドルから実行ファイル名(フルパス)を取得する
function GetFilenameFromWindowHandle(hTargetWnd: HWND): String;
var
PID: Cardinal;
SnapShot: THandle;
ModuleEntry32: TModuleEntry32;
begin
Result := '';
// ハンドルからプロセスIDを得る
GetWindowThreadProcessId(hTargetWnd, @PID);
ModuleEntry32.dwSize := SizeOf( TModuleEntry32 );
// システム中の情報のスナップショットをとる
SnapShot := CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, PID );
try
// モジュールの検索
if Module32First(SnapShot, ModuleEntry32) then
Result := String(ModuleEntry32.szExePath);
finally
CloseHandle(SnapShot);
end;
end;
タスクバーにあるアイコンを取得したいのでは?
| |,,∧ カキマチガイ |_|Д゚ミ |文|⊂ミ | ̄|∧| ハンドルからiconも取得できるようにしてます。ヨロ
Delphi6に MP3Player(作者は、計さん)をインストールしようとしてますが 【エラー】未定義の識別子:SListIndexError がでてインストできません。 確認済みの動作環境がDelphi4/5なのですが、6しか持っていないためお願いします
そのエラーだけなら Consts -> RTLConsts に変更すればいけると思うけど
921 :
919 :2008/03/06(木) 15:59:35
変更したらできました。ありがとうございました。
2つの同じ型のデータのポインタを渡したら temp := a; a := b; b := temp; を行ってくれる関数って初めから用意されてたりします? ちょっとのことなんですが、あると嬉しいんです
ないです。
がんばって procedure Exchange(var a, b: Pointer); overload; procedure Exchange(var a, b: Integer); overload; procedure Exchange(var a, b: TObject); overload; ... を整備しまくるんだ
var a, b: TObjectは、TObject型限定になるんじゃなかった?
TObjectにキャストすれば問題ない
TObject渡されても複製が出来ないだろ Assign/AssignToメソッドを持ってるTPersistent にしないと
928 :
927 :2008/03/06(木) 19:06:53
あ、 var が付いてるから、ポインタを交換するのか・・・・あんまり意味ないな
お前の空気と文脈の読めなさには頭が下がる
Janeの派生系Jane ViewやJane StyleにあるポップアップメニューでAA入力支援みたいのを作る時 どうやって作ったら良いんですか? Cだったら構造体で線形リストを作って親か子かで分けて動的にメニューの作成…みたいな感じかなあ?とは 思うんですけど、Delphiでやる場合はどうやったら良いんでしょうか?
Delphiでも同じ方法でできるよ。
ごめんなさい。同じ方法でも出来るとは思うのですが、 TStringListなんていう便利な型があるじゃないですか? あれ使えばそんなことしなくても、チャッチャッと出来てしまうものなのかな?と思って…。 AAlistの部分のソースとかないですかね?参考に見てみたいんですけど。
JaneはDelphiによるオープンソースプロジェクトだと思ったが。
Cでのやり方がわかってるのならそれをさらしては?
>>932 AAList := TStringList.Create;
AA := TSringList.Create;
AA.Add('| |,,∧');
AA.Add('|_|Д゚ミ');
AA.Add(|文|⊂ミ');
AA.Add(| ̄|∧|');
AAList.AddObject('フサ/電柱', AA);
のように見出しリストの各項目にテキスト本体をぶら下げる二重構造にしておいてやれば
例えばEdit1に検索文字列'電柱'と入れて
for i := 0 to AAList.Count-1 do
begin
if AnsiPos(Edit1.Text, AAList[i]) > 0 then
begin
Label1.Caption := AAList[i];
Memo1.Lines.Assign( AAList.Objects[i] as TStringList );
end;
end;
なんて感じで検索・表示できるようになる。
UIは見出しを'/'で分割してExplorer風にツリーを表示させるようにしてもいいし
Spotlightのように検索ベースのものにしてもいい。
Migemoというライブラリを入れるとfusa denというローマ字でもヒットさせられるようになる。
Delphiで書かれたWin32アプリケーションのソースコードを、C++とかCとかに変換するソフトってありますか?
んなもんあったら、Delphi捨てとるわ
TurboDelphiのコード支援がウザ過ぎる いずれ慣れるだろうとオフらず耐えてはいるが… もう慣れてデフォルトのまま使ってる人いる?
>>936 BCBならWinMainの中身だけC++に書き換えればそのままコンパイルできて、C++ユニットも使えるけどそれじゃだめ?
たぶん、DelphiでやってることをCのコードで知りたいんだと思われ
942 :
デフォルトの名無しさん :2008/03/07(金) 16:53:57
ReadProcessMemoryで他のアプリケーションのメモリに書き込むときに、 すでにそこの番地が変わっててエラーが起きたりするのですが、どうしたらいいでしょうか
そのアプリケーションを止めとけば?
>>933 Jane Viewはソース非公開なのです。
Jane Styleはソースが公開されていた頃のViewの派生のようです。
>>935 ,941
おお!ありがとうございます!
「適当に」でこれって…すごいですね…。
ソースを読んで勉強させてもらいます!ありがとうございました!
947 :
デフォルトの名無しさん :2008/03/07(金) 22:59:55
いくら超初心者スレとはいえ、ヒントが与えられたならまずそれで調べるのが質問者の義務じゃないかね
プロセスだかスレッドのハンドル拾って停止させりゃいいんじゃね。 Win32APIスレでもいってみたら。
Delphiの長文ソース晴れる掲示板ってないの
どっかにあげろよ メールでソースコピペして送ってくる奴とか殺したくなる
昔は2chライクなソースアップ用の掲示板があったけど。
>>951 そんな奴いないと思ってたけど、知り合いがそれやってきて唖然とした。
添付じゃなくて、ベタ貼りか? そりゃひどいなw まあ、短いコードならアリだとは思うが・・・。
955 :
デフォルトの名無しさん :2008/03/08(土) 14:24:24
'&File' ==> 'File' 'ファイル(&F)' ==> 'ファイル' 見たいな関数ない?
StripHotkey
TList.Sortに渡すコールバック関数は二つの値の大小関係を返せばいいから、 IntegerでもInt64でもいけるはずだけど。
動的配列をつかって ファイルの行数分の配列を確保し 配列の中にデータを格納という処理をやりたいと思います 1回のみの読込や配列を使い捨てする場合は上手くいくのですが 他の処理でも使うデータなのでグローバル変数に読み込む場合 2回目以降でエラーがでて処理が止まります(配列の長さの再定義のため) TStringListのように長さを変えられる配列やレコード型のやり方があったら 教えて下さい よろしくお願いします
960 :
959 :2008/03/08(土) 19:21:33
Type TMYRec = Record name: String; age: Integer; Flag: Boolean; end; var Data: array of TMyRec; List: TStrings; FileLinesCount: Integer; List:=TStringsList.Creat; try ファイル読込処理 if List.Count > 0 then begin FileLinesCount:= List.Count; SetLength(Data,FileLinesCount) //ファイルの行数分の配列確保 データ格納処理部分 end; finally List.free; end;
961 :
957 :2008/03/08(土) 19:45:06
比較用関数に間違いがあったようでした ありがとうございました
SetLengthは長さを変えられたはずだけど。 record に string を入れるときは Initialize しないとだめなんじゃなかった?
勝手にやっといてくれるはず
そろそろ次スレの季節でございます。
テンプレは今のままでよろしいでしょうか。
(ちなみにこちらはスレ立ては多分無理です)
>>957 それは知りませんでした。
Janeシリーズの家系はどんどん複雑になってきてますね。
tidpop3でメールの受信をやってるのですが、 「サーバーはセキュリティで保護された接続(SSL)が必要」 ってのは、どうやればできるでしょうか? つたない質問で申し訳ありませんが、よろしくお願いします。
実装すればよろしい
967 :
965 :2008/03/09(日) 00:09:42
自己解決しました。
処理中に閉じるボタンを押しても閉じることができないのですが、 これはどうしたらいいのでしょうか
969 :
968 :2008/03/09(日) 11:53:30
すみません途中で書き込んでしまいますた。 2〜三分かかる処理なので、その間止めることができなくてtaskmgrなどで強制終了してる状態です。 これを閉じるボタンとかで閉じることってできるのでしょうか
その2〜3分かかる処理を途中で止める方法を考えればわかる
2〜3分かかっているのが自分で書いてる処理なら、そのループ中に 適当な頻度でApplication.ProcessMessages; 呼んでおけば OnCloseQueryが飛んでくるから、自分でなんとか出来ると思うけどな
973 :
デフォルトの名無しさん :2008/03/10(月) 17:01:16
ADOQueryを使用してSQLServerへSelect文を発行しています。 SQL自体複雑ではないのですが、負荷がかかる(大人数でDBへ処理をかける)と 稀にSQLの結果(複数行返す)が2〜3行欠損することがあります。 負荷が少ないときには現象が全く出ません。 原因が全く思いつかないのですが、ADOQueryが負荷によりデータを途中までしか取得しないで戻ることはあるのでしょうか?
最初にrecordcountを参照してみれば?
recordcountって問題無かったっけ?
問題ある つCOUNT
コンソールアプリ(他アプリ)のwritelnで出力される文字列を自アプリで取得する方法を教えて下さい。
標準出力を取得するなら、標準入力で取れるのでは? パイプ?w
クリップボードわろた
982 :
デフォルトの名無しさん :2008/03/12(水) 10:11:28
フォームにいくつかボタン(TButton)を配置して、 既にある程度ソースを書いたのですが、 画像が欲しくなり、ボタンをTBitBtnに変更したくなりました。 つまり、コンポーネントを入れ替えたいのですが、 私の頭では、フォームデザイナのTButtonの位置に新たにTBitBtnを置いて、 ソースをコピペして元のボタンを削除する、という原始的な方法しか思いつきません・・・。 何かいい方法はないですか?
TButton削除してTBitBtnに貼り替えてOnClickイベントにTButtonで指定してたイベントハンドラ指定すればいいだけじゃないか
dfmをテキストエディタで開いて修正
985 :
982 :2008/03/12(水) 11:09:27
>>983 多分、
>>982 と同じ方法と思われますが、
これだと例えば電卓ソフトでボタンが10個あった場合、
10回貼り変えることになりますよね。
もう少しミスの少なそうな方法があると嬉しいです。
>>984 dfmの該当コンポ部分をテキストベースで変更し、
さらにpasファイルも同じく置換すればいい、ということでしょうか。
2つのファイルを変更するということですね。
これが最善でしょうか。
「電卓ソフトなら」という前提だが、 イベントハンドラは1個で済むように作れるだろうから、 10個選択してOnClickを指定すればミスは大幅に減る。 なんなら実行時に代入してもいいし。
984 の方法が使えるのがまさに Delphi が 2wayツールたる所以なのである
984のいうようにわざわざテキストエディタで開かなくても フォームを右クリックすると「テキストで表示」みたいのがあったような気がするけど
Delphiには未来があるんでしょうか?
実行時パッケージを使用してコンパイルしたいのですが、 特定のpasファイルだけは静的リンクするにはどうしたらできますか?
現在勉強の一環としてVCLを使わずにAPIだけでプログラムを書いているのですが、 IEコンポーネントのブラウザは作成可能でしょうか? CreateWindowで「AtlAxWin」と「Shell.Explorer.2」を指定してみたのですが作成されていないのかフォームは灰色のままです また、Navigateの方法も教えてくださると光栄です
ごめん光栄うけた
>>991 IEコンポーネントはCOMオブジェクトだからCreateWindowじゃ駄目っぽい
994
995
996
997
998
999 :
デフォルトの名無しさん :2008/03/12(水) 17:49:16
フォームからマウスが外れた時に、 ある処理(例えばbeep)を行いたいのですが、 どう記述すればいいでしょうか?
1000 :
リオレイア :2008/03/12(水) 17:50:19
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。