2

Web ページのフィードバック ボタンをシミュレートするメイン (MDIParent) フォームにフィードバック ボタンを配置するのが好きです。

マウスが上に来ると大きくなるのが好きです。ちょうどウェブのように。質問のあるフォームとデータの送信は、実際には必要ありません。視覚的なものだけです。

そのようなコンポーネントはありますか?難しいことではないと思いますが、すでに存在する場合は、しばらくの間同じです。

ありがとう

4

1 に答える 1

5

アニメーション スライド パネルを作成するには、次のようなコードを使用できます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FFeedbackBtn: TPanel;
    FFeedbackPanel: TPanel;
    procedure OnFeedbackBtnMouseEnter(Sender: TObject);
    procedure OnFeedbackPanelMouseLeave(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFeedbackBtn := TPanel.Create(Self);
  FFeedbackBtn.Parent := Self;
  FFeedbackBtn.Anchors := [akLeft, akTop, akBottom];
  FFeedbackBtn.Caption := '';
  FFeedbackBtn.SetBounds(0, 0, 40, ClientHeight);
  FFeedbackBtn.OnMouseEnter := OnFeedbackBtnMouseEnter;

  FFeedbackPanel := TPanel.Create(Self);
  FFeedbackPanel.Parent := Self;
  FFeedbackPanel.Anchors := [akLeft, akTop, akBottom];
  FFeedbackPanel.Caption := 'Feedback panel';
  FFeedbackPanel.Visible := False;
  FFeedbackPanel.SetBounds(0, 0, 250, ClientHeight);
  FFeedbackPanel.OnMouseLeave := OnFeedbackPanelMouseLeave;
end;

procedure TForm1.OnFeedbackBtnMouseEnter(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_ACTIVATE or AW_SLIDE or
    AW_HOR_POSITIVE);
end;

procedure TForm1.OnFeedbackPanelMouseLeave(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_HIDE or AW_SLIDE or
    AW_HOR_NEGATIVE);
end;

end.

アップデート:

上記の別のバージョンを次に示します。典型的なフィードバック ボタンのような縦書きテキストが、ボタンパネルに引き伸ばされたペイント ボックスにレンダリングされます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FFeedbackBtn: TPanel;
    FFeedbackBtnOverlay: TPaintBox;
    FFeedbackPanel: TPanel;
    procedure OnFeedbackBtnMouseEnter(Sender: TObject);
    procedure OnFeedbackPanelMouseLeave(Sender: TObject);
    procedure OnFeedbackBtnOverlayPaint(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFeedbackBtn := TPanel.Create(Self);
  FFeedbackBtn.Parent := Self;
  FFeedbackBtn.Anchors := [akLeft, akTop, akBottom];
  FFeedbackBtn.Caption := '';
  FFeedbackBtn.Color := $0000B3FF;
  FFeedbackBtn.ParentBackground := False;
  FFeedbackBtn.SetBounds(0, 0, 40, ClientHeight);

  FFeedbackBtnOverlay := TPaintBox.Create(Self);
  FFeedbackBtnOverlay.Parent := FFeedbackBtn;
  FFeedbackBtnOverlay.Align := alClient;
  FFeedbackBtnOverlay.OnPaint := OnFeedbackBtnOverlayPaint;
  FFeedbackBtnOverlay.OnMouseEnter := OnFeedbackBtnMouseEnter;

  FFeedbackPanel := TPanel.Create(Self);
  FFeedbackPanel.Parent := Self;
  FFeedbackPanel.Anchors := [akLeft, akTop, akBottom];
  FFeedbackPanel.Caption := 'Feedback panel';
  FFeedbackPanel.Color := $0000F9FF;
  FFeedbackPanel.ParentBackground := False;
  FFeedbackPanel.Visible := False;
  FFeedbackPanel.SetBounds(0, 0, 250, ClientHeight);
  FFeedbackPanel.OnMouseLeave := OnFeedbackPanelMouseLeave;
end;

procedure TForm1.OnFeedbackBtnMouseEnter(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_ACTIVATE or AW_SLIDE or
    AW_HOR_POSITIVE);
end;

procedure TForm1.OnFeedbackPanelMouseLeave(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_HIDE or AW_SLIDE or
    AW_HOR_NEGATIVE);
end;

procedure TForm1.OnFeedbackBtnOverlayPaint(Sender: TObject);
var
  S: string;
  X, Y: Integer;
begin
  S := 'Feedback...';
  with FFeedbackBtnOverlay do
  begin
    Canvas.Brush.Color := $0000B3FF;
    Canvas.FillRect(ClientRect);
    Canvas.Font.Orientation := 900;
    X := (ClientWidth - Canvas.TextHeight(S)) div 2;
    Y := ClientHeight - (ClientHeight - Canvas.TextWidth(S)) div 2;
    Canvas.TextOut(X, Y, S);
  end;
end;

end.

そして結果:

結果

また、実際にフィールドに入力するときにユーザーがフィードバック パネルを非表示にできないようにするためのロジックを実装する必要がありますが、それはこの種のフィードバック フォームの自然な弱点です。

于 2012-08-14T18:50:13.823 に答える