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 Eigene Komponente: Position wird nicht richtig gesetzt (https://www.delphipraxis.net/104397-eigene-komponente-position-wird-nicht-richtig-gesetzt.html)

guidok 3. Dez 2007 10:17


Eigene Komponente: Position wird nicht richtig gesetzt
 
Hmm, ich komm grad nicht weiter, obwohl es wahrscheinlich nur eine Kleinigkeit ist...

Ziel ist ein Edit mit angehängtem Label (ich weiß, dass gibt es bereits, ich mach es trotzdem selbst).

Ich leite von TCustomEdit ab und erzeuge darin ein Label abgeleitet von TCustomLabel.

Delphi-Quellcode:
  TbroseEdit = class(TCustomEdit)
  private
    fLabel: TbroseEditLabel;
    function GetCaption:TCaption;
    procedure SetCaption(Value: TCaption);
  protected
    procedure SetParent(AParent: TWinControl); override;
  public
    constructor Create(AOwner: TComponent); Override;
    destructor Destroy; override;
  published
    property Caption: TCaption read GetCaption write SetCaption;
    property EditLabel: TbroseEditLabel read fLabel write fLabel;
    property OnChange;
    property OnEnter;
    property OnExit;
  end;

constructor TbroseEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Height := 17;
  BevelInner := bvRaised;
  BevelKind := bkFlat;
  BevelOuter := bvLowered;
  BorderStyle := bsNone;

//Label erzeugen
  fLabel := TbroseEditLabel.Create(self);
  fLabel.SetBounds(Left - 100, Top, 100, 17);

  //FDoAutocomplete := True;
  //FIndex := -1;
end;

procedure TbroseEdit.SetParent(AParent: TWinControl);
begin
  inherited SetParent(AParent);
  if fLabel = nil then exit;
  fLabel.Parent := AParent;
  fLabel.Visible := True;
end;
Soweit so gut, nun soll das Label 100 Punkte VOR dem Edit liegen (siehe im Konstruktor), wenn ich das Editfeld auf dem Formular platziere dann haben anscheinend Left und Top des Edit den Wert 0, da das Label auf der Position -100,0 eingefügt wird. Blöderweise geht das weder zur Entwurfs- noch zur Laufzeit.

Deep-Sea 3. Dez 2007 10:21

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Du musst das Label doch mit verschieben, wenn das Edit verschoben wird, oder?! :)

guidok 3. Dez 2007 10:25

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Ja, das stimmt schon, soweit bin ich aber noch gar nicht. Es ist ja schon beim ersten Platzieren nicht da wo es hin soll.

Deep-Sea 3. Dez 2007 10:28

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Zitat:

Zitat von guidok
Ja, das stimmt schon, soweit bin ich aber noch gar nicht. Es ist ja schon beim ersten Platzieren nicht da wo es hin soll.

Wenn du zB. Left im Konstruktor des Edits nicht setzt, ist es 0. Also ist das Label wie du schon sagst bei -100.

a) Schau dir doch TLabeledEdit an, wie es da gemacht wird
b) Überschreibe die Methode Resize. Da drin kannst du dann das Label neu Ausrichten.

guidok 3. Dez 2007 10:30

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Ich habe jetzt mal was ergänzt.

Delphi-Quellcode:
procedure TbroseEdit.WMSize(var Message: TWMSize);
begin
  fLabel.SetBounds(Left - 100, Top, 100, 17);
  inherited;
end;

procedure TbroseEdit.WMMove(var Message: TWMMove);
begin
  fLabel.SetBounds(Left - 100, Top, 100, 17);
  inherited;
end;
Jetzt stimmt es zumindest mal zur Laufzeit, aber noch nicht zur Entwurfszeit.

Deep-Sea 3. Dez 2007 10:32

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Zitat:

Zitat von guidok
Jetzt stimmt es zumindest mal zur Laufzeit, aber noch nicht zur Entwurfszeit.

Fast schon ein Wunder, wenn du das Label ausrichtest, bevor Left und Top des Edits neu gesetzt wurden :shock: ...

Wie gesagt, nimm Resize.

teebee 3. Dez 2007 10:37

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Überschreibe SetBounds des Edits und positioniere dort bach dem Aufruf von inherited das Label.

Gruß, teebee

guidok 3. Dez 2007 10:45

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Zitat:

Zitat von Deep-Sea
Fast schon ein Wunder, wenn du das Label ausrichtest, bevor Left und Top des Edits neu gesetzt wurden :shock: ...

Wie gesagt, nimm Resize.

Naja, die Position des Edit steht ja fest, sobald ich es auf dem Formular platziere und das Edit erscheint ja auch an genau dieser Position, insofern steht ja auch zur Laufzeit ein Wert in Left und Top.

Ich glaube das ich mit Resize auch nichts anderes erreiche, als wie schon oben beschrieben, aber ich kann es gern mal probieren.

Deep-Sea 3. Dez 2007 10:53

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Zitat:

Zitat von guidok
Zitat:

Zitat von Deep-Sea
Fast schon ein Wunder, wenn du das Label ausrichtest, bevor Left und Top des Edits neu gesetzt wurden :shock: ...

Wie gesagt, nimm Resize.

Naja, die Position des Edit steht ja fest, sobald ich es auf dem Formular platziere und das Edit erscheint ja auch an genau dieser Position, insofern steht ja auch zur Laufzeit ein Wert in Left und Top.

Ich glaube das ich mit Resize auch nichts anderes erreiche, als wie schon oben beschrieben, aber ich kann es gern mal probieren.

TControl.Left := 123;
Dies sendet keine Windowsnachricht. Deine Methode wäre so total nutzlos.
Ich glaube aber das Resize nicht beim Loading kommt, also nimm vlt. doch besser SetBounds wie teebee gesagt hat.

guidok 3. Dez 2007 10:54

Re: Eigene Komponente: Position wird nicht richtig gesetzt
 
Zitat:

Zitat von teebee
Überschreibe SetBounds des Edits und positioniere dort bach dem Aufruf von inherited das Label.

Gruß, teebee

Hat nicht funktioniert...


edit:

Ich nehms zurück, es funktioniert, aber auch nur zur Laufzeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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