Hi,
weiß jemand, wie man auf das verschieben einer Komponente reagieren kann?
wenn sich die Größe (width & height) ändert, wird wmSize gesendet aber was wenn left und top sich ändert?
Das ganze soll für eine Kompnente z.B. TComboBox oder TEdit verwendet werden,
die 'ihr eigenes' TLabel mit sich führt.
Ich finde es umständlich im Formulardesigner ständig die Labels mit den zugehörigen Eingabeboxen neu auszurichten, außerdem wäre es doch chic den Beschreibungstext gleich als Eigenschaft in der Eingabekomponente zu haben.
Das Problem mit TFrames zu lösen gefällt mir nicht, da auch hier im Formulardesigner oft was versehentlich verschoben werden kann.
Eine Lösung ist folgender Ansatz, der aber nicht so super ist, da neue Eigenschaften für Left und Top erstellt werden müssen, die alten aber nicht ausgeblendet werden können. Aber grundsätzlich funktioniert es:
Delphi-Quellcode:
unit ComboBoxLabel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TComboBoxLabel =
class(TComboBox)
private
FText:
string;
FLeft: integer;
FTop: integer;
procedure SetText(Value:
string);
procedure SetLeft(Value: integer);
procedure SetTop(Value: integer);
protected
CBLabel: TLabel;
public
constructor Create(Owner: TComponent);
override;
procedure SetParent(Value: TWinControl);
override;
published
property Text:
string read FText
write SetText;
property XLeft:integer
read FLeft
write SetLeft;
property XTop:integer
read FTop
write SetTop;
end;
procedure Register;
implementation
constructor TComboBoxLabel.Create(Owner: TComponent);
begin
inherited Create(Owner);
CBLabel:= TLabel.Create(Self);
end;
procedure TComboBoxLabel.SetParent(Value: TWinControl);
begin
inherited SetParent(Value);
CBLabel.Parent:= Self.Parent;
end;
procedure TComboBoxLabel.SetText(Value:
string);
begin
FText:= Value;
CBLabel.Caption:= FText;
end;
procedure TComboBoxLabel.SetLeft(Value: integer);
begin
FLeft:= Value;
Left:= FLeft;
CBLabel.Left:= Left-80;
end;
procedure TComboBoxLabel.SetTop(Value: integer);
begin
FTop:= Value;
Top:= FTop;
CBLabel.Top:= Top;
end;
procedure Register;
begin
RegisterComponents('
Beispiele', [TComboBoxLabel]);
end;
end.
Wenn man nun auf Veränderungen von Left und Top reagieren könnte wäre es wesentlich
schöner