AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TEdit mit Rahmen

Ein Thema von zahor · begonnen am 26. Mär 2008 · letzter Beitrag vom 26. Mär 2008
Antwort Antwort
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#1

TEdit mit Rahmen

  Alt 26. Mär 2008, 10:59
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!
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: TEdit mit Rand

  Alt 26. Mär 2008, 11:03
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: TEdit mit Rand

  Alt 26. Mär 2008, 11:28
Oder Du benutzt eine Fremdkomponente.
Gehst Du nach www.torry.net und gibst als Suchbegriff "TEdit" ein.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#4

Re: TEdit mit Rand

  Alt 26. Mär 2008, 11:50
@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?
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#5

Re: TEdit mit Rand

  Alt 26. Mär 2008, 11:56
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.
Thomas
  Mit Zitat antworten Zitat
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TEdit mit Rand

  Alt 26. Mär 2008, 14:46
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.
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: TEdit mit Rahmen

  Alt 26. Mär 2008, 19:40
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.
Thomas
  Mit Zitat antworten Zitat
zahor

Registriert seit: 27. Jun 2006
Ort: im hintersten Winkel des RAMs
182 Beiträge
 
Delphi 2007 Professional
 
#8

Re: TEdit mit Rahmen

  Alt 26. Mär 2008, 21:15
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.
Miniaturansicht angehängter Grafiken
w_h_148.png  
Angehängte Dateien
Dateityp: pas sedit_126.pas (3,2 KB, 31x aufgerufen)
Real Programmers always confuse Christmas and Halloween because Oct31 = Dec25. - Andrew Rutherford
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 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