Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TEdit mit Rahmen (https://www.delphipraxis.net/110891-tedit-mit-rahmen.html)

zahor 26. Mär 2008 10:59


TEdit mit Rahmen
 
Wie kann ich ein TEdit mit Rand machen, der angezeigt wird, sobald ich reinklicke, und wieder verschwindet, wenn ich ein anderes Control aktiviere, z.B. auf nen Button klicke? Ich meine von der Idee wie dieses Suchfeld links oben im Apple Store. Ist das mit erträglichem Aufwand möglich? Also nicht einfach mit Canvas ein Rechteck um das Edit zeichnen, das ist ja kein Problem, sondern so rund und mit Verlauf.
Geht das mit Delphi (gut)? Habe sowohl 7 als auch 2007.
Danke schonmal!

Bernhard Geyer 26. Mär 2008 11:03

Re: TEdit mit Rand
 
Theming-Komponenten wie z.B. das ElPack wären ein Möglichkeit welche die Anwendung unabhängig vom eingestellten Windows-Themen darstellen lassen können.

RavenIV 26. Mär 2008 11:28

Re: TEdit mit Rand
 
Oder Du benutzt eine Fremdkomponente.
Gehst Du nach www.torry.net und gibst als Suchbegriff "TEdit" ein.

zahor 26. Mär 2008 11:50

Re: TEdit mit Rand
 
@Bernhard Geyer: Mit diesen Theming-Packs habe ich schlechte Erfahrungen gemacht, die treiben meistens die Größe der EXEs und der Sourcen enorm in die Höhe. Ich hab sie auch mal ne Weile verwendet, dann aber wieder weggelasssen, weil sie so Resourcenfressend sind (--> Performance).
Aber bei Torry guck ich mal. Danke! [EDIT] Gab nix passendes [/EDIT]
Aber geht das auch mit Delphi-internen Mittel?

toms 26. Mär 2008 11:56

Re: TEdit mit Rand
 
Zitat:

Zitat von zahor
Aber geht das auch mit Delphi-internen Mittel?

Du müsstest das Edit selber zeichnen. Eine Komponente von TEdit/TCustomEdit ableiten und
WM_NCPAINT, WM_NCCALCSIZE, OnEnter, OnExit behandeln.

zahor 26. Mär 2008 14:46

Re: TEdit mit Rand
 
so, hab's jetzt mal probiert. allerdings funzt das mit dem OnEnter / OnExit noch nicht. Könntet ihr mir da helfen, was ich da machen muss?
Habe bisher einfach nur einen 1px roten Rahmen zeichnen lassen.
So sieht die Unit aus:
Delphi-Quellcode:
unit SEdit;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Messages, graphics;

type
  TSEdit = class(TEdit)
  private
    procedure WMNCCalcSize(var Msg: TWMNCCALCSIZE); message WM_NCCALCSIZE;
    procedure WMNCPAINT(var Msg: TWMNCPaint); message WM_NCPaint;
    procedure unmark;
  protected
    { Protected-Deklarationen }
  public
    procedure RePaint; override;
  published
    procedure DoEnter;
    procedure DoExit;
    { Published-Deklarationen }
  end;

procedure Register;

var h: TWMNCPAINT;
  dc: hDc;
  Pen: hPen;
  OldPen: hPen;
  OldBrush: hBrush;
  sel: boolean=true;

implementation

procedure Register;
begin
  RegisterComponents('Zusätzlich', [TSEdit]);
end;

procedure TSEdit.RePaint;
begin
  WMNCPAINT(h);
end;

procedure TSedit.WMNCCalcSize(var Msg: TWMNCCalcSize);
begin
  exit;
end;

procedure TSEdit.WMNCPAINT(var Msg: TWMNCPAINT);
begin
  inherited;
  if not sel then
    unmark;
  dc := GetWindowDC(Handle);
  Msg.Result := 1;
  //Change the RGB value to change the color
  Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
  OldPen := SelectObject(dc, Pen);
  OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
  Rectangle(dc, 0, 0, Width, Height);
  SelectObject(dc, OldBrush);
  SelectObject(dc, OldPen);
  DeleteObject(Pen);
  ReleaseDC(Handle, Handle);
end;

procedure TSEdit.DoEnter;
begin
  sel := true;
end;

procedure TSEdit.DoExit;
begin
  sel := false;
end;

procedure TSEdit.unmark;
begin
  inherited;
  dc := GetWindowDC(Handle);
  //Change the RGB value to change the color
  Pen := CreatePen(PS_SOLID, 1, color);
  OldPen := SelectObject(dc, Pen);
  OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
  Rectangle(dc, 0, 0, Width, Height);
  SelectObject(dc, OldBrush);
  SelectObject(dc, OldPen);
  DeleteObject(Pen);
  ReleaseDC(Handle, Handle);
end;

end.

toms 26. Mär 2008 19:40

Re: TEdit mit Rahmen
 
Hallo, hier mal eine kleine Weiterentwicklung.

PS: Ist nur mal ein Anfang und ist noch nicht perfekt!

Delphi-Quellcode:
unit SEdit;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Messages, Graphics;

type
  TSEdit = class(TEdit)
  private
    Fh: TWMNCPAINT;
    Fdc: hDc;
    FPen: hPen;
    FOldPen: hPen;
    FOldBrush: hBrush;
    FSelected: boolean;
    procedure WMNCCalcSize(var Msg: TWMNCCALCSIZE); message WM_NCCALCSIZE;
    procedure WMNCPAINT(var Msg: TWMNCPaint); message WM_NCPAINT;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
    procedure RedrawBorder;
  protected
    { Protected-Deklarationen }
  public
    procedure RePaint; override;
    constructor Create(AOwner: TComponent); override;
  published
    { Published-Deklarationen }
  end;

procedure Register;


implementation

procedure Register;
begin
  RegisterComponents('Additional', [TSEdit]);
end;

constructor TSedit.Create(AOwner: TComponent);
begin
  inherited;
  ParentFont := True;
  FSelected := False;
end;

procedure TSEdit.RePaint;
begin
  WMNCPAINT(Fh);
end;

procedure TSedit.WMNCCalcSize(var Msg: TWMNCCalcSize);
begin
  inherited;
  InflateRect(Msg.CalcSize_Params^.rgrc[0], -1, -1);
end;

procedure TSEdit.WMNCPAINT(var Msg: TWMNCPAINT);
begin
  inherited;
  RedrawBorder;
end;


procedure TSedit.WMSetFocus(var Message: TWMSetFocus);
var
  Msg: TWMNCPAINT;
begin
  inherited;
  if not (csDesigning in ComponentState) then
  begin
    FSelected := True;
    RedrawBorder;
  end;
end;

procedure TSedit.WMKillFocus(var Message: TWMKillFocus);
begin
  inherited;
  if not (csDesigning in ComponentState) then
  begin
    FSelected := False;
    RedrawBorder;
  end;
end;

procedure TSedit.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  if (GetActiveWindow <> 0) then
  begin
    RedrawBorder();
  end;
end;

procedure TSedit.CMMouseLeave(var Message: TMessage);
begin
  inherited;
  RedrawBorder();
end;

procedure TSEdit.RedrawBorder;
begin
  inherited;
  if FSelected then
  begin
    Fdc := GetWindowDC(Handle);
    //Change the RGB value to change the color
    FPen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    FOldPen := SelectObject(Fdc, FPen);
    FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH));
    Rectangle(Fdc, 0, 0, Width, Height);
    SelectObject(Fdc, FOldBrush);
    SelectObject(Fdc, FOldPen);
    DeleteObject(FPen);
    ReleaseDC(Handle, Handle);
  end else
  begin
    Fdc := GetWindowDC(Handle);
  //Change the RGB value to change the color
    FPen := CreatePen(PS_SOLID, 1, color);
    FOldPen := SelectObject(Fdc, FPen);
    FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH));
    Rectangle(Fdc, 0, 0, Width, Height);
    SelectObject(Fdc, FOldBrush);
    SelectObject(Fdc, FOldPen);
    DeleteObject(FPen);
    ReleaseDC(Handle, Handle);
  end;
end;


end.

zahor 26. Mär 2008 21:15

Re: TEdit mit Rahmen
 
Liste der Anhänge anzeigen (Anzahl: 2)
um das ganze gleich wieder weiterzuentwickeln:
die farben können jetzt im objektinspektor eingestellt werden,
ausserdem werden jetzt abgerundete rechtecke verwendet.
ich hängs's auch gleich mal dran.
was mich im moment noch stört, ist wie das ganze zur entwicklungszeit auf dem formular aussieht (beispiel siehe anhang)
Delphi-Quellcode:
unit SEdit;

interface

uses
  Windows, SysUtils, Classes, Controls, StdCtrls, Messages, Graphics;

type
  TSEdit = class(TEdit)
  private
    Fh: TWMNCPAINT;
    Fdc: hDc;
    FPen: hPen;
    FOldPen: hPen;
    FOldBrush: hBrush;
    FSelected: boolean;
    rcolorfocused, rcolornotfocused: tcolor;
    procedure WMNCCalcSize(var Msg: TWMNCCALCSIZE); message WM_NCCALCSIZE;
    procedure WMNCPAINT(var Msg: TWMNCPaint); message WM_NCPAINT;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
    procedure RedrawBorder;
  protected
    { Protected-Deklarationen }
  public
    procedure RePaint; override;
    constructor Create(AOwner: TComponent); override;
  published
    property ColorFocused: TColor read rColorFocused write rcolorFocused;
    property ColorNotFocused: TColor read rcolornotfocused write rColorNotFocused;
  end;

