Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Propertyeditor nicht Modal (https://www.delphipraxis.net/177192-propertyeditor-nicht-modal.html)

Mavarik 23. Okt 2013 12:39

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

stahli 23. Okt 2013 14:21

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: http://docwiki.embarcadero.com/RADSt...machen_-_Index allerdings zur Tools API gibt es kaum etwas.

Mavarik 23. Okt 2013 15:23

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

Mavarik 23. Okt 2013 18:37

AW: Propertyeditor nicht Modal
 
Also...

gefunden habe ich: IDesignNotification.SelectionChanged & ASelection

"Nur" noch wie ich das benutzen kann...

Mavarik

Mavarik 30. Okt 2013 18:38

AW: Propertyeditor nicht Modal
 
OK für alle die es Interessiert...

Es geht so...

Delphi-Quellcode:
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;
Grüsse Mavarik

PS.: Auch ein nicht modaler Editor funktioniert!


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

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