喫茶XRAYトップページ

[スレッド全体
]

[6473] 移動リサイズコンポーネント返信 削除
2012/10/23 (火) 10:52:10 Mr.XRAY
> 移動リサイズのコンポをアップしたついでに,
> ちょっと応用的なサンプルでも作ってみようかな.


こんな動作をするのを作ってみました.
目的の用途に使えるかどうかは別として,反応があれば,
サンプルプログラム集か,移動リサイズコンポの方に記事を掲載する予定です.
まだ整備できていないので,EXE だけUPします.

http://mrxray.on.coocan.jp/Delphi/zipothers/DragResizeDemos.zip

コンセプトがDrawing Objectsとは違いますので,

(1) TplDragResizeコンポのTargetプロパティに相当する図形等のコードは
    利用者が用意する
    つまり,クラス(コンポーネント)を作成する
(2) 回転などの機能はない
(3) 保存,読み出しのコードは利用者が考える
(4) 移動対象のコントロールは,全て実行時に自動生成する
(5) 複数のコントロールを選択するには,[Ctrl]キーを押したまま選択
(6) 矢印キーで1ドットづつ移動.[Shift]キーを押しておくとリサイズ
(7) 親のパネルを左クリックすると,選択を全て解除

といったところでしょうか.


[6475] Re:移動リサイズコンポーネント返信 削除
2012/10/23 (火) 19:22:31 snail3
▼ Mr.XRAYさん

> こんな動作をするのを作ってみました.
> 目的の用途に使えるかどうかは別として,反応があれば,


今触ってみました。いい感じですね。
1つ不具合。私な環境では「文字列」の列の右側が欠けてしまいます。

> コンセプトがDrawing Objectsとは違いますので,
>
> (1) TplDragResizeコンポのTargetプロパティに相当する図形等のコードは
>     利用者が用意する
>     つまり,クラス(コンポーネント)を作成する


意味がよく理解できないのですが、規則にそったコンポーネントを
作成すれば、線や○を追加できるということでしょうか。
よくつかいそうな図形は誰かがアップすれば、みんなが利用可能?

> (2) 回転などの機能はない
回転は欲しいです

以下の内容はなんとかなりそう、
でもわからないときはきっと親切な人が助言してくれる気がします。
そして、頭が悪い質問者に変わってコードがアップされる予感。

> (3) 保存,読み出しのコードは利用者が考える
> (4) 移動対象のコントロールは,全て実行時に自動生成する
> (5) 複数のコントロールを選択するには,[Ctrl]キーを押したまま選択
> (6) 矢印キーで1ドットづつ移動.[Shift]キーを押しておくとリサイズ
> (7) 親のパネルを左クリックすると,選択を全て解除



[6476] Re2:移動リサイズコンポーネント返信 削除
2012/10/23 (火) 19:25:01 snail3
図形がアップされなかったのでもう一度

[6477] Re3:移動リサイズコンポーネント返信 削除
2012/10/23 (火) 20:30:25 Mr.XRAY
確かに「列」の左が少し欠けていますね.
これ,多分フォントの問題のようですね.

http://mrxray.on.coocan.jp/Delphi/plSamples/172_MetaFile_BasicTest.htm#fig3

当方も Windows XP(SP3) ですが発生していなようですので,
Windows のアップデートの内容によるのかも知れません.

>> (2) 回転などの機能はない
>回転は欲しいです


