Das Doppelklickverhalten ändern

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Komponenteneditoren hinzufügen


Wenn der Benutzer auf die Komponente doppelklickt, wird die Methode Edit des Komponenteneditors aufgerufen. Standardmäßig wird dadurch der erste dem lokalen Menü hinzugefügte Befehl ausgeführt. Im obigen Beispiel wird durch Doppelklicken auf die Komponente also der Befehl DoThis ausgeführt.

Im Allgemeinen ist es sinnvoll, den ersten Befehl auszuführen. In folgenden Situationen empfiehlt es sich jedoch, dieses Standardverhalten zu ändern:

  • Sie fügen dem Kontextmenü keine Befehle hinzu.
  • Sie wollen ein Dialogfeld anzeigen, in dem mehrere Befehle zusammengefasst sind.

Das Standardverhalten kann durch Überschreiben der Methode Edit geändert werden. Im folgenden Beispiel wird ein Dialogfeld geöffnet, wenn der Benutzer auf die Komponente doppelklickt:


procedure TMyEditor.Edit;
var
  FontDlg: TFontDialog;
begin
  FontDlg := TFontDialog.Create(Application);
  try
    if FontDlg.Execute then
      MyComponent.FFont.Assign(FontDlg.Font);
  finally
    FontDlg.Free
  end;
end;
void __fastcall TMyEditor::Edit(void)
{
  TFontDialog *pFontDlg = new TFontDialog(NULL);
  pFontDlg->Execute();
  ((TMyComponent *)Component)->Font = pFontDlg->Font;
  delete pFontDlg;
}

Hinweis:  Wenn bei einem Doppelklick auf die Komponente der Quelltext-Editor für eine Ereignisbehandlungsroutine angezeigt werden soll, verwenden Sie als Basisklasse für Ihren Komponenteneditor TDefaultEditor anstelle von TComponentEditor. Überschreiben Sie dann anstelle von Edit die geschützte Methode TDefaultEditor:EditProperty. EditProperty durchsucht alle Ereignisbehandlungsroutinen der Komponente und öffnet die zuerst gefundene. Sie können jedoch auch wie im folgenden Beispiel nach einem bestimmten Ereignis suchen: Beispiel:

procedure TMyEditor.EditProperty(PropertyEditor: TPropertyEditor;
  Continue, FreeEditor: Boolean)
begin
  if (PropertyEditor.ClassName = 'TMethodProperty') and
    (PropertyEditor.GetName = 'OnSpecialEvent') then
    DefaultEditor.EditProperty(PropertyEditor, Continue, FreeEditor);
end;
void __fastcall TMyEditor::EditProperty(TPropertyEditor* PropertyEditor,
bool &Continue, bool &FreeEditor)
{
  if (PropertyEditor->ClassNameIs("TMethodProperty") &&
      CompareText(PropertyEditor->GetName, "OnSpecialEvent") == 0)
  {
    TDefaultEditor::EditProperty(PropertyEditor, Continue, FreeEditor);
  }
}