Delphi初心者のための寺子屋at TECH
Delphi初心者のための寺子屋 - 暇つぶし2ch1:デフォルトの名無しさん
05/11/23 23:31:08
Delphi初心者が問題をコツコツと解きながらレベルアップするためのスレです。


2:デフォルトの名無しさん
05/11/23 23:38:37
糞スレたてんな。
Delphi関連のスレがいくつあると思ってんだ?
既存のスレを利用しろ池沼


/*          終了          */

3:デフォルトの名無しさん
05/11/23 23:58:22
早く、問題出せ
俺はやらないが…

4:デフォルトの名無しさん
05/11/24 00:57:02
そもそもDelphiのスレなんて必要ねーよ
糞言語氏ね

5:デフォルトの名無しさん
05/11/24 01:36:10
object pascalをいじめないでください><

6:デフォルトの名無しさん
05/11/24 02:51:06
Dr.Dのマシン語寺子屋ってコーナーがあったなあ・・・・

7:デフォルトの名無しさん
05/11/24 09:28:17
Unicodeはどうやって扱えますか?

8:デフォルトの名無しさん
05/11/24 09:56:47
さあ!私にDelphiを教えなさい!

9:デフォルトの名無しさん
05/11/24 10:34:28
前スレより問題文を転載

//ここから問題文
次は、例外処理の締めとしてRaiseを使おう。
ファイルが開けないときは
writeln(filename)した後、今の例外処理(Writeln(E.Message);)
を実行するように、
また、読み込みエラーのときは、E.Messageの内容を
"読み込めねー"
に変更してみてみてくれ。どちらも Raise を使えば簡単にできる。
//ここまで問題文


10:デフォルトの名無しさん
05/11/24 10:34:51
ちなみにこのプログラムに手を加えろという問題です

const
    filename='test.txt';
var
    sum:    double;
    fp:    TextFile;
    str:    string;
begin
    sum:=0;
    try
        AssignFile(fp, filename);
        Reset(fp);
        try
            while (not Eof(fp)) do
            begin
                Readln(fp, str);
                sum:=sum+StrToFloatDef(str, 0);
            end;
            writeln(FloatToStr(sum));
        finally
            CloseFile(fp);
        end;
    except
        on E: Exception do Writeln(E.Message);
    end;
end.


11:デフォルトの名無しさん
05/11/24 10:36:03
現在の回答

sum:=0;
try
  AssignFile(fp, filename);
  try
    Reset(fp);
  except
    Memo1.Lines.Add(filename);
    raise;
  end;
  try
    while (not Eof(fp)) do
    begin
      try
        Readln(fp, str);
      except
        raise Exception.Create('よみこめねー');
      end;
      sum:=sum+StrToFloatDef(str, 0);
    end;
    Memo1.Lines.Add(FloatToStr(sum));
  finally
    CloseFile(fp);
  end;
except
  on E: Exception do Memo1.Lines.Add(E.Message);
end;


12:デフォルトの名無しさん
05/11/27 18:53:41
次の問題まだぁ~?

13:デフォルトの名無しさん
05/11/27 21:46:37
>>11

これで例外処理関係はOKだと思うがどうだろう?

それでは次は文字列処理かな。
入力された文字列から'='を探し出し、
(=より前の文字列)'は、'(=より後ろの文字列)'です。'
という出力、および、処理にかかった時間を出力
するプログラムを作ってみてくれ。


14:デフォルトの名無しさん
05/11/28 00:18:18
いいかげん自作自演うざいんですけど…

15:デフォルトの名無しさん
05/11/28 02:18:02
>>14
レスアンカーつけないと誰に言ってるんだか分かりませんよd(^-^)b

16:デフォルトの名無しさん
05/11/28 03:09:04
つまり、>>13は高速に文字列の中から
'='の左と右を分けたいわけね。


17:デフォルトの名無しさん
05/11/28 03:31:56
自演乙

18:デフォルトの名無しさん
05/11/28 16:40:00
>>13
program Project1;

{$APPTYPE CONSOLE}

uses
    SysUtils, Types, MMSystem;

const
    str='Delphi=399,000YEN';

var
    i:    Integer;
    len:    Integer;
    StartTime:    DWORD;
    EndTime:    DWORD;

begin
    StartTime:=timeGetTime;
    i:=1;
    while str[i]<>'=' do
    begin
        Write(str[i]);
        Inc(i);
    end;

    Write('は');
    Inc(i);

19:デフォルトの名無しさん
05/11/28 16:40:36
    len:=Length(str);
    while i<=Len do
    begin
        Write(str[i]);
        Inc(i);
    end;

    Writeln('です');

    EndTime:=timeGetTime;

    Writeln(Format('タイムは%d㍉秒です', [EndTime-StartTime]));
    Readln;
end.

//ここまで。よろしくお願いします。

20:デフォルトの名無しさん
05/11/28 23:16:12
>>18-19
題を出したのとは別人だけども。

・題意は、入力文字列は固定ではなくReadLnで実行時に入力させることを意図していたと思われる。のでReadLnを使う。
・また、'='が見つからなかった場合の処理。
・ふたつめのwhileループは、ループ回数がループ開始前にわかっている。こういう場合は定石としてはforを使う。
・DelphiっぽくNowとTDateTimeを使ってみよう。

ていうかこのスレでいきなりtimeGetTime見て驚いた。

21:デフォルトの名無しさん
05/11/28 23:20:21
ついでに>>10は、
PascalとしてはDoubleじゃなくRealのほうがいいね。
Delphiだとどっちでも同じ(64ビット倍精度浮動小数点)だけど。

…ちなみに精度が欲しければExtended(80ビット拡張精度)を使う、つーか
Delphiは浮動小数点の内部計算全部Extendedでやってるので、
実はExtendedで統一した方が変換ロスとか無くていい。


22:デフォルトの名無しさん
05/11/29 09:01:26
>>20
program Project1;

{$APPTYPE CONSOLE}

uses
    SysUtils;

var
    i, j:    Integer;
    len:    Integer;

    StartTime: TDateTime ;
    EndTime: TDateTime ;

    Hour, Min, Sec, MSec: Word;

    str:    String;
begin

    Readln(str);

    StartTime:=Now;

    len:=Length(str);

    i:=1;
    while str[i]<>'=' do
    begin
        Write(str[i]);
        Inc(i);

23:デフォルトの名無しさん
05/11/29 09:02:09
        if i>len then
        begin
            Writeln;
            Writeln('=が見つかりませんでした');
            Readln;
            Exit;
        end;
    end;

    Write('は');
    Inc(i);

    for j:=i to len do
    begin
        Write(str[j]);
    end;

    Writeln('です');
    EndTime:=Now;

    DecodeTime(EndTime-StartTime, Hour, Min, Sec, MSec);
    Writeln(Hour,'時間',Min,'分',Sec,'秒',MSec);

    Readln;
end.
//ここまで。よろしくお願いします。

24:デフォルトの名無しさん
05/11/29 09:32:44
>>22

ただ、次の点をアップデートしていただけるとうれしい。
・文字列処理の習得を中心に考えているので結果(XはYです)の出力はまとめて
 行うようにしてほしい。
・Delphi初心者がいきなりコンソールアプリから入るとは考えにくいので
 できればGUIでお願いしたい。
・こちらではコンパイルして確認するわけではないのでコードすべてをアップする
 必要はない(そのため細かいバグは見落としますがそれはゴメン)

25:デフォルトの名無しさん
05/11/29 10:19:21
DelphiでINIファイルの読み書きをしたいのですが・・
良いサンプルとかありませんでしょうか?

26:デフォルトの名無しさん
05/11/29 11:00:56
>>25
ヘルプでTIniFileを検索して、あとは色々たどっていけばサンプルがあるけど、それじゃダメか?

27:デフォルトの名無しさん
05/11/29 12:13:12
>>26
TIniFile検索してみたけどちょっとわかりずらいっす。
でもTIniFileを使うってのがわかったので助かります。
さんくす

28:デフォルトの名無しさん
05/11/29 18:30:10
>>22-23 & >>24
空文字列が入力されたら存在しないstr[1]をアクセスしにいかないか?

29:デフォルトの名無しさん
05/11/29 18:48:21
>>28
    if len=0 then
    begin
        exit;
    end;

修正しました

30:デフォルトの名無しさん
05/11/29 20:52:30
>>27
D7だとヘルプのテキスト検索で「TIniFile とTMemIniFile の使い方」
ここにサンプル載ってるけどダメか?

ちょっとコード書いてみて、具体的にわからない所があったら質問してみ。

31:デフォルトの名無しさん
05/11/30 13:05:59
メディアンフィルタとかガンマが付いてるTImageの派生クラスはありまつか?

32:デフォルトの名無しさん
05/11/30 17:12:15
>>24
結果をまとめて表示、GUIをやりました
よろしくお願いします

procedure TForm1.Button1Click(Sender: TObject);
var
    i, j:        Integer;
    len:        Integer;

    StartTime: TDateTime ;
    EndTime: TDateTime ;

    Hour, Min, Sec, MSec: Word;

    str_src:    String;
    str_dest: String;
begin
    str_src:=Edit1.Text;
    StartTime:=Now;
    len:=Length(str_src);

    if len=0 then
    begin
        ShowMessage('なにか文字を入力してください');
        exit;
    end;

    i:=1;
    while str_src[i]<>'=' do
    begin
        str_dest:=str_dest+str_src[i];
        Inc(i);

33:デフォルトの名無しさん
05/11/30 17:12:50
        if i>len then
        begin
            ShowMessage('=が見つかりませんでした');
            Exit;
        end;
    end;

    str_dest:=str_dest+'は';
    Inc(i);

    for j:=i to len do
    begin
            str_dest:=str_dest+str_src[j];
    end;

    str_dest:=str_dest+'です';
    EndTime:=Now;

    DecodeTime(EndTime-StartTime, Hour, Min, Sec, MSec);
    Memo1.Lines.BeginUpdate;
    Memo1.Lines.Add(str_dest);
    Memo1.Lines.Add(Format('%u時間 %u分 %u秒 %u', [Hour,Min,Sec,MSec]));
    Memo1.Lines.EndUpdate;
end;
//ここまで

34:デフォルトの名無しさん
05/11/30 20:35:52
>>32


文字列処理は大丈夫っぽいのでまとめてお題を出しちゃおう。
1 Pos(AnsiPos)関数を使ってみる
2 その他使えそうな標準関数がないか探して使ってみる
3 PCharを使ってみる

35:デフォルトの名無しさん
05/12/01 02:33:50
>>34
あんたホントに理解してんの?

36:デフォルトの名無しさん
05/12/01 09:24:06
>>35
日本語処理のことかな。
そこは出題意図ではないので別の機会で勉強してくれ。


37:デフォルトの名無しさん
05/12/01 10:18:01
日本語処理を無視した文字列処理はナンセンス

38:デフォルトの名無しさん
05/12/01 10:23:44
>>37
ごめんな。
俺だけがお題を出すのも限界があるから是非もっとよいお題を頼む。

39:デフォルトの名無しさん
05/12/01 10:42:02
お題
「このスレの1-38までを Memo1 にコピーして、「Delphi」という文字列が何度
現れたか数えなさい。