これは,移動リサイズコンポとは別に作成しなければならないので
パスですね (^^; スんません.

>意味がよく理解できないのですが、規則にそったコンポーネントを
>作成すれば、線や○を追加できるということでしょうか。


です.例えば角が丸い四角形は以下のようになっています.
変数類の説明は省略します.
DrawRoutine というメソッドをオーバーライドした描画コードを作成する
ことになります.

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  plDragResize, Menus, Math;

type
  TplResizeRoundRect = class(TplResizeBaseControl)
  private
    FRoundSize : Integer;
  public
    constructor Create(AOwner: TComponent); override;
    procedure DrawRoutine(ACanvas: TCanvas; OffSetX: Integer=0;
      OffSetY: Integer=0); override;
  published
    property RoundSize : Integer read FRoundSize write FRoundSize;
  end;

{ TplResizeRoundRect }

//-----------------------------------------------------------------------------
//  Create処理
//  角の丸部分のサイズの初期値を設定
//-----------------------------------------------------------------------------
constructor TplResizeRoundRect.Create(AOwner: TComponent);
begin
  inherited;
  FRoundSize := 35;
end;

//-----------------------------------------------------------------------------
//  実際の描画処理を実行するDrawRoutineメソッド
//  Signの使用には,usesにMathが必要
//-----------------------------------------------------------------------------
procedure TplResizeRoundRect.DrawRoutine(ACanvas: TCanvas; OffSetX: Integer=0;
  OffSetY: Integer=0);
var
  ARect   : TRect;
  ALeft   : Integer;
  ATop    : Integer;
  AWidth  : Integer;
  AHeight : Integer;
begin
  inherited;

  OffSetX := Sign(Width)  * OffSetX;
  OffSetY := Sign(Height) * OffSetY;

  ARect := ClientRect;
  OffsetRect(ARect, OffSetX, OffSetY);

  ACanvas.Pen   := Pen;
  ACanvas.Brush := Brush;

  ALeft   := Pen.Width div 2 + OffSetX;
  ATop    := Pen.Width div 2 + OffSetY;
  AWidth  := Width  - Pen.Width + 1;
  AHeight := Height - Pen.Width + 1;
  if Pen.Width = 0 then begin
    Dec(AWidth);
    Dec(AHeight);
  end;
  ACanvas.RoundRect(ALeft, ATop, ALeft + AWidth, ATop + AHeight,
                    FRoundSize, FRoundSize);
end;

end.




[6478] Re4:移動リサイズコンポーネント返信 削除
2012/10/23 (火) 21:03:22 snail3
▼ Mr.XRAYさん

>確かに「列」の左が少し欠けていますね.
>これ,多分フォントの問題のようですね.


よくわかっていませんが幅の計算が違うように思います。


> >> (2) 回転などの機能はない
> >回転は欲しいです
>
> これは,移動リサイズコンポとは別に作成しなければならないので
> パスですね (^^; スんません.


アップしてあるGDI+サンプルの矢印は回転できますが、
同じようにはできないということですか。




[6479] Re5:移動リサイズコンポーネント返信 削除
2012/10/23 (火) 21:16:20 Mr.XRAY
▼ snail3さん

> よくわかっていませんが幅の計算が違うように思います。

そうなんです.これは直せます.

> アップしてあるGDI+サンプルの矢印は回転できますが、
> 同じようにはできないということですか。


矢印は回転ではなく,ある点からある点までの描画なので
文字の場合は,よくある回転の描画をすることになるんですが.
ラバーバンドとグラブハンドルも制御しないとダメなんですよねー.

機能的には実装したいですが,コンポを作り直す気力ないてす.
キッパリ(笑)


[6481] 文字列の回転返信 削除
2012/10/23 (火) 21:27:11 Mr.XRAY
参考までに,

[フォントの横倍と方向]
http://mrxray.on.coocan.jp/Halbow/Notes/N003.html

[Delphi] GDI+ Text Rotation (1)]
http://blog.livedoor.jp/junki560/archives/24342422.html


[6482] Re6:移動リサイズコンポーネント返信 削除
2012/10/24 (水) 00:39:18 snail3
▼ Mr.XRAYさん
>
> 機能的には実装したいですが,コンポを作り直す気力ないてす.


私には知力がありません。(T_T)



[6485] Re7:移動リサイズコンポーネント返信 削除
2012/10/24 (水) 10:48:20 Mr.XRAY
▼ snail3さん

> 私には知力がありません。(T_T)

私にも「知力」はないのですが,「痴力」はあるかも?

またちょっと作り直おそうと思っています.
Delphi 2009 以降専用のコードになっていたので...
でも,もう Delphi 2009 より古いバージョン使っている人いなかも
知れないからいいかも... (^^)


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82