![]() |
Propertyeditor nicht Modal
Hallo Zusammen!
Bisher habe ich immer, wenn ich einen PropertyEditor für eine Komponente gebraucht habe, diesen Editor [Dialog] Modal erzeugt und nach der Bearbeitung die Werte an die Komponente zurückgegeben. Jetzt möchte ich aber einen Dialog erzeuge, der offen bleibt und auf Klicks des offenen Formulars reagieren kann. Beispiel: Der Dialog geht auf und wenn ich auf einen Label oder einen Button auf dem Formular klicke bekommt mein Dialog das mit. (Focuscontrol)? Nett wäre auch, wenn ich per Drag&Drop Komponenten in mein Dialogfenster ziehen könnte... Geht das? Jemand ne Idee? Nen Codeschnipsel? Lieber anders Lösen? Grüsse Mavarik |
AW: Propertyeditor nicht Modal
Meinst Du einen "Komponenteneditor"?
Das ShowModal könnte man ja leicht ersetzen, aber das könnte die IDE übel nehmen, da sie ja sozusagen die Kontrolle abgibt. Wenn der Editor offen bleibt und später immer wieder der IDE ins Handwerk pfuscht ... weiß man nicht.
Delphi-Quellcode:
procedure TssLayoutComponentEditor.ShowDesigner;
var DesignerForm: TFormSsLayoutEditor; begin if (Component is TssLayout) then begin DesignerForm := TFormSsLayoutEditor.Create(nil); try DesignerForm.ssLayoutIDE := (Component as TssLayout); DesignerForm.AssignLayoutIDEtoDTE; DesignerForm.ShowModal; DesignerForm.AssignLayoutDTEtoIDE; DesignerForm.ssLayoutIDE := nil; Designer.Modified; finally DesignerForm.Free; end; end; end; Ich denke, Du musst deutlich tiefer in die Tools API. Ich habe es zumindest schon mal ansatzweise geschafft, selbst erzeugte Units in mein Projekt zu installieren.
Delphi-Quellcode:
procedure TFormSsFWEditor.CornerButton1Click(Sender: TObject);
var PackageTest: IOTAPackageServices; PackageModule: IOTAModule; UnitModule: IOTAModule; S: string; begin FWEM.FWProject.CreateUnits; ProjectFileName := FWEM.FWProject.PathProject + FWEM.FWProject.Name + '.dpk'; PackageModule := (BorlandIDEServices as IOTAModuleServices).FindModule(ProjectFileName); if not Assigned(PackageModule) then PackageModule := (BorlandIDEServices as IOTAModuleServices).CreateModule(TProjectCreator.Create); for S in FWEM.FWProject.UnitFileList do begin CurrentPackageModule := PackageModule; UnitFileName := S; UnitModule := (BorlandIDEServices as IOTAModuleServices).CreateModule(TUnitCreator.Create); UnitModule.Save(False, True); end; PackageModule.Save(False, True); PackageTest := (BorlandIDEServices as IOTAPackageServices); PackageTest.InstallPackage(LowerCase(FWEM.FWProject.Name + '.bpl')); PackageModule.Save(False, True); Close; end; Ein persistentes Formular live parallel mit dem Formulareditor zu syncronisieren wird aber noch um einiges schwerer werden, wenn nicht gar unmöglich sein. So eine Vorstellung hatte ich im Rahmen meiner Layout-Kompo auch schonmal, dann aber nicht den Mut, das weiter zu denken. :stupid: Einige Infos zu Komponenteneditoren gab es hier: ![]() |
AW: Propertyeditor nicht Modal
hmm Danke schon mal...
Gibt es zur DesignTime auch das Feld FocusControl des Forms des Editors? Muss das mal testen... Mavarik |
AW: Propertyeditor nicht Modal
Also...
gefunden habe ich: IDesignNotification.SelectionChanged & ASelection "Nur" noch wie ich das benutzen kann... Mavarik |
AW: Propertyeditor nicht Modal
OK für alle die es Interessiert...
Es geht so...
Delphi-Quellcode:
Grüsse Mavarik
TMyComponentEditor = class(TForm,IDesignNotification)
... protected procedure DesignerClosed(const ADesigner: IDesigner; AGoingDormant: Boolean); procedure DesignerOpened(const ADesigner: IDesigner; AResurrecting: Boolean); procedure ItemDeleted(const ADesigner: IDesigner; AItem: TPersistent); procedure ItemInserted(const ADesigner: IDesigner; AItem: TPersistent); procedure ItemsModified(const ADesigner: IDesigner); procedure SelectionChanged(const ADesigner: IDesigner;const ASelection: IDesignerSelections); ... end implementation procedure TMyComponentEditor.FormCreate(Sender: TObject); begin ... RegisterDesignNotification(Self as IDesignNotification); end; procedure TMyComponentEditor.FormDestroy(Sender: TObject); begin UnregisterDesignNotification(Self as IDesignNotification); ... end; procedure TMyComponentEditor.SelectionChanged(const ADesigner: IDesigner;const ASelection: IDesignerSelections); var i : integer; begin // Workingtest memo1.Lines.Clear; for i:=0 to ASelection.Count-1 do begin Memo1.Lines.Add(ASelection.Items[i].ClassName); end; end; PS.: Auch ein nicht modaler Editor funktioniert! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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-2025 by Thomas Breitkreuz