40:デフォルトの名無しさん
05/12/01 14:08:14
>>34の1
begin
    str_src:=Edit1.Text;
    StartTime:=Now;

    len:=Length(str_src);
    eq_pos:=pos('=', str_src);

    if len=0 then
    begin
        ShowMessage('なにか文字を入力してください');
        exit;
    end;
    if eq_pos=0 then
    begin
        ShowMessage('=が見つかりませんでした');
        Exit;
    end;

    str_dest:=copy(str_src, 1, eq_pos-1);
    str_dest:=str_dest+'は';
    str_dest:=str_dest+copy(str_src, eq_pos+1, High(Integer));
    str_dest:=str_dest+'です';

    EndTime:=Now;
    DecodeTime(EndTime-StartTime, Hour, Min, Sec, MSec);
    Memo1.Lines.BeginUpdate;
    Memo1.Lines.Add(str_dest);
    Memo1.Lines.Add(Format('%u時間 %u分 %u秒 %u', [Hour,Min,Sec,MSec]));
    Memo1.Lines.EndUpdate;
end;

41:デフォルトの名無しさん
05/12/01 14:26:49
>>34の2

回答1.DeleteとInsertを使う
Delete(str_src, eq_pos, 1);
Insert('は', str_src, eq_pos);
str_dest:=Concat(str_src, 'です');

回答2.出来合いの関数を使う
Borland - Delphi Q&A 文字列を一括置換するには
URLリンク(www.borland.co.jp)

回答3.正規表現を使う
TRegExpr - PukiWiki
URLリンク(onigiri.s3.xrea.com:8080)

※2と3は標準関数ではないですが見つけたので添えておきます

42:デフォルトの名無しさん
05/12/01 17:43:03
D5 以降だと StringReplace があるけど

43:デフォルトの名無しさん
05/12/01 18:24:52
>>42
天才あらわる

44:デフォルトの名無しさん
05/12/01 22:23:51
>>34の3
    PSrc:=AllocMem(len+1);
    PSrcCopy:=PSrc;
    ZeroMemory(PSrc, len+1);

    for i:=1 to len do
    begin
        PSrc[i-1]:=str_src[i];
    end;

    while PSrc^ <> #0 do
    begin
        if PSrc^ = '=' then
        begin
            str_dest:=str_dest+'は';
        end
        else
        begin
                str_dest:=str_dest+PSrc^;
        end;
        Inc(PSrc);
    end;
    str_dest:=str_dest+'です';
    FreeMem(PSrcCopy, len+1);

45:デフォルトの名無しさん
05/12/01 22:41:39
メモリ割り当ててコピーは無駄。ポインタ使う意義が半減。

PSrc := PChar(str_src);

でいいんでない?

46:デフォルトの名無しさん
05/12/01 23:10:52
>>45
了解です。修正しました。
PCharとStringの変換が意外と楽で感激
    PSrc:=PChar(str_src);
    while PSrc^ <> #0 do
    begin
        if PSrc^ = '=' then
        begin
            str_dest:=str_dest+'は';
        end
        else
        begin
                str_dest:=str_dest+PSrc^;
        end;
        Inc(PSrc);
    end;
    str_dest:=str_dest+'です';

47:デフォルトの名無しさん
05/12/01 23:13:41
>>39
    p:=0;
    cnt:=0;
    str:=Memo1.Text;
    len:=length(sword);

    repeat
        ap:=Pos(sword, copy(str, p, High(Integer)));
        if ap>0 then
        begin
            p:=p+ap;
            Inc(cnt);
            Inc(p, len);
        end;
    until ap=0;
    ShowMessage(IntToStr(cnt));

48:デフォルトの名無しさん
05/12/01 23:32:47
>>39をPCharを使って解きました
文字列の添え字に間違って0を使ってしまってハマってしまいました
PCharのときは0から、それ以外(constやstring)は1からでいいんですよね?
    p:=1;
    cnt:=0;
    str:=Memo1.Text;
    PStr:=PChar(str);
    len:=length(sword);

    while PStr^ <> #0 do
    begin
        if PStr^ = sword[p] then
        begin
            Inc(p);
            if (p=len) then
            begin
                Inc(cnt);
                p:=1;
            end;
        end
        else
        begin
            p:=1;
        end;
        Inc(PStr);
    end;
    ShowMessage(IntToStr(cnt));

49:デフォルトの名無しさん
05/12/01 23:32:52
>>47
パチパチパチ、すばらしい
◎-3

減点は、この場合は問題ないだろうけど、日本語処理では Pos じゃなく AnsiPos
を使うこと。

いろいろ改良点があるけど

ap:=Pos(sword, copy(str, p, High(Integer)));

これがこの処理のキモ。でも、文字列コピーは最も効率悪い方法。
1MByte のテキストで検索文字列が1000回現れたら、1000回コピーする
ことになる。PChar をつかってなるべくコピーをしないで処理する方法を
考えるのが次のお題。



50:デフォルトの名無しさん
05/12/01 23:34:57
> PCharのときは0から、それ以外(constやstring)は1からでいいんですよね?

そう。string 型は、パルカルのときの実装を引きずっていますので例外的に1から、と覚える


51:デフォルトの名無しさん
05/12/02 00:00:42
×パルカル
○パスカル

52:デフォルトの名無しさん
05/12/02 00:06:33
49 のヒント AnsiStrPos

53:デフォルトの名無しさん
05/12/02 09:07:30
TEditに英文字のみ入るようにする方法教えて下さい。

54:53
05/12/02 09:19:30
イベントハンドラでキー入力をカット出来ないかなぁ?

55:デフォルトの名無しさん
05/12/02 09:35:55
>39にも誰か答えてやれよ

56:デフォルトの名無しさん
05/12/02 09:38:03
×39
○31

57:デフォルトの名無しさん
05/12/02 09:58:38
> Delphi初心者が問題をコツコツと解きながらレベルアップするためのスレです。

単発質問はくだすれへ

58:デフォルトの名無しさん
05/12/02 16:42:41
>>48

Inc(p);
if (p=len) then

これじゃ、比較が一バイト少ないよ。それから、2バイト文字を考慮してないので
ダメです。「Delphi」ならまず問題ないけど「D」だったら、2バイト文字の2バイト目も
数えてしまう可能性がある。


59:デフォルトの名無しさん
05/12/05 21:38:25
>>49
日本語処理にも気をつけました
よろしくお願いします。

const
    sword='Delphi';
var
    str:    AnsiString;
    cnt:    Integer;
    PStr: PChar;
begin
    cnt:=0;
    str:=Memo1.Text;
    PStr:=PChar(str);

    repeat
        PStr:=AnsiStrPos(PStr, sword);
        if (PStr<>nil) then
        begin
            if (StrByteType(PStr, 0)=mbSingleByte) then
            begin
                Inc(cnt);
            end;
            Inc(PStr);
        end;
    until PStr=nil;

    ShowMessage(IntToStr(cnt));

end;


60:デフォルトの名無しさん
05/12/06 00:37:50
>>59
AnsiStrPosを使ってる時点で2バイト文字として意味のある位置で
結果が返ってる筈なんでStrByteTypeいらない。

というか前からスキャン方式でStrByteTypeは使っちゃだめ。
途中の位置をいきなり指定してそれがどこにあたるか調べるのは
前後の文字を辿るしかなく、
逆にそういった機能を持つ関数を使うことは
その次点に到達するまで前からスキャンしてきたこと自体を
無駄にしてる。
前から辿るならAnsi~系を使わずに自力でマルチバイト処理をするとしても
LeadBytesで充分。

61:デフォルトの名無しさん
05/12/06 00:46:30
>>59

惜しい。あと一歩。78点くらい。
たぶん結果は正しい。冗長なのが減点の原因。

AnsiStrPos は二バイト文字をサポートしていますので、検索の先頭を間違わなければStrByteType による確認は不要です。

それから、見つかったら、PStr は検索文字列の長さ分だけ Inc() してから再度検索します。

    repeat
        PStr:=AnsiStrPos(PStr, sword);
        if (PStr<>nil) then
        begin
          Inc(cnt);
          Inc(PStr, Length(sword));
        end;
    until PStr=nil;

このようにすると検索文字列が 「Delphi」であっても「デルファイ」であっても問題なく検索できます。
>>59 の回答は検索文字列の最初が一バイト文字であることを仮定しているので正しくないです。

しかし、かなりな進歩で驚いています。

次のお題は、何回現れるかの他に、その位置も返すような関数をつくってください。具体的には、RichEdit に
同様にテキストを読み込んで、ボタンを押すと Delphi の部分が赤い文字列になるようにします。

赤文字にする方法、位置情報を返すための配列の定義の仕方など、分からないことがあったら個別に質問してください。

62:デフォルトの名無しさん
05/12/07 01:04:33
>>61
begin
    cnt:=0;
    spos:=0;

    str:=RichEdit1.Text;
    PStr:=PChar(str);
    len:=Length(sword);

    repeat
        p:=AnsiPos(sword, PStr+spos);

        if (p>0) then
        begin
            Inc(cnt);
            Inc(spos, p);

            with RichEdit1 do
            begin
                SelStart:=spos-1;
                SelLength:=len;
                SelAttributes.Color:=clRed;
            end;
            Inc(spos, len);

        end;

    until p=0;
    ShowMessage(IntToStr(cnt));
end;
//ここまで
よろしくお願いします。

63:デフォルトの名無しさん
05/12/07 02:35:14
>>62
AnsiPosに暗黙のPChar→String変換で引数渡してるよね…。
これは暗黙に実行されるわりにコストがメチャ高いので、
ループの中では避けたほうがいい。
上と同じでAnsiStrPosじゃダメだったの?

64:デフォルトの名無しさん
05/12/07 03:05:54
>>62

すばらしい!

つぎに、汎用的に使えるように関数にしてみてください。

type
TPosArray = array of integer;

function SearchAndPos(const SubStr, Str: string; PosArray: TPosArray): integer;

で戻り値が出現回数であるような。>>63 さんのおっしゃるとおり、AnsiStrPos をつかって
実装してみてください。

65:デフォルトの名無しさん
05/12/07 03:10:21
すみません、関数は

function SearchAndPos(const SubStr, Str: string; var PosArray: TPosArray): integer;

の形です。var をわすれました。

66:デフォルトの名無しさん
05/12/09 04:07:45
>>64-65
AnsiStrPosを使うように変更しました
よろしくお願いします

function SearchAndPos(const SubStr, Str: string; var PosArray: TPosArray): integer;
var
    PStr:     PChar;
    PBgmStr:    PChar;
    PSubStr:    PChar;
    Cnt:    Integer;
    Len:    Integer;
begin
    Cnt:=0;
    Len:=Length(SubStr);

    PBgmStr:=PChar(Str);
    PStr:=PBgmStr;
    PSubStr:=PChar(SubStr);

    repeat
        PStr:=AnsiStrPos(PStr, PSubStr);
        if (PStr<>nil) then
        begin
            Inc(Cnt);
            SetLength(PosArray, Cnt);
            PosArray[Cnt-1]:=PStr-PBgmStr;
            Inc(PStr, Len);
        end;
    until PStr=nil;

    result:=Cnt;
end;

67:デフォルトの名無しさん
05/12/09 09:57:48
>>66

すばらしい!
実際のの動作はすみませんが、時間が出来たらあとで検証してみます。
見た限りでは問題無さそうです。

>>47 から比べると格段の進歩です。検索には一度も文字列コピーをしてないのですよね。

今回の教訓は、ひとかたまりの論理が完結したら、関数や手続き、クラス内のメソッド
などで表現すべき、ということです。コードの断片より、関数などで完結した論理を
表現しておくと、たとえ他の言語や環境になったとしても論理そのものは生きるので
自分の財産にすることが出来ます。

68:デフォルトの名無しさん
05/12/09 09:58:14
次の課題。

1)Delphi には Pos や AnsiPos にように文字列の先頭から、最初の位置までを
検索する関数がありますが、途中から検索する関数がありません。それを

function AnsiPosEx(const Substr, S: string; initPos: integer): Integer;

の形で AnsiStrPos をつかって、つくってください。そして、それをつかって >>66
書き直してみてください。

