掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TStringsとTStringListの扱いについて (ID:17468)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
kaisekiさん、詳しい解説ありがとうございます。長文ですいません。 > SetPrinters := TStringList.Create; は、新規に作成したTStringListの実体の場所(アドレス)をSetPrintersに記憶しておく。 > SetPrinters := Printers.Printer.Printers; は、すでに存在するTStringsの実体の場所をSetPrintersに記憶しておく。 > 5:で作成したTStringListのアドレスを記憶しているのに6:で新たにアドレスを上書きしてしまうので5:でのアドレスが失われてしまうということで > 5:で作成したTStringListの実体が消えてしまうことではありません。メモリに残ったままになっています。 SetPrinters := ???? は、代入しているように見えるが、実際は実体の場所を表してるという事ですが、 今回、自分はTStringListにコピーしたかったので、このままでは意図しない動きになりそうです。 上記の内容を見ると、 SetPrinters := TStringList.Create; の部分が残ったままという事ですが、これは「アドレスが失われる=場所を指定する記録が無くなる」 となって放置状態になり開放も出来ず、メモリリークになるという解釈で良いのでしょうか? 又、最初の箱のイメージで例えると SetPrinters := TStringList.Create; は、空箱を新たに作成して、その場所を指定する。 SetPrinters := Printers.Printer.Printers; は、Printersという値が入っている箱の場所を知らしている。 みたいなイメージで良いのでしょうか? > 6:でSetPrinters := Printers.Printer.Printers;とコピー(Assign)ではなく代入しているので 8:の SetPrinters.Freeは Printers.Printer.Printersを Freeすることになり終了時に TPrinterが実体のなくなっている Printersを処理しようとしてエラーとなるものです。 > この場合6:でSetPrinters.Assign(Printers.Printer.Printers); とコピーをするのなら > 8:でのFreeは 5:で作成した TStringListをFreeすることになり問題はありません。 という事は、このままでは SetPrinters := Printers.Printer.Printers; SetPrinters.Free; と Printers.Printer.Printers.Free; は同じ意味で、 この時点でアプリ起動時に読み込んだTPrinterが無くなり、 アプリ終了時に開放済みの存在しないTPrinterを開放しようとして エラーが出る…という事でしょうか? > 「抽象クラス」は検索して調べてみてください。 > 例えば http://www.borland.co.jp/tips/delphi/dh014/ ありがとうございます。anoneさんが仰ってた > 要するに抽象クラスと具象クラス、継承と多態性、上位クラスには下位クラスは > 代入可能だがその逆は不可、という OOP の基本が分かってないのです。 という指摘ですが、まさに的中でして、勉強中ではありますが、思うように進まず苦戦をしております。 ボーランドのtipsページはいくつか見た事がありますが、このページは初めて見ます。 ページを見て、イロイロ勉強したいと思います。 > 3番目の書き方の場合 SetPrinters は Printers.Printer.Printersを指していますので > 参照とかする分には大丈夫ですが、SetPrintersを書き換える(変更する)場合はPrinters.Printer.Printersを変更することになりますから注意が必要です。 となると、自分の目的は場所を指定するのではなく、一覧を「コピー」したいので、 SetPrinters.Assign(Printers.Printer.Printers); の方を使うべきだと判断します。 今回の件を元に、下記のような内容に変更しました。(try文は除く) SetPrinters := TStringList.Create; SetPrinters.AddStrings(Printers.Printer.Printers); ComboBox1.Items := SetPrinters; SetPrinters.Free; 実際には、間に挟むものはありますが、これで安心して一覧を扱えそうです。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.