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

このエントリーをはてなブックマークに追加
943デフォルトの名無しさん:04/11/25 16:36:50
>>942
即レスありがとうです。やってみたんですが、
QouteChar:=''だと、StringとCharに互換性がないと言われます。
#0ではエラーが出ました。
944デフォルトの名無しさん:04/11/25 16:43:48
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
i := -1;
if i in [-1, 0] then ShowMessage('');
end;

コンパイルエラーが出るのは何故ですか?
945デフォルトの名無しさん:04/11/25 16:57:27
>>944
集合型は負数の指定は不可。
InRange使え。
946デフォルトの名無しさん:04/11/25 17:34:08
文字を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;

何故かデータが難しい漢字ばかりになってしまいます。
947デフォルトの名無しさん:04/11/25 18:16:01
レイブレポートの使い方を教えてくれる学校とかないですか?
948デフォルトの名無しさん:04/11/25 18:26:37
がっこう・・・
949デフォルトの名無しさん:04/11/25 19:55:39
>>946
二バイト文字の判断をしなくちゃだめでしょ。文字ごとじゃなくて文字列で変換してくれる
HenkanJ2.pas というのを使ったらいい

http://forum.nifty.com/fdelphi/samples/00959.html
950デフォルトの名無しさん:04/11/25 20:55:28
>>949
凄い助かった。ありがとう。
後から二バイトの判断には気づいたんだが、
その後の処理がめちゃくちゃだった。

これで家に帰れる。
951デフォルトの名無しさん:04/11/25 20:58:07
Delphi2005トライアルで作ったソフトは配布してもいいですか?
952デフォルトの名無しさん:04/11/25 20:59:59
Delphi2005トライアルの規約をお読みください
953922:04/11/25 21:10:47
これでカンマを送ることが出来ました。
keybd_event(188, 0, 0, 0);

お騒がせしました。


>>935

コロンは「186」
中括弧は不明です。
954デフォルトの名無しさん:04/11/25 21:41:27
>>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。以下おなじ。
955922:04/11/25 22:13:22
>>954
なるほど。
956デフォルトの名無しさん:04/11/25 22:24:05
WM_CHARでも送っとけ
957デフォルトの名無しさん:04/11/25 23:05:00
keybd_event() のとこを話すと必ず一人は現れるね > WM_CHAR
958デフォルトの名無しさん:04/11/26 00:02:46
>>922
カンマとかのキーコードはキーボードレイアウトによって変わる。
VkKeyScanを使えば、任意の文字に対応する仮想キーコードと修飾キーを調べられるよ。
959デフォルトの名無しさん:04/11/26 02:16:16
>>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;
960デフォルトの名無しさん:04/11/26 02:17:30
つづき

結果

65
SHIFT + 65
188
219
SHIFT + 219

うまくいった!
961デフォルトの名無しさん:04/11/26 02:21:23
実際に使うときは文字列じゃなくて、結果をフラグと数値にして

keybd_event()

を SHIFT を押すかどうかなどを判断するようにコードを書けばいいね。
962デフォルトの名無しさん:04/11/26 03:13:31
やってみた

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);
963デフォルトの名無しさん:04/11/26 03:15:20
つづき

    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;
964デフォルトの名無しさん:04/11/26 03:17:00
結果

Delphi
@<|8_

となって、期待通りキャレットが8の前に来る
965デフォルトの名無しさん:04/11/26 03:38:14
D6パソナルで作ったexeを配布したらどうなるとですか?
966デフォルトの名無しさん:04/11/26 03:50:03
対価を得なければいいんじゃないの。フリーソフトなら。
967デフォルトの名無しさん:04/11/26 03:51:14
あわわ、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に接続した際にパスワード認証を行いたいのですが、
どのように書けば良いでしょうか。
969デフォルトの名無しさん:04/11/26 15:53:41
下のようなテキストファイルがあるとき、
文字列 name から adress までに含まれる
文章1だけ指定するにはどうしたらいいんでしょうか?


name
 文章1
adress
 文章2
proffile
 文章3