2)>>66 では見つかるたびに SetLength() を使って配列を一つずつ増やしています。
これは非効率的なので、たとえば10個づつ増やすようにしてみてください。

69:デフォルトの名無しさん
05/12/09 20:18:26
>>68
function AnsiPosEx(const SubStr, S: string; initPos: integer): Integer;
var
    PSubStr:    PChar;
    PS: PChar;
    PBgn: PChar;
    PPos: PChar;
begin
    PSubStr:=PChar(SubStr);
    PS:=PChar(S);
    PBgn:=PS+initPos;

    PPos:=AnsiStrPos(PBgn, PSubStr);
    result:=PPos-PS+1;
    if result<0 then
    begin
        result:=0;
    end;
end;


70:デフォルトの名無しさん
05/12/09 20:19:15
function SearchAndPos(const SubStr, Str: string; var PosArray: TPosArray): integer;
var
    PStr:     PChar;
    Cnt:    Integer;
    NowPos: Integer;
    Len:    Integer;
begin
    Cnt:=0;
    NowPos:=0;
    Len:=Length(SubStr);
    PStr:=PChar(Str);

    repeat
        NowPos:=AnsiPosEx(SubStr, PStr, NowPos);
        if NowPos<>0 then
        begin
            if Length(PosArray)=Cnt then
            begin
                SetLength(PosArray, Cnt+10);
            end;
            PosArray[Cnt]:=NowPos-1;
            Inc(Cnt);
            Inc(NowPos, Len);
        end;
    until NowPos=0;
    SetLength(PosArray, Cnt);
    result:=Cnt;
end;
//ここまで

よろしくお願いします

71:デフォルトの名無しさん
05/12/09 22:22:06
>>69

完璧!! -2 点 =98点

減点は、AnsiPosEx の第二引数に PChar を使ったこと。const の string 型は
呼び出しても、関数内で変更できないのでコピーされることはないです。ですから
string 型のまま使ってください。AnsiPosEx をつくったことにより、SearchAndPos
から、ポインタをあらわにつかうコードが完全になくすることができたことに注目してください。

次の課題は少し難易度が上がります。

このスレの1-38までのテキストのうち、半角の数字がでてきた数を数える関数をつくってください。

いままで、テキスト内の走査は、AnsiPos や AnsiStrPos をつかったのであらわに
コードを書かなかった。この課題では、一バイト文字、二バイト文字を判別しながら
数字かどうかを判定する必要があります。自分のコードでテキストを走査してください。
出来れば、前回のように、文字列の途中から検索して、最初の数字を見つける関数を
つくり、それを使って出現数を数えてください。

72:デフォルトの名無しさん
05/12/09 22:25:23
ヒント >>60 さんのコメントが参考になります。

73:デフォルトの名無しさん
05/12/10 00:15:52
数字は全角文字の二バイト目に出てこないよ。


74:デフォルトの名無しさん
05/12/10 02:07:03
>>73
ありがとう。
ほんとうですね。いま shift-jis のコード表を見ましたら、二バイト文字の二バイト目は
$40 からなんですね。一方 0-9 は $30-$39 ですから、重複しませんね。

うーむ、それでは課題が破綻するので変えることにします。

このスレの1-38までのテキストのうち、半角のアルファベット( a-z と A-Z )文字がでてきた数を数える関数をつくってください。

とします。すみませんでした。

75:デフォルトの名無しさん
05/12/11 22:32:44
嘘か真かわからんが、QualityCentralにQC#21940で、「Delphi2006 ハング」との事です。時々、ハングアップするとの事です。んー。今まで、Qualityを無視しつづけたツケだな。 -- 2005-12-07 05:54:52 (水) New

2005なんか 最初 吹っ飛んで消滅していたじゃん。 消滅からハングに 大差ないしおどろくことではないかと  先行バグ取り隊の情報引き続きよろしく  -- 2005-12-07 09:14:09 (水) New

>「消滅からハングに 大差ないしおどろくことではない」 どっちにしろ、真面目につかうものではなさそうですね。

「どっちにしろ、真面目につかうものではなさそうですね」 しらずに2005のときせっかく数時間かけて書いたコードが消滅して悲しい思いしたよ -- 2005-12-07 15:22:52 (水) New

76:デフォルトの名無しさん
05/12/15 07:29:16
>>74
function CountAlpha(var str:    AnsiString):    Integer;
var
    i:    Integer;
    cnt:    Integer;
begin
    cnt:=0;
    i:=0;

    while (i <= Length(str)) do
    begin
        if ( (str[i] in LeadBytes)) then
        begin
            Inc(i,2);
        end
        else
        begin
            if (str[i] in ['a'..'z']) or (str[i] in ['A'..'Z']) then
            begin
                Inc(cnt);
            end;
            Inc(i);
        end;

    end;
    result:=cnt;
end;
//ここまで
よろしくお願いします

77:デフォルトの名無しさん
05/12/15 10:26:25
>>76
すばらしい! 94点

減点は
CountAlpha(var str: AnsiString): → CountAlpha(const str: AnsiString):

const にして、関数内で変更しない(コピーされない)ことを保証し、
IntToStr(CountAlpha(Memo1.Text)) などと、変数を確保しなくても使えるように
することは重要です。var だと str := Memo1.Text; IntToStr(CountAlpha(str))
などとしなければ使えませんね。

減点ではないけど

if (str[i] in ['a'..'z']) or (str[i] in ['A'..'Z']) then

の部分は

if (str[i] in ['A'..'Z','a'..'z']) then

とすることもできます。

文字列のインデックスは1から始まります。ですから

i:=0; ではなく、 i:=1;

で初期化してください。次の課題は少し事前に検証してから出します。




78:デフォルトの名無しさん
05/12/15 10:42:34
>>76

つぎの課題は、もうちょっと難易度が上がります。
前回同様、アルファベットの文字を見つけるのは同じですが、塊として数えてください。

例えば

This is a pen.

の場合は4を返すような関数をつくってください。アルファベット以外の文字(空白も含む)で
区切られたアルファベットだけで出来ている語句の数を数えます。

「...ことを保証し、IntToStr(CountAlpha(Memo1.Text)) などと、変数を確保しなくても使えるように」

の場合は、「IntToStr」「CountAlpha」「Memo」「Text」の4つです。

79:デフォルトの名無しさん
05/12/15 11:52:06
ヒント
新幹線で東京から名古屋まで行くときのトンネルの数を数えるのと同等です。
トンネルの入り口を数えるといいですね。でも入り口を認識するためには
出口を認識する必要があります。出口を認識するためには、「いまトンネルの
なかにいる」という<状態>を変数に保存しておかなければなりません。また、
トンネルの中にも駅があることを考慮しなければなりません。ですから、名古屋
は違いますが終点がトンネルの中の場合もありえます。

80:デフォルトの名無しさん
05/12/15 12:22:11
すみません(こればっかり)、ヒントの最後の2行は、見つかった語句の長さを
記録するときのものです。今回は無視してください。入り口の数だけで十分です。

81:デフォルトの名無しさん
05/12/16 13:56:59
●問題2
エディットボックス(Edit1)に入力した数字までの合計値を、ボタン(Button1)を押したら、表示(Label1に表示)させよ。
なお変数は、エディットボックスの入力値(a)、合計値(Sum)、ループのカウンタ(i)とする。

procedure TForm1.Button1Click(Sender: TObject);
var
i,Sum:□□□□□□□;
a:integer;
begin
a:=StrToInt(Edit1.text);
Sum:=0;

for i:= □ to □ do
begin
Sum:= □□□+□
end;

Label1.Caption:=IntToStr(Sum);
end;

教えて!↑

82:デフォルトの名無しさん
05/12/16 15:44:01
Integer
0
a
Sum
i

83:デフォルトの名無しさん
05/12/18 04:51:49
すんません、教えてください。

TPopupMenuに動的にメニューを追加する方法なんですが、サブメニューも追加したくて・・・
例えば

A
 -SubA
 -SubB
B
 -SubA
 -SubB
 -SubC

こんな感じでサブメニュー含めて動的に追加するにはどうしたらいいですかね?

84:デフォルトの名無しさん
05/12/18 09:33:06
>>83
>>57

85:デフォルトの名無しさん
05/12/20 06:50:34
>>78-80
function CountAlphaWord(const str:    AnsiString):    Integer;
var
    i:    Integer;
    cnt:    Integer;
    isAlphaNow:    Boolean;
    isAlphaPrev:    Boolean;
begin
    isAlphaPrev:=False;

    cnt:=0;
    i:=1;

    while (i <= Length(str)) do
    begin
        isAlphaNow:=False;

        if ( (str[i] in LeadBytes)) then
        begin
            Inc(i,2);
        end
        else
        begin
            if (str[i] in ['a'..'z', 'A'..'Z']) then
            begin
                isAlphaNow:=True;
            end;
            Inc(i);
        end;


86:デフォルトの名無しさん
05/12/20 06:54:35
        if (not isAlphaPrev) and isAlphaNow then
        begin
            Inc(cnt);
        end;
        isAlphaPrev:=isAlphaNow;

    end;

    result:=cnt;
end;

//ここまで
よろしくお願いします

87:デフォルトの名無しさん
05/12/20 14:36:57
>>85-86

100点。

キモは、

if (not isAlphaPrev) and isAlphaNow then

ですね。これでトンネルの入り口を認識しているのだね。Boolean の変数を二つ
つかって、論理が分かりやすくなっています。わたしの実装だと、IsTunnel という
Boolean の変数をひとつだけ使っているので、今回の実装より簡単ですが、コードは
読みにくいです。他人の実装をみると、自分との違いが分かって勉強になります。

さて、次の課題は、多分予想できていると思いますが、トンネルの出口も認識して
数だけでなく、位置と長さも返すような関数を作ってください。

type
TPosLength = record
Position: integer;
Length : integer;
end;

TPosLenArr = array of TPosLength;

function SearchAlphaWord(const str: string; var pl: TPosLenArr): integer;

>>79 の全文をヒントとしてください。

88:デフォルトの名無しさん
05/12/23 05:34:45
>>87
function SearchAlphaWord(const str: string; var pl: TPosLenArr): integer;
var
    i:    Integer;
    cnt:    Integer;
    isAlphaPrev:    Boolean;
    isAlphaNow :    Boolean;
    iPrev:    Integer;
begin
    isAlphaPrev:=False;

    cnt:=0;
    i:=1;

    while (i <= Length(str)) do
    begin
        isAlphaNow:=False;
        iPrev:=i;

        if ( (str[i] in LeadBytes)) then
        begin
            Inc(i,2);
        end
        else
        begin
            if (str[i] in ['a'..'z', 'A'..'Z']) then
            begin
                isAlphaNow:=True;
            end;
            Inc(i);
        end;

89:デフォルトの名無しさん
05/12/23 05:35:25
        if (not isAlphaPrev) and isAlphaNow then
        begin
            Inc(cnt);

            if cnt>Length(pl) then
            begin
                SetLength(pl, cnt+10);
            end;
            pl[cnt-1].Position:=iPrev;
        end
        else    if isAlphaPrev and (not isAlphaNow) then
        begin
            pl[cnt-1].Length:=iPrev-pl[cnt-1].Position;
        end;

        isAlphaPrev:=isAlphaNow;
    end;

    SetLength(pl, cnt);
    result:=cnt;
end;
//ここまで
よろしくお願いします

90:デフォルトの名無しさん
05/12/23 11:51:19
>>88-89

90点。

ヒントの

> トンネルの中にも駅があることを考慮しなければなりません。ですから、名古屋
> は違いますが終点がトンネルの中の場合もありえます。

を忘れています。アルファベットでテキストが終わる場合を考慮してください。

