Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vitus_Bering

Цитата:
Получается, что оптимально использовать ShFileOperation.

На самом деле естественно нет, по ряду причин. Допустим есть там один файл, который занят в данный момент каким либо процессом, тогда любая операция шела прервется (потому что так реализзован проводник или это как то обходится?). Для правильного копирования папок и подпапок используется рекурсивная процедура для обхода дерева. Код уже не раз давался, вот еще разок.

Цитата:
 
procedure CopyFolder(Source,Destination:string);
var
   FileInfo                              :TSearchRec;
   DosCode                               :integer;
begin
  DosCode := FindFirst(Source+ '\*.*', faAnyFile, FileInfo);
  try
    while DosCode = 0 do begin
      if (FileInfo.Name[1] <> '.') and (FileInfo.Attr <> faVolumeID) then
      begin
        if (FileInfo.Attr and faDirectory = faDirectory) then begin
          MkDir(Destination+'\'+ FileInfo.Name);
          CopyFolder(Source+'\'+ FileInfo.Name,Destination+'\'+ FileInfo.Name);
         end
        else if (FileInfo.Attr and faVolumeID <> faVolumeID) then begin
            CopyFile(PChar(Source+'\'+FileInfo.Name),PChar(Destination+'\'+FileInfo.Name),false);
        end;
      end;
      DosCode := FindNext(FileInfo);
    end;
  finally
    FindClose(FileInfo);
  end;
//  RmDir(FolderDest);
end;
 

далее  

Цитата:
var  
 FromF, ToF: file;    
 NumRead, NumWritten: Integer;  
 Buf: array[1..2048] of Char;  
begin  
 begin  
 AssignFile(FromF, file1);  
 Reset(FromF, 1);

а почему бы не использовать стандартные АПИ функции по работе с файлами? Я так думаю, что быстрее АПИ никто не сможет работать по виндой.

Цитата:
 
    F1:=OpenFile(FilePath,OfStr,OF_READWRITE);
    if F1=HFILE_ERROR then begin
       Status:='Halted. Process is busy.';
       Exit;
      end;
    SetFilePointer(F1,0,nil,FILE_BEGIN);
    Res:=ReadFile(F1, A[0], FSize, Bytes,nil) ;
    WriteFile(F1,Bt,1,Bytes,nil);
 

проверял, работает быстрее чем стандартный Assign и последующее чтение запись. Так как если посмотреть код то в итоге все равно так идет вызов этих же функций, так проще сразу работать ими.


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:08 24-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть у кого-нибудь ГОТОВАЯ функция, которая бы скрывала папку (не атрибуты)?




однако смотрю мое предупреждение в твоем первом посту тебе ничего не объяснило. Есть уже тема с твоим вопросом. Вот линк, если не умеешь фильтр использовать http://forum.ru-board.com/topic.cgi?forum=33&topic=4996#1

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 07:07 26-03-2006 | Исправлено: ShIvADeSt, 01:48 27-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть задача: в свернутом окне приложения(допустим браузера) кликнуть мышкой на определенную область(не кнопку) не разворачивая окно. Даже не знаю с какой стороны за это взяться. Помогите! Если не туда просьба сильно не пинать.
Зарание спасибо.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 11:55 27-03-2006 | Исправлено: mutmut, 11:58 27-03-2006
dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сначала ищи окно ( FindWindow ) потом шли ему ввод от мыши ( mouse_event )

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 12:18 27-03-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dyr farot

Цитата:
сначала ищи окно ( FindWindow ) потом шли ему ввод от мыши ( mouse_event )

Ну для начала ознакомься как работает моусе_евент и увидишь, что ему нельзя передать хэндл окна. Так как эта функция эмулирует работу мыши, то она не может сделать событие в свернутом окне (это физически невозможно). Если бы это была не область, а контрол (и то не всякий) можно было бы при помощи sendmessage послать событие, а так только единственный способ это разверннуть окно сделать моусе_евент и опять свернуть.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 13:13 27-03-2006
Schatz



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Делфи 7
 
День добрый.
Проблема в следующем
Есть две переменные
Var Counter,MaxCounter:Integer;
 
Усть таймер, вот его обработчик
Begin
***
***
***
  If Counter<MaxCounter then  
    Counter:=Counter+1  
  else
    Counter:=0;
end;
 
Есть код  
MaxCounter:=5;
Timer1.Enabled:=True;
// в обработчике таймера все работает нормально, далее пытаюсь сделать так
Timer1.Enabled:=False;
MaxCounter:=10;
Timer1.Enabled:=True;
//Вот тут то и возникает проблема, в обработчике таймера по прежнему выполняется сравнение между Counter и 5!!!! т.е. MaxCounter в обработчике таймера по прежнему равен 5, хотя в дебагере MaxCounter принимает значение 10.
 
Подскажите как можно правильно оформить сравнение двух переменных  "If Counter<MaxCounter then " ???
 
Добавлено:
Прошу прощение за глупый вопрос, нашел проблему, у меня Counter Принимал значение больше максимального значения своего типа и поэтому автоматически переходил в 0.
Еще раз прошу прощения за глупый вопрос

Всего записей: 55 | Зарегистр. 31-05-2005 | Отправлено: 13:20 27-03-2006 | Исправлено: Schatz, 13:32 27-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
То есть получается, что это не возможно(без разворачивания)? Тогда сама задача теряет смысл. А возможно разворачивать в невидимую область экрана и там сделать клик? Вообще задача в следующем есть flash в браузере, надо нажать на определенную область flash`ки.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 13:38 27-03-2006 | Исправлено: mutmut, 13:48 27-03-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mutmut

Цитата:
невидимую область экрана и там сделать клик

Вообщето да, но такие действия могут очень плохо работать - за этим следят некоторые антивири и начиная с второго сервиспака Windows явно не равнодушна к подобным фокусам. А с броузером, если конечно в настройках безопасности не полазить, она совсем не даст открывать окна за пределами рабочего пространства. Поэтому фокусы в виде "вылетающих окон" неработают. Да и вообще, ТЗ поставлено заведомо неверно. Надо по другому подходить к задаче. Скрываете вы от нас что-то сударь. А телепаты у нас всё таки есть.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 13:51 27-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
Абсолютно ничего не скрываю. Есть окно браузера в нем flash надо периодически нажимать на определенную область и всё. И что бы это не мещало работе в текуший момент.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 13:59 27-03-2006 | Исправлено: mutmut, 16:37 27-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ты не интересовался, какой класс имеет эта область? Попробуй узнать ее дескриптор

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 14:13 27-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
А можно по подробней, как узнать дескриптор области, какую использовать API функцию?

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 16:46 27-03-2006
Olezka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подзкажите где находится объект TFileStream в Delphi 7

Всего записей: 624 | Зарегистр. 30-03-2005 | Отправлено: 17:06 27-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дескриптор можно узнать либо по имени, либо по классу компонента.
Узнаем класс:

Код:
function GetCt(a: hwnd): string;  //Узнать имя класса по дескриптору
var
sBuf: array[0..255] of char;
begin
GetClassName(a,sbuf,256);
result := trim(StrPas(sBuf));
end;
................................................
//Эту процедуру в таймер интервалом ~10
var
wnd: hwnd;
begin
wnd := windowfrompoint(mouse.CursorPos);
Label1.Caption := GetCt(wnd);
end; //Наводим мышь на область, в Label1 отобразится ее класс (записываешь на бумажку)
 

 
После этого перебираешь всех его потомков вот так

Код:
wnd:=GetParent(wnd);
 

Записывая класс каждого из них, пока не доберемся до самой верхушки (формы)
 
Таким образом, у тебя будет полный путь до этого компонента. При запуске своей программы, находишь дескриптор родителя

Код:
wnd := FindWindow("Имя класса, который ты записал последним на бумажку",nil);
 

А дальше добираемся до компонента, перебирая все классы, только в обратном порядке

Код:
wndA := FindWindowEx(wndB,0,'Имя класса',nil); //wndB - дескрипто предыдущего класса  
 

Добрались до компонента, знаем дескриптор. Можно посылать сообщения. wm_mousedown например
 
З.Ы. БЛИН Я НЕУМЕЮ ОБЪЯСНЯТЬ!!!
 
З.Ы. 2 МОЖЕТ ДАШЬ ЭТУ ШТУКУ Я САМ ПОСМОТРЮ?
 
 

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 17:16 27-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar
Всё ты умеешь. Только тут такая фигня получается, что узнаем мы класс, а он равен MacroMediaFlashPlayerActiveX родитель его и есть форма Internet Explorer_Server. Но у родителя не один такой потомок, а их несколько. На странице несколько флешек. Как быть, как унифицировать именно этого потомка?

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 17:56 27-03-2006
RostY



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вы грузите не страницу, а только флешку хттп/..../....swf

Всего записей: 387 | Зарегистр. 11-01-2006 | Отправлено: 18:05 27-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RostY
Загружается страница(php) на ней 3 фрейма, в одном из них несколько флешок,где-то 4-5.

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 18:20 27-03-2006 | Исправлено: mutmut, 18:28 27-03-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Olezka

Цитата:
подзкажите где находится объект TFileStream в Delphi 7

Там, где и в 6,и в 2005 - Classes

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 20:07 27-03-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mutmut
Где то я видел пример работы с виртуальными десктопами, как объяснение быстрого сворачивания всех окон (когда мы нажимаем Win-D) то есть все окна просто меняют свой десктоп, попробуй в инете поискать. Тогда возможно удастся перекинуть свернутое окно на другой десктоп, там нажать (вот только хз где результ отобразится ) и потом обратно перекинуть его на свой десктоп. Насчет поиска окон, как вариант можно эмпиричисеским путем выяснить сколько раз надо сделать FindWindowEx, чтобы получить хэндл именно нашей флэшки и потом посылать ей уже мессагу.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:55 28-03-2006
mutmut



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Отображение результато совсем не нужно. Главное что бы по нажатию отработала флешка.
Я тут проснулся и подумал а если эмпирическим путем вычислить, но на той флешке 5 разных кликабельных облостей, возможно ли будут послать событие именно на обределенную область, или опять будут проблемы какие то?

Всего записей: 46 | Зарегистр. 14-12-2005 | Отправлено: 04:20 28-03-2006 | Исправлено: mutmut, 07:17 28-03-2006
Jokerjar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
На странице несколько флешек. Как быть, как унифицировать именно этого потомка?

В этом случае ИМХО ищем не по классу а по имени

Код:
function Gett(a: hwnd): string;  //имя по дескриптору
var
sBuf: array[0..255] of char;
begin
SendMessage(a, wm_gettext, 256, integer(@sBuf));
result := trim(StrPas(sBuf));
end;

Попробуй, наведи так же мышью, узнай дескриптор а затем имя...
 
Добавлено:
Еще как вариант, можно набросать хук WH_GETMESSAGE и перехватить сообщение, которое посылается области при клике на нее. Ну и потом из программы посылать такое же сообщение

Всего записей: 591 | Зарегистр. 22-03-2006 | Отправлено: 08:04 28-03-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru