線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1374
推到 Plurk!
推到 Facebook!

自製元件無法觸發 OnMouseDown 事件

答題得分者是:Justmade
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-27 14:47:08 IP:202.39.xxx.xxx 未訂閱
小弟做了一個簡單的元件, 目的是可以在一個 TEdit 內可以顯示不同顏色的字元 於是把一個 TImage 元件放進 TEdit 內,  當用滑鼠 Click 在 TImage 上時, 便 SetFocus 到 TEdit 上 使用時利用該 TImage.Canvas.TextOut 的方式來畫出不同顏色的字元 (以 FColorCode 來記錄字元的顏色) 可是出現了一個問題,  假設已經在 TEdit 內輸入了一些字 此時欲用滑鼠點選該 TEdit 元件來改變 TEdit.SelStart 值 發現它是沒有作用的, 一定要用鍵盤的上/下/Home/End等鍵才有用 請問一下大家, 小弟該怎麼解決這個問題?    
unit MyEdit;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;    type
  TMyEdit = class(TEdit)
  private
    FImg: TImage;
    FLogFont: TLogFont;
    FColorCode: string;        procedure SetColorCode(Value: string);
  protected
    procedure ImgClick(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;        property Img: TImage read FImg;
    property ColorCode: string read FColorCode write SetColorCode;
  published
  end;    procedure Register;    implementation    procedure Register;
begin
  RegisterComponents('My', [TMyEdit]);
end;    { TMyEdit }    constructor TMyEdit.Create(AOwner: TComponent);
begin
  inherited;      Font.Name := 'Courier New';
  Font.Size := 12;
  Font.Height := 24;      GetObject(Font.Handle, SizeOf(TLogFont), @FLogFont);
  FlogFont.lfWidth := 8;
  Font.Handle := CreateFontIndirect(FLogFont);      FImg := TImage.Create(Self);
  FImg.Parent := Self;
  FImg.Width := Width + 900;
  FImg.Align := alClient;
  FImg.Canvas.Brush.Color := clBlack;
  FImg.Canvas.FillRect(Rect(0, 0, Width, Height));
  FImg.Refresh;      FImg.Canvas.Font.Assign(Font);
  FImg.Canvas.Font.Color := clRed;
  FImg.OnClick := ImgClick;      FColorCode := '';
end;    destructor TMyEdit.Destroy;
begin
  if Assigned(FImg) then
    FImg.Free;      inherited;
end;    procedure TMyEdit.ImgClick(Sender: TObject);
begin
  Self.SetFocus;
end;    procedure TMyEdit.SetColorCode(Value: string);
begin
  if FColorCode <> Value then
    FColorCode := Value;
end;    end.
--- 每個人都是一本書
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-27 16:02:48 IP:218.85.xxx.xxx 未訂閱
我覺得你可以直接創建一個Canvas物件而無須借助使用Image的這個屬性 type TMyEdit = class(TEdit) private FDC: HDC; FCanvas: TCanvas; protected public constructor Create(AOwner: TComponent); override; destructor Destroy; override; published end; { TMyEdit } constructor TMyEdit.Create(AOwner: TComponent); begin inherited; FDC := GetDC(Handle); FCanvas := TCanvas.Create; FCanvas.Handle := FDC; end; destructor TMyEdit.Destroy; begin FCanvas.Free; ReleaseDC(Handle, FDC); inherited; end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-27 18:33:27 IP:202.39.xxx.xxx 未訂閱
感謝 Rain 兄的解答. :) 小弟斗膽再請教, 直接用 TCanvas 而不用 TImage 小弟就不知怎麼將字顯示在 TMyEdit.Canvas 上了 小弟用了如下的程式, 但 MyEdit1 內無法顯示紅色的字 懇請指正, 小弟哪裏做錯了. 謝謝.    
var
  TmpRect: TmpRect;
begin
  MyEdit1.Canvas.Handle := GetDC(MyEdit1.Handle);
  TmpRect := MyEdit1.ClientRect;
  MyEdit1.Canvas.Rectangle(TmpRect.Left, TmpRect.Top, TmpRect.Right, TmpRect.Bottom);
  MyEdit1.Canvas.Brush.Color := clBlack;
  MyEdit1.Canvas.FillRect(TmpRect);
  MyEdit1.Canvas.Font.Color := clRed;
  MyEdit1.Canvas.TextOut(0, 0, 'TEST');
end;
--- 每個人都是一本書 發表人 - hagar 於 2003/05/27 18:35:33
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-27 20:08:56 IP:61.10.xxx.xxx 未訂閱
hagar 兄,    我也同意直接使用 TCanvas    這是把你們的碼合在一起 :
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TMyEdit = class(TEdit)
  private
    FDC: HDC;
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Canvas : TCanvas read FCanvas write FCanvas;
  published
  end;      TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    MyEdit, MyEdit2 : TMyEdit;
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    constructor TMyEdit.Create(AOwner: TComponent);
begin
  inherited;
  Parent := TWinControl(AOwner);
  FDC := GetDC(Handle);
  FCanvas := TCanvas.Create;
  FCanvas.Handle := FDC;
  FCanvas.Rectangle(ClientRect.Left, ClientRect.Top, ClientRect.Right, ClientRect.Bottom);
end;    destructor TMyEdit.Destroy;
begin
  FCanvas.Free;
  ReleaseDC(Handle, FDC);
  inherited;
end;    procedure TMyEdit.WMPaint(var Message: TWMPaint);
begin
  inherited;
  FCanvas.Brush.Color := clBlack;
  FCanvas.FillRect(ClientRect);
  FCanvas.Font.Color := clRed;
  FCanvas.TextOut(0, 0, Text);
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  MyEdit := TMyEdit.Create(self);
  MyEdit.Text := 'MyTest1';
  MyEdit2 := TMyEdit.Create(self);
  MyEdit2.Top := 30;
  MyEdit2.Text := 'MyTest2';
end;    procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyEdit.Free;
  MyEdit2.Free;
end;    end.
不用放任何元件, copy to unit1 執行即可 這還有很多問題,只是初按照你倆的構思的初步架構。
系統時間:2024-05-04 16:47:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!