end       
970デフォルトの名無しさん:04/11/26 16:16:13
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]);
971デフォルトの名無しさん:04/11/26 16:16:45
AnsiPosでnameの位置とadressの位置を見つけて引き算する。
あとはCopyで文章1を抜き出す。
972デフォルトの名無しさん:04/11/26 18:17:58
>>970さん
>>971さん
素早い回答ありがとうございます。
今から試してみたいと思います。
では・・
973デフォルトの名無しさん:04/11/26 19:19:54
>>970-971
素晴らしい連携だな、おい
974デフォルトの名無しさん:04/11/26 19:34:26
このスレでさえレベルの違う自分が嫌になってきたorz

ttp://hp.vector.co.jp/authors/VA015669/
ここのUIDHTMLEdっていうのをインストールしようとしたんですが、
どうもActiveXの初期化(?)の部分でエラーがでます。
未定義の識別子 action.UIEditon みたいな感じのです。
必要なコンポーネントはインストールしたんですけど全く駄目でした。
サポートもHPも死んでるみたいなので、どなたか対処法をご存じの方、
ご教示下さい。

>>973
同一人物では?
975デフォルトの名無しさん:04/11/26 19:52:30
同一人物じゃないだろ。970は文字列単位で、971は文字単位で抜き出す方法。
前者が正解に近い
976デフォルトの名無しさん:04/11/26 20:02:38
>>974
1週間前に更新してるから生きてるんじゃないの?
ttp://www33.ocn.ne.jp/~takoyakusi/index.html
977デフォルトの名無しさん:04/11/26 21:36:43
簡単なシミュレーションを作りたいと思っています。
それにあたって、
プログラム内で、○日目○時○分という形で、
独自の時間を動かしたいのです。
現実の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によって速度も変えられますよね。

ただどうも原始的というかスマートではないですよね。
他にこういう時の定石みたいなものがあるのではと思ったんですが、
何かないでしょうか。
978デフォルトの名無しさん:04/11/26 21:52:24
>>977
TDateTime型とIncSecond関数とかどうよ?
979デフォルトの名無しさん:04/11/26 22:15:18
PAnsicharの変数をstringに変更するにはどうしたらいいですか?
980デフォルトの名無しさん:04/11/26 22:25:40
>>978
難しそうで諦めたんですが
もう一度見てみます。
981デフォルトの名無しさん:04/11/26 22:28:42
>>979
PAnsiCharが指す文字をString型に代入するという意味なら

a: PAnsiChar;
b: String;

b := a^;
982デフォルトの名無しさん:04/11/26 22:58:31
>>980
独自の時間を秒単位で持つ変数をtとすると
second := t mod 60;
minute := t div 60 mod 60;
hour := t div 3600 mod 24;
day := t div 86400;
983デフォルトの名無しさん:04/11/27 01:02:30
>>981
ありがとうございます
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) );

こんな風にすると、要素数が異なるって怒られます
985高野聖:04/11/27 01:51:40
  MyRec : array [0..0] of TMyRec =
   ((aa:'テスト';bb:0;cc:True));
986裏高野:04/11/27 01:53:39
>>985
高野聖がこんな所で何をしておる!
987デフォルトの名無しさん:04/11/27 01:59:52
>>985
できた!ありがとう
98820用テンプレ:04/11/27 03:05:34
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。

<前スレ>
くだすれDelphi(超初心者用)その19
http://pc5.2ch.net/test/read.cgi/tech/1097454588/

<その他>
ボーランド
http://www.borland.co.jp/
DelWiki
http://onigiri.s3.xrea.com:8080/delphi/
98920用テンプレ:04/11/27 03:06:37
990デフォルトの名無しさん:04/11/27 13:43:33
くだすれDelphi(超初心者用)その20
http://pc5.2ch.net/test/read.cgi/tech/1101530485/
991デフォルトの名無しさん:04/11/27 15:09:11
あれ?
同じ引数を取る、別の型を返す同じ名前のfunctionって作れなかったっけ?

オーバーロードしようとしたら怒られたんだけど

function GetInput(const Prompt: string): string; overload;
function GetInput(const Prompt: string): integer; overload;
992デフォルトの名無しさん
無理だよ。

SetInput(GetInput('xxx'));

でSetInputがoverloadされてたらあいまいさを解決できないから。