クラスの作り方教えてください

解決


QZ  2014-01-01 19:11:15  No: 45798

あけまして、おめでとうございます。
今年もよろしくお願いします。
(⌒▽⌒)/゜・:*【ネ兄】*:・゜\(⌒▽⌒)

--------------------
クラスを使ってプログラムを作っているのですが、うまくいきません。
クラスのインスタンスの値(?)が0になってるみたいです。
テスト用に次のようにしたんですが、ShowMessageで0が表示されます。
(コンストラクタのところでは正常に表示されます)

  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

    TCheckText = class(TObject)
      Fnum: Integer;
      Findic:Array of String;
      constructor Create(indictxt: TStringList); // コンストラクタ
      function Checkind(text:String):String;
    end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Constructor TCheckText.Create(indictxt: TStringList);//配列に置き換え
var
  Findic:array of String;
  i,len_array,Fnum:Integer;
begin
  len_array := indictxt.Count;
  SetLength(Findic,len_array);
  Fnum := len_array div 5; 
  for i := 0 to len_array - 1 do
  begin
    Findic[i] := indictxt.Strings[i];
  end;
  ShowMessage(IntToStr(Fnum));//ここでは正常に表示される
end;
//----------------------------------

ボタンで以下のプログラムを実行
procedure TForm1.test();
var
  ind0:TStringList;
  indic0:TCheckText;
  filename_ind0:string;
  i:Integer;

begin
  ind0 := TStringList.Create;
  filename_ind0 := '\いろいろ.txt';//数百行
  ind0.LoadFromFile(filename_ind0);
  indic0:=TCheckText.Create(ind0);
  ShowMessage(IntToStr(indic0.Fnum));//  0と表示される

end;


igy  2014-01-01 20:12:21  No: 45799

コンストラクタの

>var
>  Findic:array of String;
>  i,len_array,Fnum:Integer;

にある Fnum を 削除したらどうなりますか?


igy  2014-01-01 20:18:10  No: 45800

>var
>  Findic:array of String;
>  i,len_array,Fnum:Integer;

Findic も削除したほうがよいかも・・・


QZ  2014-01-01 21:30:35  No: 45801

igyさん、素早い回答ありがとうございます。
>にある Fnum を 削除したらどうなりますか?
>Findic も削除したほうがよいかも・・・

ううっ、そうするとCreateだけになってしまうんじゃないんですか?
初期化(データセット)も同時にしたいんですけど、無理なんでしょうか?


igy  2014-01-01 21:59:31  No: 45802

>    TCheckText = class(TObject)
>      Fnum: Integer;
>      Findic:Array of String;

で、 FnumとFindicがあるので、

コンストラクタ内の変数の
>var
>  Findic:array of String;
>  i,len_array,Fnum:Integer;
のうち、 FnumとFindicを削除して

var
  i,len_array:Integer;

にすればいいのかな、と思ったのですが。


マッコ  2014-01-01 23:38:08  No: 45803

新年明けましておめでとうございます
フィールドの
TCheckText = class(TObject)
  Fnum: Integer;//ここ

constructor TCheckText.Create( indictxt: TStringList);
var
  Findic:array of String;
  i,len_array,Fnum:Integer;//Fnum ここ
begin
  len_array := indictxt.Count;
  SetLength(Findic,len_array);
  Fnum := len_array div 5;
  self.Fnum:=Fnum; 追加

フィールドの名前とローカル変数の名前の衝突しているので
ローカル変数が優先されます
どうしても同じ名前にした場合は「追加」するとうまくいくと思います
※同名を使うとバグの原因となりますのでプロパティにするなり
プログラムの構造を検討したほうが良いかも


QZ  2014-01-02 00:09:23  No: 45804

うまくいきました。
igyさん、マッコさんありがとうございます。
これで2,3日悩んでいました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加