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/)
-   -   Problem beim zeichnen eines Rahmens um TEdit (https://www.delphipraxis.net/61197-problem-beim-zeichnen-eines-rahmens-um-tedit.html)

Sharky 18. Jan 2006 09:36


Problem beim zeichnen eines Rahmens um TEdit
 
Hai ihr lieben,

mit diesem Code zeichne ich im OnEnter eines TEdits einen Rahmen um dieses und entferne ihn im OnExit wieder.
Eigentlich funktioniert dies auch ... aber ... wenn ich die Anwendung starte (einfach zwei Edits auf der Form und beiden das selbe OnEnter , OnExit zugewiesen) hast das erste Edit keinen Rahmen. Erst wenn ich den Focus ändere wird er so gezeichnet wie ich es möchte.

Hat einer eine Idee woran das liegen kann?

Delphi-Quellcode:
procedure DrawControlRect(AHandel: HWND; AColor: TColor);
 // Diese Procedure habe ich im großen und ganzen bei
 // den Jedis "geklaut"
var
  LHDC:   HDC;
  LRect:  TRect;
  LCanvas: TCanvas;
begin
  LHDC := GetWindowDC(AHandel);
  try
    GetWindowRect(AHandel, LRect);
    OffsetRect(LRect, -LRect.Left, -LRect.Top);
    LCanvas := TCanvas.Create;
    with LCanvas do
    begin
      try
        Handle := LHDC;
        Brush.Color := AColor;
        FrameRect(LRect);
        InflateRect(LRect, -1, -1);
        FrameRect(LRect);
      finally
        Free;
      end;
    end;
  finally
    ReleaseDC(AHandel, LHDC);
  end;
end;

procedure TForm1.edt_Edit2Enter(Sender: TObject);
begin
  DrawControlRect((Sender as TWinControl).Handle, clBlue);
end;

procedure TForm1.edt_Edit2Exit(Sender: TObject);
begin
  (Sender as TWinControl).Perform(CM_RECREATEWND, 0, 0);
end;

Der_Unwissende 18. Jan 2006 09:57

Re: Problem beim zeichnen eines Rahmens um TEdit
 
Hi,
nun ja, vielleicht liegt es ja daran, dass das OnEnter-Ereignis nur aufgerufen wird, wenn er den Focus erhält. Wenn Delphi den Focus anders setzt (beim Start), dann solltest du einfach in das OnCreate Ereignis den Aufruf der entsprechenden Methode aufnehmen.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  if assigned(self.ActiveControl) then
    begin
      DrawControlRect(self.ActiveControl.Handle, clBlue);
    end;
end;
Gruß Der Unwissende

Bernhard Geyer 18. Jan 2006 10:02

Re: Problem beim zeichnen eines Rahmens um TEdit
 
Zitat:

Zitat von Sharky
Hat einer eine Idee woran das liegen kann?

Systembedingt falsch.
Jedes neuzeichnen des Formulars wird deinen Rahmen entfernen. Und da beim start der Anwendung mit sicherheit genügend "Neuzeichen-Befehle" kommen ist dein Rahmen weg.
Schon mal probiert einfach die Anwendung zu minimieren? Dann dürfte dein Rahmen auch weg sein.
Probier mal den Code im OnPaint-Event des Formulars unterzubringen.

Sharky 18. Jan 2006 10:09

Re: Problem beim zeichnen eines Rahmens um TEdit
 
Zitat:

Zitat von Bernhard Geyer
Systembedingt falsch.

Jup,
das war es dann wohl. Ich hatte die Form zwar maximiert und die grösse geändert und verschoben aber nie minimiert. :cry:

Zitat:

...Probier mal den Code im OnPaint-Event des Formulars unterzubringen.
Dann muss ich mich mal in die OnPaint der Komponente einklinken da ich den Code für ein eigenes T(TNT)Edit haben möchte.
Ich habe es nur auf die zum testen im OnEnter der "normalen" Edits gemacht. Mal schauen wie die Jedis das bei ihrem TJVEdit gemacht haben.

Danke für den Hinweiss. Jetzt weiss ich wo ich ansetzen muss.

@Der_Unwissende: Das OnEnter wird schon aufgerufen. Nur wird halt danach, wie Bernhard erkannte, alles wieder überzeichnet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.

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