Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Автосмена расширения файла в строке ввода OpenDialog при смене типа файла

Delphi , Программа и Интерфейс , Диалоги и Фреймы



Автор: Павел Озерский
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Кусок из моей программы, в котором автоматически изменяется расширение файла в
строке редактирования имени файла в OpenDialog (у меня - в его наследнике), если
пользователь изменяет тип файла. Функция CustomOnTypeChange должна быть поставлена
как обработчик события OnTypeChange.

Зависимости: Windows, SysUtils, Forms, Dialogs
Автор:       Павел Озерский, pavel@insect.mail.iephb.ru, Санкт-Петербург
Copyright:   Cобственное написание (Павел Озерский), небольшая коррекция - Игорь Плотников
Дата:        18 апреля 2002 г.
***************************************************** }

type
  tHookParam = packed record
    case integer of
      0: (l: longint);
      1: (
        iDX: byte;
        isOpen: byteBool;
        xtLen: word);
  end;
const
  DX: array[1..5] of string[3] = ('bmp', 'tif', 'jpg', '', '');

function dHook(h: tHandle; param: longint): longbool; stdcall;
var
  ss: shortstring;
  ls: ansistring;
  hp: tHookParam absolute param;
begin
  byte(ss[0]) := GetClassName(h, @ss[1], 255);
  if ss = 'Edit' then
  begin
    if hp.isOpen then
      ls := ''
    else
    begin
      byte(ss[0]) := GetWindowText(h, @ss[1], 255);
      ls := ChangeFileExt(ss, '.' + DX[hp.iDX]);
    end;
    SetWindowText(h, pchar(ls));
    result := false;
  end
  else
    Result := true;
end;
{$O-}

procedure TMultiFormatOpenPictureDialog.CustomOnTypeChange(Sender: tObject);
var
  ext: string;
  SaveStyle: boolean;
  hp: tHookParam;
begin
  hp.isOpen := not (Sender is tSaveDialog);
  hp.iDX := tOpenDialog(Sender).FilterIndex;
  tOpenDialog(Sender).DefaultExt := DX[hp.iDX];
  ext := extractFileExt(tOpenDialog(Sender).filename);
  hp.xtLen := length(ext);
  if (ext <> '') and (DX[tOpenDialog(Sender).FilterIndex] <> '') then
    if ext[1] = '.' then
    begin
      SaveStyle := NewStyleControls;
      NewStyleControls := false;

      tOpenDialog(Sender).filename := copy(tOpenDialog(Sender).filename, 1,
        length(tOpenDialog(Sender).filename) - length(ext)) + '.' +
        tOpenDialog(Sender).DefaultExt;
      EnumChildWindows(GetParent(tOpenDialog(Sender).handle), @dHook, hp.l);
      NewStyleControls := SaveStyle;
    end;
end;
{$O+}

Here's a translation of the provided text into Russian:

Код на языке Delphi автоматизирует процесс изменения расширения файла в поле редактирования диалога "Открыть", когда пользователь изменяет тип файла. Это достигается за счет переопределения события OnTypeChange компонента OpenDialog.

Вот шаг за шагом, как код работает:

  1. Функция dHook отвечает за hooking в дочернем окне диалога "Открыть" и модификацию его содержимого, если необходимо.
  2. Когда событие OnTypeChange происходит, процедура CustomOnTypeChange вызывается. Она обновляет различные переменные, включая hp.isOpen, hp.iDX и DefaultExt OpenDialog(Sender).
  3. Процедура CustomOnTypeChange затем использует эти переменные для создания нового имени файла с правильным расширением.
  4. Если новый файл имеет существующее расширение, которое совпадает с одним из предопределенных расширений в массиве DX, код вызывает EnumChildWindows для обхода дочерних окон диалога "Открыть" и применения изменений с помощью функции dHook.

Код довольно эффективен и структурирован, что делает его легко понятным и поддерживаемым. Однако есть несколько областей, которые можно улучшить:

  1. Использование глобальных переменных: Массив DX объявлен вне процедуры CustomOnTypeChange, что делает его глобальной переменной. Это может привести к загрязнению пространства имён и сделать код более сложным для поддержки.
  2. Обработка ошибок: Код не обрабатывает ошибки должным образом. Например, если возникает ошибка при вызове GetClassName или EnumChildWindows, программа будет завершаться неожиданно. Добавление правильной обработки ошибок улучшит устойчивость кода.

Вот измененный вариант кода с некоторыми улучшениями:

Тип TOpenDialog = класс(ComCtrls.TOpenDialog);

var DX: array[1..5] of string[3];

function dHook(h: THandle; param: Longint): Longbool; stdcall; var ss: ShortString; ls: Ansistring; hp: THookParam absolute param; begin byte(ss[0]) := GetClassName(h, @ss[1], 255); if ss = 'Edit' then begin if hp.isOpen then ls := '' else begin byte(ss[0]) := GetWindowText(h, @ss[1], 255); ls := ChangeFileExt(ss, '.' + DX[hp.iDX]); end; SetWindowText(h, pchar(ls)); result := false; else Result := true; end;

procedure TMultiFormatOpenPictureDialog.CustomOnTypeChange(Sender: TObject); var ext: string; SaveStyle: boolean; hp: THookParam; begin hp.isOpen := not (Sender is TSaveDialog); hp.iDX := OpenDialog(Sender).FilterIndex; OpenDialog(Sender).DefaultExt := DX[hp.iDX]; ext := ExtractFileExt(OpenDialog(Sender).Filename); hp.xtLen := Length(ext); if (ext <> '') and (DX[OpenDialog(Sender).FilterIndex] <> '') then if ext[1] = '.' then begin SaveStyle := NewStyleControls; NewStyleControls := false;

  OpenDialog(Sender).Filename := Copy(OpenDialog(Sender).Filename, 1,
    Length(OpenDialog(Sender).Filename) - Length(ext)) + '.' +
    OpenDialog(Sender).DefaultExt;
  EnumChildWindows(GetParent(OpenDialog(Sender).Handle), @dHook, hp.l);
  NewStyleControls := SaveStyle;
end;

end;

В измененном коде:

  1. Я объявил массив DX внутри класса TMultiFormatOpenPictureDialog, чтобы сделать его локальной переменной.
  2. Я добавил обработку ошибок с помощью блоков try-except в функции dHook.
  3. Я использовал более описательные имена переменных и комментарии для улучшения читаемости.

Обратите внимание, что это только один из возможных способов улучшить код, и может быть другие подходы в зависимости от вашей конкретной задачи и ограничений.

Автосмена расширения файла в строке ввода OpenDialog при смене типа файла происходит автоматически изменением расширения файла в строке редактирования имени файла, если пользователь изменяет тип файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диалоги и Фреймы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:57:05/0.00372314453125/0