2017-01-07 9 views
-2

基本的な書式/マークアップのサポートでDelphiのラベルコンポーネントを検索するDelphi Markup Label (MDLabel)が見つかりました。それはボーナスとしてリンクをサポートします。残念ながら私はそれを働かせることはできません。このコンポーネントは、単一のMD_Label.pasファイルとして提供されます。私はそれのためのコンポーネントパッケージを作成し、それをインストールしました。私は今、コンポーネントのリストから選択しますが、フォームに追加すると、エラーがスローされますすることができますDelphiのマークアップラベルで "Control 'MDLabel1'に親ウィンドウがありません。"

Control 'MDLabel1' has no parent window."

私はコールCreateWndにそれをトレースし、同様の問題のいくつかのトピックを見つけましたが、まだすることができませんでしたこれを解決する。私は間違ったことをしましたか、初期のコードがDelphi 2007のために書かれていて、私はXEを使用しているので、これを調整する必要がありますか?

ここにはソースコード全体を投稿するためのコンポーネントがありますが、上記のリンクからダウンロードできます。ここで作成部です:

constructor TMDLabel.Create(AOwner: TComponent); 
begin 
    FInitialized := False; // required for runtime creation of MDLabel 
    inherited; 
    ControlStyle := [csOpaque, csCaptureMouse, csClickEvents, csSetCaption]; 

    FLinkFontNormal := TFont.Create; 
    FLinkFontNormal.Assign(Font); 
    FLinkFontNormal.Color := clBlue; 
    FLinkFontNormal.Style := []; 

    FLinkFontHover := TFont.Create; 
    FLinkFontHover.Assign(Font); 
    FLinkFontHover.Color := clRed; 
    FLinkFontHover.Style := [fsUnderline]; 

    Width := 100; 
    Height := 13; 
    Cursor := crArrow; 
    TabStop := False; 
    DoubleBuffered := True; 
    FTextHeight := 0; 

    FAutoSizeWidth := True; 
    FAutoSizeHeight := True; 
    FTextAlignment := taLeftJustify; 
    FCompressSpaces := False; 
    FTabWidth := 8; 
    FParsingText := False; 
    FBuildingLines := False; 
    FRebuildLines := False; 
    FMaxWidth := 0; 

    FLinkFontNormal.OnChange := DoFontChange; 
    FLinkFontHover.OnChange := DoFontChange; 

    FOnLinkClicked := nil; 
    FOnPaintBackground := nil; 
    FOnHeightChanged := nil; 
    FOnWidthChanged := nil; 

    FLines := TList.Create; 
    FWords := TList.Create; 
    FLinkRCs := TList.Create; 

    FMouseDownMove := False; 
    FMouseWasDown := False; 
    FMouseDownIndex := - 1; 
    FInitialized := True; 
end; 

procedure TMDLabel.CreateWnd; 
begin 
    inherited CreateWnd; 
{$IFNDEF UNICODE} 
    if (inherited Caption <> '') and (FCaptionUTF8 = '') then CaptionUTF8 := inherited Caption; 
{$ENDIF} 
end; 

完全なソース:http://pastebin.com/sxYvpqTy

側の注意点としては:あなたは、ラベル内の整形テキストをサポートし、より良い部品があることを感じた場合は、コメントとして共有すること自由に感じなさい(TJvHTLabelとTJvMarkupLabelはではなく、が良い)。

+0

私はJvラベルを一度も使用していません。しかしおそらく彼らは働いています。なぜ彼らは「良い」ではないのに対し、フォームにドロップさえできないものは何ですか? –

+0

問題はCreateWndにありません。問題は、コントロールに親がないことです。 –

+0

私はコンポーネントをDLにしません。しかし、問題を理解する上で重要な要素はコンポーネントの階層です。次に、 'SetParent'がオーバーライドされているかどうか、どのようにして階層全体をチェックインします。例外を引き起こす可能性のあるコードに注意してください。 –

答えて

1

このエラーは、VCLが内部的にどのように動作するかを理解していないコンポーネント作成者にとっては、非常に一般的なエラーです。

デザイン時にフォームにコンポーネントをドロップするときにエラーが発生するという事実は、コンポーネントのコンストラクタは、そうしてはならないことをしていることを意味します。操作の1つは、コンポーネントのHandleに割り当て済みのHWNDが必要ですが、コンポーネントのParentプロパティがまだ割り当てられていないか、またはParent.Handleに割り当て済みのHWNDがないため、エラー時には実行できません。 Parentは、コンストラクターが終了するまで割り当てられません。

したがって、コードをデバッグし、コンポーネントのHandleプロパティに依存する問題のコンストラクタコードを見つけて、コンストラクタの外に移動する必要があります。コードに応じて、Loaded()またはCreateWnd()、さらにはSetParent()に属しているか、デザイン時に完全に無効にする必要がある場合もあります(デザイン時またはDFMストリーミング中に実行時コードを実行しないでください)まったく)。

+0

コメントの議論の詳細については、ありがとうございます。私はコードを1つずつ減らし、 'ParseText'メソッドが作成プロセスで間接的に呼び出されることを発見しました。元のコードをあまり変更しないために、私は単純にメソッドの先頭に '割り当てられていない(Parent)then exit;を追加して問題を解決しました。 – CodeX

関連する問題