...
isAlphaPrev:=isAlphaNow;
end;

if isAlphaNow then pl[cnt-1].Length:=iPrev+1-pl[cnt-1].Position; // これを追加

SetLength(pl, cnt);
result:=cnt;
end;

あと、一つも見つからない場合もありますので、while の前に

isAlphaNow := false;
iPrev := 1;

で初期化しておくとコンパイラの警告が出ませんね。

文字列操作は列挙や置換、抽出、パースなどいろいろありますが、少々当方も飽きてきた
ので次はリストクラスから出題します。すこし時間をください。

91:デフォルトの名無しさん
05/12/23 12:10:18
>>88-89

リストクラスはもっとも簡単そうな文字列のリスト TStringList から始めます。
最初はソートの練習です。

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  i: integer;
begin
  Randomize;
  sl := TStringList.Create;
  try
    for i := 1 to 20 do sl.Add(IntToStr(Random(1000)));
    Memo1.Lines.Assign(sl);
  finally
    sl.Free;
  end;
end;

にすると、0-999 のランダムな数値に対応する文字列が sl に20個保持され、その内容が Memo1 に
表示されます。コードを継ぎ足して、数値の小さい方から(昇順)並べ直して見てください。

TStringList.CustomSort を使います。

92:ささ ◆6KVcpBNXy.
06/01/26 15:45:51
みなさん。こんにちゎ。経済学部のささと申します。
パスカル(Delphi)の授業での課題がわかりません。。教えてください!
3科目、10人分のデータを入力して各人の合計点と科目毎の平均点を作れ!
という課題が出ました。。。

先生に下記を改変するとやりやすいといわれました。repeatとwhileとforまでしか習っていません。
Score :array[0..1000] of integer; 
begin
writeln('入力得点の平均と偏差値を計算します'); writeln('入力後、負の数を入力すると…終了します。');
kazu :=0;
repeat
write('点数は?'); readln(data);
if data >= 0 then
begin 
kazu := kazu + 1;
score[kazu] := data
end
until data < 0;
goukei := 0;  for i := 1 to kazu do goukei := goukei + score[i];  heikin :=goukei / kazu;
goukei :=0;  for i := 1 to kazu do  goukei := goukei + Sqr(score[i]); hensa := sqrt(goukei /kazu - sqr(heikin));
writeln('点数  偏差値');
for i := 1 to kazu do  writeln(score[i]:4, 50 +10 * (score[i]-heikin)/ hensa:10:1);
writeln(' 平 均 =',heikin:5:1);  writeln('標準偏差=',hensa:5:1);
readln;
end.

93:棄民党党首 ◆8slekwWKD6
06/01/26 17:00:39
やひゃひゃひゃ。おまいら。

AssignFile(f, s); Reset(f);

で s にアクセント記号と漢字交じりのファイル名をWideStringでぶちこんでみたら
開かんぞ。

TntのUnicode Componentsをいぢってみたが、AssignFileのUnicode版がみつからん。

でしかたないから
WideRenameFileで名前を'safe.bin'とかに変更しちゃって。
フツ~にAssignFileで開いて処理してからまた
WideRenameFileで名前をUnicodeの名前へもどしますた。

わたしってなんて天才♪

94:デフォルトの名無しさん
06/02/10 02:28:56
Delphiってなくなるの?
Turbo Pascal時代からずっと使って来ただけに、
手に馴染んだ開発環境がなくなると困る。

95:デフォルトの名無しさん
06/02/10 04:04:10
>>94
ボーランドが手放すだけでDelphiがなくなるわけじゃないから安心しる。

96:デフォルトの名無しさん
06/02/10 08:15:16
買い手が無ければなくなるんじゃね?

97:デフォルトの名無しさん
06/02/10 14:45:48
で、MDIでWM_COPYDATAを子フォームで受け取るにはどーすんの?


98:デフォルトの名無しさん
06/02/10 16:58:38
受け取るのは簡単だろ

99:デフォルトの名無しさん
06/02/10 17:29:53
>>98
え?マジすか?kwsk!
とあるスレッドからMDI子フォームにSendMessageしたいんです。
そのスレッドでは、MDI子フォームのウィンドウハンドルを取得する事は
出来るのですが、SendMessageしてもMDI子フォームにメッセージが来ないです。
もう泣きそうです。
もちろん、MDI子フォームではメッセージを受け取れるようにしているのですけども・・・。


100:デフォルトの名無しさん
06/02/10 17:49:34
どうやってハンドルをみつけたの?

101:デフォルトの名無しさん
06/02/10 18:13:45
改行が多いと怒られたので、かなりハショってます。
メッセージを送る側では
procedure Thread.SendMsg(sClassName: String; nKind: Cardinal; pInfo: Pointer; nInfoSize: Integer);
var
begin
Wnd := FindWindow(PChar(sClassName), nil);
if (Wnd <> 0) then begin
:
SendMessage(Wnd, WM_COPYDATA, WPARAM(Wnd), LPARAM(@Cd));
end;

とし、SendMsg('TForm', ....); と、使っています。で、
受け取る側(MDI子フォーム)では
procedure WMCopyData( var sMsg: TWMCopyData ); message WM_COPYDATA;
を、privateに宣言して
procedure TForm.WMCopyData(var sMsg: TWMCopyData);
:
begin
pMessage := nil;
if (sMsg.CopyDataStruct.dwData = ID_TEST) then begin
:
:
:
end;
としています。


102:デフォルトの名無しさん
06/02/10 19:22:04
それでほんとに、目的 MDI 子ウィンドウが見つかってる?
一度 Spy++ か WinInsight で確かめたら?

103:デフォルトの名無しさん
06/02/10 19:45:00
取れてるようですが・・・ダメなんでしょうか?
通常どうやるのかわからないもので・・・。
とりあえず実行させて、FindWindowの戻り値を見たら0x604A6でした。
Spy++の検索ウィンドウで0x604A6を検索したら、目的のウィンドウが
検索されました。一応ウィンドウハンドルは取れているようでした。
うーん・・・困りました・・・。


104:デフォルトの名無しさん
06/02/14 02:57:20
部分範囲型って、実際バリバリ使ってる人います?
便利なようでいまいち、使いどころが…。
動作中チェックありにして、速度とか問題ないですか?

105:デフォルトの名無しさん
06/02/14 15:13:33
そもそも Delphi を実際バリバリ使ってる人なんか、そんなにいないからね

106:デフォルトの名無しさん
06/02/14 21:37:45
バリバリじゃない。さり気なく使うんだ。

107:デフォルトの名無しさん
06/02/15 10:29:36
さりげなく、こっそりと、ひそかに・・・な。

108:デフォルトの名無しさん
06/02/15 11:11:39
いや、ペタペタと使う。

109:デフォルトの名無しさん
06/02/21 23:53:44
>>101
ヘルプに有るように、FindWindowは子ウィンドウは探してくれないよ。
同じクラス名を持つ別のウィンドウのハンドルを返していると思われ。

110:デフォルトの名無しさん
06/02/22 23:07:35
質問です。色付きのボタンを作ることはできますか?
パネルを色つきにしてOnClickという事もできますが
それだとクリックされたときにボタンのように
凹んだりしないのでわかりづらいし・・・
なにかいい方法はありますでしょうか?
どなたか、よろしくお願いします。


111:デフォルトの名無しさん
06/02/22 23:14:06
>>110
まさか本当に凹んでるとか思ってないよな?

112:デフォルトの名無しさん
06/02/23 00:27:17
Paintメソッドをoverrideして自分で描画するとか。


113:Delフサギコ ◆A6VzDeLphI
06/02/23 00:51:33

           (´⌒;;
;⌒`)   ∧,,∧   そういうのだいたい
 ;; `)./ミ,,゚Д゚彡  誰か作ってるよ。
   //\ ̄ ̄旦~   (´(´⌒)
  // ※.\___\
 \\※ ※ ※ ※ ※ヽ
   \`ー───ヽ
    ────

URLリンク(homepage1.nifty.com)

URLリンク(homepage2.nifty.com)

114:デフォルトの名無しさん
06/03/02 22:41:07
152 :  :2006/03/01(水) 06:16:00 HOST:ed251.opt2.point.ne.jp
削除対象アドレス:
 スレリンク(tech板)
 スレリンク(tech板)
 スレリンク(tech板)
削除理由・詳細・その他:
 6. 連続投稿・重複

115:デフォルトの名無しさん
06/03/03 01:13:30
Dr.Dのマシン語寺子屋

116:デフォルトの名無しさん
06/03/31 11:14:10
TBitmap→TJpegImage→Jpegファイル、とやってますが、
DDBからDIBにするとメモリ減りますか?

コーディングも簡単でつか?

117:デフォルトの名無しさん
06/03/31 12:06:28
やってることと、質問の内容が噛み合ってない

118:116
06/03/31 13:30:05
いやだから、

TBitmap(DDB)→TJpegImage→Jpegファイル
から
TBitmap(DIB)→TJpegImage→Jpegファイル
に変更。

今は意識してないけど、TBitmapってデフォはDDBだおね?

119:デフォルトの名無しさん
06/03/31 13:50:09
大差ないよ。

120:デフォルトの名無しさん
06/05/29 00:58:17
feeddemonってRSSリーダーがあるんですが
v1のときにhtaのような使い方をしている
部分(左のチャンネルリスト)をどう実装してるのか
わからないんですが、誰か教えてください詳しい人


121:デフォルトの名無しさん
06/05/29 13:16:35
> Delphi初心者が問題をコツコツと解きながらレベルアップするためのスレです。

すれ違い

122:デフォルトの名無しさん
06/06/09 17:59:34
マウスカーソルをアルファベット文字、もしくは単語にしたいのですが、
簡単にできますか?

アルファベット毎にカーソルファイルを作るのでなく、
コーディングでやりたいです。

123:デフォルトの名無しさん
06/06/09 18:47:12
簡単にはできないでしょ。すなくとも動的にアルファベットの画像をつくらなきゃならないし。

124:デフォルトの名無しさん
06/06/09 19:15:11
>>122
URLリンク(forum.nifty.com)

TBitmapを作成して そこに文字を書いて、
それからCreateCursor

125:122
06/06/12 08:41:29
>>123 >>124

サンクス。
ちょっとひねればコーディングできそうですね。

126:デフォルトの名無しさん
06/09/03 09:14:12
どうぞよろしくお願いします

Delphi7.0上で、3層の情報系の業務アプリケーションを構築しています
データベースはOracle9iです
UIでは、ADOレコードセットを入力データソースするMicrosoftのActiveXコンポーネント
を使用しています
BDE、DBExpressやBizSnapを利用すれば3層のデータアプリケーションは作成できる
ことは分かりました
データセットプロバイダ経由でデータを取得しようとすると、クライアント側はClientDataSet
として受け取ることになるのですが、どこかでADOレコードセット形式に変換しなければなりません

試しにClientDataSetをまわしながらADOレコードセットにフィールド定義とデータ値をコピーする
方法を試してみましたが、処理時間とCPU負荷が半端ではなく、とても採用できませんでした
他には、BizSoapを利用した形式では、サーバー側でADOレコードセットとしてデータ取得後に
Saveメソッドを利用してXML形式で一旦データ出力し、Soap経由でテキスト送信し、クライアント
側では受信内容をファイルとして出力しADOレコードセットのLoadメソッドをCallしてXMLファイル
から復元する方法を試したみましたが、これも採用できるものではありませんでした
素直にクライアント側でADOレコードセットとして取得可能な方法としては、リモートデータセット
(Microsoft RDS)を利用したDComアプリケーションとして構築する方法もあるので試してみました
これは、非常に高速で20万件程度のデータもほぼ一瞬でクライアント処理でき驚いたものですが、
MicrosoftのサポートページではRDS自体が今後は非推奨の技術として明記されており、その点
が引っかかっております

どうしてもクライアント側で扱うデータ量が数十万件程度あることでパフォーマンスが重要になって
しまいます。
オーバーヘッドがなるべく最小の形でClientDataSetからADOレコードセット形式に変換する方法は
ないものでしょうか
もしくは、素直にADOレコードセットとしてクライアント側で一発でデータ取得できれば嬉しいです

長文になってしまい申し訳ありません
どうぞよろしくお願いいたします


127:126
06/09/03 09:22:44
126です
大変失礼しました
[ くだすれdELPHI(超初心者用) ] のスレの方に移動します

128:デフォルトの名無しさん
06/09/11 00:03:00
>>1
問題だしておくれ
初心者でも10分ぐらいで解けて、面白味のあるものがいい

129:デフォルトの名無しさん
06/09/11 08:47:19
じゃ、俺から問題

ボタンを二つ用意し、片方を非表示とする。
表示されているボタンを押すと、非表示だったボタンを表示し、押されたボタンを非表示に。
これを交互に繰り返せるものを作れ。

130:デフォルトの名無しさん
06/09/11 10:14:48
くだらね┐(´~`;)┌

