На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как скопировать файл((???
    Пишу программу (Дельфи 6) нужно чтоб она в фоновом режиме копировала файлы из одной папки в другую, по таймеру.... И желательно чтоб в трее висела... Я вообще-то админ а не программер, но шэф требует..... Так что понятия не имею как это делать(((((( Может подскажете.... У меня Винда 2000, а работать это всё должно на 98, тоже блин гемор((((

    Заранее спасибо!!!
      Из win32.hlp:
      BOOL CopyFile(

         LPCTSTR lpExistingFileName,      // pointer to name of an existing file
         LPCTSTR lpNewFileName,      // pointer to filename to copy to
         BOOL bFailIfExists      // flag for operation if file exists
        );      


      Что касается Tray, зайди на torry.ru и залей оттуда SysTray сомпоненту - вот тебе и иконка.
      Кинь на форму таймер и пропиши туда (Timer1.OnTimer) свои операции копирования.

      Нажми Project->View source и напиши: Application.ShowMainForm := False;
       SysTray1.Visible := True;
       Form1.Timer1.Active := True;
      ...

      Ну вот и всё! :)
        Спасибо за совет!!! Но с таймером у меня вообще глюки копирование я сделал через function MoveFiles(WndHandle: HWND; From, To_: String; FilesOnly, Moving: Boolean): Integer;
        var
         OpStruc: TSHFileOpStruct;
         frombuf, tobuf: Array [0..MAX_PATH] of Char;
        begin
         FillChar(frombuf, Sizeof(frombuf), 0);
         FillChar(tobuf, Sizeof(tobuf), 0);
         StrPCopy(frombuf, From);
         StrPCopy(tobuf, To_);
         with OpStruc do
         begin
           Wnd := WndHandle;
           if Moving then wFunc:= FO_MOVE
                     else wFunc:= FO_COPY;
           pFrom := @frombuf;
           pTo := @tobuf;
           if FilesOnly then fFlags := FOF_NOERRORUI + FOF_NOCONFIRMATION + FOF_FILESONLY
                        else fFlags := FOF_NOERRORUI + FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR;
           hNameMappings:= Nil;
           lpszProgressTitle:= Nil;
         end;
         Result := ShFileOperation(OpStruc)
        end;

        Мне посоветовали а я уж в принципе ночью доразбирался сам. А вот с таймером у меня сплошные заморочки...... В трэй он кидает по 2 -3-4 иконки программы, причём одна висит даже в design-time????? А с тай
          Блин не то нажал(((( А с таймером мне никак не разобраться...... Хелпов не установлено....  а сам никак не пойму как он работает..... Моно мне плиз кусок кода примерного события по таймеру - раз в пять мин....... ну только такого для даунов ( для меня то бишь)  ;)  Заранее огромное спасибо,  и ещё вышеприведённый кусок работает под Вин20000 будет ли он работать на Вин98-Ме????

          Очень благодарен.....
            работать то оно... хотя применять API SHFileOperation есть смысл когда у тебя группа файлов или ты хочешь видеть процесс копирования, запросы на перизапись и все такое в стиле виндовс....

            а для одного файла достаточно copyFile и  moveFile

            а какие проблемы с таймером непонятно

            в дизайн-мод ставишь timerInterval на 300000 (это 5*60*1000) и потом на закладке events делаешь обработчик события onTimer - и в этой процедуре пишешь свое копирование ну или вызываешь уже готовую

            p.s. вот только таймер вещь не совсем точная....
              Ну мне надо копировать группу файлов, только вот как прогресс бар туда запихать не в курсе. Вернее из папки надо считать объём файлов, и знать объём каждого скопированного файла.... а вот как это вычисляется.....??????? А запросов на перезапись и в помине не нужно, наоборот, всё должно быть от юзера скрыто......
                если ты собрался копировать SHFileOperation то там ты уже получишь прогрессбар от виндовс...

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

                готовый пример дать ен могу..... у меня тут D3 на win2k, а это дело не работает под NT (но в D6 платформа любая, я думаю :) )

                эта штука даст тебе доступ к массиву из элементов типа tSHNAMEMAPPING

                typedef struct _SHNAMEMAPPING { // shnm
                   LPSTR pszOldPath; // address of old path name
                   LPSTR pszNewPath; // pointer to new path name
                   int   cchOldPath; // number of characters in old path name
                   int   cchNewPath; // number of characters in new path name
                } SHNAMEMAPPING, FAR *LPSHNAMEMAPPING;

                ну тебе просто надо все их просмотреть и узнать размеры файлов

                примерно это будет так

                ExpandedWrap disabled
                   
                  var
                    fo:tSHFILEOPSTRUCT;
                    nm:tSHNAMEMAPPING;
                   
                  begin
                    ....
                    SHFileOperation(fo)
                    ....
                    
                    for i:=0 to SHGetNameMappingCount(fo.hNameMappings)-1 do
                      begin
                          nm:=SHGetNameMappingPtr(fo.hNameMappings,i);
                        
                        // смотрим размер файла string(nm.pszNewPath)
                        // и записываем его в лог или т.п.
                   
                      end;
                    SHFreeNameMappings(fo.hNameMappings);
                    ....
                  end;

                ..
                но я могу и ошибаться.........

                ну а внешний вид диалога копирования можно натроить.....чеоез fFlags
                  Но блин проблема с доступом, если файл из папки для копирования открыт Аксцессом, то ни один вобще не копируется, системные предупреждения отключены.....  Что делать..........???? Там где это будет стоять все файлы будут открыты, и что всё зря в итоге или моно обойти в виндах занятость файла?????
                    Можно прочитать в TMemoryStream() а оттуда сохранить куда нужно. Это один из малочисленных способов открыть какой-либо файл, который уже открыт.
                    Заметьте, что переместить его нельзя, только скопировать.
                      Не работает(((( С акцессом (((((
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0310 ]   [ 16 queries used ]   [ Generated: 2.05.24, 08:46 GMT ]