Раздел "Каком к верху", посвящён вашим вопросам "Как?". Если ты хочешь задать свой вопрос, то пиши мне сюда Почтальон. Пожалуйста, конкретизируй свои вопросы. Если твои вопросы будут маленькими и конкретными, то они попадут сюда, и ты их увидишь очень скоро. Иначе мне придётся писать отдельную статью, а такого у меня очень много и не известно, когда я напишу тебе ответ.
Как получить короткий путь файла если имеется длинный?
Для этого уже давно существует функция GetShortPathName. Она имеет три параметра:
длинный путь (тип Pchar)
короткий путь, суда запишется результат (тип Pchar)
длинна буфера указанного во втором параметре (тип Integer).
Как можно скопировать файлы с помощью стандартных средств?
Для этого есть специальная функция ShFileOperation.
procedure TForm1.Copy1Click(Sender: TObject);
var
FSrc,FDes,FPath: string;
begin
FDes := '';
if not SelectDirectory('Select Directory', '', FDes) then exit;
FSrc:=DirectoryPath +#0;
DoSHFileOp(Handle, FileOpMode[0], FSrc, FDes, true);
end;
DirectoryPath – указывает на директорию, которую надо скопировать. Функция DoSHFileOp выглядит так:
function TForm1.DoSHFileOp(Handle: THandle; OpMode: UInt; Src,
Dest: string; DelRicleBin: Boolean): Boolean;
var
Ret: integer;
ipFileOp: TSHFileOpStruct;
begin
Screen.Cursor:=crAppStart;
FillChar(ipFileOp, SizeOf(ipFileOp), 0);
with ipFileOp do
begin
wnd := Handle;
wFunc := OpMode;
pFrom := pChar(Src);
pTo := pChar(Dest);
if DelRicleBin then
fFlags := FOF_ALLOWUNDO
else
fFlags := FOF_NOCONFIRMMKDIR;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := '';
end;
try
Ret := SHFileOperation(ipFileOp);
except
Ret := 1;
end;
result := (Ret = 0);
Screen.Cursor:=crDefault;
end;
FileOpMode – константа, которая выглядит как:
const
FileOpMode: array[0..3] of UInt =(FO_COPY, FO_DELETE, FO_MOVE, FO_RENAME);
Объявлять эту константу надо перед implementation. Например:
var
Form1: TForm1;
const
FileOpMode: array[0..3] of UInt =(FO_COPY, FO_DELETE, FO_MOVE, FO_RENAME);
implementation
{$R *.DFM}
С помощью этой функции можно копировать удалять директории вместе с подкаталогами. Только не забудь подключить в раздел USES модуль ShellApi.
Почему моя MDI Child форма при закрывании просто минимизируется? Как сделать так, чтобы она закрывалась?
Создаёшь обработчик события OnClose и в нём пишешь Action := caFree.
Как с помощью CreateProcess сделать так, чтобы прога ждала завершения работы другой???
Легко:
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOW;
if not CreateProcess(nil,
zAppName, { указатель командной строки, путь к
проге + аргументы }
nil, { указатель на процесс атрибутов безопасности }
nil, { указатель на поток атрибутов безопасности }
false, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or { флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }
nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo) { указатель на PROCESS_INF }
then Result := -1
else
begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;