Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Text in TEdit ausrichten (https://www.delphipraxis.net/131381-text-tedit-ausrichten.html)

Ganymed 24. Mär 2009 07:33


Text in TEdit ausrichten
 
Moin allezusammen!

Wie der Titel es vermuten lässt, möchte ich den Text in einem TEdit (rechtsbündig) ausrichten.

Ich habe schon mal eine Komponente gebaut, die das kann. Nur darf ich in meinem aktuellen Projekt ausschließlich Standard-Komponenten verwenden :(

Zum Glück gibt es in der DP auch dafür eine Lösung (oh ja, ich habe die SuFu bemüht ^^). Dieses Code-Fragment soll das Problem lösen:
Delphi-Quellcode:
SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong( 
  Edit1.Handle, GWL_STYLE) and not ES_LEFT or ES_RIGHT)
Was hier gemacht wird, ist mehr als offensichtlich. Nur leider funktioniert das bei mir nicht. Ich habe es auf D5, D7 und D2007 ausprobiert und nirgendwo hat es etwas bewirkt. Weder im OnCreate-Event, noch im Constructor (der Formulars) und schon gar nicht beim z.B. ButtonClick...

Bei einer Abfrage des GWL_STYLEs des Edits ist zwar ES_RIGHT übernommen worden, aber auf die Anzeige des Textes hat das keine Auswirkung.

Hat jemand eine Idee, woran das liegen könnte und/oder was ich sonst noch versuchen könnte?

Vielen Dank und Grüße vom

Ganymed

joehd 24. Mär 2009 08:32

Re: Text in TEdit ausrichten
 
Also ich weis ja nicht kann es sein vorher markieren ?
Grüße Joachim

DeddyH 24. Mär 2009 08:41

Re: Text in TEdit ausrichten
 
Und so?
Delphi-Quellcode:
unit bla;

interface

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

type
  TEdit = class(StdCtrls.TEdit)
  protected
    procedure CreateParams(var Params: TCreateParams);override;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TEdit.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style and not ES_LEFT or ES_RIGHT;
end;

end.
Unter Delphi 5 klappt das so bei mir.

turboPASCAL 24. Mär 2009 08:55

Re: Text in TEdit ausrichten
 
Also die Kurtzversion von Ganymed funktioniert (D6). :gruebel:

Ganymed 24. Mär 2009 09:00

Re: Text in TEdit ausrichten
 
@DaddyH: Hui! Ich weiß nicht, ob ich dir dafür den Nobelpreis für geniale Workarounds verleihen oder mit Weihwasser und Kruzifix den Dirty-Programming-Teufel austreiben soll... :?

Eine Klasse auf ihrem eigenen Namen abzuleiten ist mir irgendwie nicht geheuer... Obwohl die CreateParams()-Geschichte wunderbar funktioniert und ich auf deine Weise keine neue Komponente bräuchte.

@turboPASCAL: Dass das SetWindowLong() funktioniert, wird auch von anderen Benutzern hier im Forum bestätigt. Nur eben bei mir nicht und ich hab keinen Plan warum... :gruebel:

DeddyH 24. Mär 2009 09:03

Re: Text in TEdit ausrichten
 
Naja, für meine Vorgehensweise findet Du in der DP geschätzte 2000 Beispiele ;). Das hat den Vor- (oder auch Nachteil, je nachdem), dass alle Edits auf dem Formular automatisch angepasst werden.

Ganymed 24. Mär 2009 09:40

Re: Text in TEdit ausrichten
 
Meine ganz persönliche Meinung dazu ist, dass diese Lösung, auch wenn sie technisch einwandfrei funktioniert, trotzdem nicht sauber sein muss.

In meinem Fall ist sie auch eher unangebracht, weil eben nicht alle Edits auf dem Formular (bzw. in der Unit) rechtsbündig sein sollen.

Und es bleibt die Frage, warum die SetWindowLong()-Methode bei mir nicht funktionieren will...

DeddyH 24. Mär 2009 09:56

Re: Text in TEdit ausrichten
 
Dann verwende doch eine Kombination aus diesem Code und meiner Crackerklasse. Damit kannst Du dann die Ausrichtung jedes einzelnen Edits festlegen und eine Komponente muss auch nicht installiert werden.

Ganymed 30. Mär 2009 15:08

Re: Text in TEdit ausrichten
 
Tja, wird mir wahrscheinlich nicht anderes übrig bleiben.

Wobei diese Lösung nicht die Frage klärt, warum das SetWindowLong() bei mir nicht funktionieren will... Wenns jetzt "einfach" nur nicht funktionieren wollte, wäre das eine Sache. Aber ich habe es auf drei unterschiedlichen Systemen mit drei verschiedenen Delphi-Versionen (5, 7 und 2007) probiert, und es hat nirgends funktioniert...

Edit:
Ich habs jetzt mal mit der Crackerklasse versucht, und ganz so sauber scheint das nicht zu funktionieren. Zumindest meckert der FastMM jetzt beim Beenden des Programmes Memoy-Leaks - die hatte ich vorher nicht... Also dieser Methode gegenüber bleibe ich vorerst skeptisch...

Edit:
Hab die Crackerklasse in eine eigene Unit ausgelagert und diese dann in allen betroffenen Units eingefügt. Scheint jetzt zu laufen. (Problem waren wahrscheinlich die abgeleiteten Klassen...)

DeddyH 30. Mär 2009 16:14

Re: Text in TEdit ausrichten
 
Das hier habe ich gerade erfolgreich (ohne MemoryLeaks) unter Delphi 2007 ausgeführt:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TEdit = class(StdCtrls.TEdit)
  private
    FAlignment: Classes.TAlignment;
    procedure SetAlignment(const Value: TAlignment);
  protected
    procedure CreateParams(var Params: TCreateParams);override;
  public
    property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
  end;

  TForm1 = class(TForm)
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TEdit }

procedure TEdit.CreateParams(var Params: TCreateParams);
begin
  inherited;
  case FAlignment of
    taLeftJustify: Params.Style := Params.Style and not (ES_RIGHT or ES_CENTER) or ES_LEFT;
    taRightJustify: Params.Style := Params.Style and not (ES_LEFT or ES_CENTER) or ES_RIGHT;
    taCenter: Params.Style := Params.Style and not (ES_RIGHT or ES_LEFT) or ES_CENTER;
  end;
end;

procedure TEdit.SetAlignment(const Value: TAlignment);
begin
  if FAlignment <> Value then
    begin
      FAlignment := Value;
      RecreateWnd;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edt1.Alignment := taLeftJustify;
  edt2.Alignment := taRightJustify;
  edt3.Alignment := taCenter;
end;

end.
Du scheinst den Speicher anderweitig zu verschwenden ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 Uhr.
Seite 1 von 2  1 2      

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