Entwickler-Ecke

Windows API - Editfeld mit zentriertem Text...


Rool - Di 08.04.03 15:43
Titel: Editfeld mit zentriertem Text...
Wie kann ich den Text in meinem editfeld zentrieren???


patrick - Di 08.04.03 18:13

das ist mit der standart komponenten nicht möglich.
musst dir ne alternative runterladen die das kann.
(frag mich nich welche das kann) :oops:


fcg - Di 08.04.03 18:43

versuch es mit den length und width Eigenschaften des Edit-Feldes. Das irgendwie so hinzurechnen, das der string (mit nen paar leerzeichen vielleicht) in der mitte steht.

fcg


wulfskin - Di 08.04.03 19:39

Hallo Rool!

Im Prinzip können das die Windowskomponenten schon, nur muss man denen das vor dem Erstellen sagen und das kann Delphi leider nicht.
Die einzige Möglichkeit ist es, das Edit manuell zu erstellen (näheres zu finden in Luckie's nonVCL Hilfe):

Quelltext
1:
2:
3:
4:
5:
6:
7:
const
IDC_EDIT = 1;

procedure TForm1.Button1Click(Sender: TObject);
begin
hwndEdit := CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', 'Edit1', WS_VISIBLE or
  WS_CHILD or ES_CENTER, 10, 20, 400, 20, Handle, IDC_EDIT, hInstance, nil);
Zitat:
After the control has been created, these styles cannot be modified, except as noted.

Gruß wulfskin!


Delete - Di 08.04.03 21:40

wulfskin hat folgendes geschrieben:
Die einzige Möglichkeit ist es, das Edit manuell zu erstellen (näheres zu finden in Luckie's nonVCL Hilfe):

Davon würde ich abraten, weil so erstellte Controls nicht mehr mit TAB angesteuert werden können. Diese Lektion musste ich beim Versuch lernen, ein IP-Control in ein VCL-Programm einbinden zu wollen.

Also, hier sollte man sich entweder eine passende Komponente besorgen, oder (entsprechende Kenntnisse vorausgesetzt) man erweitert die Standard-Komponente von Delphi um das entsprechende Stilattribut (hab´s nicht probiert, aber es wäre eine Idee), oder man schreibt das Programm, sofern möglich!, ohne VCL auf dem API-Weg.


wulfskin - Di 08.04.03 22:06

Hast ja wie immer recht, war ja nur so ne Idee ;)!


Delete - Mi 09.04.03 06:56

Nix für ungut, wulfskin. Wollte bloß meinen Senf dazu geben. :)


Tino - Mi 09.04.03 10:41

Hallo,

ich habe mir mal eine kleine Komponente gebastelt die das kann:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
type
  tAlignmentEdit = class(TEdit)
      private
        fAlignment: TAlignment;
      protected
        procedure SetAlignment (Value: TAlignment);
      public
        procedure CreateParams (var Params: TCreateParams); override;
      published
        property Alignment: TAlignment read FAlignment write SetAlignment
          default taLeftJustify;
    end;
    
procedure Register;

implementation

procedure tAlignmentEdit.CreateParams (var Params: TCreateParams);
const
  cAlignments : Array [TAlignment] of Longint = (ES_LEFT, ES_RIGHT, ES_CENTER);
begin
  inherited CreateParams (Params);
  Params.Style := Params.Style or cAlignments [FAlignment] or ES_MULTILINE;
end;

procedure tAlignmentEdit.SetAlignment;
begin
  if FAlignment <> Value then
  begin
    FAlignment := Value;
    RecreateWnd;
  end;
end;

procedure Register;
begin
  RegisterComponents('Samples', [tAlignmentEdit]);
end;


Gruß
Tino


Motzi - Mi 09.04.03 10:43

@Tino: Wieso aktivierst du Multiline in einem Edit?!? :shock:


Rool - Mi 09.04.03 15:13
Titel: ...
jau, vielen dank für eure antworten.
das die komponente nicht mit tab angesteuert weden kann, ist gar nicht schlimm, sie ist eigentlich immer unsichtbar, nur wenn man doppelt auf n label klickte, legt sich das feld darüber und man kann die werte editieren. sobald der focus das control verlässt wird es wieder unsichtbar. deswegen: DANKE!!!


Tino - Do 10.04.03 10:14

Motzi hat folgendes geschrieben:
@Tino: Wieso aktivierst du Multiline in einem Edit?!? :shock:

Ich hatte die Komponete einwenig vom Funktionumfang gekürzt (extra für die Frage von Rool) und habe es wohl übersehen. Hier der komplette Code der Komponente:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
Type
  tAlignmentEdit = class(TEdit)
      private
        FAlignment: TAlignment;
        FMultiline: Boolean;
      protected
        procedure SetAlignment (Value: TAlignment);
        procedure SetMultiline (Value: Boolean);
      public
        procedure CreateParams (var Params: TCreateParams); override;
      published
        property Alignment: TAlignment read FAlignment write SetAlignment
          default taLeftJustify;
        property Multiline: Boolean read FMultiline write SetMultiline;
    End;

procedure tAlignmentEdit.CreateParams (var Params: TCreateParams);
const
  cAlignments : Array [TAlignment] of Longint = (ES_LEFT, ES_RIGHT, ES_CENTER);
  cMultiline  : Array [Boolean]    of Longint = (0, ES_MULTILINE);
begin
  inherited CreateParams (Params);
  Params.Style := Params.Style or cAlignments [FAlignment] or cMultiline [FMultiline];
end;

procedure tAlignmentEdit.SetAlignment;
begin
  if FAlignment <> Value then
  begin
    FAlignment := Value;
    RecreateWnd;
  end;
end;

procedure tAlignmentEdit.SetMultiline (Value: Boolean);
begin
  if FMultiline <> Value then
  begin
    FMultiline := Value;
    RecreateWnd;
  end;
end;

Gruß
Tino


The_Unknown - Mo 14.04.03 20:44

Nimm doch ein Memo, welches du zentriert setzt (das ist nich das problem). Leider kann der user einen Zeilenumbruch machen, den müsste man unterdrücken...