連載

Windows業務アプリケーション開発 Q&A #5

グレープシティ株式会社 八巻 雄哉
2006/10/18

本記事は、業務アプリケーション向けコンポーネントのベンダであるグレープシティのテクニカル・サポート担当に対して、実際にプログラマーから問い合わせがあった質問を取り上げて解説しています。

コントロールのフォントサイズが変更できない

 以前はVisual Basic 6.0で開発していましたが、現在.NETでWindowsアプリケーションを構築しています。.NETでコントロールのフォントサイズをコードから変更しようとすると、「プロパティ 'Size' は 'ReadOnly' です。」というエラーが発生します。.NETではコントロールのフォントサイズを変更できないのでしょうか?

 Visual Basic 6.0(以下、VB 6)では、下記のようなコードでコントロール(ここではテキストボックスを想定)のフォントサイズを変更することができました。

Text1.Font.Size = 24
リスト1 FontオブジェクトのSizeプロパティに値を設定して、フォントサイズを変更するVB 6のコード

 上記のコードと同じ内容をVisual Basic 2005やVisual Basic .NET(以下、VB 2005)で記述してみると、下記のようなコードになるかと思います。

TextBox1.Font.Size = 24
リスト2 リスト1の内容をVB 2005で記述した場合のコード(エラーになる)

 しかしながら、このコードでは質問にもあるように「プロパティ 'Size' は 'ReadOnly' です。」というコンパイル・エラーが発生してしまいます。これはそのエラー・メッセージが示すとおり、FontクラスのSizeプロパティが読み取り専用のプロパティとなっており、値を取得することはできても設定することができないためです。

 VB 2005の場合には、下記のようなコードを記述する必要があります。

TextBox1.Font = New Font("MS UI Gothic", 24)
リスト3 VB 2005でコントロールのフォントサイズを変更する最も単純なコード

 このようにVB 2005では、フォントサイズだけを変更する場合であっても、新しいFontオブジェクトのインスタンスを生成し、それを代入する必要があります。

 ちなみに、VB 6ではコンストラクタにパラメータが存在しないので、少し違った感じのコードにはなってしまいますが、VB 6でもStdFontオブジェクトのインスタンスを生成する方法でフォントサイズを変更することもできます。

Dim f As New StdFont ' インスタンスを生成
f.Size = 24
Set Text1.Font = f
リスト4 VB 6でフォントサイズを変更するもう1つの方法

【参考】MSDN: フォント処理 (Visual Basic 6.0 ユーザー向け)


クラス・ライブラリ化したら突然「評価期限切れ」のメッセージが

 グレープシティのコンポーネントを購入して利用していたのですが、突然評価版であることを示すメッセージが表示されるようになりました。そのとき変更したことといえば、クラス・ライブラリ化したことくらいしか思いつかないのですが、何か関係があるのでしょうか?

 .NET Frameworkには、知的所有権の保護を行うための共通のライセンス処理が用意されています。多くのサードパーティ製の.NETコンポーネントがこのライセンス処理を採用しており、その使用方法や仕組みは共通のものとなっています。

 通常、ライセンスを付与されたコンポーネントに必要な処理はVisual Studioが自動的に行ってくれるため、ライセンスの仕組みを理解する必要はほとんどありません。しかしながら、どのコンポーネントがライセンス付与されたものであるのかを識別するテキスト・ファイル「.licxファイル」がプロジェクト内に必要であるということだけは覚えておく必要があります。このようなファイルはVB 6にはありませんでした。

 サードパーティ製コンポーネントがコントロール(フォームに貼り付けることができるもの)である場合、コントロールをフォームに貼り付ける動作により、Visual Studioが自動的に.licxファイルを作成し、プロジェクトに追加してくれます。しかしながら、それ以外の場合には手動で.licxファイルを作成し、プロジェクトへ追加しなければなりません。

 この.licxファイルが作成されていない、もしくは作成されているが適切な場所に存在しないといったことにより、製品版が評価版として認識されてしまう場合が多いようです。

 ここでは、.licxファイルを手動で作成しなければならない代表的な3つのパターンについて解説したいと思います。

ライセンス付与されたコンポーネントを設計時ではなく実行時にコードから生成している場合

 プロジェクトの種類がWindowsアプリケーションやWebアプリケーションで、ライセンス付与されたコンポーネントがフォームに貼り付けることのできるコントロールであれば、一度フォームにコントロールを貼り付けて.licxファイルを自動生成させ、その後、貼り付けたコントロールを削除しておくという方法が最も手っ取り早いでしょう。

 そうでない場合には、下記のような方法で.licxファイルをプロジェクトに手動で追加します。

  1. プロジェクトを右クリックし、[追加]-[新しい項目の追加]を選択します。
  2. [テキスト ファイル]を選択し、「licenses.licx」という名前を指定します*
  3. プロジェクト内の個々のライセンス付与されたコンポーネントについて、.licxファイルに下記のような記述を追加します。
<名前空間>.<クラス名>, <拡張子なしのアセンブリ名>
.licxファイルに記述するライセンス付与されたコンポーネントの宣言
多くの場合、製品のヘルプ・ドキュメントなどに.licxファイルへ記述すべき内容が記されているので、それを参照するとよいだろう。

* 拡張子が.licxであればファイル名は任意で構いませんが、「licenses.licx」という名前にしない場合、後述の[ランタイム ライセンスのビルド]というメニュー項目が表示されません。なお、Visual Studio 2005で「.licx」に拡張子を変更すると、[ビルド アクション]プロパティの値が自動的に「埋め込まれたリソース」になります。

ライセンス付与されたコンポーネントを継承して使用している場合、あるいはライセンス付与されたコンポーネントを使ってユーザー・コントロールを作成している場合

 これら2つのケースでは、作成した継承コンポーネントやユーザー・コントロールをフォームに貼り付けても.licxファイルは自動的に作成されません。この場合には下記の2つの方法のどちらかにより対応します。

(A) 継承したクラスやユーザー・コントロールとして作成したクラスにLicenseProvider属性を設定する

Imports System.ComponentModel

<LicenseProvider(GetType(LicenseProvider))> _
Public Class MyComponent
  ……
End Class
using System.ComponentModel;

[LicenseProvider(typeof(LicenseProvider))]
public class MyComponent
{
  ……
}
LicenseProvider属性を設定するコード例(上:VB、下:C#)

 LicenseProvider属性を設定することで、継承コンポーネントやユーザー・コントロールをフォームに貼り付けたときにも.licxファイルが自動的に作成されるようになります。

 ただし、作成した継承コンポーネントやユーザー・コントロールのバージョンが頻繁に更新されるような場合には注意が必要です。.licxファイルに書き込まれる内容にはバージョン番号が含まれています。そして、バージョンが更新されるたびにそれに対応した新たな行が.licxファイル内に追加され、以前のバージョンの記述はそのまま残ってしまいます。

 その結果、.licxファイルに不要な記述があると判断され、「"LC.exe" はコード -1 を伴って終了しました。」といったエラーが発生します。この場合には、次の(B)の方法を採用した方がよいでしょう。

(B) ライセンス付与されたコンポーネントに対応した.licxを手動で作成する

 「 ライセンス付与されたコンポーネントを設計時ではなく実行時にコードから生成している場合」で述べた方法で、手動にて.licxを作成します。

ライセンス付与されたコンポーネントをほかのアセンブリから呼び出して利用している場合

 ライセンス付与されたコンポーネントをクラス・ライブラリなどで使用し、ほかのアセンブリからそのクラス・ライブラリを呼び出して利用している場合、クラス・ライブラリのプロジェクトではなく、呼び出し元のプロジェクトに.licxファイルが必要になります。

 この場合にもで述べた方法で.licx ファイルを作成し、呼び出し元のプロジェクトに追加します。

 最後に補足事項を2つほど述べておきます。

 .licxファイルは、プロジェクト内であれば基本的にどこに作成しても構いません。

 また、Visual Studio 2005で「Webサイト」のプロジェクトを使用している場合には、ASP.NET 2.0のプリコンパイル機能をサポートするために、.licxファイルからApp_Licenses.dllが作成されるようになっています。このため、.licxファイルを手動で作成もしくは更新した場合には、App_Licenses.dllも手動で作成/更新する必要があります。

 これには.licxファイルを追加後、以下の手順を実行します。

  1. ソリューション・エクスプローラにて.licxファイルをクリックして選択します。
  2. メニューから[ビルド]-[ランタイム ライセンスのビルド]を実行します。

 これによりApp_Licenses.dllが作成/更新されます。End of Article


八巻 雄哉(やまき ゆうや)
グレープシティ株式会社 テクニカルエバンジェリスト

2003年グレープシティ入社。PowerToolsシリーズのテクニカル・サポートを担当する傍ら、製品開発やマーケティングにも従事。現在は.NETとPowerToolsシリーズ普及のため、エバンジェリストとして活動中。得意なPowerTools製品はActiveReports。http://d.hatena.ne.jp/Yamaki/にてBlogを公開中。


インデックス・ページヘ  「Windows業務アプリケーション開発 Q&A」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH