Tstringsの上書きを防止するには?

解決


way  2004-12-19 09:38:21  No: 12380

Tstringsの配列(texs)を作り、Button1個と,Edit1個,用意している状況で

ボタン1を押せば
・texs[ intToStr(Edit1.Text) ]にMemo1の内容を挿入
というようにしようとしているのですけれども、
例えば

texs[2]に内容を保存しようとすると、その前に入力したtexs[0],texs[1]の文字列も先ほど挿入しようとした文字列に変わってしまいます
というよりも、Memo1の内容を変えただけで、それ以前に挿入してあった文字列の内容がすべてMemo1の内容に更新されてしまいます

とても説明がわかりにくいかと思います。これ以上ちゃんとした説明はできないですが、どんなことでも質問していただければ答えますので。

ソースの一部を載せておきます、といってもほとんど無意味でしょうが。

---------------------------------------------------------------------
  private
    { Private 宣言 }
    texs : array[0..100]of Tstrings;

//省略

procedure TForm1.Button1Click(Sender: TObject);
begin

 texs[ StrToInt(Edit1.Text)] := Memo1.Lines;

end;


りおりお  2004-12-19 09:49:37  No: 12381

うーむ、オブジェクトがなんなのかを知るとこの問題は解決します。
Delphi に限らないのですが、クラスのインスタンスを変数に保持する、ということ
はそのインスタンスの内容を保持する事ではないのです。ただたんに、そのインスタンス
をさす参照(ポインタ)の値を代入しているだけなのです。ですから

texs[ StrToInt(Edit1.Text)] := Memo1.Lines;

のような代入は、Memo1.Lines の保持している内容を代入しているのではありません。

texs[1] := Memo1.Lines;

としてから、Memo1 になにか文字を書き加えてから

texs[2] := Memo1.Lines;

としても、同じになるのはそのためです。texs[1] も texs[2] も同一の

Memo1.Lines 

を参照しているからです。


りおりお  2004-12-19 10:01:19  No: 12382

追加です。内容を保持するには、TStrings の Assign メソッドを使います。
新規で Memo1 Memo2 Button1 〜 Button4 を Form1 において以下のコードを
試してください。内容を保持するには、予め同じクラスのインスタンスを作成
しておかなければなりません。

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    stl:array[0..1] of TStrings;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  stl[0] := TStringList.Create;
  stl[1] := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  stl[0].Free;
  stl[1].Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  stl[0].Assign(Memo1.Lines);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  stl[1].Assign(Memo1.Lines);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo2.Lines.Assign(stl[0]);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Memo2.Lines.Assign(stl[1]);
end;


way  2004-12-19 21:01:20  No: 12383

無事思い通りの動作を確認することが出来ました。
Delphiを始めてから結構な時間が経っているというのにのにそんなことに気づいていませんでした。
こんな初歩的かつ、わかりにくい質問に親身にお答えいただいて、まことにありがとうございました。


way  2004-12-19 21:02:04  No: 12384

申し訳ありません、解決です。


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

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






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