喫茶XRAYトップページ

[▲前のスレッド]

[7691] width文とIDEからの検索返信 削除
2014/7/3 (木) 12:56:43 Mr.XRAY
ちょっといい題材を見つけたので.

[EIdHTTPProtocolExceptionが未定義になるのはなぜ?]
http://hpcgi3.nifty.com/e-papy/DelphiBBS/wwwlng.cgi?print+201407/14070003.txt


with Form1 do begin
//
end;

というのがあります.
IdHTTP1.Get(FURL,MS); は,Form1.IdHTTP1.Get(FURL,MS); ということになりす.

EIdHTTPProtocolException も Form1.EIdHTTPProtocolException
ということになります.
ところが,Form1 には EIdHTTPProtocolException が定義されていません.
これは IdHTTTP ユニットで定義されています.
つまり,uses に IdHTTP が必要です.そうすれば,Delphi は,

Form1.EIdHTTPProtocolException がなければ IdHTTP.EIdHTTPProtocolException
も試してしてくれます.

width 文の使用には注意が必要です.
width 文は便利ですが,

with Form1 do begin
// ここには,確実に Form1.XXXX というものだけを書く
// あるいは,どのユニットにも含まれない変数類,関数類だけを使用する
end;

といったことが必要と思われます.
width 文のネストには,更に注意が必要です.
基本的には使用しない方がいいでしょう.

参考まで,未定義のエラーが発生した時の,解決方法の一つを記事にしてみました.

[IDE からの文字列の検索]
http://mrxray.on.coocan.jp/Delphi/Others/FindText.htm

参考 [withの使い方] Delphi Forum
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1295


[7692] コンポーネントをフォームに配置すると返信 削除
2014/7/3 (木) 23:23:57 Mr.XRAY
念のために,追記しておきます.

> EIdHTTPProtocolException も Form1.EIdHTTPProtocolException
> ということになります.
> ところが,Form1 には EIdHTTPProtocolException が定義されていません.
> これは IdHTTTP ユニットで定義されています.
> つまり,uses に IdHTTP が必要です.そうすれば,Delphi は,


これは,
EIdHTTPProtocolException が,IdHTTP.pas で定義されているからです.

もし,質問された方が提示したコードを,Form1 のユニットで実行した場合は,
未定義のエラーにはなりません.
なぜかというと,Form1 のユニットの uses には IdHTTP があるからです.
これは,質問された方の発言内容から判定できます.

Delphi XE の場合ですが,新規にプロジェクトを作成すると,
以下のようになっています.


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 

TIdHTTP コンポをフォームに配置して,コンパイルすると,次のように,
uses に自動で IdHTTP が追加されます.
このように,コンポーネントをフォームに配置すると,自動的に,
必要なユニット名が追加される仕組みになっています.


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;
 


[7693] コンポーネントを実行時に生成する場合は返信 削除
2014/7/3 (木) 23:36:12 Mr.XRAY
> このように,コンポーネントをフォームに配置すると,自動的に,
> 必要なユニット名が追加される仕組みになっています.


コンポーネントを実行時に生成する場合,動的に生成する,とも言いますが,
その場合は,自動では uses 部に必要なユニット名は追加されません.
次のコードは,以下のコンパイルエラーとなります.

[DCC エラー] Unit1.pas(28): E2003 未定義の識別子 : 'TIdHTTP'


procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP : TIdHTTP;
begin
  HTTP := TIdHTTP.Create(Self);
  try
    //何かの処理
  finally
    FreeAndNil(HTTP);
  end;
end;

実行時に生成する場合でも,
もし,フォームに TIdHTTP コンパが配置してあれば,エラーとはなりません.


[7694] ファイルが見つかりませんと未定義のエラー返信 削除
2014/7/4 (金) 12:55:05 Mr.XRAY
Delphi XE で新規にプロジェクトを作成すると,ユニットの uses 部は
次のようになっています.
これらはユニット名と呼ばれています.ファイル名から,
拡張子 .pas あるいは .dcu を除いたものです.

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;


また,プロジェクトのよって,[プロジェクトの追加]で,プロジェクト
にファイルを追加することがあります.
 
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  VCLImageUtils in '..\VCLImageUtils.pas';  //ここ

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
 
コンパイル時に,Delphi は,パスの通ったフォルダから,これらの
ファイルを探します.
もし,ファイルがないと,「ファイルが見つかりません」という
エラーとなります.

未定義のエラーは,これらのファイル内に該当する関数等がない場合に
発生することになります.

uses 部に書いてあるユニット内でも当然 uses 部があります.
そのユニットの uses 部のユニット(ファイル)も探すわけです.
そして,該当ファイルがなければ,やはり,ファイルが見つかりません.
ということになります.
未定義のエラーも現象は同じです.


[7695] Re:ファイルが見つかりませんと未定義のエラー返信 削除
2014/7/4 (金) 16:01:54 Mr.XRAY
> 未定義のエラーも現象は同じです.

たとえ,uses 部やプロジェクトのソースコードで指定したファイル内にあっても,
未定義のエラーは,コンポーネント(つまり,クラスです)内のアクセスできない
位置にあると未定義になります.

それは,例えば,interface 部の Protected 部や Private 部にある場合です.
implementation 部にはアクセスできません.


[7703] Re2:ファイルが見つかりませんと未定義のエラー返信 削除
2014/7/8 (火) 11:44:34 Mr.XRAY
また,同じバターンか...


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82