Ich hab einen kleinen Objectinspektor (Siehe Anlage). Die einzelnen Zeilen sind z.B. so aufgebaut.
Delphi-Quellcode:
TPropComboBox = class(TComboBox)
private
Info: TEdit;
CheckBox: TCheckBox;
procedure SetTopIndex(const Value: integer);
procedure SetVisible(const Value: boolean);
public
property TopIndex: integer write SetTopIndex;
property Visible: boolean write SetVisible;
constructor Create(AOwner: TComponent); override;
end;
{ TPropComboBox }
constructor TPropComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Info := TEdit.Create(Self);
CheckBox := TCheckBox.Create(Self);
end;
procedure TPropComboBox.SetTopIndex(const Value: integer);
begin
Top := (Value - 1) * 25 + 40;
Info.Top := Top;
CheckBox.Top := Top;
TabOrder := Value;
end;
procedure TPropComboBox.SetVisible(const Value: boolean);
begin
inherited Visible := Value;
Info.Visible := Value;
end;
Erzeugen tue ich eine Reihe z.B. so:
Delphi-Quellcode:
function TDrawPadProperties.CreateComboBox(const Name, Text: string;
const Tag: TProp): TPropComboBox;
begin
Result := TPropComboBox.Create(FOwner);
Result.Name := NameSubStr + Name + '_Prop';
Result.Parent := FOwner.Pages[0];
Result.Visible := false;
Result.Left := 155;
Result.Width := 130;
Result.Style := csOwnerDrawFixed;
Result.Font.Assign(FFontBlack);
Result.OnClick := EditExit;
Result.Tag := Integer(Tag);
Result.ShowHint := Length(Text) > 20;
Result.Hint := Text;
Result.Info.Name := NameSubStr + Name + '_PropInfo';
Result.Info.Parent := FOwner.Pages[0];
Result.Info.Left := 20;
Result.Info.Width := 130;
Result.Info.ReadOnly := true;
Result.Info.TabStop := false;
Result.Info.Font.Assign(FFontInfo);
Result.Info.Text := Text;
if not FSimple then
begin
Result.CheckBox.Name := NameSubStr + Name + '_MultiProp';
Result.CheckBox.Parent := FOwner.Pages[0];
Result.CheckBox.Visible := false;
Result.CheckBox.Left := 290;
Result.CheckBox.Width := 20;
Result.CheckBox.Height := 20;
Result.CheckBox.Font.Assign(FFontBlack);
Result.CheckBox.TabStop := false;
Result.CheckBox.Caption := '';
Result.CheckBox.OnClick := EditExit;
Result.CheckBox.Tag := Integer(Tag);
Result.CheckBox.ShowHint := true;
Result.CheckBox.Hint := 'Auf alle markierten Objekte anwenden';
end;
end;
In OnExit (= OnClick für diese Komponente) frage ich den Sender ab. Klappt aber nicht (***)?
Delphi-Quellcode:
function TDrawPadProperties.GetAll(Sender: TObject): integer; // ****
begin
Result := 0;
if not FSimple then
begin
if Sender is TCheckBox then
if TCheckBox(Sender).Checked and (Pos('_MultiProp', TControl(Sender).Name) > 0) then
Result := 1;
if Result = 0 then
begin
if Sender is TPropCheckBox then
if TPropCheckBox(Sender).CheckBox.Checked then
Result := 2
else
if Sender is TPropEdit then
if TPropEdit(Sender).CheckBox.Checked then
Result := 3
else
if Sender is TPropComboBox then
if TPropComboBox(Sender).CheckBox.Checked then
Result := 4;
end;
end;
// ShowMessage(TControl(Sender).Name);
end;
procedure TDrawPadProperties.EditExit(Sender: TObject);
var
All: boolean;
begin
if FEnabled and Assigned(FOnPropertiesChange) then
begin
StoreToStringList(FSL2);
All := GetAll(Sender) <> 0; // ***
if All or (not Compare) then
begin
FSL1.Assign(FSL2);
FOnPropertiesChange(TProp(TControl(Sender).Tag), All);
end;
end;
end;
Die GetAll reagiert nicht so wie beabsichtigt. Die soll sagen, wenn OnExit (=ComboBoxClick) betätigt wird, ob die abgehängte Checkbox gecheckt ist (liefert Result = 0)?
Im Beispiel habe ich Stiftfarbe auf himmelblau gesetzt. Wie man sieht ist nur ein Object himmelblau dargestellt (sollten aber alle sein weil eben die dazugehörige Checkbox gecheckt ist).