Delphi-PRAXiS

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 TDesignWindow verwenden (keine Quellen oder Doku vorhanden!) (https://www.delphipraxis.net/150532-tdesignwindow-verwenden-keine-quellen-oder-doku-vorhanden.html)

RSE 20. Apr 2010 08:14


TDesignWindow verwenden (keine Quellen oder Doku vorhanden!)
 
Hallo,

ich möchte einen Ersatzeditor für den Collection-Editor programmieren, der weitere Anforderungen erfüllt. Wenn ich mich richtig belesen habe (viel findet man ja nicht), dann sollte ich von TDesignWindow ableiten. Ich verwende Delphi 5 Enterprise. Leider kann ich nirgends eine Dokumentation zu TDesignWindow auftreiben. Kann mir von euch vielleicht einer sagen, was ich tun muss, um meine Items im OI anzuzeigen? Das ist eigentlich der Kern dessen, was ich erreichen möchte. Die Form dazu (den Editor) habe ich schon ein Stück weit entwickelt.

Meine Komponente, für die der Editor sein soll, beinhaltet eine Collection mit Items, die aber verschiedene Erscheinungen haben können (die CollectionItem-Klasse ist aber immer gleich), so dass ich verschiedene Itemtypen im Editor erstellen möchte. Desweiteren sollen die Items in der Komponente angeordnet werden können. Deswegen entwickle ich den Editor neu.

RSE 20. Apr 2010 09:42

Re: Verwendung von TDesignWindow
 
Mit TDesignWindow.SetSelection(Components: TDesignerSelectionList) scheint das zu funktionieren. Laut den Quellen von TFieldsEditor muss man die TDesignerSelectionList offenbar selbst instanzieren und übergeben. Freigegeben wird die dann woanders... irgendwo... Jetzt tut sich zumindest im OI was. Mein Item wird oben in der Dropdownbox angezeigt, nur die published Properties werden noch nicht im OI angezeigt, er bleibt einfach leer. Mal sehen, ob ich den Knoten dadurch lösen kann, dass ich meinen Editor nicht mehr modal anzeige (was ja nun auch irgendwie unsinnig ist).

RSE 20. Apr 2010 10:50

Re: TDesignWindow verwenden (keine Quellen oder Doku vorhand
 
Die published Properties werden auch nicht im OI angezeigt, wenn mein Editor nicht mehr modal angezeigt wird. Ich bastele gerade an der Sicherstellung der Freigabe der Form meines Editors, danach widme ich mich wieder der Anzeige im OI.

Da offenbar keiner Erfahrungen mit der Thematik hat, erstelle ich den Thread als eine Art Logbuch, damit andere dann wissen, wie man mit TDesignWindow umgeht. Zumindest bezüglich meiner Wünsche ;-)

himitsu 20. Apr 2010 11:11

Re: TDesignWindow verwenden (keine Quellen oder Doku vorhand
 
Bin auch noch nicht so tief in der OpenToolsAPI drin und vom TDesignWindow hab'sch praktisch garkeine Ahnung
und es stimmt, viele Infos gibt es diesbezüglich leider nicht (scheint kaum jemand mit dieser API zu arbeiten)

Alle möglichen Ergebnisse in Google sind nicht sehr viel:
http://www.google.de/search?q="TDesignWindow"+OR+"IDesignWindow"



Aber vielleicht mußt du auch nur noch irgendwas registrieren, bzw. auf irgendwas reagieren?

Unit DesignIntf:
RegisterDesignNotification
RegisterPropertyEditor
RegisterPropertyInCategory
RegisterPropertyMapper
RegisterComponentEditor
uvm.

RSE 20. Apr 2010 12:11

Re: TDesignWindow verwenden (keine Quellen oder Doku vorhand
 
Form nichtmodal anzeigen und trotzdem die Freigabe sicherstellen:

Delphi-Quellcode:
  TFmMyCompEditor = class(TDesignWindow)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    MyComp: TMyComp;
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    procedure Edit(AMyComp: TMyComp);
  end;

  TMyCompEditor = Class (TComponentEditor)
  protected
    procedure ShowEditor;
  end;

var
  FmMyCompEditor: TFmMyCompEditor;

implementation

{ TFmMyCompEditor }

procedure TFmMyCompEditor.Edit(AMyComp: TMyComp);
begin
  if MyComp <> nil then
    MyComp.RemoveFreeNotification(Self);
  MyComp := AMyComp;
  MyComp.FreeNotification(Self);
  Show;
end;

procedure TFmMyCompEditor.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if (Operation = opRemove) and (AComponent = MyComp) then
    Close;
end;

procedure TFmMyCompEditor.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FmMyEditor := nil; // globale Variable wieder nil setzen
  Action := caFree; // sich selbst freigeben
end;

{ TMyCompEditor }

procedure TMyCompEditor.ShowEditor;
begin
  if FmMyCompEditor = nil then
    FmMyCompEditor := TFmMyCompEditor.Create(Application);
  FmMyCompEditor.Edit(TMyComp(Component));
end;

RSE 20. Apr 2010 12:16

Re: TDesignWindow verwenden (keine Quellen oder Doku vorhand
 
Nun zur Anzeige der MyItems im ObjektInspektor...
Auf Creating Custom Delphi Components, Part III, Page 4 ist beschrieben, wie man das macht. So klappt das allerdings nur für Objekte, die man über IFormDesigner erstellt und lediglich in einer Collection verwaltet. Somit wird mir auch klar, warum die Published-Eigenschaften meiner Items nicht im OI angezeigt werden. Ich beschäftige mich jetzt also mit IFormDesigner.

RSE 20. Apr 2010 14:08

Re: TDesignWindow verwenden (keine Quellen oder Doku vorhand
 
Lösung:
Delphi-Quellcode:
procedure TFmCGrpEditor.ItemListClick(Sender: TObject);
begin
  if (not Active) or (ItemList.Selected = nil) or // ist etwas ausgewählt?
    (ItemList.Selected.Data = nil) then          // hat das ausgewählte auch ein Item angehangen?
    Exit;
  Designer.SelectComponent(TChoiceGroupItem(ItemList.Selected.Data));
end;

procedure TFmMyCompEditor.Edit(AMyComp: TMyComp; ADesigner: IFormDesigner);
begin
  if MyComp <> nil then
    MyComp.RemoveFreeNotification(Self);
  MyComp := AMyComp;
  MyComp.FreeNotification(Self);
  Designer := ADesigner; // <-- ohne das funktioniert nix!
  Show;
end;

procedure TMyCompEditor.ShowEditor;
begin
  if FmMyCompEditor = nil then
    FmMyCompEditor := TFmMyCompEditor.Create(Application);
  FmMyCompEditor.Edit(TMyComp(Component),Designer);
end;
Kaum macht man es richtig, funktioniert auch alles... :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz