Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TFileOpenDialog ableiten mit DoOnFileOkClick (https://www.delphipraxis.net/209905-tfileopendialog-ableiten-mit-doonfileokclick.html)

anse 6. Feb 2022 13:57

TFileOpenDialog ableiten mit DoOnFileOkClick
 
Hi,

mit Delphi 10.4.2 leite ich eine eigene TExtFileOpenDialog von TFileOpenDialog ab, und möchte die darin enthaltene DoOnFileOkClick überschreiben. Meine eigene DoOnFileOkClick wird aber nicht aufgerufen, und ich verstehe gerade nicht warum:

Delphi-Quellcode:
uses Vcl.Dialogs;

...

  TExtFileOpenDialog = class(TFileOpenDialog)
    protected
      function DoOnFileOkClick: Boolean; override;
  end;

...

function TExtFileOpenDialog.DoOnFileOkClick: Boolean;
begin
  showmessage('hier bin ich');
  Result := inherited;
end;
Ich bin mir gar nicht sicher ob die ursprüngliche DoOnFileOkClick nicht auch tot ist...

Einen schönen Sonntag!

Klaus01 6. Feb 2022 14:49

AW: TFileOpenDialog ableiten mit DoOnFileOkClick
 
.. aus der Hilfe "Ruft das Ereignis OnFileOkClick auf, sofern es definiert ist. "

so funktioniert es.
Delphi-Quellcode:
type
  TExtFileOpenDialog = class(TFileOpenDialog)
    private

   protected
       function DoOnFileOkClick: Boolean; override;
    public
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  fFileOpenDialog := TExtFileOpenDialog.Create(nil);
  try
    fFileOpenDialog.OnFileOkClick := onFileOkClick; // wenn hier nichts zugewiesen wird, wird doFileOnClick nicht ausgeführt.
    fFileOpenDialog.Execute;
  finally
    fFileOpenDialog.Free;
  end;
end;

procedure TForm1.onFileOkClick(sender: TObject; var canClose: Boolean);
begin
  showMessage('---test---');
  canClose := true;
end;

{ TExtFileOpenDialog }


Im Prinzip bräuchte man dann nicht die doOnFilOkClick Methode überschreiben, sondern nur ein entsprechendes Ereignis zuweisen.

Grüße
  Klaus
function TExtFileOpenDialog.DoOnFileOkClick: Boolean;
begin
  showMessage('123');
end;

Uwe Raabe 6. Feb 2022 14:52

AW: TFileOpenDialog ableiten mit DoOnFileOkClick
 
Zitat:

Zitat von Klaus01 (Beitrag 1501773)
"Ruft das Ereignis OnFileOkClick auf, sofern es definiert ist. "

Das allein spräche ja nicht gegen einen Aufruf von DoOnFileClick selbst. Allerdings wird in TFileDialogEvents.OnFileOk genau das vorab schon überprüft und ein Aufruf von FileOkClick und somit auch DoOnFileOkClick unterbunden.

anse 6. Feb 2022 20:01

AW: TFileOpenDialog ableiten mit DoOnFileOkClick
 
Ah.. danke für den Hinweis. Das klärt es natürlich.

Für's Ableiten hatte ich wohl erwartet dass DoOnFileOkClick auch ausgeführt wird, wenn der Caller kein OnFileOkClick Event zugewiesen hat.
Ich weise jetzt in dem Fall einen Dummy-Event zu. Untenstehend mal die ganze Implementierung, damit man sieht wofür das ganze. Es wird eine Combobox zur Auswahl eines Encodings erzeugt, und in DoOnFileOkClick wird dessen ausgewählter Eintrag ausgelesen:


Delphi-Quellcode:
constructor TExtFileOpenDialog.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEncodings := TStringList.Create;
  FEncodingIndex := 0;
end;


destructor TExtFileOpenDialog.Destroy;
begin
  FEncodings.Free;
  inherited;
end;


procedure TExtFileOpenDialog.DoOnExecute;
var
  iCustomize: IFileDialogCustomize;
  i: Integer;
begin
  // Add encodings selector
  if Dialog.QueryInterface(IFileDialogCustomize, iCustomize) = S_OK then
  begin
    iCustomize.StartVisualGroup(0, PChar(_('Encoding:')));
    try
      // note other controls available: AddCheckButton, AddEditBox, AddPushButton, AddRadioButtonList...
      iCustomize.AddComboBox(idEncodingCombo);
      for i:=0 to FEncodings.Count - 1 do begin
        iCustomize.AddControlItem(idEncodingCombo, i, PChar(FEncodings[i]));
      end;
      iCustomize.SetSelectedControlItem(idEncodingCombo, FEncodingIndex);
      if not Assigned(OnFileOkClick) then
        OnFileOkClick := FileOkClickNoOp;
    finally
      iCustomize.EndVisualGroup;
    end;
  end;
end;


procedure TExtFileOpenDialog.FileOkClickNoOp(Sender: TObject; var CanClose: Boolean);
begin
  // Dummy procedure, just makes sure parent class calls DoOnFileOkClick
end;


function TExtFileOpenDialog.DoOnFileOkClick: Boolean;
var
  iCustomize: IFileDialogCustomize;
begin
  Result := inherited;
  if Dialog.QueryInterface(IFileDialogCustomize, iCustomize) = S_OK then
  begin
    iCustomize.GetSelectedControlItem(idEncodingCombo, FEncodingIndex);
  end;
end;

Uwe Raabe 6. Feb 2022 21:03

AW: TFileOpenDialog ableiten mit DoOnFileOkClick
 
Zitat:

Zitat von anse (Beitrag 1501801)
Für's Ableiten hatte ich wohl erwartet dass DoOnFileOkClick auch ausgeführt wird, wenn der Caller kein OnFileOkClick Event zugewiesen hat.

Hatte ich auch erwartet. Es ist aber wohl ein Unterschied, ob ein Eventhandler überhaupt vorhanden ist. Andernfalls sollte die IFileDialogEvents-Implementierung ein E_NOTIMPL zurückgeben. Zugegeben, das hätte man auch in FileOKClick/DoOnFileOkClick abhandeln können. Die aktuelle Implementierung ist zumindest dokumentationswürdig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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