ホーム
Top.Mail.Ru Yandeks.Metrika
フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

ダウン

コンポーネントは描かれていません。それだけです... 似ている枝を探す


Aleksandr   (2001-12-18 13:03) [0]

親愛なる同僚!
このコンポーネントを作成する必要がありました。 TGraphicControlから生成して作成されます。 フォームに配置します。すべてが正常で、プロパティは表示されていますが、描画されていません。それだけです...コードは次のとおりです

type
TWayTree = class(TGraphicControl)
プライベート
...
保護された
手順Paint;オーバーライド;
公共
コンストラクターCreate(AOwner:TComponent);
公表
...
プロパティColorデフォルトclWhite;
property Visibleデフォルトtrue;
終わり

手続き登録

実装

プロシージャTWayTree.Paint;
VAR
ARect:TRect;
始まる
継承されます。
Canvas.Brush.Color:=色;
ARect.Left:=左;
ARect.Top:=Top;
ARect.Bottom:=上部+高さ;
ARect.Right:=左+幅;
Canvas.FillRect(ARect)
終わり

コンストラクターTWayTree.Create;
始まる
継承作成(AOwner);
...
終わり

手続き登録
始まる
RegisterComponents(「WayTrees」、[TWayTree])
終わり

終わり。

それだけでなく、FPenプロパティとFBrushプロパティを追加しようとしているとき(設計時の個別のアクセス用):

TWayTree = class(TGraphicControl)
プライベート
FPen:TPen;
FBrush:TBrush;
プロシージャRePaintRequest(送信者:TObject);
プロシージャSetBrush(値:TBrush);
プロシージャSetPen(値:TPen);
保護された
手順Paint;オーバーライド;
公共
コンストラクターCreate(AOwner:TComponent);
デストラクタ
公表
プロパティColorデフォルトclWhite;
プロパティVisible;
プロパティBrush:TBrush読み取りFBrush書き込みSetBrush;
プロパティペン:TPen読み取りFPen書き込みSetPen;
終わり

手続き登録

実装

プロシージャTWayTree.Paint;
VAR
ARect:TRect;
始まる
継承されます。
Canvas.Pen:= FPen;
Canvas.Brush:= FBrush;
Canvas.Brush.Color:=色;
ARect.Left:=左;
ARect.Top:=Top;
ARect.Bottom:=上部+高さ;
ARect.Right:=左+幅;
Canvas.FillRect(ARect);
Canvas.TextOut(ARect.Left、ARect.Top、「AAA」);
終わり

デストラクタTWayTree.Destroy;
始まる
FPen.Free;
FBrush.Free;
継承された破棄
終わり

コンストラクターTWayTree.Create;
始まる
継承作成(AOwner);
FPen:= TPen.Create;
FBrush:= TBrush.Create;
FPen.OnChange:= RepaintRequest;
FBrush.OnChange:= RepaintRequest
終わり

プロシージャTWayTree.SetBrush;
始まる
値= nilの場合
終了します。
FBrush.Assign(値);
無効にする
終わり

プロシージャTWayTree.SetPen;
始まる
値= nilの場合
終了します。
FPen.Assign(値);
無効にする
終わり

プロシージャTWayTree.RePaintRequest;
始まる
無効にする
終わり

手続き登録
始まる
RegisterComponents( "WayTrees"、[TWayTree]);
終わり

終わり。
コンポーネントはフォームに挿入されると宣誓します。これにより、ペンをゼロに設定できません。 インスペクターにペンとブラシが表示されますが、+をクリックしても、nifigaはドロップアウトしません。コンポーネントのサイズを変更しても同じエラーが発生します...ここで何が間違っていますか?



csf   (2001-12-18 13:09) [1]

彼らが言うには、Delphiを再起動すると役立ちます。
オン 保存され あなたはまだ読むことができます...



Aleksandr   (2001-12-18 13:11) [2]

申し訳ありませんが、埋め立て地に行かなければなりません...デストラクタでコンストラクタの反対側にオーバーライドを描画するのを忘れていたことがわかりました...このコンポーネントに垂直スクロールバーを接続するにはどうすればよいですか...



csf   (2001-12-18 13:19) [3]

... nilのPaint FPenとFBrushで確認するといいでしょう...



Юрий Зотов   (2001-12-18 14:30) [4]

> csf

1。 > Delphiを再起動すると、助けになるという。
貴重なアドバイス。

2。 >あなたはまだ保存について読むことができます...
できます。 sabzhにとってのみ、これは何の関係もありません。

3。 > ... nilのPaint FPenおよびFBrushで確認するとよいでしょう...
なんで? コンポーネントコンストラクターで作成されます。 ニルはそこにいられない。

合計:3フレーズとすべての3を書いた、ごめん、ナンセンス。 書く価値はありましたか? 一般的には、あなたがそのトピックを扱っている質問に答える必要があります。


>アレクサンドル

オーバーライドを使用すると、すでに自分でそれを理解しましたが、それだけではありません-ダブル再描画があります

プロシージャTWayTree.SetBrush;
始まる
if Value = nil then //これは不必要で有害です-ユーザーエラーをマスクします
終了します。
FBrush.Assign(値); // FBrush.OnChangeを生成し、RePaintRequestを呼び出します
無効化//これは不要です-再描画が進行中です
終わり

SetPenでも同じことが言えます。 さらに、ペイントのARect変数はまったく不要です。ClientRectまたはCanvas.ClipRectを使用してください。

最後に、主なことは、FBrushとFPenはまったく役に立たないことです。余分なリソースのみが破壊されます。 組み込みのCanvasを使用します。

公表
property Pen:TPenはGetPenを読み取り、SetPenは書き込みます。
...

関数... GetPen:TPen;
始まる
結果:= Canvas.Pen
終わり

手順... SetPen(定数値:TPen);
始まる
Canvas.Pen.Assign(値)
終わり

結論-そのような最も単純なコンポーネントであっても、より慎重に考え、より正確に行う必要があります。



Aleksandr   (2001-12-18 15:50) [5]

2ユーリ・ゾトフ
情報をありがとう。 ただし、キャンバスのプロパティへの直接参照により、デフォルトでは「標準」がなくなります-常に最後に使用された色でペイントされ続けます。 そして、それに応じて、OnChangeに何も植えることができません-基本ループが発生します-キャンバスの色を設定するとOnChangeが呼び出され、再描画が発生し、再描画でキャンバスの色が再び変更されます。
議題に残っている質問が1つあります。TScrollBarコンポーネントに追加する方法ですか? TGraphicControlとTScrollBarから二重継承を行うためにnifigができないこと...



DieHard   (2001-12-18 16:01) [6]

二重継承は通過しません。
TScrollBoxから継承してみてください。



MBo   (2001-12-18 16:02) [7]

二重継承はありません。
多分TWinControlを継承しますか?



Polevi   (2001-12-18 16:19) [8]

TCustomControl



Aleksandr   (2001-12-18 16:19) [9]

うーん...さて、これはそのままにしておきましょう...形状のサイズを変更するときにコンポーネントが常にちらつくのを防ぐ方法は次のとおりです。



panov   (2001-12-18 16:31) [10]

> Aleksandr©(18.12.01 16:19)
サイズ変更の前にEnabled:= Falseを指定してみてください



Юрий Зотов   (2001-12-18 17:25) [11]

> Aleksandr©(18.12.01 15:50)

>彼女は常に最後に使用した色で塗り続けます。

必要なもの


>したがって、OnChangeには何も植えることができません

必要ありません。 Paintメソッドが自動的に呼び出され、他に何も必要ありません。

>基本ループが発生します-キャンバスの色を設定します
> OnChangeを呼び出し、再描画を呼び出し、再描画で再度
>キャンバスの色が変わります。

まず、キャンバスのプロパティを変更するとPaintメソッドが自動的に呼び出されることを確認します。 したがって、前の点に同意する必要があります-OnChangeハンドラーは必要ありません(OnChangeハンドラーは追加の再描画のみを提供するため、追加の点滅が行われます)。

第二に、再描画では、キャンバスのプロパティを変更しないでください。 なんで? 実際、コンポーネントのプロパティをキャンバスのプロパティに結び付けた場合、Paintメソッドを呼び出すと、必要に応じてキャンバスのこれらのプロパティがすでに設定されます。 何も変更せずに、それらを使用して描画します。 そして、ループはありません。

一般的には、試してみることをお勧めします-自分で確認できます。 フリッカーは大幅に減少すると思います。

さらに、ちらつきとScrollBarについて-Poleviのアドバイスを聞いてください。 TCustomControlはウィンドウです。 CreateParamsでWS_HSCROLL / WS_VSCROLLスタイルを設定するだけで、そこにScrollBar "sが挿入されます。DoubleBufferedプロパティを設定すると、ちらつきを減らすことができます。



ページ: 1 全枝

フォーラム: "Main";
現在のアーカイブ:2002.01.08;
ダウンロード:[xml.tar.bz2];

2階









メモリ:0.61 MB
時間:0.029 c
1-22058
$ Hic0
2001-12-16 11:49
2002.01.08
TTreeViewおよびTListView


1-22160
ヤクザ
2001-12-20 16:46
2002.01.08
クリップボードにコピー


4-22486
パンテロ
2001-11-03 23:59
2002.01.08
ハンドル


3-21915
KAA
2001-12-04 10:28
2002.01.08
変数MSSQL2000のゼロ化


6-22296
コリアン
2001-10-11 12:49
2002.01.08
TSocket!





アフリカーンス語 アルバニア語 Arabic アルメニア語 アゼルバイジャン語 バスク ベラルーシ Bulgarian カタロニア語 中国語(簡体字) 中国語(繁体字) クロアチア チェコ語 デンマーク語 Dutch 英語 エストニア語 タガログ語 Finnish フランス語
ガリシア語 ジョージアン ドイツ語 ギリシャ語 ハイチ語 ヘブライ語 ヒンディー語 ハンガリー語 アイスランド語 Indonesian アイリッシュ イタリア語 和風 Korean ラトビア語 リトアニア マケドニア語 Malay マルタ語 Norwegian
ペルシア語 ポリッシュ ポルトガル語 ルーマニア ロシア語 セルビア Slovak スロベニア語 スペイン語 スワヒリ語 Swedish Thai トルコ語 ウクライナ語 ウルドゥー語 ベトナム語 ウェールズ語 イディッシュ語 ベンガル語 ボスニア語
セブアノ語 エスペラント グジャラート語 ハウサ語 モン族 イボ ジャワ語 カンナダ語 クメール語 ラオ語 ラテン マオリ語 マラーティー語 モンゴル語 ネパール語 パンジャブ語 ソマリ タミル語 テルグ語 ヨルバ語
ズールー語
Английский Французский Немецкий Итальянский ポルトガル語 Русский Испанский