procedure Register;


implementation

procedure Register;
begin
  RegisterComponents('Zusätzlich', [TSEdit]);
end;

constructor TSedit.Create(AOwner: TComponent);
begin
  inherited;
  ParentFont := True;
  FSelected := False;
end;

procedure TSEdit.RePaint;
begin
  WMNCPAINT(Fh);
end;

procedure TSedit.WMNCCalcSize(var Msg: TWMNCCalcSize);
begin
  inherited;
  InflateRect(Msg.CalcSize_Params^.rgrc[0], -1, -1);
end;

procedure TSEdit.WMNCPAINT(var Msg: TWMNCPAINT);
begin
  inherited;
  RedrawBorder;
end;


procedure TSedit.WMSetFocus(var Message: TWMSetFocus);
begin
  inherited;
  if not (csDesigning in ComponentState) then
  begin
    FSelected := True;
    RedrawBorder;
  end;
end;

procedure TSedit.WMKillFocus(var Message: TWMKillFocus);
begin
  inherited;
  if not (csDesigning in ComponentState) then
  begin
    FSelected := False;
    RedrawBorder;
  end;
end;

procedure TSedit.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  if (GetActiveWindow <> 0) then
  begin
    RedrawBorder();
  end;
end;

procedure TSedit.CMMouseLeave(var Message: TMessage);
begin
  inherited;
  RedrawBorder();
end;

procedure TSEdit.RedrawBorder;
begin
  inherited;
  if FSelected then
  begin
    Fdc := GetWindowDC(Handle);
    //Change the RGB value to change the color
    FPen := CreatePen(PS_SOLID, 1, rColorFocused);
    FOldPen := SelectObject(Fdc, FPen);
    FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH));
    RoundRect(Fdc, 0, 0, Width, Height, 3, 3);
    SelectObject(Fdc, FOldBrush);
    SelectObject(Fdc, FOldPen);
    DeleteObject(FPen);
    ReleaseDC(Handle, Handle);
  end else
  begin
    Fdc := GetWindowDC(Handle);
  //Change the RGB value to change the color
    FPen := CreatePen(PS_SOLID, 1, rColorNotFocused);
    FOldPen := SelectObject(Fdc, FPen);
    FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH));
    RoundRect(Fdc, 0, 0, Width, Height, 3, 3);
    SelectObject(Fdc, FOldBrush);
    SelectObject(Fdc, FOldPen);
    DeleteObject(FPen);
    ReleaseDC(Handle, Handle);
  end;
end;


end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz