1 名前:デフォルトの名無しさん mailto:sage [2009/12/01(火) 20:41:37 ] Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を 勇気を持って書き込むスレッドです。 Delphi使いが優しくコメントを返しますが お礼はDelphiの布教と初心者の救済をお願いします。 <前スレ> くだすれDelphi(超初心者用)その50 pc12.2ch.net/test/read.cgi/tech/1246340765/ <過去スレ> DelWiki避難所(Delphi 関連の過去スレッド) delwiki.info/?%E3%83%AA%E3%83%B3%E3%82%AF%2F%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%2FDelphi%20%E9%96%A2%E9%80%A3%E3%81%AE%E9%81%8E%E5%8E%BB%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89
709 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 11:27:41 ] 皆さん、ありがとうございます。 基本的には begin〜end は保守性の面から入れるのですが 今回の質問のような単純で短い構文で、狙った動きにならないので びっくりしたのと納得できなかったので質問しました。 >直近のifに対応する こんな規則で動いていたんですね。 納得しました。 ありがとうございました。
710 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 11:47:07 ] 綺麗さ、かつ Pascal の特性を活用するなら、入れ子関数を作って、 関数名をコメントがいらないくらい分かりやすいものにしてしまう。 というのも実用性の高い手法です。 新しめの処理系なら、日本語関数名も使えますしね。 procedure SetFontColor(originalColor, modifiedColor: TColor) begin if lblCurrent.Font.Color = originalColor then lblCurrent.Font.Color:=modifiedColor; end; if regCurrent=Current then SetFontColor(clWhite, clYellow) else if regCurrent<Current then lblCurrent.Font.Color:=clRed else if regCurrent>Current then lblCurrent.Font.Color:=clLime;
711 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 12:29:21 ] なるほど。 ちょっとの手間でスマートですね。 まだ、この辺の手間をかけた方が後々いいのか、どうかの判断が 出来ないレベルなので参考にさせてもらいます。
712 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 17:43:30 ] >>697 ,702 ありがとうございます。 ググりつつコピペしつつ改変しながら eggrice.no.land.to/up/src/tohoh0403.txt と言うふうに書いてみたんですが、 二度目に起動したときに前のウィンドウがアクティブになるだけで メッセージの処理は行われませんでした。 winexpでメッセージ監視してみたら TMainFormじゃなくてTApplicationにメッセージが飛んでいたので これが問題かな?と思ってFindWindowでハンドル取得してみてもうまくいきませんでした。 どこか間違えているでしょうか?
713 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 12:56:44 ] >>704 これあきらかにおかしいじゃん if A=B then if C=D then E:=F; ここまで1行とコンパイラは理解するから次の else if が文法上間違い
714 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 14:33:18 ] 質問が紛らわしくてすんません。 @ABの条件分岐のつもりで、@の時にTを実行する意図なのですが 「F;」の「;」を取ると TABがグループと認識して@の入れ子と処理されてしまいます。 Tは単独のif文にする意図で「;」を付けるとコンパイルエラーになるので 「何で?」と言う意味でした。
715 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 15:00:07 ] だいじょうぶ。意図を理解している人もいるよ。
716 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 17:01:10 ] 自作アプリをプログラムから最小化してタスクバーに入れるにはどうすればいいですか。 WindwStataだとタスクバーの上に表示されてしまいます。
717 名前:716 mailto:sage [2010/05/21(金) 17:07:39 ] 出来ました。
718 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 07:52:47 ] Continueってバグを起こしますか? for i:=0 to max do begin if hoge then begin continue; end; end; デバッグしているとi = maxの時にcontinueが実行されるとループが進んでしまうのですが・・・
719 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 12:26:05 ] あなたの頭がバグを起こしているだけです
720 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 12:32:28 ] デバッグしろ
721 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 14:16:18 ] max-1が正しかったという罠
722 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 18:43:28 ] マルチスレッドが存在するかしていないかって、分かる関数とかってあります? Createした時に覚えておいて、解放する時はメインの方から明示的にFreeするしかないんでしょうか?
723 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:01:08 ] >718 ブロック内で、変数Iを使っていないので、最適化されて減少カウンタとして利用されている予感。
724 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:57:31 ] >722 スレッド終了時に自分で自分を解放 >718 >723のいうとおりだと思う。コンパイルオプションで最適化を外すとデバッグしやすくなる。
725 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 12:47:56 ] 最後に判定しに行くだけだろ? Cで書けばfor(i=0;i<=max;i++)なんだからmaxの次に判定があるのは当たり前 アホか
726 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 17:11:33 ] >>722 一応IsMultiThreadってグローバル変数が存在してるけど。ソースみりゃわかるけど、 直接Win32のCreateThreadとか呼んだら駄目ぽだけど。BeginThreadかTThreadクラスだけを 使ってる場合だけオk。
727 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 17:14:10 ] ああでも、ダメポそうだな。ごめん。
728 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 00:04:05 ] >>722 WaitForと言うのがあるらしい。 使い方は分からない。 お知恵をお借りしたいのですが。 今、複数起動が前提のアプリを作っているのですが、 一斉に最小化や復元をしたいと思って共有メモリを 使うところまでは出来たのですが、例えば一斉に最小化の場合は メニューをクリックされたソフトで共有メモリに「1」を入れる。 他のソフトはその「1」がたったかどうかで最小化すればいいのですが、 お知恵を借りたいのは「1」をどのタイミングで「0」にすればいいかです。 全部が最小化されたかどうかを知るにはどうすればいいかって事です。 考えたのは複数起動した数を共有メモリに記録しておいて、メニューをクリック されたら「1」ではなく、起動数を入れて(例えば「10」)で最小化したら -1 していくと言うやり方です。 他にもっとスマートなやり方があれば教えて下さい。
729 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 00:46:32 ] HWND_BROADCAST
730 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 13:33:42 ] e?
731 名前:728 mailto:sage [2010/05/26(水) 14:07:31 ] レス、ありがとうございます。 >HWND_BROADCAST ググってみます
732 名前:728 mailto:sage [2010/05/26(水) 18:53:43 ] ググったけど、よう分からんかったです。 SendMessageやPostMessageでHWND_BROADCASTを送ると 関係ないアプリまで最小化や終了をさせてしまうことになりませんか?
733 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 19:28:16 ] RegisterWindowMessageって知ってるか?
734 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:25:07 ] >>733 > RegisterWindowMessageって知ってるか? おぉ、ありがとうございます。 ググって来ました。 確認させて下さい。 例えば、WM_APP+100は一斉に最小化、WM_APP+101は一斉に終了みたいに決めておいて アプリ起動時に RegisterWindowMessage(WM_APP+100); とかやって登録して 一斉に最小化させたい時は SendMessage(HWND_BROADCAST , WM_APP+100 , 0 , 0); とやればいいって事ですか? 受け取りは WndProc(ググった先で出てきたので、よく分かってないです。)を使って送られて来た メッセージによって処理する こんな感じで良いでしょうか?
735 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:42:18 ] RegisterWindowMessageの引数は文字列 RegisterWindowMessage(自分だけの文字列) ↓ SendMessage(HWND_BROADCAST, RegisterWindowMessageの戻り値, ここ, とここは自分で決めて振り分ける);
736 名前:728 mailto:sage [2010/05/27(木) 00:41:49 ] >>735 思い通りの動きが出来ました。(;゚∀゚)=3 ありがとうございました。
737 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 23:12:46 ] var Form1: TForm1; days:double; procedure TForm1.Button1Click(Sender: TObject); begin days :=VarToDateTime('28/5/2010') - VarToDateTime('27/4/2010'); showmessage(FloatTostr(days)); end; これは2010年4月27日と2010年5月28日の日数の差として「31」が表示されます こんな感じで2010年4月27日から31日経つと「2010年5月28日」のような処理をしたいのですが、どうすればよいのでしょうか? 要はTDateTime 型から日付を求めたいのです
738 名前:737 mailto:sage [2010/05/29(土) 00:01:44 ] ごめんなさい自己解決しました
739 名前:デフォルトの名無しさん mailto:sage [2010/05/29(土) 20:46:03 ] >>712 ですが、 結局TMainFormというインスタンス名が他のアプリケーションで使われていたようでうまくいかなかったので メッセージ受信専用ウィンドウを利用する方法を使いました。 メッセージ用ウィンドウプロシージャは 特定のメッセージがきたときだけMainFormにDispatchするようにして あとはDefWindowProcに渡すようにしたのですが、 処理としてはあっているのでしょうか? 初めはディスパッチのみでDefWindowsProcを呼び出さずにしていたら 終了時にエラーがでました。
740 名前:デフォルトの名無しさん mailto:sage [2010/05/29(土) 22:19:45 ] 名前変えればいいだけじゃ・・・
741 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 20:53:51 ] 下のソースをJavaに移植したいのですが、内容が理解できなくて困っています。 下から7行ほど前からが理解できないので・・・、別言語に書き換えて教えて頂けないでしょうか? java, c, perl , php, vb, javascript 辺りの書き方であれば理解できます。 function EncodeB32(s: String): String; const B32Char: array[0..31] of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', 'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V'); var i: Integer; len: Integer; begin if s = '' then begin Result :=''; Exit; end; len := (Length(s) * 8 - 1) div 5 + 1; s := s + StringOfChar(#0, (len * 5 - 1) div 8 + 1 - length(s)); SetLength(Result, len); for i:=0 to len - 1 do Result[i + 1] := B32Char[(MakeWord(Byte(s[(i * 5) div 8 + 1]), Byte(s[(i * 5) div 8 + 2])) shr ((i * 5) mod 8)) and 31]; end;
742 名前:E- ? mailto:sage [2010/06/06(日) 21:31:21 ] BASE32 だから、検索すれば仕様書があるはず。仕様書から作ったほうが早いよ。私はCで作った。 function EncodeB32(s: String): String; const B32Char: array[0..31] of Char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F', 'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V'); var i: Integer; len: Integer; begin if s = '' then begin Result :=''; Exit; end; len := (Length(s) * 8 - 1) div 5 + 1; s := s + StringOfChar(#0, (len * 5 - 1) div 8 + 1 - length(s)); SetLength(Result, len); for i:=0 to len - 1 do Result[i + 1] := B32Char[(MakeWord(Byte(s[(i * 5) div 8 + 1]), Byte(s[(i * 5) div 8 + 2]) ) shr ((i * 5) mod 8) ) and 31]; end;
743 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 21:38:01 ] Javaならライブラリあるだろうに。
744 名前:デフォルトの名無しさん [2010/06/06(日) 21:39:03 ] これで事足りないというなら出直して来るんだ つttp://www.google.co.jp/codesearch?hl=ja&q=base32+lang:java
745 名前:デフォルトの名無しさん mailto:sage [2010/06/06(日) 23:49:13 ] あれ、関数名はBase32だったので、そう思って組んでみたんですが、結果が違ったので・・・ 1. そのソースコードが使われいるexe $ exec "1c68ee574965514ec9c27a57972719ea" 4NDXFOSLFKFHMTQT2K6LSOGPK 2. Base32エンコード $ echo "1c68ee574965514ec9c27a57972719ea" | java Base32encode S0QSUB595BKSK4B0QRLEPJ43A7 >>742 整形ありがとうございます。 やってることは似てそうなんですが、定数が違ってそうなのでもう少し弄ってみます。
746 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 03:58:40 ] 4NDX と、X が出てくる理由が不明だ。 B595 と、9 が出てくる理由が不明だ。 こうなるはず、 8bit区切り 1c 68 ee 57 49 65 51 4e c9 c2 7a 57 97 27 19 ea 5bit区切り 3 11 14 E 1C 15 1A 9 C 15 8 14 1D 12 E 2 F 9 B 19 E 9 18 19 1D 8
747 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 09:04:15 ] Base32(WXYZが使われてる)と、Base32hex(0189が使われてる)があるそうですね。 面白そうなので作ってみたら >>746 と同じ結果に。 Base32: DRUO4V2JMVIU5SOCPJLZOJYZ5I====== Base32hex: 3HKESLQ9CL8KTIE2F9BPE9OPT8====== >>745 と全然違うなあ。 しかしBase32って超マイナーですね。
748 名前:748 mailto:sage [2010/06/07(月) 20:34:22 ] > 1. そのソースコードが使われいるexe > $ exec "1c68ee574965514ec9c27a57972719ea" > 4NDXFOSLFKFHMTQT2K6LSOGPK > アナタの自作プログラム↑ソース↓ pc12.2ch.net/test/read.cgi/tech/1274617383/328 > > 2. Base32エンコード > $ echo "1c68ee574965514ec9c27a57972719ea" | java Base32encode > S0QSUB595BKSK4B0QRLEPJ43A7 こっちのソース、またはソースのURLくれ。
749 名前:748 mailto:sage [2010/06/07(月) 22:36:19 ] shr ((i * 5) mod 8)) and 31]; ↓に変更(再コンパイル可能なら、だけど) shr (11 - ((i * 5) mod 8))) and 31];
750 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 01:00:38 ] >>748 今確認したら結果が逆でした・・・汗 1. 移植したいプログラム ( Delphi ) ttp://jane.s89.xrea.com/test/read.cgi/kakolog/1090658524/583-585 > nghash.exe "1c68ee574965514ec9c27a57972719ea" S0QSUB595BKSK4BOQRLEPJ43A7 2. 自作したプログラム ( Java ) ttp://pc12.2ch.net/test/read.cgi/tech/1274617383/328 % echo "1c68ee574965514ec9c27a57972719ea" | java Base32encode 4NDXFOSLFKFHMTQT2K6LSOGPK Jane2chのNSFiles.txtで使われる、MD5をエンコードした無視画像リストを、 システムに組み込みたくて、移植してる次第です。・・・なんですが、力不足で全く移植できず
751 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 09:57:52 ] S0Q..L..はナンチャラは何なの?という疑問 0とL が混じってる。 1.Base32HEX エンコードだけをしてもこの値にはならないので、 その部分だけのDelphiでは足りない。ソースは受け取ったが、 ソース全部読む必要があるので、時間と人手がいる。 > nghash.exe "1c68ee574965514ec9c27a57972719ea" S0QSUB595BKSK4BOQRLEPJ43A7 2.Base32HEX エンコードだけのソースなら、ネット検索すればあるはず。 1.に関連して、>>749 はバグだと思ったけど、そのソースを生かすなら Base32HEXではない。逆にその部分だけを修正すればBase32HEX のソース を直せばいい。 また、>>749 shr の使い方を誰かDelphiで合ってるか確認してほしい。
752 名前:747 mailto:sage [2010/06/08(火) 10:53:30 ] >>750 やっぱり。どうも変だなと思ってた。あと、ソースの頭にしっかり //5bitエンコーディング関数 Base32ではない。 って書いてあるじゃない。最初は見落としてたの? >>751 >>741 の function EncodeB32 だけでちゃんと S0QSUB595BKSK4BOQRLEPJ43A7 になるのを確認したので、これはBase32でもBase32hexでもないと思います。 >また、>>749 shr の使い方を誰かDelphiで合ってるか確認してほしい。 どう確認すればいいのか分かりませんが、そこだけ差し替えたら D0N6FIA5A575IGMQATBLF69A03 になりましたよ。 Delphi始めて数ヶ月の初心者が頭突っ込んでスマソでした
753 名前:デフォルトの名無しさん mailto:sage [2010/06/08(火) 16:32:22 ] いやいや、可能性が無いなら参考になった。>>752 以下の修正で目的の文字列になった。 参考になるURLがどこかに有ると思うが省略させてもらう。 MakeWord(byte1,byte2) の定義は byte1 | byte2 << 8 それと、shr ((i * 5) div 8) BASE32の場合は MakeWord(byte1,byte2) の定義を以下にする byte1 << 8 | byte2 それと、shr (11 - ((i * 5) div 8))
754 名前: ◆/91kCCQXBo mailto:sage [2010/06/08(火) 17:41:05 ] #include <stdio.h> #include <stdlib.h> #include <malloc.h> char*EncodeB32(char*s){const char B32Char[32]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K' ,'L','M','N','O','P','Q','R','S','T','U','V'};int i,len;char*sa,*Result;if(s==NULL||*s==(char)NULL){return NULL;}len=(strlen(s)*8- 1)/5+1;sa=s;Result=calloc(len+1,1);for(i=0;i<=len-1;i++){Result[i]=B32Char[(((sa[(i*5)/8+0]&0xFF)|(sa[(i*5)/8+1]&0xFF)<<8)>>(((i*5 )%8)))&31];}return Result;} int main(void){char*ans;ans=EncodeB32("\x1c\x68\xee\x57\x49\x65\x51\x4e\xc9\xc2\x7a\x57\x97\x27\x19\xea");if(ans)puts(ans);free(ans);}
755 名前:747 mailto:sage [2010/06/08(火) 23:02:43 ] 私も勉強がてらJavascriptに翻訳してみました。 出来る限り元ソースに忠実にしました。 ideone.com/bNeGf DelphiもJavascriptもよく分かっていない初心者が書いてるので、激しいツッコミはご容赦下さい。 一応、ブックマークレット版。もちろん、末尾改行は全部除去して使ってね。 Javascript:function EncodeB32(s){function StringOfChar(C,N){var I,Z='';for(I=1;I<=N;++I) {Z+=C;}return Z;}function MakeWord(H,L){return H|L<<8;}var i,len,B32Char=['0','1','2','3', '4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V'], Result=[];if(s==''){return '';}len=(s.length*8-1)/5+1;s+=StringOfChar('\x00',(len*5-1)/8+1-s.length); for(i=0;i<=len-1;++i){Result[i+1-1]=B32Char[(MakeWord(s.charCodeAt((i*5)/8+1-1), s.charCodeAt((i*5)/8+2-1))>>>((i*5)%8))&31];}return Result.join('');} function HexToStr(H){var I,Result='';for(I=0;I<=H.length/2-1;++I) {Result+=String.fromCharCode(parseInt(H.substr(I*2,2),16));}return Result;} alert(EncodeB32(HexToStr('1c68ee574965514ec9c27a57972719ea'))); 普段はごく簡単なブックマークレットしか作らないので、functionすら滅多に使いません。。。
756 名前:747 mailto:sage [2010/06/09(水) 07:20:10 ] DelphiスレなのにJavaやらCやらJavascriptもなんなので、 ideone.comのPascal(FPC:Free Pascal)でDelphiできるか?試してみました。 ideone.com/5Q6ky 結果:プログラム本体の書き換えは一切せずに動作しました。 追加したこと 1. コンパイラモードをDelphi互換に指定 → {$MODE DELPHI} 2. Uses節を追加、StrToIntのためにsysutilsを指定 3. function MakeWordをWindows.pasからパクってきた 以上、初心者の研究コーナーでした スレ汚しまくってスマソ
757 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 09:40:11 ] >>756 君は毎回誤るんかい。 >>745 S0QSUB595BKSK4B0QRLEPJ43A7 誤り S0QSUB595BKSK4BOQRLEPJ43A7 正しい だね? 右から左への場合は入力を5の倍数ワード、出力を8の倍数にしなければならないが、 Base32HEX (WXYZを使わない) でエンコードする場合。 Base32を使って、左から右に5ビットで区切ってエンコード 1 c 6 8 e e 5 7 4 9 6 5 5 1 4 e c 9 c 2 7 a 5 7 9 7 2 7 1 9 e a 0 0 0 0 0 0 0 0 3 11 14 E 1C 15 1A 9 C 15 8 14 1D 12 E 2 F 9 B 19 E 9 18 19 1D 8 0 0 0 0 0 0 3HKESLQ9CL8KTIE2F9BPE9OPT8 Encode32を使って、左から右に5ビットで区切ってエンコード 1 c 6 8 e e 5 7 4 9 6 5 5 1 4 e c 9 c 2 7 a 5 7 9 7 2 7 1 9 e a 0 0 0 0 0 0 0 0 1C 0 1A 1C 1E B 5 9 5 B 14 1C 14 4 B 18 1A 1B 15 E 19 13 4 3 A 7 0 0 0 0 0 0 S0QSUB595BKSK4BOQRLEPJ43A7 Base32を使って、右から左に5ビットで区切ってエンコード 0 0 0 0 0 0 0 0 e a 1 9 2 7 9 7 5 7 7 a c 2 c 9 4 e 5 1 6 5 4 9 5 7 e e 6 8 1 c 0 0 0 0 0 0 7 A 3 4 13 19 E 15 1B 1A 18 B 4 14 1C 14 B 5 9 5 B 1E 1C 1A 0 1C 0000007A34JPELRQOB4KSKB595BUSQ0S Encode32を使って、右から左に5ビットで区切ってエンコード 0 0 0 0 0 0 0 0 e a 1 9 2 7 9 7 5 7 7 a c 2 c 9 4 e 5 1 6 5 4 9 5 7 e e 6 8 1 c 0000008TPO9EPB9F2EITK8LC9QLSEKH3 0 0 0 0 0 0 8 1D 19 18 9 E 19 B 9 F 2 E 12 1D 14 8 15 C 9 1A 15 1C E 14 11 3
758 名前:こまった?? [2010/06/09(水) 11:40:16 ] Delphi5 から Delphi2010 に一気に移行したものですが、 たとえば、 TMemo などの既存コンポーネントを継承して、 新しいコンポーネントを作成したとき、 TEST用プロジェクトで動作確認はできるのですが、 いざ、コンポーネントタブ(たとえばsample)に登録しようとしたとき Delphi5にはあった「コンポーネント」=>「コンポーネントのインストール」 メニューがDelphi2010メニューにありません。 どうやってインストールするのでしょうか? それとも、プロフェッショナル版ではできない?
759 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 13:55:35 ] >>758 mrxray.on.coocan.jp/Delphi/CompoInstall/index.htm
760 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 22:19:20 ] TOpenDialogとかにボタンを追加したいときはどうするべきなのでしょうか。
761 名前:デフォルトの名無しさん mailto:sage [2010/06/09(水) 23:49:42 ] TOpenPictureDialogのコードが参考になると思う。
762 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 12:59:36 ] Synchronizeで実行するプロシージャーで引数が使いたい時って皆さんはどうしていますか?
763 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 15:02:32 ] 匿名メソッドでいいじゃん
764 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 16:35:12 ] >>762 そのためにわざわざフィールド変数を用意して、それ経由してる。
765 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 17:16:57 ] mixiにログインして情報をとってくるようなアプリケーションを作りたいと思っています。 そこで、TIdHTTPコンポーネントを使用してログイン部分をいま作成中なのですが、Cookieが無効 になっているため、ログインできませんと言われてしまいます。 (mixi.jp/check.pl?n=%2Fhome.pl が返ってくる) TIdHTTPコンポーネントのCookieManagerには該当のTIdCookieManagerを指定し、 AllowCookiesはtrueの状態にしています。 IdHTTP1.Postの第一引数は以下の通りです。 'mixi.jp/login.pl ' IdHTTP1.Postの第二引数にはstringlistで以下のようなデータを渡しています。 'next_url=/home.pl' 'email=メールアドレス' 'password=パスワード' TIdHTTPコンポーネントを使用して、mixiへのログインに成功した方、どのようにされたかアドバ イスいただけないですか?
766 名前:デフォルトの名無しさん mailto:sage [2010/06/10(木) 21:38:02 ] オミトロンとかLiveHTTPHeaderなんかで ブラウザでログインしたときの状況を確認したほうが早いと思ふ
767 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 11:13:50 ] >>764 無名メソッドを使えば、わざわざフィールド変数を用意する必要はない。 edn.embarcadero.com/article/39701 procedure TNewThread.Execute; var i: Integer; A,B: Integer; begin { スレッドとして実行したいコードをここに記述してください } for i := 0 to 99 do begin A := Random(10000); B := Random(10000); Synchronize(procedure begin Form1.Memo1.Lines.Add('NT : ' + FormatFloat('#,##0',A-B)); end); end; end;
768 名前:765 mailto:sage [2010/06/11(金) 11:26:33 ] >>766 LiveHTTPHeaderで確認したところ、POSTする情報は765の3つでした。 試しにブラウザからcokieを一度削除し、最初のログインでどのようなものを渡しているか確認。 それと同じ内容をIdHTTP1.Request.CustomHeaders.Addで渡してみたのですが、やはり ttp://mixi.jp/check.pl?n=home.plのアドレスが返ってきます・・・。 なんか根本的に設定を間違えているんでしょうか・・・。
769 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 11:40:09 ] ssl だったり?
770 名前:769 mailto:sage [2010/06/11(金) 11:43:19 ] >>769 あんまり関係ないか。
771 名前:765 mailto:sage [2010/06/11(金) 12:00:48 ] >>769 C#とかのサンプルみる限りはSSLじゃなくてもログインできるようなんですよね。 Indyの情報すくなすぐる・・・泣ける・・・。
772 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 13:34:24 ] Indyは自力でソース見て解決できないバカが使うものじゃないから、 おとなしくTWebBrowserを操作してログインしておけ
773 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 13:35:31 ] cookiemanagerにsessionはいってるのか?
774 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 20:25:06 ] IdHTTPのProxyにオミトロン通してブラウザと挙動を比較するとか。 mixi.jp/check.pl?n=home.pl は普通にログインしてても通過するみたいだから 内容がどうかだね。
775 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 20:45:00 ] url := 'mixi.jp/login.pl '; contents := TStringList.Create; contents.Text := 'next_url=%2Fhome.pl&email=hogehoge%40yahoo.co.jp&password=00000000&x=0&y=0'; res := IdHTTP1.Post(url, contents); で実行したら <html><head><meta http-equiv="refresh" content="0;url=/check.pl?n=%2Fhome.pl"></head></html> が返ってきた。 たぶんこれが成功じゃないかな。 LiveHTTPHeadersからコピペしたからエンコード済みの文字列だったから IdHTTPのHTTPOptionsのhoForceEncodeParamsはFalseにしたけど。
776 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 20:45:59 ] クッキーマネージャは何もいじってないよ
777 名前:デフォルトの名無しさん [2010/06/11(金) 20:46:20 ] DSPack 2.3.3 destructor TFilterGraph.Destroy; var i:integer; begin SetActive(False); DeallocateHWnd(FHandle); if FFilters<>nil then//追加2010.06.11 FFilters.Free; FGraphEvents.Free; //追加2010.06.11 inherited Destroy; end; destructor TDSVideoWindowEx2.Destroy; begin FFullScreenControl.Free;//追加2010.06.11 if DesktopPlayback then NormalPlayback; if FDDXM <> nil then FDDXM.SetCallbackInterface(nil, 0); OverlayCallback := nil; FOverlayMixer := nil; FFilterGraph := nil; FVideoWindow := nil; FVideoRenderer := nil; FCaps.Free; FColorControl.Free; inherited Destroy; end;
778 名前:デフォルトの名無しさん [2010/06/11(金) 20:52:58 ] >>777 続き procedure TDSVideoWindowEx2.ClearBack;//変更2010.06.11 var DC, MemDC: HDC; MemBitmap, OldBitmap: HBITMAP; BackBrush, OverlayBrush: HBrush; begin * * * finally SelectObject(MemDC, OldBitmap); DeleteDC(MemDC); DeleteObject(MemBitmap); DeleteObject(BackBrush); DeleteObject(OverlayBrush); ReleaseDC(Handle, DC); end; 上記を下記の順番に変更 finally DeleteObject(OverlayBrush); DeleteObject(BackBrush); ReleaseDC(Handle, DC); SelectObject(MemDC, OldBitmap); DeleteDC(MemDC); DeleteObject(MemBitmap); end; end;
779 名前:デフォルトの名無しさん mailto:sage [2010/06/11(金) 23:24:48 ] TStringListのSaveToFileって同時に同じ名前のファイルで行われると共有違反とか起きますか?
780 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 04:08:26 ] 起きる起きない以前にそんなクソコード書かないで下さい
781 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 08:04:10 ] 「同時に」の意味は?本当に同時にはできないから、先にSaveToFileしたほうは 成功して、後のほうは失敗するんだけどね。
782 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 09:56:46 ] あとの方で上書きされると思ってたが違うのか?w
783 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 10:12:36 ] >>777 2.3.4の間違いだよね?
784 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 12:58:15 ] ><html><head><meta http-equiv="refresh" content="0;url=/check.pl?n=%2Fhome.pl"></head></html> >が返ってきた。 >たぶんこれが成功じゃないかな。 ミクシィに詳しくない俺でもこれは失敗だとわかる・・・ リファラが不足してるかもしれないよ サーバーがクライアントを蹴る理由は UA、リファラ、IP、クッキーのいずれか
785 名前:781 mailto:sage [2010/06/12(土) 18:23:37 ] >782 ああ、先のほうの保存が終了てから後の保存が行われるならその通りだね。 「同時に」って言葉に引っぱられすぎだ。
786 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 19:31:59 ] >>784 失敗したときは違うHTMLがかえってくるよ。 check.plを経由してhome.plにいくみたい。
787 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 20:17:10 ] ミクシィに詳しくない俺でもこれは失敗だとわかる・・・(キリッ うわあ・・・これは恥ずかしい こいつに足りないのはリファラじゃなくて頭だな
788 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 21:14:20 ] >UA、リファラ、IP、クッキーのいずれか 他のヘッダで弾いてるところもいっぱいあるよ 成功したかどうかの確認は帰ってくるURLとかじゃなくてクッキー見たほうがいい
789 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 22:17:16 ] オミトロンなりWireSharkなりを使って、ブラウザで認証OKだったときの挙動をキャプチャしてみると 何か見つかると思うよ。
790 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 00:18:37 ] procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := true; Timer2.Enabled := true; end; procedure TForm1.Timer1Timer(Sender: TObject); var sl : TStringList; begin sl := TStringList.Create; with sl do begin clear; add(TTimer(sender).Name); savetofile(extractFilepath(Application.ExeName)+'test.txt'); free end; sl := nil; TTimer(sender).Enabled := false; end; 保存されたテキストの中身はTimer1だった
791 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 01:42:01 ] さすがにTimer使っといて同時はねーだろ。別スレッドとか別プロセスじゃないと。 同一スレッド上ではシーケンシャルにしか処理は動かないんだから。
792 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 02:52:43 ] >>790 ばかだねー(´・∀・`)
793 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 13:51:21 ] いやそうじゃなくって・・・ >>791 だから中身はtimer2になるはずでしょ? 間違ってたらスマンが。
794 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 14:15:28 ] >>793 Timer1のイベントが先に実行されるって決まってるんですか?
795 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 14:46:53 ] 無知なのは別にいいがそれをあたかも常識のように言うのはやめていただきたい
796 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 15:01:52 ] Timer2のイベントが存在していないのに、Timer2になるって脳内お花畑か。 まあそれより、ず〜っと以前の問題なんだけどな。
797 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 16:17:28 ] えっ?
798 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 20:29:08 ] イベントはTimer1とTimer2で共有ってことだろ。 >>794 決まってないと思うが、どちらのタイマイベントが先に発生するにせよ、 そのイベントハンドラの実行は同時に実行される事はない。だから、 後の方で上書きされるだけ。 タイマー使ってもマルチスレッドにはならんよ。
799 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 20:35:01 ] ↑ 明らかな間違いだぜ イベントが共通だったとしても Timer2になることは無いのだよ。 ヒント:タイマーはひとつだけ!
800 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 21:28:47 ] 1個のformには1個のTimerしか使えない。理由はWindowsの仕様だから。 ハイ、次の質問。
801 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 21:56:43 ] >>800 では次の質問。 procedure TForm1.Timer1Timer(Sender: TObject); begin Memo1.Lines.Add((Sender as TTimer).Name); end; Timer1とTimer2が交互に追加されて表示されるのですが、なぜですか?
802 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 21:59:00 ] うそはよくない。TTimerは別々にウィンドウを保持してるので独立して動作する。 ただしメッセージループが動作していないといけないし、Windowsのタイマはもともと 指定時間を経過したことを示すフラグなのでそのあたりも注意が必要だが。
803 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 00:34:30 ] >>800 ばかだねー(´・∀・`)
804 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 00:46:36 ] >>790 ファイル保存するときに排他処理やってないとかいうオチ?
805 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 01:23:22 ] >>804 お前は何を言ってるんだ?
806 名前:756 mailto:sage [2010/06/14(月) 12:02:13 ] みなさん、レスありがとうございます。 あれから色々やってみたのですが、相変わらず <meta http-equiv="refresh" content="0;url=/check.pl?n=%2Fhome.pl"> が返ってきます。 今はLive HTTP headersを火狐に入れて、正常にログインできたときの情報を確認しています が、オミトロンを使用し、ブラウザとIdHTTP両方で確認してみます。 Indy使ったことがないので、勉強がてらやってみたのですが、俺にはてごわすぎる・・・。
807 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 14:21:55 ] それが正しいんじゃないの? ほんとにブラウザの動きを確認してる?
808 名前:デフォルトの名無しさん mailto:sage [2010/06/14(月) 20:59:05 ] >>806 ブラウザの動き的にはそれであってるんじゃないの? 次にそのHTMLから/check.pl?n=%2Fhome.plにアクセスして その次にhome.plに行けば成功じゃない?
809 名前:デフォルトの名無しさん mailto:sage [2010/06/15(火) 04:36:11 ] >>806 (´・∀・`)