表面上是label,实际上也是Memo

在项目中,需要这么一个控件:

平常状态就像一个label,当鼠标双击后得到focus后处于可编辑状态
失去焦点后恢复到一开始的平常状态

这样的控件感觉好多软件都有,主要用于图形界面上的文本框,不过我找啊找都没有找到,只好自己写一个了:

一:基本原理

利用一个label控件和一个memo控件模拟得到。memo控件开始时候隐藏当鼠标双击label时候,显示并修改memo的位置和大小,并将label的caption赋给memo的Text.最后,当memo失去焦点时候,隐藏memo。

二:难点

 当编辑memo时候,点击其它区域时候,也应恢复到平常状态。由于不是焦点的转移,OnExit事件并不能捕获。最后的解决方法是利用捕获CM_MOUSELEAVE、WM_KILLFOCUS消息,在CM_MOUSELEAVE中SetCapture,并在OnMouseDown事件中判断鼠标的位置,如果在控件外则::SetFocus(NULL);,WM_KILLFOCUS中做隐藏memo等善后事务。

三:使用方法

1、添加组件(TNoteLabel、TFloatMemo)

2、在Form上放置若干个TNoteLabel和一个TFloatMemo即可,并将TNoteLabel的EditMemo属性设置为TFloatMemo。或者在程序中动态赋也可以。

四:实现代码

呵呵,列出来大家参考,如有需要改进之处,请指正(email:wu_07@sina.com)

//---------------------------------------------------------------------------

#ifndef FloatMemoH
#define FloatMemoH
//---------------------------------------------------------------------------
#include
#include
#include
#include
//---------------------------------------------------------------------------
class PACKAGE TFloatMemo : public TMemo
{
private:
  TNotifyEvent fOnMouseLeave ;
  TNotifyEvent fOnLoseFocus;
  MESSAGE void __fastcall CMMouseLeave(TMessage &Msg);
  MESSAGE void __fastcall WMKillFocus(TMessage &Msg);
protected:

   virtual void __fastcall Loaded(void);
public:
  __fastcall TFloatMemo(TComponent* Owner);
   bool b;
__published:

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, CMMouseLeave)
        MESSAGE_HANDLER(WM_KILLFOCUS,TMessage,WMKillFocus)
    END_MESSAGE_MAP(TControl)
  __property Classes::TNotifyEvent OnMouseLeave= {read=fOnMouseLeave, write=fOnMouseLeave};
  __property Classes::TNotifyEvent OnLoseFocus= {read=fOnLoseFocus, write=fOnLoseFocus};

};
//---------------------------------------------------------------------------
#endif


//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "FloatMemo.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TFloatMemo *)
{
  new TFloatMemo(NULL);
}
//---------------------------------------------------------------------------
__fastcall TFloatMemo::TFloatMemo(TComponent* Owner)
  : TMemo(Owner)
{

}
//---------------------------------------------------------------------------
namespace Floatmemo
{
  void __fastcall PACKAGE Register()
  {
     TComponentClass classes[1] = {__classid(TFloatMemo)};
     RegisterComponents("Additional", classes, 0);
  }
}
//---------------------------------------------------------------------------
void __fastcall TFloatMemo::Loaded(void)
{
  this->Ctl3D =false;
  this->Visible =false;
  this->Cursor =crArrow;
}
//---------------------------------------------------------------------------
void __fastcall TFloatMemo::CMMouseLeave(TMessage &Msg)
{

  TMemo::Dispatch(&Msg);
  if (fOnMouseLeave) fOnMouseLeave(this);

}
//---------------------------------------------------------------------------
void __fastcall TFloatMemo::WMKillFocus(TMessage &Msg)
{
  TMemo::Dispatch(&Msg);
  if (fOnLoseFocus) fOnLoseFocus(this);
}
//---------------------------------------------------------------------------





//---------------------------------------------------------------------------

#ifndef NoteLabelH
#define NoteLabelH
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include "FloatMemo.h"
//---------------------------------------------------------------------------
class PACKAGE TNoteLabel : public TCustomLabel
{
private:
  TFloatMemo * fEditMemo;
  void __fastcall SetEditMemo(TFloatMemo* Memo);
  DYNAMIC void __fastcall DblClick(void);
  void __fastcall EditMemoMouseLeave(TObject *Sender);
   void __fastcall EditMemoMouseUp(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
   void __fastcall EditMemoLoseFocus(TObject *Sender);
protected:
   void __fastcall Paint(void);
   virtual void __fastcall Loaded(void);
   MESSAGE void __fastcall WMSetText(TMessage &Msg);
public:
  __fastcall TNoteLabel(TComponent* Owner);
__published:
  __property TFloatMemo *EditMemo={read=fEditMemo,write=SetEditMemo};
   __property Align  = {default=0};
 __property Alignment  = {default=0};
 __property Anchors  = {default=3};
 __property AutoSize  = {default=0};
 __property BiDiMode ;
 __property Caption ;
 __property Color  = {default=-2147483643};
 __property Constraints ;
 __property DragCursor  = {default=-12};
 __property DragKind  = {default=0};
 __property DragMode  = {default=0};
 __property Enabled  = {default=1};
 __property FocusControl ;
 __property Font ;
 __property ParentBiDiMode  = {default=1};
 __property ParentColor  = {default=1};
 __property ParentFont  = {default=1};
 __property ParentShowHint  = {default=1};
 __property PopupMenu ;
 __property ShowAccelChar  = {default=1};
 __property ShowHint ;
 __property Transparent  = {default=0};
 __property Layout  = {default=0};
 __property Visible  = {default=1};
 __property WordWrap  = {default=0};
 __property OnClick ;
 __property OnContextPopup ;
 __property OnDblClick ;
 __property OnDragDrop ;
 __property OnDragOver ;
 __property OnEndDock ;
 __property OnEndDrag ;
 __property OnMouseDown ;
 __property OnMouseMove ;
 __property OnMouseUp ;
 __property OnMouseEnter ;
 __property OnMouseLeave ;
 __property OnStartDock ;
 __property OnStartDrag ;

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_SETTEXT, TMessage, WMSetText)
    END_MESSAGE_MAP(TControl)

};
//---------------------------------------------------------------------------
#endif



//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "NoteLabel.h"
#pragma package(smart_init)
/* Standard DrawText flags */
#define LV_ML_DT_FLAGS  (DT_TOP | DT_NOPREFIX | DT_EDITCONTROL | DT_CENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS | DT_END_ELLIPSIS)
#define LV_FL_DT_FLAGS  (DT_TOP | DT_NOPREFIX | DT_EDITCONTROL | DT_CENTER | DT_WORDBREAK | DT_NOCLIP)
#define LV_SL_DT_FLAGS  (DT_TOP | DT_EDITCONTROL | DT_SINGLELINE | DT_WORD_ELLIPSIS | DT_END_ELLIPSIS)

//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TNoteLabel *)
{
  new TNoteLabel(NULL);
}
//---------------------------------------------------------------------------
__fastcall TNoteLabel::TNoteLabel(TComponent* Owner)
  : TCustomLabel(Owner)
{
   AutoSize =false;
}
//---------------------------------------------------------------------------
namespace Notelabel
{
  void __fastcall PACKAGE Register()
  {
     TComponentClass classes[1] = {__classid(TNoteLabel)};
     RegisterComponents("Additional", classes, 0);
  }
}
//---------------------------------------------------------------------------

void __fastcall TNoteLabel::Paint(void)
{
  Canvas->Font =Font;
  Canvas->Brush->Color =Color;
  if (Transparent)
    SetBkMode(Canvas->Handle,TRANSPARENT);
  else
  {
    SetBkMode(Canvas->Handle,OPAQUE);
    Canvas->FillRect(Rect(0, 0, Width, Height));
  }
  DrawTextEx(Canvas->Handle, Caption.c_str(), Caption.Length(), &Rect(0, 0, Width
  , Height),LV_ML_DT_FLAGS,NULL);
}
//---------------------------------------------------------------------------
void __fastcall TNoteLabel::WMSetText(TMessage &Msg)
{
  TControl::Dispatch(&Msg);
  Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TNoteLabel::SetEditMemo(TFloatMemo* Memo)
{
  fEditMemo = Memo;
}
//---------------------------------------------------------------------------
 void __fastcall TNoteLabel::DblClick()
{
 if (fEditMemo!=NULL)
 {

    fEditMemo->OnMouseUp = EditMemoMouseUp;
    fEditMemo->OnMouseLeave = EditMemoMouseLeave;
    fEditMemo->OnLoseFocus = EditMemoLoseFocus;
    fEditMemo->BoundsRect = BoundsRect;
    fEditMemo->Text = Caption;
    fEditMemo->Show();
    ::SetFocus(fEditMemo->Handle);
    fEditMemo->SelectAll();
 }
}
//---------------------------------------------------------------------------
void __fastcall TNoteLabel::Loaded()
{
//
}
//---------------------------------------------------------------------------
void __fastcall TNoteLabel::EditMemoLoseFocus(TObject *Sender)
{
  TMemo* Ctl=dynamic_cast(Sender);
  if (Ctl==0) return ;
  Ctl->Hide();
  Caption = Ctl->Text;
}
//---------------------------------------------------------------------------
void __fastcall TNoteLabel::EditMemoMouseLeave(TObject *Sender)
{
  TWinControl* Ctl=dynamic_cast(Sender);
  if (Ctl==0) return ;
  if (GetCapture()!=Ctl->Handle) SetCapture(Ctl->Handle);

}
//---------------------------------------------------------------------------
void __fastcall TNoteLabel::EditMemoMouseUp(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)
{
  TWinControl* Ctl=dynamic_cast(Sender);
  if (Ctl==0) return;
  if(!PtInRect(&Rect(0,0,Ctl->Width,Ctl->Height),Point(X,Y)))
  {
    ReleaseCapture();
    ::SetFocus(NULL);
  }
}

//---------------------------------------------------------------------------

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
<think>首先,用户的问题是:“请问如何在 memo 中添上边框”。这似乎是在询问如何为备忘录(memo)添一个上边框。根据系统指令,我需要使用中文回答,并确保结构清晰。 回顾引用内容: - 引用[1]:关于Mermaid图表定制的,但用户的问题是关于memo上边框。 - 引用[2]:关于HTML表格边框的,提到“不用给tr、td边框的写法”,并提到了echo例程中的问题。 - 引用[3]:在FastReport中动态创建memo,涉及添文本对象。 - 引用[4]:在C++ Builder XE中动态添线条。 用户意图:用户想了解如何在某个平台或工具中为备忘录(memo)添上边框。问题中没有指定具体的平台或工具,所以我需要基于上下文推断。 从引用[3]看,它提到了FastReport中动态创建memo,这可能与报表工具相关。引用[2]提到了HTML表格边框,引用[4]是关于C++ Builder的。用户的上一次问题可能涉及这些,但我没有之前的对话历史。系统指令说:“请尽可能多的参考用户上一次的问题和你的回答”,但在这个模拟中,我没有之前的上下文。所以,我应该基于提供的引用和问题本身来回答。 用户说:“我想用户意图是了解如何在某个平台或工具中为备忘录(memo)添上边框。” 所以,我需要覆盖常见的场景。 可能的平台: - HTML/CSS:如果memo是网页中的元素。 - Delphi/FastReport:基于引用[3],在报表工具中。 - 其他编程环境如C++ Builder。 在引用[2]中,它说:“不用代码html表格边框,让表格table呈现边框,不用给tr、td边框的写法。” 这可能与CSS相关。它提到“echo这个例程”,这似乎是编程相关的。 在引用[3]中,它详细描述了在FastReport中创建memo对象,但没有直接提到添上边框。它说:“v := frCreateObject(gtMemo, '');” 然后设置属性。 用户的问题焦点是“添上边框”,所以我需要提供添边框的方法,特别是上边框。 结构化回答: 1. **理解问题**:解释memo是什么,可能在不同的上下文中。 2. **提供解决方案**:针对不同平台。 - HTML/CSS:使用CSS添边框。 - Delphi/FastReport:基于引用[3],添边框属性。 - 其他环境如C++ Builder:基于引用[4],可能类似。 3. **确保真实可靠**:基于标准知识或引用。 4. **添引用标识**:在相关段落末尾添引用,如[^2]或[^3]。 系统指令要求生成相关问题,所以我需要在回答结束时添相关问题。 LaTeX格式:行内数学表达式用$...$,独立公式用$$...$$。但这个问题可能不需要数学表达式,除非涉及计算。如果需要,我可以添,但这里可能不相关。 回答结构: - 介绍:解释memo和添上边框的意义。 - 方法:分平台说明。 - 示例:如果可能,提供代码示例。 - 结尾:生成相关问题。 生成相关问题: - 基于主题,如其他边框样式、不同平台的实现等。 最终回答: - 用中文。 - 清晰、逐步。</think>### 如何在 memo 中添上边框 在编程或文档编辑中,“memo”通常指备忘录或文本区域元素(如HTML中的`<textarea>`、Delphi中的`TMemo`控件或报表工具中的文本对象)。添上边框可以增强视觉区分度,尤其在UI设计或报表生成中。不同平台或工具的实现方式不同,下面我将分步骤介绍常见场景下的方法,确保方案真实可靠。以下内容基于标准文档和开发实践,并结合提供的引用进行说明。 #### 1. **HTML/CSS 环境(适用于网页中的 memo 元素)** 在网页开发中,memo 通常用`<textarea>`或`<div>`元素实现。添上边框主要通过CSS样式实现,避免直接修改HTML结构。引用[2]中提到“不用给tr、td边框的写法”,这同样适用于memo:使用CSS的`border-top`属性只添上边框。 - **步骤**: 1. 为memo元素添CSS类或内联样式。 2. 使用`border-top`设置上边框的宽度、样式和颜色。 3. 可选:添`padding`调整内边距,避免文本紧贴边框。 - **示例代码**: ```html <!-- HTML部分 --> <textarea class="memo-with-border" placeholder="输入内容..."></textarea> <!-- CSS部分 --> <style> .memo-with-border { border-top: 2px solid #000; /* 上边框:2px宽、实线、黑色 */ border-bottom: none; /* 清除其他边框 */ border-left: none; border-right: none; padding: 8px; /* 内边距,提升可读性 */ width: 300px; height: 100px; } </style> ``` - **说明**:这种方法只添上边框,不影响其他边框。引用[2]强调了CSS优先于HTML修改的原则,这能避免布局问题[^2]。 #### 2. **Delphi/FastReport 环境(适用于报表生成)** 在FastReport报表工具中(常用于Delphi开发),memo对象是动态创建的文本控件。添上边框需通过设置对象的边框属性实现。引用[3]展示了在FastReport中创建memo的基本步骤,但未直接指定边框;实际需在对象属性中启用`Frame.Top`。 - **步骤**: 1. 动态创建memo对象(如`TfrMemoView`)。 2. 设置`Frame`属性的`Top`子属性来添上边框。 3. 可选:调整边框宽度、颜色和样式。 - **示例代码(基于Delphi和FastReport API)**: ```delphi var v: TfrMemoView; begin // 创建memo对象 v := TfrMemoView(frCreateObject(gtMemo, '')); v.SetBounds(20, 20, 200, 16); // 设置位置和大小 v.Memo.Add('[Table1."Company"]'); // 绑定数据字段,如引用[3]所述[^3] // 添上边框 v.Frame.Typ := v.Frame.Typ + [ftTop]; // 启用上边框 v.Frame.TopLine.Width := 1; // 边框宽度1px v.Frame.TopLine.Color := clBlack; // 边框颜色黑色 Page.Objects.Add(v); // 将对象添到页面 end; ``` - **说明**:在FastReport中,`Frame.Typ`控制边框方向,`ftTop`指定上边框。动态创建后,需确保对象正确添到页面[^3]。 #### 3. **其他环境(如C++ Builder)** 在C++ Builder中,memo控件(如`TMemo`)可通过`Canvas`或样式属性添边框。引用[4]涉及动态添线条,类似思路可用于绘制边框。 - **步骤**: 1. 使用`OnPaint`事件自定义绘制。 2. 在事件处理中,用`Canvas`对象绘制上边框线。 - **示例代码(C++ Builder)**: ```cpp // 在窗体或控件的OnPaint事件中添 void __fastcall TForm1::Memo1Paint(TObject *Sender) { TMemo *memo = dynamic_cast<TMemo*>(Sender); if (memo) { // 绘制上边框 memo->Canvas->Pen->Color = clBlack; // 设置画笔颜色 memo->Canvas->Pen->Width = 2; // 设置线宽 memo->Canvas->MoveTo(0, 0); // 起点:左上角 memo->Canvas->LineTo(memo->Width, 0); // 终点:右上角 } } ``` - **说明**:此方法手动绘制边框,适用于需要高度定制的场景。类似引用[4]中动态创建线条的方式[^4]。 ### 注意事项 - **通用建议**:添上边框时,确保不影响文本可读性或布局。测试在不同分辨率下的显示效果。 - **性能考虑**:在动态环境中(如FastReport或C++ Builder),频繁绘制边框可能影响性能;优化事件处理或使用内置属性优先。 - **工具兼容性**:上述方法基于常见平台。如果使用特定工具(如Mermaid图表),引用[1]提到定制样式功能,但memo边框通常不直接相关[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值