Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SaveDialog1.FileName [D7, XP]


Страницы:   1 2

Zhekson ©   (2008-10-28 16:43:00) 

Есть функция, которая выдаёт количество файлов определённого разрешения в папке, для индексирования...


function GetFileCount(Dir: string; MaskF: string): integer;
var
 fs: TSearchRec;
begin
 Result := 0;
 if FindFirst(Dir + MaskF, faAnyFile - faDirectory - faVolumeID, fs) = 0
   then
   repeat
     inc(Result);
   until
     FindNext(fs) <> 0;
 FindClose(fs);
end;


Его обработчик:

procedure TForm1.SaveDialog1FolderChange(Sender: TObject);
begin
SaveDialog1.FileName := IntToStr(GetFileCount(GetCurrentDir; '*.tbl') + 1);
end;


функция GetFileCountна выходе выдаёт соответствующее кол-во файлов, но присвоения параметра не происходит. Почему?


{RASkov}   (2008-10-28 21:31:00) [1]

Код [23] не оптимальный, но думаю и этого не нужно было после последнего спора :)


{RASkov}   (2008-10-28 21:27:00) [2]

Держи:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

const READ_FILENAME = WM_USER+101;

type
 TForm1 = class(TForm)
   SaveDialog1: TSaveDialog;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure SaveDialog1FolderChange(Sender: TObject);
 private { Private declarations }
   procedure GenerateFileName(var Mes: TMessage); message READ_FILENAME;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(Handle, READ_FILENAME, Integer(SaveDialog1), 0);
 SaveDialog1.Execute;
end;

procedure TForm1.GenerateFileName(var Mes: TMessage);
begin
 SaveDialog1FolderChange(TSaveDialog(Mes.WParam));
end;

function ReadDirAndGenerateFileName(const HWn: THandle; N: Longint): Longbool; stdcall;
var ss: ShortString; Ext: PChar absolute N;
function GetFileName: String;
var fs: TSearchRec; Cnt: Integer;
begin
  Cnt := 0;
  if FindFirst(IncludeTrailingPathDelimiter(GetCurrentDir)+'*.'+Ext, faAnyFile, fs) = 0 then
  try repeat
   if (fs.Name='.') or (fs.Name='..') or ((fs.Attr and faDirectory)=faDirectory) then Continue;
   inc(Cnt);
  until FindNext(fs) <> 0;
  finally FindClose(fs); end;
  Result:=IntToStr(Cnt)+'.myext';
  while FileExists(IncludeTrailingPathDelimiter(GetCurrentDir)+Result) do
   Result:='_'+Result;
end;
begin
 Byte(ss[0]):=GetClassName(HWn, @ss[1], 255);
 if ss='Edit' then begin
  SetWindowText(HWn, PChar(GetFileName));
  Result:=False;
 end else Result:=True;
end;

procedure TForm1.SaveDialog1FolderChange(Sender: TObject);
begin
 EnumChildWindows(GetParent(TSaveDialog(Sender).Handle), @ReadDirAndGenerateFileName, Integer(Pchar('pas')));
end;

end.

Примерно так....


{RASkov}   (2008-10-28 20:23:00) [3]

> [21] Zhekson   (28.10.08 20:05)
> какие ещё есть варианты???

Пробывал [15]?


Zhekson   (2008-10-28 20:05:00) [4]

Сергей М. ©   (28.10.08 19:58) [20]
Впринципе место идеальное(SaveDialog1FolderChange), но раз в нм нельзя использовать это свойство, то какие ещё есть варианты???


Сергей М.   (2008-10-28 19:58:00) [5]


> как обратиться к свойству имени файла?


Да вот прямо так и обращайся...

Вопрос-то, видимо, в другом - является ли упомянутый тобой обработчик ( процедурный метод!!!) подходящим "местом" для установки значения этоо свойства..


Правильный$Вася   (2008-10-28 19:01:00) [6]


> хм...

а ты подумай
я зашел в папку - у тебя плюсуется имя
я вышел из папки - у тебя опять плюсуется имя (строка)
я так могу гулять долго, а имя у тебя получится состоящее из всех цифр переходов


Zhekson   (2008-10-28 17:49:00) [7]

Сергей М. ©   (28.10.08 17:25) [13]
вообще ты прав, ф -ция в данном случае не при чём... вопрос скорее, как обратиться к свойству имени файла???


{RASkov}   (2008-10-28 17:40:00) [8]

> не верный алгоритм присвоениянового имени....

(получения, генерация)


{RASkov}   (2008-10-28 17:39:00) [9]

> [14] Zhekson   (28.10.08 17:33)
> Ф-ция считает кол-во файлов определённого расширения, в
> определённой папке. Это нужно для определения нового имени
> файла
, которое будет получено путем прибавления единицы
> к количеству файлов в папке. Подсчёт производится успешно,
> но присвоения не происходит. Почему???

А если такое имя уже будет, то что?
Скорее всего у тебя не верный алгоритм присвоения нового имени....


{RASkov}   (2008-10-28 17:35:00) [10]

> [14] Zhekson   (28.10.08 17:33)

Поищи в интернете пример "дотукивания" до "имени файла" в диалоге с применением EnumChildWindows функции...
Пример, на сколько мне помнится, был связан со сменой расширения при смене типа файлов но исправить для твоей задачи - не составит труда.


Zhekson   (2008-10-28 17:33:00) [11]

Сергей М. ©   (28.10.08 17:13) [5]
и как быть???

Ф-ция считает кол-во файлов определённого расширения, в определённой папке. Это нужно для определения нового имени файла, которое будет получено путем прибавления единицы к количеству файлов в папке. Подсчёт производится успешно, но присвоения не происходит. Почему???


Сергей М.   (2008-10-28 17:25:00) [12]


> Zhekson   (28.10.08 17:24) [11]


Ты не хмыкай, ты скажи причем здесь функция)..


{RASkov}   (2008-10-28 17:25:00) [13]

> А он не про обработчик - он про функцию долдонит)..

Функция его тоже не из "прямых".... Но не в ней конечно же дело.... куда уж нагляднее [5]?


Zhekson   (2008-10-28 17:24:00) [14]

Правильный$Вася   (28.10.08 17:19) [10]
хм...


Правильный$Вася   (2008-10-28 17:19:00) [15]


> а вернее: SaveDialog1.FileName := SaveDialog1.FileName +
> IntToStr(GetFileCount(GetCurrentDir; '*.tbl') + 1);

т.е. ты хочешь, чтобы при перемещении между папками имя файла все увеличивалось и увеличивалось в ДЛИНЕ ?


Сергей М.   (2008-10-28 17:17:00) [16]


> {RASkov} ©   (28.10.08 17:16) [8]


А он не про обработчик - он про функциюдолдонит).. Вызов которой он осуществляет в обработчике и при этом пеняет на функцию)


{RASkov}   (2008-10-28 17:16:00) [17]

> [6] Zhekson   (28.10.08 17:13)

Да бестолку в данном обработчике напрямую изменять свойство FileName....


Сергей М.   (2008-10-28 17:16:00) [18]


> Zhekson   (28.10.08 17:13) [6]


Это неимеет отношения к реализации функции.
Не важно что делает функция - важно что она возвращает некое значение типа integer


Zhekson   (2008-10-28 17:13:00) [19]

2 Сергей М. ©   (28.10.08 17:09) [4]

SaveDialog1.FileName := IntToStr(GetFileCount(GetCurrentDir; '*.tbl') + 1);

а вернее: SaveDialog1.FileName := SaveDialog1.FileName + IntToStr(GetFileCount(GetCurrentDir; '*.tbl') + 1);

но эффект тот же...((


Сергей М.   (2008-10-28 17:13:00) [20]


> присвоения параметра не происходит


procedure TForm1.SaveDialog1FolderChange(Sender: TObject);
begin
SaveDialog1.FileName := '2';
ShowMessage(SaveDialog1.FileName); // ЧТОвидишь ?
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо