>>942 即レスありがとうです。やってみたんですが、
QouteChar:=''だと、StringとCharに互換性がないと言われます。
#0ではエラーが出ました。
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
i := -1;
if i in [-1, 0] then ShowMessage('');
end;
コンパイルエラーが出るのは何故ですか?
>>944 集合型は負数の指定は不可。
InRange使え。
文字をS-JISからEUCに変換したいのですが、
HenkanJ.pasの使い方を教えていただけないでしょうか。
len := Length(Line);
for ch := 1 to len do
begin
moji := SJisToEUC(ord(Line[ch]));
mojis := mojis + chr(moji);
end;
何故かデータが難しい漢字ばかりになってしまいます。
レイブレポートの使い方を教えてくれる学校とかないですか?
がっこう・・・
>>949 凄い助かった。ありがとう。
後から二バイトの判断には気づいたんだが、
その後の処理がめちゃくちゃだった。
これで家に帰れる。
Delphi2005トライアルで作ったソフトは配布してもいいですか?
Delphi2005トライアルの規約をお読みください
953 :
922:04/11/25 21:10:47
これでカンマを送ることが出来ました。
keybd_event(188, 0, 0, 0);
お騒がせしました。
>>935 コロンは「186」
中括弧は不明です。
>>953 ありがとう。こっちでも試してみた。virtual-key code が Windows.pas で未定義な 166 から 228 の間で
keybd_event(Code, 0, 0, 0);
keybd_event(Code, 0, KEYEVENTF_KEYUP, 0);
で意味ある「文字」を送れるのは
186 : :
187 : ;
188 : ,
189 : -
190 : .
191 : /
192 : @
219 : [
220 : \
221 : ]
222 : ^
226 : \
228 : 00 (?)
たとえばキーボードを見ると { は shift + [ だから
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(219, 0, 0, 0);
keybd_event(219, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
でOK。以下おなじ。
955 :
922:04/11/25 22:13:22
WM_CHARでも送っとけ
keybd_event() のとこを話すと必ず一人は現れるね > WM_CHAR
>>922 カンマとかのキーコードはキーボードレイアウトによって変わる。
VkKeyScanを使えば、任意の文字に対応する仮想キーコードと修飾キーを調べられるよ。
>>958 >>922 じゃないけど試してみた。ありがとう。
function GetVirtualKey(ch:Char):string;
var
ret: word;
func,code: byte;
begin
ret := VkKeyScan(ch);
func := HIBYTE(ret);
code := LOBYTE(ret);
if (func = $FF) and (code = $FF) then
begin
result := 'not found';
exit;
end;
result := '';
if (func and $01 <> 0) then result := 'SHIFT + ';
if (func and $02 <> 0) then result := result + 'CTRL + ';
if (func and $04 <> 0) then result := result + 'ALT + ';
result := result + IntToStr(code);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Add(GetVirtualKey('a'));
Memo1.Lines.Add(GetVirtualKey('A'));
Memo1.Lines.Add(GetVirtualKey(','));
Memo1.Lines.Add(GetVirtualKey('['));
Memo1.Lines.Add(GetVirtualKey('{'));
end;
つづき
結果
65
SHIFT + 65
188
219
SHIFT + 219
うまくいった!
実際に使うときは文字列じゃなくて、結果をフラグと数値にして
keybd_event()
を SHIFT を押すかどうかなどを判断するようにコードを書けばいいね。
やってみた
function KeybrdEvent(ch: Char; CtrlCode:Boolean=false):Boolean;
var
ret: word;
func,code: byte;
fShift,fCtrl,fAlt:Boolean;
begin
result := false;
if CtrlCode then
begin
keybd_event(byte(ch), 0, 0, 0);
keybd_event(byte(ch), 0, KEYEVENTF_KEYUP, 0);
end
else
begin
ret := VkKeyScan(ch);
func := HIBYTE(ret);
code := LOBYTE(ret);
if (func = $FF) and (code = $FF) then exit;
fShift := (func and $01 <> 0);
fCtrl := (func and $02 <> 0);
fAlt := (func and $04 <> 0);
つづき
if fShift then keybd_event(VK_SHIFT, 0, 0, 0);
if fCtrl then keybd_event(VK_CONTROL, 0, 0, 0);
if fAlt then keybd_event(VK_MENU, 0, 0, 0);
keybd_event(code, 0, 0, 0);
keybd_event(code, 0, KEYEVENTF_KEYUP, 0);
if FAlt then keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
if FCtrl then keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
if FShift then keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end;
result := true;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
KeybrdEvent('D');
KeybrdEvent('e');
KeybrdEvent('l');
KeybrdEvent('p');
KeybrdEvent('h');
KeybrdEvent('i');
KeybrdEvent(Char(VK_RETURN),true);
KeybrdEvent('@');
KeybrdEvent('<');
KeybrdEvent('|');
KeybrdEvent('8');
KeybrdEvent('_');
KeybrdEvent(Char(VK_LEFT),true);
KeybrdEvent(Char(VK_LEFT),true);
end;
結果
Delphi
@<|8_
となって、期待通りキャレットが8の前に来る
D6パソナルで作ったexeを配布したらどうなるとですか?
対価を得なければいいんじゃないの。フリーソフトなら。
あわわ、overload を使った方がきれいだね。
function KeybrdEvent(VKey: Byte):Boolean;overload;
begin
keybd_event(VKey, 0, 0, 0);
keybd_event(VKey, 0, KEYEVENTF_KEYUP, 0);
end;
function KeybrdEvent(ch: Char):Boolean;overload;
var
ret: word;
func,code: byte;
fShift,fCtrl,fAlt:Boolean;
begin
result := false;
ret := VkKeyScan(ch);
省略
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
KeybrdEvent('D');
KeybrdEvent('e');
KeybrdEvent('l');
KeybrdEvent('p');
KeybrdEvent('h');
KeybrdEvent('i');
KeybrdEvent(VK_RETURN); // 見かけ上同じに書ける
KeybrdEvent('@');
以下略
968 :
デフォルトの名無しさん:04/11/26 04:40:49
Server/Clientプログラムで、Serverに接続した際にパスワード認証を行いたいのですが、
どのように書けば良いでしょうか。
下のようなテキストファイルがあるとき、
文字列 name から adress までに含まれる
文章1だけ指定するにはどうしたらいいんでしょうか?
name
文章1
adress
文章2
proffile
文章3
end
sl := TStringList.Create;
sl.LoadFromFile('foo.txt');
idx1 := sl.IndexOf('name');
idx2 := sl.IndexOf('address');
for i := idx1+1 to idx2-1 do
Writeln(sl[i]);
AnsiPosでnameの位置とadressの位置を見つけて引き算する。
あとはCopyで文章1を抜き出す。
972 :
デフォルトの名無しさん:04/11/26 18:17:58
>>970さん
>>971さん
素早い回答ありがとうございます。
今から試してみたいと思います。
では・・
このスレでさえレベルの違う自分が嫌になってきたorz
ttp://hp.vector.co.jp/authors/VA015669/ ここのUIDHTMLEdっていうのをインストールしようとしたんですが、
どうもActiveXの初期化(?)の部分でエラーがでます。
未定義の識別子 action.UIEditon みたいな感じのです。
必要なコンポーネントはインストールしたんですけど全く駄目でした。
サポートもHPも死んでるみたいなので、どなたか対処法をご存じの方、
ご教示下さい。
>>973 同一人物では?
同一人物じゃないだろ。970は文字列単位で、971は文字単位で抜き出す方法。
前者が正解に近い
簡単なシミュレーションを作りたいと思っています。
それにあたって、
プログラム内で、○日目○時○分という形で、
独自の時間を動かしたいのです。
現実の1秒=プログラム内の1秒ではなく、
速度を早めたりできるようにしたい。
今の知識で思いついたのは、
day,time,minuteという3つの変数をIntegerで定義して、
Timerコンポーネントの中に、
time=23 minute=59 なら time=0 minute=0 day+1
time=23 でなく minute=59 なら minute=0 time+1
それ以外なら minute+1
というような内容を書き込んで
時間を経過させていくというものです。
Timer.intervalによって速度も変えられますよね。
ただどうも原始的というかスマートではないですよね。
他にこういう時の定石みたいなものがあるのではと思ったんですが、
何かないでしょうか。
>>977 TDateTime型とIncSecond関数とかどうよ?
PAnsicharの変数をstringに変更するにはどうしたらいいですか?
>>978 難しそうで諦めたんですが
もう一度見てみます。
>>979 PAnsiCharが指す文字をString型に代入するという意味なら
a: PAnsiChar;
b: String;
b := a^;
>>980 独自の時間を秒単位で持つ変数をtとすると
second := t mod 60;
minute := t div 60 mod 60;
hour := t div 3600 mod 24;
day := t div 86400;
984 :
デフォルトの名無しさん:04/11/27 01:43:46
TMyRec = record
aa : string[10];
bb : Integer;
cc : Boolean;
end;
こんな型で宣言時に値をつめたいと思っているのですが、
どうもうまくいきません。よろしくお願いいたします。
var
MyRec : array [0..0] of TMyRec =
( (aa:'テスト'),(bb:0),(cc:True) );
こんな風にすると、要素数が異なるって怒られます
MyRec : array [0..0] of TMyRec =
((aa:'テスト';bb:0;cc:True));
987 :
デフォルトの名無しさん:04/11/27 01:59:52
あれ?
同じ引数を取る、別の型を返す同じ名前のfunctionって作れなかったっけ?
オーバーロードしようとしたら怒られたんだけど
function GetInput(const Prompt: string): string; overload;
function GetInput(const Prompt: string): integer; overload;
無理だよ。
SetInput(GetInput('xxx'));
でSetInputがoverloadされてたらあいまいさを解決できないから。