131:デフォルトの名無しさん
06/09/11 11:34:13
>>130
ならおまえがだせ。
と、いいたいところだが、これはどうだ?
コントロールのオーナーをTForm1からTForm2に変える。

132:デフォルトの名無しさん
06/09/11 12:30:13
他のスレでTPrinterの話題が出てたんで。

用紙の左上から右に5cm、下に5cmの位置に
「はろーわーるど」と印字せよ
フォントは何でもいい

133:デフォルトの名無しさん
06/09/11 15:51:09
初心者の基準を考えよ

134:デフォルトの名無しさん
06/09/12 16:57:18
iniファイル作って
初期データ読み込み書き込みはどうだ?

135:デフォルトの名無しさん
06/09/12 17:10:37
初心者の基準を考えよ

136:デフォルトの名無しさん
06/09/12 20:17:27
procedure TForm2.Button1Click(Sender: TObject);
begin
  Button1.Visible:=not Button1.Visible;
  Button2.Visible:=not Button2.Visible;

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Button2.OnEnter:=Button1Click;
  Button2.Visible:=False;
end;


137:デフォルトの名無しさん
06/09/12 20:18:58
あ、途中で書き込み押しちゃった
>>136>>129への回答です
短くなるように工夫しました
採点お願いします

138:デフォルトの名無しさん
06/09/12 20:25:08
わざわざコードで
  Button2.OnEnter:=Button1Click;
  Button2.Visible:=False;
をする必要が無い。
0点。

139:デフォルトの名無しさん
06/09/12 20:30:07
そりゃプロパティでも出来るけどあえて明示してるんでしょうが。

140:デフォルトの名無しさん
06/09/12 20:42:49
ほかにもフォームの位置とかサイズとか、明示しろよ。

141:デフォルトの名無しさん
06/09/12 20:54:32
こりゃいかん。

142:デフォルトの名無しさん
06/09/12 21:10:23
てゆうか先生!なんでOnEnterやねん!Clickや!!
と突っ込むところではないの?


143:デフォルトの名無しさん
06/09/12 21:12:52
ほんとだwwww

144:デフォルトの名無しさん
06/09/12 22:23:37
TD2006ってコンポにフォーカスさせてF1押してもヘルプでないよね

145:デフォルトの名無しさん
06/09/12 23:28:50
しらねぇよ。Del6per の方がましだし、そんなの使うヤツの気が知れん

146:デフォルトの名無しさん
06/09/13 03:30:32
procedure TForm1.Button1Click(Sender: TObject);
const
FILE_URL = 'URLリンク(203.131.199.131:8060)';
FILE_PATH = 'test.mp3';
var
fs: TFileStream;
begin
fs := TFileStream.Create(FILE_PATH, fmCreate);
try
with IdHTTP1 do begin
Get(FILE_URL, fs);
end;
finally
fs.Free;
end;
end;

147:デフォルトの名無しさん
06/09/13 08:14:13
>>145
可哀そうに

148:デフォルトの名無しさん
06/09/13 11:33:34
TDって略すとTurbo Debuggerかと思ってしまう俺。
(さすがにTokyo Disnylandとは思わないが)

149:デフォルトの名無しさん
06/09/13 19:35:33
>>144
可哀そうに

150:デフォルトの名無しさん
06/09/13 21:21:06
>>134
iniファイル読み書きの習作をつくってみました
普通にファイルの読み書きするより簡単かもしれない
ちょっと感動!!
procedure TForm1.Button1Click(Sender: TObject);
var
  iniFile:  TInifile;
begin
  iniFile:=TIniFile.Create('ook.ini');
  try
    count:=iniFile.ReadInteger('CounterApp', 'Count', 0);
    Inc(count);
    iniFile.WriteInteger('CounterApp', 'Count', count);
  finally
    iniFile.Free;
  end;
  ShowMessage(IntToStr(count));
end;



151:デフォルトの名無しさん
06/09/13 21:30:06
フルパスつかっとけ

152:デフォルトの名無しさん
06/09/13 22:06:31
EXEファイルと同じフォルダが前提ならそのままがいいと思うが。

153:デフォルトの名無しさん
06/09/13 22:39:21
>>152
お前はそのままでいいよw

154:デフォルトの名無しさん
06/09/13 23:24:42
>>152 は、今後大変だな・・・

155:デフォルトの名無しさん
06/09/14 00:35:54
>>150
お主、俺を超えたな!?

156:デフォルトの名無しさん
06/09/14 04:04:15
カレントディレクトリが変わるたびに、あちこちにいっぱい ini をつくるけどね

157:デフォルトの名無しさん
06/09/14 05:19:24
TIniFile って相対パス渡すとプロファイルフォルダに作られなかったっけ?

158:デフォルトの名無しさん
06/09/14 07:56:03
なんにせよそういう不安定要素は削除しないとな

159:デフォルトの名無しさん
06/09/14 10:09:08
>Delphiで無料でプログラミングしてみるお
スレリンク(tech板:239番)
>ソースと実行ファイル
URLリンク(vipperup.orz.hm)

これって、もう手に入らないの?

160:デフォルトの名無しさん
06/09/14 16:02:35
 

161:デフォルトの名無しさん
06/09/29 18:21:31
授業を受けに来たのに先生がいませんよ。有給ですか?

162:デフォルトの名無しさん
06/09/29 18:37:24
>>132


163:デフォルトの名無しさん
06/10/06 22:25:29
別のアプリケーションにエンターキーを送りたいのですが、アプリケーション側でなにか
対策をしているらしく、keybd_event ではエンターキーだけが認識されません。
(そのアプリ上でエンターキーを直接押せば認識される)

こういった場合、どのようにすればいいのでしょうか?

164:163
06/10/06 22:49:19
>>163
すみません、、、スレ間違えました。別スレに行ってきます。

165:デフォルトの名無しさん
06/10/16 03:02:58
Delphiで
Vbでいうところの Validate イベントを実現したい。
どうすればいい?

Procedure TXXXXX.OnValidate(Sender : TObject;Cancel : Boolean);

Cancel := True;

とすれば、フォーカスが抜けないようにする。
どうやったらできるんだろう?

TEdit を継承して、
WndProc を オーバーライドして
CM_EXIT をフックしてみた。

TEdit ではうまくいったが
TComboBox ではうまくいかなかった(DropDownList では おk で DropDown ではNg だった)。

誰か経験者か、うまいやり方知ってるひと教えてください。

166:デフォルトの名無しさん
06/10/16 09:10:19
やったことないけどOnEnterでValidateすべきかどうか(どこかで)設定しといて
WM_KILLFOCUS受け取ったときに上記状態なら指定されたところにチェックしにいくとか

167:デフォルトの名無しさん
06/10/16 09:25:28
OnChangeかOnExitの時に、
Cancel=Falseなら、Combobox.setfocus


168:デフォルトの名無しさん
06/10/16 10:42:34
procedure TForm1.hogeExit(Sender: TObject);
begin
  チェック処理
  if エラー then
  begin
    Enabled := False;
    Application.ProcessMessages;
    Enabled := True;
    hoge.SetFocus;
  end;
end;

169:デフォルトの名無しさん
06/10/16 16:57:31
TPrinterで印刷の集約指定等の設定変更できますか?

170:デフォルトの名無しさん
06/10/16 17:36:53
印刷設定ダイアログ結果をWindowsに反映する方法教えて下さいでつ。

171:デフォルトの名無しさん
06/10/17 01:33:57
>>166
ありがとうございます。
WM_KILLFOCUSでも同じでした。

>>167,168
ありがとうございます。

TComboBox の派生クラスに OnValidate イベントを実装したいのです。

172:デフォルトの名無しさん
06/10/19 10:09:05
DoExitをオーバーライドするのはどうですか?

procedure TMyCombo.DoExit;
var
  Cancel: Boolean;
begin
  if Assigned(FOnValidate) then begin
    Cancel := False;
    FOnValidate(Self, Cancel);
    if Cancel then begin
      SetFocus;
      Exit;
    end;
  end;

  inherited;
end;


173:デフォルトの名無しさん
06/10/19 10:47:13
Delphi7
SQLServer2000 使用です。

exceptにて、EDatabaseErrorが発生した場合に、
そのエラーNoを取得したいのですが、どのように書けばよいのでしょうか?
現時点では下のように書くところまでやりました。

except
on E: EDatabaseError do
begin
Result := False;
end;
end;

174:デフォルトの名無しさん
06/10/19 11:09:58
>>173
いろいろ考えられるね。
・E.MessageにエラーNoが入ってるならそこから抽出する。
・E.ErrorNoみたいのがあるならそれを使う。
・SQLServer2000にGetLastDBError見たいな関数があるならそれを利用する。

175:デフォルトの名無しさん
06/10/19 11:19:34
>>173
BDE使ってるならEDBEngineErrorでcatchすれば
エラーの詳細が取れるけど。
どうやって接続してるの?

176:173
06/10/19 11:24:15
>>174
すみません、もっと根本的な問題だったようです。
やりたいことは、レコードロックによるタイムアウトエラーを取得したいのですが、
タイムアウトはEDatabaseErrorではないようです。

タイムアウトはEDatabaseError以外のどのExxxErrorでとれるのでしょうか?

177:173
06/10/19 11:25:55
>>175
データモジュールにADOConnectionを貼り、ADOQueryで実行しています。

178:デフォルトの名無しさん
06/10/19 11:35:44
>>176
そこまで細かいことは自分で調べちゃった方が早くね?

179:デフォルトの名無しさん
06/10/19 11:46:42
>>176
on E: Exception で捕まえて、E.ClassNameを調べる

180:173
06/10/19 15:30:24
>>178、179
ありがとうございました。
調べたところ、EOleExceptionと出ました。



181:デフォルトの名無しさん
06/11/04 19:10:27
SyncObjsの中にあるTCriticalSectionですが、
EnterとAcquire、LeaveとReleaseの違いは何ですか?
いろいろ試した限りでは同じ処理に見えるのですが・・・

182:デフォルトの名無しさん
06/11/04 22:59:27
>>181
ヘルプ見た?
その上で動作が同じだと判断するなら同じなんです
深く考えすぎないほうが良いかと

183:デフォルトの名無しさん
06/11/06 22:23:11
>>182
TCriticalSectionのページに行こうとしても、
リンクがみつかりません って出るんですよ
無料のDelphi6だからかな? まぁ気にしないことにします

184:デフォルトの名無しさん
06/11/07 11:13:41
QuickReport印刷内容をビットマップ(Jpegでもおk)に落とす方法教えて下さい。

185:デフォルトの名無しさん
06/11/07 18:24:07
そういうプリンタドライバがあるよ

186:デフォルトの名無しさん
06/11/23 13:53:16
リレー動作のプログラムなんですが64個のリレーを
チェックボックスに分けて選んでリレーを
ON/OFFしたいんですが

procedure TForm1.Button1Click(Sender: TObject);
begin
Relay[Time]:=True;
Time:=Time+1;

RelayChange;
end;

これからどう増やせばいいでしょうか?
どうかよろしくお願いいたします。

187:デフォルトの名無しさん
06/11/23 20:25:23
>>186
日本語でおk

188:デフォルトの名無しさん
06/11/25 17:27:49
IsDelphiで、このソフトが、Delphi製とでるのですが、
URLリンク(www.highdots.com)
オフィスっぽいGUIは、どんなコンポーネントを使っているんでしょうか?

189:188
06/11/25 17:28:27
すみません。超初心者スレと間違えました(汗

190:デフォルトの名無しさん
06/12/25 17:35:38
コンストラクタ内で例外を発生させるのってまずい?

自作クラスのコンストラクタの引数で作業フォルダのパスを指定して
フォルダが存在しなければ作成ってのをやろうと思うんだけど、
try~finallyの手前でCreateすると例外が発生したときに例外を捕まえられないし
try内の先頭でCreateするとコンパイルで「初期化されていない可能性があります」と警告が出る。

コンストラクタは内部変数の初期化だけにしておいて
作業フォルダのパス指定は別メソッドにしておいたほうがいいのだろうか・・・

191:デフォルトの名無しさん
06/12/25 19:14:46
>>190

try
 Create
 try
  hoge
 finally
  hoge
 end;
finally
 hoge
end;

192:デフォルトの名無しさん
06/12/29 14:20:58
>190
Delphiにおいてはコンストラクタ内で発生して捕捉されない例外は
コンストラクタの失敗を意味する。

193:デフォルトの名無しさん
07/01/06 19:54:05
hosyu

194:デフォルトの名無しさん
07/01/27 03:40:04
2chブラウザのJaneみたいな動かせるメニューバーってどうやって作ったらよいのでしょうか。

195:デフォルトの名無しさん
07/01/27 03:58:26
>>194
TCoolBar のバンドの .Control に TToolBar 設定して、
TToolBar.Menu に TMainMenu 設定。

196:デフォルトの名無しさん
07/01/31 17:58:13
Bitmap画像をレイアウト部分はコーディングでなくてポトペタで作成したいのですが、
良い方法はありますか?

QuickReportで良いのですがQuickReportは汎用画像出力が出来ないので...

197:196
07/01/31 19:05:07
そういう機能をレポーティング コンポーネントって言うらしいですね。
でもWin32用が無いお。

198:デフォルトの名無しさん
07/01/31 23:11:14
>196
日本語でおk

199:デフォルトの名無しさん
07/01/31 23:15:30
グラフィックソフトとか、ワープロでつくるようなをDelphiでやりたいんじゃないの?
で、最終的に、印刷じゃなくて、画像にしたいと。

200:デフォルトの名無しさん
07/03/02 07:58:21
.netを普及させる方法を思いついた!
win32に、WCaption: WideString みたいなメンバを追加して
さらにくそでかく遅いバイナリしか生成できなくする。
これなら.netでいいや、ってなりwin32死滅。


201:デフォルトの名無しさん
07/03/02 16:54:35
日本語でおk

202:入門きぼん
07/03/18 23:52:34
 すみません。教えて下さい。
DelphiTurboExplorerを、サイトからDLして使用したいと考えているのですが、
ユーザー登録をすませても、DLページに行けずに困っています。

それと、フリーのデーターベースであるFirebirdと
繋げられるのでしょうか?
やはり製品版でないと無理なのでしょうか?

自分は、単純に初心者向けプログラムである。
CDやDVDの在庫管理アプリを作りたいだけなんですが、
自分の労力以外は、極力フリーで作りたいと思っています。
可能でしょうか?

宜しくお願いします。

203:デフォルトの名無しさん
07/03/19 00:54:43
URLリンク(www.turboexplorer.com)

204:デフォルトの名無しさん
07/03/19 01:06:50
>>203
The page cannot be found

205:デフォルトの名無しさん
07/03/19 06:01:06
URLリンク(www.turboexplorer.com)

206:デフォルトの名無しさん
07/03/19 11:33:22
>>204,205

HTTP Error 404 - File or directory not found.


207:デフォルトの名無しさん
07/03/19 20:46:50

URLリンク(torrent.borland.com)

208:202
07/03/19 21:55:11
>>207

すみません。
やはりHTTP Error 404 - File or directory not found.になります。

みなさん、ありがとうございました。
残念で、悲しいですが、すみませんがDelphiあきらめます。

209:デフォルトの名無しさん
07/03/19 22:07:23
繋がるけどなぁ
URLリンク(www.codegear.com)

210:デフォルトの名無しさん
07/03/20 00:22:27
>203 >205 >209は普通に繋がるね。

211:デフォルトの名無しさん
07/03/21 07:19:26
普通につながるけど?

212:デフォルトの名無しさん
07/03/21 23:56:26
条件文がたくさんあって、それらを同じ処理するときはどうしたらいいですか?
ifのあとに条件をズラーッとandでくっつけるしかないのでしょうか?
例えばxが1 3 5 6 7 10・・100と不規則なときに、一定の動作をさせたいです。

213:デフォルトの名無しさん
07/03/22 00:14:26
case x of
1,3,5,6,7,10,100: ~~';
else
~~;
end;

214:デフォルトの名無しさん
07/03/22 07:13:44
if x in [1,3,5,6,7,10..100] then XX;
ってのもあるよ

215:デフォルトの名無しさん
07/03/22 14:14:54

二次元配列があり地図のようになってるとします。

その時に●から一番近い5(複数ある)への経路を求める問題。
マスは30*30
●は(16、16)
0は通れる、1は通れない、4はいやな人
で、5の周りに4がいた場合それは目的の5にはなりません。

000000000000000000000000000000
000000000000000000000000000000
000000111100000000050000000000
000000001100000000000000000000
000000000100541110000000000000
000000000000111111000000000000
000000000000000000000000000000
001100000000000000000000000000
00000000000000●000000000000000
000100000000000000000000000000
000100000000000111111110000000
000000000000000000000000000000
000000500000000000050000000000
000000000000000000000000000000
000000000000000000000000000000

216:デフォルトの名無しさん
07/03/23 12:23:28
>>215
2chのレス数じゃ無理w
試しに幅優先探索して書こうとしたら、600行超えたからやめたw

217:デフォルトの名無しさん
07/03/23 17:39:42
>>215
たけしのコマ大かと思った・・・。

斜め移動はあり?
地形は固定?
障害物1等のオブジェクトは、定数?

つっこむ所が多々ありそうだなぁ。

218:デフォルトの名無しさん
07/03/24 19:35:42
>>215
普通にA*でいいんじゃないの?

>>216
600行はありえん。

219:デフォルトの名無しさん
07/03/25 00:12:27
>>217
俺は斜め移動無し、固定でMAPはファイルからそのまんま読み込んだ状態としたよ
んで、今の箇所から上下左右で自分の関数を呼び出して、再起関数にして探してった。
でもこれじゃ全数検索になってしまう。
こういうアルゴリズム習ったけどやり方有ってるか不明

>>218
A*って何?

220:デフォルトの名無しさん
07/03/25 04:42:33
工場勤務でブルーワーカなのだが、明日から夜勤なので睡眠時間調整の
暇つぶしに >>215 をやってみた。5時間かかったお。

再帰呼び出しとかは使えないし分からんので、長めになっちゃった。
キュー(FIFO)をやってみようと思って、ポインタとか使ってみたけど訳分からん。

URLリンク(strawberry.web-sv.com)
(フォームにボタン1個要)

だって、MC工作機械マクロ言語に再帰呼び出しとかポインタなんて無いよ orz
あ、でも、なんちゃってポインタは出来るかな? #(#10) な感じで。

221:デフォルトの名無しさん
07/03/25 07:25:37
A Starでやれ

222:デフォルトの名無しさん
07/03/27 02:25:05
昔Delphi6触ったときにはたしか標準でフォルダ選択ダイアログってなかったような気がするんですが

TurboExplorerにもなかったりします?

223:デフォルトの名無しさん
07/03/27 06:53:37
SelectDirectoryなら昔からあったと思うが?
名前がセレクトフォルダじゃないからダメなの?

224:デフォルトの名無しさん
07/03/28 09:12:04
Delphi6のSelectDirectoryはダイアログの表示位置がずれるバグがあるんだよな

225:デフォルトの名無しさん
07/03/28 09:45:16
バグじゃないよ、たんに場所指定してないだけ。ML の過去ログやら、コンポ
で解決したのがわんさかあったけど、いまは知らない

226:デフォルトの名無しさん
07/03/28 09:54:17
まあ、フォルダのD&Dに対応しとけば、みんなソレ使うから
SelectDirectoryはとりあえずあればいいやみたいなもんだし

227:デフォルトの名無しさん
07/03/28 21:40:15
uses
FileCtrl;

procedure TForm1.Button1Click(Sender: TObject);
var
dir: string;
begin
MoveWindow(Application.Handle , Left ,Top ,0 ,0 ,False);
SelectDirectory('表題', '', dir);
Label1.Caption := dir;
end;


228:215
07/03/29 09:06:36
>>220
遅くなったがサンクス!
ただ、速度おっそいなぁw

229:デフォルトの名無しさん
07/03/31 10:40:58
保守

230:デフォルトの名無しさん
07/04/07 19:52:37
現在BDEで作成されているものをFirebirdに簡単に変更できるものでしょうか
Firebirdはまだ触ったこともないし、BDEもそのとき玉々作ってみただけの
データベース素人ですが。

231:デフォルトの名無しさん
07/04/08 13:26:52
>>230
どういう作りになっているのかにも寄るけど
簡単には無理じゃね。

232:デフォルトの名無しさん
07/04/08 20:33:05
>>231
ありがとうございますm(_ _)m
やっぱ作り直しですか。

233:デフォルトの名無しさん
07/04/08 20:57:31
いや、普通にコンポーネント貼り付けて作ってるなら
InterBase Data Access に変えるだけで問題ないだろし
そうでないなら、それなりに大変だろうってだけさ

234:デフォルトの名無しさん
07/04/08 21:59:34
やってみまふ。

235:デフォルトの名無しさん
07/04/10 13:29:14
ヒント: Firebird ODBCドライバ

236:デフォルトの名無しさん
07/04/10 20:04:01
今しばらくは生きていけそうです

237:疑問
07/04/16 02:52:02
なんでIntegerとかが予約語になっていないのでしょうか

var
Integer: string;
begin
Integer := 'Double';
Writeln(Integer);
end.


238:デフォルトの名無しさん
07/04/16 08:03:01
Integerは予約語ではないけど定義済の型名だから
変数として使うと、
使った後整数型の定義とか、型変換とかで困ってしまうよ

他の型名とか自分で定義する型名も同じ事情があるよ。

239:デフォルトの名無しさん
07/04/16 16:19:27
回答になってねぇw

240:デフォルトの名無しさん
07/04/16 23:21:03
>>237
なんでだろ。
Windows.hとかのCからコンバートしたときのための兼ね合い?
似たようなので、引数でも例外あったような

241:名無し@沢村
07/04/17 00:10:20
おみゃーらー♪
Delphiはつまらんぞー!
おみゃーたー、『肥えた語』つー言語があるの知ってる?
おりは知ってるよ。
おりがつくった言語よ。これからh『肥えた語』の時代よ。
URLはここよ↓
URLリンク(www.geocities.jp)
感想を頼むなー♪


242:デフォルトの名無しさん
07/04/23 22:52:08
JEDI がDelphi2005にインストールできません。
以前入れたときは確か、すんなり入ったのですが。
..\JEDI\jvcl\run\JvJVCLUtils.pas(7359) エラー: E2010 'Char' と 'string' には互換性がありません
..\JEDI\jvcl\run\JvJVCLAboutForm.pas(115) 致命的エラー: F2063 '..\..\run\JvJVCLUtils.pas' ユニットはコンパイルできませんでした
ほかにも出てきます。
pas は秀丸では欧文フォントで文字化けなしに読めたんですが「TM」とかの特殊文字が
○株みたいに扱われているんでしょうか、Shift-Jis ではChar扱いしてもらえないようです。

OSは Vista
D5 にはインストールされています。
m(_ _)m

243:デフォルトの名無しさん
07/04/23 23:02:28
せめてバージョンくらい書こうよ・・・

244:デフォルトの名無しさん
07/04/23 23:05:38
すんません、JVCL320CompleteJCL197-Build2172.zip でした。

245:デフォルトの名無しさん
07/04/23 23:07:22
なんでそんなに古いのを入れようとしてるの?

246:デフォルトの名無しさん
07/04/23 23:17:26

そんなに古いのー?

247:デフォルトの名無しさん
07/04/23 23:18:12
すみまそん。
しばらくD5で使ってたのでそれをそのままフォルダからインストールしようとしてました。

248:デフォルトの名無しさん
07/04/23 23:19:48
それだとD5でコンパイルされたファイルと混じっておかしくなるんじゃない?

249:デフォルトの名無しさん
07/04/23 23:28:30
やっぱそうですか。
はき出す場所が違うからOKだと思っていたのですが、
とりあえず2005には最新版を入れてみます。

250:デフォルトの名無しさん
07/04/24 20:28:58
JVCL331CompleteJCL199-Build2551.zip
入れてみましたが状況は変わりませんでした(x.x)

251:デフォルトの名無しさん
07/04/24 21:14:09
前にインストールしたときのゴミが残ってるんじゃないかね。
とりあえずJcl*.bplとJv*.bplを削除してみたら?

252:デフォルトの名無しさん
07/04/24 21:28:50
ってことは皆さん問題なく入れていたということなんでしょうね。
結局使わない部分っぽかったので修正して無理矢理入れてしまいました。

JvgUtils.pas
function Transliterate(const Str: string; RusToLat: Boolean): string;
コメントアウトで Result := Str;

JvDBGrid.pas
FCharList :=
['A'..'Z', 'a'..'z', ' ', '-', '+', '0'..'9', '.', ',', Backspace{,
'e', 'e', 'e', 'e', 'o', 'o', 'u', 'u', 'a', 'a', 'a', 'i', 'i', 'c'}];
下半分をコメントアウト

JvJVCLUtils.pas
// Text: Char;
Text: string[2];
Char を string に変更

JvStrToHtml.pas
特殊文字 27 個コメントアウト

ありがとうございましたm(_ _)m

253:デフォルトの名無しさん
07/04/24 21:35:10
Delphi5って、サポートされてたっけ?

254:デフォルトの名無しさん
07/04/24 22:06:55
されてる。

255:デフォルトの名無しさん
07/04/24 22:44:22
JCL/JVCLって昔試したときマルチバイト文字に対応してなかったような記憶が
あったようななかったような・・・

256:デフォルトの名無しさん
07/04/24 23:15:42
コンポーネントによってされてたりされてなかったりだね。

257:デフォルトの名無しさん
07/06/18 23:36:07
コンポーネントがDesignideを使っててコンパイルできなくなるとかの
問題でずっと悩まされてます・・・
古いIDE組み込み型のコンポーネントって
新しくなるとコンパイルが通らなくなる・・(泣

Designideで悩まない方法はありますか?


258:デフォルトの名無しさん
07/06/19 05:33:00
D6パーではHelpに書いてある。互換性の問題

259:ミ,,゚Д゚ミノ ◆A6VzDeLphI
07/06/19 14:05:42
こんなんでよい?

-- DsgnIntfが見つからない場合 --

コンポーネントをインストールするときに
DsgnIntfが無いといってエラーになる場合があります。

Delphi5からDsgnIntf.dcuのコンパイル済みユニットが
無くなったからこのような現象が起きるそうです。

Delphi6からはDesignIntfという名前に変更されています。

DsgnIntf Unit はおもに、コンポーネントエディタやプロパティエ
ディタを作るときに利用するものです。

「環境オプション/ライブラリパス」に
$(DELPHI)\Source\Toolsapi
を追加してみましょう。

解決するはずです。

本当は、この方法を用いるとプロパティエディタのコードが
実行ファイルに含まれてしまうので、そういう書き方をしている
コンポーネントが悪いので、自分の作る物ではこういう問題が発生しないように
気をつけましょう。

参照──────────
[Delphi:42979] Delphi5 変更点
URLリンク(www2.big.or.jp)

260:デフォルトの名無しさん
07/06/21 20:49:16
Delphi7を使ってます。
designide.dcuが見つからないという
エラーが出てしまいます・・orz


261:デフォルトの名無しさん
07/06/21 22:17:40
そうですか

262:デフォルトの名無しさん
07/06/28 07:12:16
TUIWebBrowserで読み込んだFlash上の入力ボックスで
BackSpaceキーは効くものの
Enterキーがきかないのですが
効くようにすることは可能でしょうか?



263:デフォルトの名無しさん
07/06/30 08:58:54
>>259
ありがとうございます。
いろいろいじっていて
実行時パッケージでない方でビルドできました。

264:デフォルトの名無しさん
07/06/30 22:34:43
ナッキーのdelphi奮戦記面白い
間違いなくナッキーは淫乱

ペイントソフト楽に作れ杉

265:デフォルトの名無しさん
07/07/04 09:36:13
TShapeじゃなくて、ラインをペタペタ貼るコンポーネントありましたっけ?

266:デフォルトの名無しさん
07/07/04 09:44:58
直線だけなら OnPaintに Canvas.MoveTo Canvas.LineToで簡単に引けるから需要無いかと


267:デフォルトの名無しさん
07/07/04 09:49:35
Delアメ猫だったかの人がフサギコと絡んで、マウスで直線を動かせるようなコンポーネントの原型を作って
どっかにアップしてたように思うのだけど、今検索してもみつからないな

268:265
07/07/04 09:55:01
>>266
やっぱ、そうですか。

>>267
>マウスで直線を動かせるようなコンポーネントの原型を作って
欲しいもの、これですorz

269:ミ,,゚Д゚ミノ ◆A6VzDeLphI
07/07/04 10:54:14
HDDに、原型のやつがあったよ。
検索に1時間ほどかかってしまた。


270:265
07/07/04 11:00:48
>>269
デルフサギコ様、うpをお願いしますorz

コンポーネントのソースは読めるので、
手直しとか派生くらいできますし、
使いこなせると思いまつ。

271:ミ,,゚Д゚ミノ ◆A6VzDeLphI
07/07/04 11:00:59
実行時にマウスで動かせた矢印コンポもあったような気がするんだけど
手元にあるのはShapeの矢印版っすね。

majunarrowexとか、viArrow.pas
って名前だけど、googleではでないみたいだ。

とりあえずうpろうか。午後くらいでよい?



272:265
07/07/04 11:03:42
>午後くらいでよい?

ずっと待ってまつ。

希望では、以下の機能も欲しかったり。。。
・マウスで動かせる
・マウスで長さが変えられる
・移動や長さが変ったときに、Changeイベント
・矢印をオフにして単なるライン化

273:ミ,,゚Д゚ミノ ◆A6VzDeLphI
07/07/04 11:09:05
URLリンク(delfusa.main.jp)

いや、はようpっとくよ。

もっといいものをつくってくれた人もいたきがするんだが...

あの時期てきにホットゾヌの作者の中の人だった気がするが
確証無しで。

このコンポ、いったい誰作なんだろう...中国の方かしら。

274:ミ,,゚Д゚ミノ ◆A6VzDeLphI
07/07/04 11:11:48
設計時なら
>・マウスで動かせる
>・マウスで長さが変えられる


>・移動や長さが変ったときに、Changeイベント
わからない。というか、Resizeイベントはなさそうだから
どっちにしても自作だね。

>・矢印をオフにして単なるライン化
なぜか出来ないみたいだ。
改造すれば簡単でしょう。



275:デフォルトの名無しさん
07/07/04 11:20:24
コレの事?
URLリンク(delwiki.info)


276:265
07/07/04 11:27:46
>>274
>>275

サンクス!

両方ダウソしました。
どっち使うか決めなきゃ。。。

277:デフォルトの名無しさん
07/07/04 11:53:46
>>273
・1個だけ
・設計中のみ変更可能
・コードはシンプル

>>275
・複数のラインやオブジェクトが1コントロールに入る
・フォームにフックさせて最下面に無理やり描画するのも出来る
・実行中に移動等も可能
・出来る事が大きいだけに、けっこう複雑

278:265
07/07/04 11:56:32
>>277
サンクス

どっちもクセ多杉orz

やりたいことは275なんだけどメッセージフック&インライン汗と、
何かあったとき対処できるかなとドンビキ。

273に275のコード混ぜるかなぁ。。。

279:デフォルトの名無しさん
07/07/04 12:06:35
>>275 には コンポが2つ入っていて、片方は TGraphicControl でメッセージフックは使ってない。
インラインアセンブラの部分はたぶん変更しなくていいいだろう。

ただ、文字を回転させるのに端ではなくて 真中というのは、チョットとまどった

あと、DesignProcでマウス応答全部やってるので
右ボタンメニューに対応させるとか、ココでやらんとあかんのかも


280:デフォルトの名無しさん
07/07/04 12:50:49
アセンブラの部分は 浮動小数点に置き換えたらいいんじゃないの?
iHypot -> math.Hypot で代用
MulSubDiv はコメント通りに浮動小数点で計算させる

281:265
07/07/04 13:02:06
汗は汗のままでも良いです。

>あと、DesignProcでマウス応答全部やってるので

この作り、拡張性大丈夫かなぁ。

282:デフォルトの名無しさん
07/07/04 13:11:00
WndProc で inherited してるから大丈夫じゃないの?
気になるなら、それぞれ分けたらいいだけで

ひとつはデザイン中だけ処理させる判定を1箇所にまとめたかったのと、
TMyFormDraw と TMyDraw の両方で使いたくてコピペが楽だからそうしたんだろな


283:265
07/07/04 13:19:59
>WndProc で inherited してるから大丈夫じゃないの?

了解でつ。

このコンポってStringsの中身をLines1つにすれば1本の線になるんですね。
動きも面白いし、機能は完璧。

最期の悩みは、このまま使うか、Linesプロパティを削除して、1本の線のコントロールとサブセットコントロール化するか。。。

284:Delフサギコ ◆A6VzDeLphI
07/07/04 13:21:48
 ∩ ∩
 ミ ゙''゙~     ________
 ミ∧,,∧   /
 ミ,,゚Д゚彡 < おお。あったですかぁ。
 U U    \あっててよかったDelWiki新
           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
こういうのって、コンポインストールしないとサンプルプログラムが
コンパイルできない形になってて、非常に面倒よね~
コンパイルしたsample.exeを是非に付けて欲しいもので。
まあ、漏れも付けてないんだけど。

それにしても、MyDraw....すごすぎだな。
(って何年も前にも言った感じがとてもデジャブー)

>>283さん
贅沢な悩みだな。(w

みつかってよかったね。


285:265
07/07/04 13:25:23
>>284
有難う。

デルフサさんて、一時期見かけなかったような。。。

286:デフォルトの名無しさん
07/07/04 13:27:30
MyDraw1.Lines.Add('LINE');
で実行中に、線を増やせるね。

287:|Д゚彡 ◆A6VzDeLphI
07/07/04 13:30:56
いつもひっそりと
草葉の陰から見つめているんですよ。

288:デフォルトの名無しさん
07/07/04 15:13:17
>>コンパイルしたsample.exeを是非に付けて欲しいもので。
そんな物、ダウソして実行する馬鹿がいたら是非お目にかかりたい物でwwww



289:デフォルトの名無しさん
07/07/04 18:28:34
たくさんいますよ

290:デフォルトの名無しさん
07/07/04 19:37:14
何か呼ばれた気がしたので来ました。

291:デフォルトの名無しさん
07/07/04 20:00:09
デモには、実行ファイルをつけようよ・・・

292:デフォルトの名無しさん
07/07/04 21:15:30
URLリンク(delwiki.info)
ココに、サンプル書いてみた。

右ボタンで削除出来るようにコンポ側に少し追加もした

でも、コレ、誰がItemのオブジェクト削除してくれてるんだろ?
テキストを変更してもメモリリークしないんだろか?

293:初心者++
07/07/05 00:11:28
いきなり割り込んで書き込みます、すいません。 
初心者です。データベースの接続で困ってます。
TTableのDataBaseNameで
サンプルのDBDEMOSでは無事接続できるんですが、
ほかのアリエス名(MSAccess,Excel...)では
ログインダイアログでユーザー名 パスワードをきかれ、
先へ進めません。どなたか教えてください。

  Turbo Delphi for wind32
OS : wind2000です。

294:初心者++
07/07/05 00:15:55
いきなり割り込んで書き込みます、すいません。 
初心者です。データベースの接続で困ってます。
TTableのDataBaseNameで
サンプルのDBDEMOSでは無事接続できるんですが、
ほかのアリエス名(MSAccess,Excel...)では
ログインダイアログでユーザー名 パスワードをきかれ、
先へ進めません。どなたか教えてください。

  Turbo Delphi for wind32
OS : wind2000です。


295:デフォルトの名無しさん
07/07/05 16:25:33
>>294
URLリンク(www.lares.dti.ne.jp)

296:デフォルトの名無しさん
07/07/05 16:38:53
こんにちは。Delphi製ブラウザコンポーネント
(TUIWebBrowser)のFlash上の
テキスト入力コントロールでEnter入力が
できない問題について質問した者です。

RADながらWin32APIとの親和性,
カスタマイズ性が高くアセンブラも使え、
デフォルトコントロールの綺麗さなど、
色々優れた点がある中で、生産コストを下げる目的で
Delphiを選ぶときについて意見をお伺いしたいです。

ブラウザを作る際に、
まずTWebBrowserを使ってみて、入力に関する
致命的なバグがあったために、そのバグを修正した
TUIWebBrowserを使ったのですが、
そこでまた入力バグに出会ってしまい、
これらの問題が、VC++での開発でははじめから起きない
問題であったために、VC++で作り直すべきか考えています。

流通しているDelphi製のブラウザ系ソフトにも同じバグが見れました。
しかし、作りやすいので本当はDelphiを使いたいです。

Delphiで、資料やバグフィクス情報が無く、
節約できるはずの時間が、逆に冗長になるケースを考慮したとき、
そういった面を考えても、Delphiの生産性を活用するためには
どういったことが必要になりますでしょうか。
Delphi開発の先輩である皆さんに
お考えをお聞かせ願いたいです。



297:デフォルトの名無しさん
07/07/05 17:19:12
>そういった面を考えても、Delphiの生産性を活用するためには
>どういったことが必要になりますでしょうか。

VCLコードを読んで理解する事。

298:デフォルトの名無しさん
07/07/05 17:46:02
VC++で解決出来るんなら、 それを見て自分で修正すればいいんじゃないの?
でも、たぶん VC++でも色々拡張しようとすると、いろんな問題が出ると思うよ。
他人の作ったコードをソース無しに使おうってんだから当然だ。

TWebBrowser ならともかく TUIWebBrowser は使ってる人が少ないだろうし
さらに Flash となると、問題に答えてくれる人は少ないと思うよ。

>>262 の問題は メッセージポンプの所で流れてるメッセージ
を(Application.OnMessage とかで)見て、なんとか出来ないか考えてみたら?


299:デフォルトの名無しさん
07/07/05 17:47:05
ActiveX や OLEControl の制御は VCL のソースを読んでも、個人レベルでは
解決は難しい。TWebBrowser やその派生コントロールは、Delphi で簡単に
使えるように見えるが、Delphi での細かい制御が一番面倒なもののひとつ。
VC++ でできるなら、そっちでやればいいでしょう。

300:デフォルトの名無しさん
07/07/05 17:49:23
いまさらだがMLに投げてみりゃよかったのに。

301:デフォルトの名無しさん
07/07/05 17:54:18
まぁなんでもMLに投げてみりゃいいんだよな。

302:デフォルトの名無しさん
07/07/05 18:45:41
Delphi TWebbrowser Enter ぐぐれかす

303:デフォルトの名無しさん
07/07/05 19:02:10
>>302
TWebBrowserのバグを回避した
TUIWebBrowserでFlashActiveX上のコントロールを経由した
ときだけ起こるって言ってるし
TWebBrowserの有名な入力バグは普通もう回避してるだろう。


304:デフォルトの名無しさん
07/07/05 22:25:45
コード量が短いので>>273を参考にして勉強中のものです。

そこで質問です。>>273
.dfm に記述されたコードを .pas側で実行時に自動生成する
形に書き直すと、どういう風になりますか?じぶんはテキスト
エディタ派なのでコードの編集はできればテキストエディタで
やりたいとです。。。

プロジェクトを立ち上げると、

フォーム作成中にエラーが発生しました。(中略)
クラス TviArrowが見つかりません
とか出て上手くゆかなかったとです。

viArrow.pas をプロジェクトに追加して
プロジェクトを再構築。でコンパイルしたら実行
ファイルのほうは簡単にできてちょっと感動したとです。ひろしですひろしですひろしです

305:デフォルトの名無しさん
07/07/05 22:39:05
>>304
なあ、こっちも実行してみてくれ。
URLリンク(delwiki.info)


306:304
07/07/05 23:07:33
>>305
1000行越えのコードの解読は厳しかったとです orz

307:デフォルトの名無しさん
07/07/06 07:39:12
>>304
.dfm にはコンポーネントのプロパティが入っている。
実行中に位置やサイズを変更したいなら、 Left, Top, Right, Bottom をコードで弄る必要がある

>>305のは、コンポーネントを登録しなくてもいいように作られている
位置やサイズは文字列で与えてるようだ

308:Delフサギコ ◆A6VzDeLphI
07/07/06 09:35:55
    ∧,,∧  オハヨ
   ミ,,゚Д゚彡
    ミ つ旦)~~
  ~と,,,~),,~)  旦~~
]]]]]]]]]]]]]]]]]]]]]]]]]]]]

自動生成する形になってて、いいっすね
>>305さん

どうせなら、バイナリも含んじゃえばいいのに。(w
IDE起動するのメンド(い人もいるかもね。)

>>307さん
MyDrawコンポーネントは単体で
たくさんの矢印や
矩形を処理するようになっていて
その位置を元々TStrings系でもっているのですよ。



309:デフォルトの名無しさん
07/07/09 18:36:58
TFormとかTImageってCanvasプロパティがありますよね。

TScrollBoxみたいにCanvasプロパティの無いコンポーネントにお絵かきするには、
どうすれば良いですか?

310:デフォルトの名無しさん
07/07/09 22:34:16
1.Canvasがある他のコンポーネント(TImageとか)を貼る。
2.TWinControlから派生したものであれば、さらに派生させてCanvasプロパティをpublicにする。
ん~これしか思いつかなかった。もう少し具体的にやりたいことを書けば、もう少しまともな
回答がつくと思うよ。

311:デフォルトの名無しさん
07/07/09 22:42:34
var
 Canvas: TCanvas;
begin
 Canvas := TCanvas.Create;
 try
  Canvas.Handle := GetDC(hoge.Handle);
  try
   Canvas.TextOut(0, 0, 'HOGE');
  finally
   ReleaseDC(hoge.Handle, Canvas.Handle);
  end;
 finally
  Canvas.Free;
 end;
end;

312:309
07/07/10 08:56:46
サンクス>>310 >>311

具体的には、
TScrollBoxの上にTImage、その上にMyDrawを乗せています。

それで、MyDrawの図形をマウスでいじると、
TImageが物凄くチラツクんですよね。

それで、TScrollBoxにもTImageの図形描いておいてやろうかな、と。

313:309
07/07/10 09:35:54
TScrollBoxをやめて、TPanelにしてDoubleBufferdをtrueにしたらチラツキなくなりました。


314:デフォルトの名無しさん
07/07/10 22:26:17
現在おされているキーをセンスする関数みたいなのはないのでしょうか?


315:デフォルトの名無しさん
07/07/10 22:41:54
windows.getkeystate

316:デフォルトの名無しさん
07/07/10 23:14:11
>314
つ GetAsyncKeyState
URLリンク(msdn.microsoft.com)

>315
現在押されている、ということであればGetKeyStateは不適切。

317:デフォルトの名無しさん
07/07/11 22:17:05
ありがとうございます。

windowsの世界だと int 21h(AH=8) みたいなのはないんでしょうか。
シーラカンスですんません。


318:デフォルトの名無しさん
07/07/12 00:08:04
意味不明。何をしたいのかを具体的に。
たとえばOnKeyPressとかTForm.KeyPreviewあたりは幸せになれるかも?

319:デフォルトの名無しさん
07/07/12 06:53:33
ごめんどうおかけします。

やりたいのは、コンソールアプリケションで、
enter (1-9 or q):
みたいなプロンプトをだして、一文字キーボードから入力してもらい、
入力された文字で処理を分岐させようというだけです。
つまりread(c); でreturn を入れなくても一文字読み込みたいというだけです。


320:デフォルトの名無しさん
07/07/12 08:00:06
コンソール入力はwindows側でバッファされてるから、イベント入力を使う必要がある
GUIアプリの例だと、ボタンとメモと、タイマーを貼り付けて
procedure TForm1.Button1Click(Sender: TObject);
begin
 AllocConsole;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 pirBuffer: INPUT_RECORD;
 hdl: THandle;
 lpcRead: DWORD;
begin
 hdl := GetStdHandle(STD_INPUT_HANDLE);
 if integer(hdl) < 0 then
 exit;
 while ReadConsoleInput(hdl, pirBuffer, 1, lpcRead) do
  with pirBuffer do case EventType of
    KEY_EVENT: //Event.KeyEvent
     if Event.KeyEvent.bKeyDown then
      Memo1.Lines.Add('KEY=' + Event.KeyEvent.AsciiChar);
    _MOUSE_EVENT: //Event.MOUSE_EVENT
     with Event.MouseEvent do
      Memo1.Lines.Add(format('%5d %5d ', [dwMousePosition.x, dwMousePosition.y]));
    WINDOW_BUFFER_SIZE_EVENT, //Event. WindowBufferSizeEvent
     MENU_EVENT, // Event. MenuEvent
     FOCUS_EVENT: //Event.FocusEvent
   end;
end;

コンソールアプリだと、このタイマーの部分でキー入力があるまで無限ループする関数を書く事になるだろな


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch