AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TFileOpenDialog ableiten mit DoOnFileOkClick
Thema durchsuchen
Ansicht
Themen-Optionen

TFileOpenDialog ableiten mit DoOnFileOkClick

Ein Thema von anse · begonnen am 6. Feb 2022 · letzter Beitrag vom 6. Feb 2022
Antwort Antwort
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#1

TFileOpenDialog ableiten mit DoOnFileOkClick

  Alt 6. Feb 2022, 14:57
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!
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TFileOpenDialog ableiten mit DoOnFileOkClick

  Alt 6. Feb 2022, 15:49
.. 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;
Klaus

Geändert von Klaus01 ( 6. Feb 2022 um 15:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: TFileOpenDialog ableiten mit DoOnFileOkClick

  Alt 6. Feb 2022, 15:52
"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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
197 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TFileOpenDialog ableiten mit DoOnFileOkClick

  Alt 6. Feb 2022, 21:01
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;
Ansgar Becker
https://www.heidisql.com
Wenn du loslässt, hast du zwei Hände frei.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: TFileOpenDialog ableiten mit DoOnFileOkClick

  Alt 6. Feb 2022, 22:03
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 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