2009-07-13 9 views
15

ビジネスの穏やかな夏が始まったので、D2009への移行を手に入れました。プログラムのすべてのサブシステムをアスキーなままにする必要があるか、またはユニコードにすることができるかどうかを大まかに判断し、移植を開始しました。D2009 TStringlist ansistring

すべてのコンポーネントはD2009バージョン(VSTViewのようなものもありますが少し互換性があります)にありましたが、今は問題に遭遇していますが、一部の部分ではansistringのままでなければなりません。基本的な地図。

すでに置き換えが容易なのですか?古いDelphiまたはFPCソースに基づいて、削除されたanstistring tstringlistを含めるだけですか?

私はこれに最初に遭遇したとは思いませんか?

変更は、ローカライズされていなければなりません。これにより、検証軌道を通過する間にコードがBDS2006でコンパイル可能な状態に維持されます。ここにいくつかのifdefは問題ありません。 もちろん、string-> ansistringとchar - > ansicharなどは、私のソースで変更したものとはみなされません。なぜなら、これはやっていなければならないからです。

編集:私は、リーダー/ライタークラスのいくつかを取り除くことができました。これは私が考えていたよりも簡単にメイソンの解決策になります。私はGabrの提案をフォールバックとして覚えています。

ジェネリックスは、私がD2009を購入した理由です。彼らがFPCと互換性を欠いてしまったのは残念です。

+1

文字列のバイト数と文字列の長さなど、多くの計算をしていますか?私がこのような格下げを行うための唯一の真の要求です。 – smok1

+0

バージョン対応の後方互換性のあるバイナリバージョンがあります。もう1つは(まだ開始していない)カスタマイズされたSaxとDOMの実装です。 しかし主な理由は、私はメモ帳でユニコードのテキストファイルなどを開く方法を顧客に説明したくないということです。 –

+1

もう一度私はSOのユーザーの行動に困惑しています。 5人のユーザーがこの質問に思いやりのある答えを与えました。これまでに71人の視聴者から14人以上の投票がありましたが、1人では質問に投票していませんでした。完璧な質問はありませんが、QとAs - so +1を読んでみると分かります。 IMHO、** Delphi **には、このトピックに関する有益な議論をサポートしています。 – Argalatyr

答えて

9

「マップ」によって「ハッシュテーブル」を意味する場合は、汎用のTDictionaryに置き換えることができます。

uses 
    Generics.Collections; 

type 
    TStringMap<T: class> = TDictionary<ansiString, T>; 

次に、StringListsを正しいオブジェクトタイプのTStringMapsに置き換えてください。 (より安全な型安全性は自由に投げられます)また、辞書の所有者がオブジェクトを所有して終了するときにそのオブジェクトを解放したい場合は、それをTObjectDictionaryに変更し、コンストラクタを呼び出すときに[doOwnsValues]適切なパラメータ。

(あなたがTDictionaryを使用するつもりところで場合は、元のリリースは、それはほとんど使用不可とTDictionaryでいくつかの深刻なバグがあった3. D2009のアップデートをダウンロードしてください。)

EDIT:それはまだしなければならない場合D2006でコンパイルすると、少し修正する必要があります。

type 
    TStringMap = 
{$IFDEF UNICODE} 
    class TDictionary<ansiString, TObject> 
    (Add some basic wrapper functions here.) 
    end; 
{$ELSE} 
    TStringList; 
{$ENDIF} 

最初にマップとして使用する場合、ラッパーはあまりにも多くの作業を行うべきではありません。下位互換性と引き換えに余分な型の安全性を失いますが、O(1)時にルックアップを行う実際のハッシュテーブルが得られます。

+0

コードはD2006でコンパイルされたままでなければなりません...しかし、おそらく小さなラッパーがやってくれるかもしれません。それは1ヶ月前の電子ソフトウェア配布版なので最新の更新があります。 (私が手でインストールしたヘルプアップデート3を除く) –

+0

一方、もう少しプレイしましたが、TDictionaryは重複をサポートしていないようです。 –

3

これらのサブシステムは、ansistringのままでか、外界とのコミュニケーション(RS232、テキストファイルなど)を維持する必要がありますか? C#と同じように、Delphi 2009の文字列を単なる文字列として扱い、他の誰かが必要とするときにのみコンバージョンを心配します。

これは、コード内で意図しない暗黙的な変換や、Windows APIメソッドを呼び出すときにパフォーマンスが向上するのを防ぐのにも役立ちます。

+0

のテキストファイルで、RS232は現場にいます。しかし、永続性は単にstringlist.savetostreamほどではありませんが、厳密にバージョン管理された後方コンパイル可能性が要求されます。私はおおまかにあなたがトップレベルで助言をしているのと同じことをしますが、私はサブスクリプションをin/output ansistringsに保存し、内部的にそれを頻繁に使用してトラブルを回避することを望みます。後で、移行後、選択したものをアンインストールするように更新します。 –

+1

以前のDelphiのバージョンとの互換性については、質問を編集する必要があります。 –

+0

...明らかにユニコードストリングに。ファイルタイプの約半数はバイナリbtwです。 –

2

Delphi 2007(またはそれ以前)のTStringsクラスとTStringListクラスを変更し、それらをTAnsiStringsおよびTAnsiStringListに名前を変更できます。あなたは非常に簡単な変更であることがわかります。それは必要なクラスを提供します。

+0

AnsiStrings.pasまたはソースディレクトリの検索でこれらのいずれも表示されません。 –

+0

ansistringsにtansistringlistが含まれていないようです。 src/dir全体がgrepしませんか? –

+0

申し訳ありません、申し訳ありませんが、私が望んでいたものです。私は間違っていた。 Delphi 2009には含まれていませんが、簡単に行うことができます。私は私の答えを更新します。 – lkessler

12

JCLは、JclAnsiStringsユニットにTAnsiStringsとTAnsiStringListを実装しています。

8

TStringList.LoadFromFile/SaveToFileは、TStringListを使用して任意のタイプの文字列を格納できるようにする、TEncoding型のオプションのパラメーターを取ります。

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual; 
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual; 

はまた、それが持っているすべての既存のコードが動作するようにデフォルトでは、TStringListには、コードページとしてANSIを使用することに注意してください。

+0

(この行にある程度の遅れがある)前述のように、私は基本的なMAPとしてtstringlistを使用しています。したがって、すべての行にオブジェクト[]が関連付けられているので、 –

関連する問題