Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TSaveDialog, OnTypeChange, FileName zur Laufzeit ändern (https://www.delphipraxis.net/137835-tsavedialog-ontypechange-filename-zur-laufzeit-aendern.html)

hoika 29. Jul 2009 11:46


TSaveDialog, OnTypeChange, FileName zur Laufzeit ändern
 
Hallo #,

folgender Code wird dem OnTypeChanged eines TSaveDialog zugewiesen,

Delphi-Quellcode:
{ filter type changed }
procedure TForm1.DoCommonExportToXLS_TypeChange(Sender: TObject);
var
  sFileName : String;
  sFileExt : String;
begin
  try
    Assert(ExcelFileDialog<>NIL, 'ExcelFileDialog=NIL');
    if ExcelFileDialog=NIL then Exit;

   // xlsx
    if ExcelFileDialog.FilterIndex=2 then
    begin
      sFileName := ExcelFileDialog.FileName;
      sFileExt := ExtractFileExt(sFileName);
      if sFileExt<>'.xlsx' then
      begin
        sFileName:= ChangeFileExt(sFileName, '.xlsx');
        ExcelFileDialog.FileName:= sFileName; // klappt nicht
      end;
    end;
  except
  end;
end; { TForm1.DoCommonExportToXLS_TypeChange }
In der Hlfe steht es auch schön drin
Zitat:

Programmbedingte Änderungen von FileName haben keine Auswirkungen auf aktive Dialogfelder.
Wozu soll dann das OnTypeChanged überhaupt gut sein ?
Wie kann ich denn nun den Namen doch noch ändern,
ohne gleich gross mit Hooks (?) rumzubasteln
oder wie bei "CheckBox zu TSaveDialog" hinzufügen rumzufummeln.

Danke


Heiko

jaenicke 29. Jul 2009 11:48

Re: TSaveDialog, OnTypeChange, FileName zur Laufzeit ändern
 
Du könntest doch direkt den Text des Eingabefeldes ändern, wenn du das möchtest. ;-)

hoika 29. Jul 2009 11:56

Re: TSaveDialog, OnTypeChange, FileName zur Laufzeit ändern
 
Hallo,

will ich ja ;)

CDM_GETFILEPATH wird zum Ermitteln benutzt,
CDM_SETFILEPATH gibt es aber nicht.

Nun ja, sooo wichtig ist das nun doch nicht.


Heiko

hoika 29. Jul 2009 13:42

Re: TSaveDialog, OnTypeChange, FileName zur Laufzeit ändern
 
Hallo,

Zitat:

Du könntest doch direkt den Text des Eingabefeldes ändern, wenn du das möchtest
Hm, wie mache ich das, oder anders gesagt:
Kann man davon ausgehen, dass die Handles (Ids) in allen Windows-Versionen gleich sind ?


Heiko

hoika 29. Jul 2009 14:21

Re: TSaveDialog, OnTypeChange, FileName zur Laufzeit ändern
 
Hallo,

wer lange sucht.

Delphi-Quellcode:
function GetWndText(Ctrl:HWnd): String;
var
  i : Integer;
begin
  Result:= '';

  try
    i:=SendMessage(Ctrl,WM_GETTEXTLENGTH,0,0);
    SetLength(Result,i);
    SendMessage(Ctrl,WM_GETTEXT,i+1,DWord(Result));
  except
  end;
end; { GetWndText } 


procedure TEditGrid.DoCommonExportToXLS_TypeChange(Sender: TObject);
var
  Ctrl     : HWnd;
  Item     : Longint;
  sFileName : String;
  sFileExt : String;
begin
 { portion from [url]http://newsgroups.derkeiler.com/Archive/De/de.comp.lang.delphi.misc/2007-05/msg00169.html[/url] }
  try
    Item := $47C;

    with (Sender as TSaveDialog) do
    begin
      if FilterIndex=2 then
      begin
       // filter is ".xlsx"

        // Set a new default extension
        // The control with ID=$480 is the Filename edit field
        // Man muss $47C nehmen !!!!!!!!!!!!
        Ctrl:= GetDlgItem(Handle, Item);
        // The following block is necessary due to a bug in Delphi:
        // TSaveDialog.Handle is not always the Handle of the dialog
        if Ctrl=0 then Ctrl:=GetDlgItem(GetParent(Handle), Item);
        if Ctrl=0 then exit;

      // Get its text, change the extension, and write back
        sFileName:= GetWndText(Ctrl);
        sFileExt:= ExtractFileExt(sFileExt);
        if sFileExt<>'.xlsx' then
        begin
          sFileName:= ChangeFileExt(sFileName, '.xlsx');

          SendMessage(Ctrl,WM_SETTEXT,0,DWord(sFileName));
        end;
      end;
    end; { with (Sender as TSaveDialog) do }
  except
  end;
end; { TEditGrid.DoCommonExportToXLS_TypeChange }

      ExcelFileDialog.OnTypeChange:= DoCommonExportToXLS_TypeChange;
Original-Link im Quellcode


Heiko


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