// Wenn man ein TEdit (mit AutoSize = False) in der Höhe
// ändert, dann kann man die Schrift nicht vertikal zentrieren.
// Nimmt man stattdessen ein TMemo, so erreicht man den Effekt
// bei Anwendung des folgenden Codes:


// Getestet mit D4 und D7 unter XP

type 
  TForm1 = class(TForm) 
    Edit1: TEdit; 
    Memo1: TMemo; 
    procedure FormCreate(Sender: TObject); 
    procedure Memo1KeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState); 
  private 
    { Private-Deklarationen } 
  public 
    { Publice-Deklarationen } 
  end; 
 
var 
  Form1: TForm1; 
 
implementation 
 
{$R *.DFM} 
 
procedure SetVCenter(M: TMemo; Hoehe: integer); 
var 
  rt: TRect; 
  s: string; 
  oben: integer; 
begin 
  s := M.Text; 
  M.Text := ''; 
  M.Height := Hoehe; 
  oben := M.clientheight div 2 - M.Font.Size; 
  M.ScrollBars := ssNone; 
  M.WantReturns := false; 
  M.WordWrap := false; 
  rt := rect(0, oben, M.clientwidth, M.clientheight); 
  sendmessage(M.handle, em_setrect, 0, integer(@rt)); 
  M.Text := TrimRight(s); 
  s := ''; 
  if M.Parent.visible then M.SetFocus; 
  M.selstart := Length(M.Text); 
end; 
 
procedure Abfang(M: TMemo; var Key: Word); 
var 
  amEnde: boolean; 
  lg: Integer; 
begin 
  M.Text := Trimright(M.Text); 
  lg := Length(M.Text); 
  amEnde := M.selstart = lg; 
  case key of 
    VK_UP: Key := VK_LEFT; 
    VK_DOWN: begin 
        if not amEnde then Key := VK_RIGHT 
        else Key := 0; 
      end; 
    VK_RIGHT: if amEnde then Key := 0; 
    VK_END: begin 
        Key := 0; 
        M.selstart := lg; 
      end; 
  end; 
end; 
 
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
  Abfang(TMemo(Sender), Key); 
end; 
 
// Beispielaufruf 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  Memo1.Font.Size := 20; // z.B. 
  SetVCenter(Memo1, 100); // z.B. 
end; 



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke