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;
うーむ、オブジェクトがなんなのかを知るとこの問題は解決します。
Delphi に限らないのですが、クラスのインスタンスを変数に保持する、ということ
はそのインスタンスの内容を保持する事ではないのです。ただたんに、そのインスタンス
をさす参照(ポインタ)の値を代入しているだけなのです。ですから
texs[ StrToInt(Edit1.Text)] := Memo1.Lines;
のような代入は、Memo1.Lines の保持している内容を代入しているのではありません。
texs[1] := Memo1.Lines;
としてから、Memo1 になにか文字を書き加えてから
texs[2] := Memo1.Lines;
としても、同じになるのはそのためです。texs[1] も texs[2] も同一の
Memo1.Lines
を参照しているからです。
追加です。内容を保持するには、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;
無事思い通りの動作を確認することが出来ました。
Delphiを始めてから結構な時間が経っているというのにのにそんなことに気づいていませんでした。
こんな初歩的かつ、わかりにくい質問に親身にお答えいただいて、まことにありがとうございました。
申し訳ありません、解決です。
ツイート | ![]() |