![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SaveDialog1.FileName [D7, XP]
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;