Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Ausrichtung von Text


Stauch - Fr 15.11.02 11:05
Titel: Ausrichtung von Text
Gibt es eine (einfache) Variante Text in Tedit- oder TStringGrid- Elementen
rechtsbündig oder zentriert auszurichten.

Oder hat jemand einen Tip, in welche Richtung ich experimentieren könnte?

C.


Keldorn - Fr 15.11.02 22:08

Hallo

in einem Tedit kann ich es dir nicht sagen, in einem Stringgrid geht dies sehr wohl, indem du im ONdrawCell-ereignis die Zelle selber zeichnest.
mit textout kannst du den text an einer bestimmten position ausgeben. Mit Textwidth kannst du die Textlänge bestimmen und mit ein wenig mathematik den text rechtsbündig ausgeben.

einfach ? es gibt schwierigere sachen :wink:

Mfg Frank


Tino - So 17.11.02 18:00

Hallo,

die tEdit Komponente bietet Dir leider nicht die Möglichkeit einen Text z. B. Rechtsbündig auszurichten!

Du kannst aber eine Abgeleitetekomponete von tEdit erstellen. Hier mal ein Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type
  tRightEdit = Class (tEdit)
  Protected
    Procedure CreateParams (var Params: tCreateParams); override;
  End;

Procedure Register;

Implementation

Procedure Register;
Begin
  RegisterComponents('Samples',  [tRightEdit]);
End;

{ tRightEdit }

Procedure tRightEdit.CreateParams (var Params: tCreateParams);
Begin
  Inherited CreateParams (Params);
  Params.Style := Params.Style or ES_RIGHT;
End;


Gruß
TINO

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Stauch - Mo 18.11.02 12:49

Bin am ausprobieren.
:)
Danke

C.


Stauch - Mo 18.11.02 13:26

Wahrscheinlich eine ziemlich blöde Frage aber was solls :oops:

Wie löse ich das OnDrawCell Ereignis aus???

C.


Keldorn - Mo 18.11.02 13:44

drück mal f1 ! und lies dir erstmal durch was bei ondrawcell steht.

Mfg Frank


Stauch - Mo 18.11.02 13:50

Danke für den Hinweis :?
Aber das hatte ich bereits und das Fragezeichen über meinem Haupt ist davon nicht kleiner geworden

C.


Keldorn - Mo 18.11.02 14:07

das ereignis wird ausgelöst, wenn eine Zelle neu gezeichnet werden muß.

du willst ja drauf reagieren und es nicht unbedingt auslösen.

mit Stringrid.repaint zeichnest du das grid neu, damit wird für jede Zelle auch einzeln das ondrawcell - ereignis ausgelöst.

Beispiel für ondrawcell:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Stringgrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var s:string;
begin
  with (sender as Tstringgrid) do
    begin
      //Zellhintergrund  (jede zweite Zeile blau)
      if (arow mod 2) = 0 then canvas.brush.color:=clblue
                          else canvas.brush.color:=clwhite;
      if gdfixed in state then canvas.brush.color:=fixedcolor;
      canvas.fillrect(rect);

      //jede zweite splate rechtsbündig
      s:=cells[acol,arow];
      if (acol mod 2) = 0 then
        canvas.textrect(rect,rect.Right-canvas.textwidth(s)-2,rect.top+2,s)
       else
        canvas.textout(rect.left+2,rect.top+2,s);
    end;
end;


mfg Frank

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Delete - Mo 18.11.02 14:09

So und das ganze jetzt noch mit rechts ausgerichteten Text:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  sz: TSize;
  x: Integer;
  s: String;
begin
  s := StringGrid1.cells[ACol,ARow];
  sz := StringGrid1.Canvas.TextExtent(s);
  x := Rect.Right-Rect.Left-sz.cx-2;
  StringGrid1.Canvas.TextOut(x, Rect.Top, s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[0,0] := 'Hello World';
  StringGrid1.DefaultDrawing := False;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Stauch - Mo 18.11.02 14:47

Danke, daß hilft mir weiter.
Keldorn hat folgendes geschrieben:
das ereignis wird ausgelöst, wenn eine Zelle neu gezeichnet werden muß.

du willst ja drauf reagieren und es nicht unbedingt auslösen.

mit Stringrid.repaint zeichnest du das grid neu, damit wird für jede Zelle auch einzeln das ondrawcell - ereignis ausgelöst.

Doch doch, ich wollte es schon auslösen, die DrawCell-Procedure habe ich ja teilweise schon lauffähig, aber ich wußte halt nicht, wie sie gestartet werden kann.
Nochmal Danke an alle
C. :)


cwille - Mi 27.10.04 13:43

Hallo Tino,

wie und unter welchem Ereignis muß ich die Methode CreateParams aufrufen.
Ist es nicht so das RecreateWnd und createWnd CreateParams aufrufen.
Mit nachfolgender Anweisung habe ich mal rumprobiert. Hat aber leider nicht funktioniert.


procedure TFrmAuszErf.TxtBetragKeyPress(Sender: TObject; var Key: Char);
var Alignm :tRightEdit;
alignment : TAlignment;
begin
if (key = #13) OR (key =#9) Then
Begin
alignment:=taRightJustify;
?????
End;

Danke und Gruß
Carsten

Tino hat folgendes geschrieben:
Hallo,

die tEdit Komponente bietet Dir leider nicht die Möglichkeit einen Text z. B. Rechtsbündig auszurichten!

Du kannst aber eine Abgeleitetekomponete von tEdit erstellen. Hier mal ein Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type
  tRightEdit = Class (tEdit)
  Protected
    Procedure CreateParams (var Params: tCreateParams); override;
  End;

Procedure Register;

Implementation

Procedure Register;
Begin
  RegisterComponents('Samples',  [tRightEdit]);
End;

{ tRightEdit }

Procedure tRightEdit.CreateParams (var Params: tCreateParams);
Begin
  Inherited CreateParams (Params);
  Params.Style := Params.Style or ES_RIGHT;
End;


Gruß
TINO

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.