[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/27 14:57 / Filesize : 277 KB / Number-of Response : 972
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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
(´・∀・`)






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<277KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef