Здравствуйте, уважаемые эксперты! Подскажите пожалуйста, где у меня может быть ошибка. Я использую следующую функцию для архивации каждого файла, обрабатываемого программой void __fastcall Arh(String File) { Memo1->Lines->Clear(); Memo1->Lines->Add("@arj m " + FileName(ExtractFileName(File)) + " " + ExtractFileName(File) + " -y -hf2"); Memo1->Lines->Add("@del runn.bat"); Memo1->Lines->Add("@exit"); Memo1->Lines->SaveToFile("runn.bat"); if(WinExec("runn.bat /wait",0) > 31); MAttach = FileListBox1->Directory + "\" + FileName(ExtractFileName(MAttach)) + ".arj"; } Используемая при этом функция FileName AnsiString FileName(AnsiString File) { AnsiString Name = ChangeFileExt(ExtractFileName(File), "");
return Name; } Но при использовании этой функции архивируются не все файлы, а только некоторые, и то, через раз. Как можно улучшить работу этой функции (Arh)?
Приветствую Вас, Alexandr! Какой-то ужасный код. 1) Зачем батник создавать, если можно сразу из WinExec вызвать Arj? 2) Что это за ужасный способ создания текстового файла через TMemo? Нельзя разве fstream использовать или API? 3) Ключ m - это архивирование файлов с удалением исходных файлов. Может, у них атрибут ReadOnly и из-за этого они не удаляются? Ответ отправлен: 25.09.2003, 07:24 Отправитель: Marouder
Вопрос № 958
Как из DLL-ки показывать немодальную форму. Библиотека написана под готовое приложение и в ней не предусмотрена передача Application.Handle. Нужно чтобы форма работала параллельно Dll-ке, что-то показывала и реагировала на кнопки. Пробовал создать форму через Form:=TForm1.Create(nil); Form.Show; Форма создаеться :), но ни на что не реагирует :(. Как должны обрабатываться сообщения для формы? Или без Applicatin это не получится?
Здравствуйте, Sucker! А почему она должна на что-то реагировать? Ты же не написал ни одного обработчика событий :). Сделай вот что: 1. Создаешь форму как обычно. 2. Кидаешь на нее кнопки, едиты и все что тебе нужно. 3. В событиях (типа Button1.OnClick) описывешь все, что тебе нужно сделать с компонентом. 4. Сохраняешь с каким-нибудь именем, например MyForm.pas. 5. Делаешь DLL'ку (см. приложение). 6. Должно работать ;).
Приложение: Ответ отправлен: 24.09.2003, 05:14 Отправитель: sir henry Отвечает Marouder
Добрый день, Sucker! Я уже не помню точно. Давно как-то занимался этим вопросом. Но без Application, наверное, не получится. Ответ отправлен: 25.09.2003, 07:24 Отправитель: Marouder
Вопрос № 959
Привет всем трудящимся Экспертам! Немного вопросов набралось: Delphi: 1) Есть у меня, например, элемент TImage на форме, размером 400x300. Как мне БЫСТРО записать все точки RGB этой картинки в массив array[1..400,1..300] of TColor? 2) Как мне затем БЫСТРО записать этот массив обратно? 3) Какой есть бесплатный компонент для создания региональных окон? 4) Какой есть бесплатный компонент для создания региональных кнопок с событиями смены изображения при MouseMove и MouseDown? 5) Как средствами Delphi я могу получить список всех файлов, их точное местоположение и размер с определённого сайта? 6) Как мне установить указатель (Pointer) на определённую область памяти, если я знаю её адрес? Подписчикам: 7) Есть такая книга М.Краснова "OpenGL. Графика в проектах Delphi."+FD. Может кто поможет достать примеры
с дискеты, прилагающейся к этой великолепной книге? 8) В каком интернет-магазине лучше всего покупать книги наложенным платежом? Интересуют только проверенные вами сервера. P.S.: Слушайте, а зачем нужны всякие алгоритмы поиска пути, когда Волновой - самый быстрый и надёжный? Только для теории?
Приветствую Вас, URiS! 1) var a:array[0..399,0..299] of TColor; var i,j:integer; ............. for i:=0 to Image1.Picture.Width-1 do for j:=0 to Image1.Picture.Height-1 do a[i,j]:=GetPixel(Image1.Canvas.Handle,i,j) 2) ......................... for i:=0 to 399 do for j:=0 to 299 do pixels[i,j]:=a[i,j]; 3),4) What's it: REGIONALNIE KNOPKI (OKNA) Ответ отправлен: 23.09.2003, 21:11 Отправитель: Cybernetic Creature Отвечает Артём Шегеда
Добрый день, URiS!
1, 2. Очень настоятельно советую прочитать Win32 API, раздел "Storing an Image". В этом разделе дан пример (правда, на Си) сохранения изображения в файл. Перед тем, как будет что-то записано, очевидно, это что-то нужно получить. Вот в этом примере и получают массив битов изображения (как правило, 24 бита/точку - но нужно предусматривать всё). Ещё одно замечание: в результирующий буфер заносятся строки целиком (нет возможности указать начальный и конечный пиксел строки) 3. Не послать просто не могу: http://www.torry.net/nonrect.htm 4. Аналогично п.3: http://www.torry.net/anibuttons.htm 5. Хм... всех файлов с сайта... Если идёт речь про ftp - то нужно писать ftp-клиент, если речь про http, nj нужно писать парсер HTML-кода и выуживать все гиперссылки, а для относительных путей - восстанавливать
полные пути. Это непростая задача даже для опытных. Само получение какого-либо ресурса - уже проблема, а парсить... 6. Преобразование pointer/integer - допустимо. Также допустимо преобразование <указатель на тип>/pointer. В результате получаем:
var p : PChar; Address : integer; begin ReadLn(Address); p := PChar(pointer(Address)); WriteLn(p); end;
Ответ отправлен: 24.09.2003, 12:38 Отправитель: Артём Шегеда Отвечает Marouder
Здравствуйте, URiS! 5) Используй Функции из WinInet. На rusfaq.ru лежит дока. Здесь долговато объяснять. 6) Очень просто. Pointer - это, по сути, почти то же самое, что и Cardinal. Оба - 32 битные беззнаковые целые. В памяти они выглядят абсолютно одинаково. Только тип надо привести. Вот пример. Установить указатель по адресу 401000h: var p:pointer; begin p:=Pointer($401000); end. Ответ отправлен: 25.09.2003, 07:24 Отправитель: Marouder
Вопрос № 960
Хеллоу КОЛЛЕГИ (Уж больно нравится это слово) Есть проблема: Дан битмап файл, (огромный около 2,5х1,5 кв. метров, но проверку лучше проводит на маленких файлах где то 200х100 пиксель) Черно белый. А там график (кривая). нужно найти координаты (в пикселях) все минимумы и максимумы (локальные). Глобальные я нашел. для тех кто не понял глобальные и локальные обясняю(Глобальный минимум или максимум это самая нижняя или верхняя точка графика а локальные минимумы или максимумы это все вершинные точки графика) тот код который я написал высылаю.см приложние плиз доделайте если сможете очень нужно до четверга не надо ссылки типа Делфиворлд.народ.ру или что то подобное Извините за мой акцент я воопше то не местный.
Добрый день, Cybernetic Creature! Точно так-же просканируй поколоночно или построчно весь рисунок :). Ответ отправлен: 24.09.2003, 06:07 Отправитель: sir henry Отвечает THE_PRO
Доброе время суток, Cybernetic Creature! poskolku ne pomestilos suda... bratan ya uje poslal otvet tebe na email ot ocp@mail.az Ответ отправлен: 25.09.2003, 10:01 Отправитель: THE_PRO
Вопрос № 961
Как мне различить графическая или текстовая инфор. в БО! В чем мне открыть гр.информ.?
В документации на Win32 API есть пример программы. Поищи раздел "Example of a Clipboard Viewer". Это полностью работающий код - только на Си. Ответ отправлен: 25.09.2003, 12:31 Отправитель: Артём Шегеда
Вопрос № 962
Здравствуйте ув. Эксперты! Как проиграть аудио файл без компонента MediaPlayer. НАпример на OnButtonCLic начал проигрыватся файл fail.wav(mp3) Заранее спасибо!
Здравствуйте, elvis! Procedure PlaySound Ответ отправлен: 25.09.2003, 21:24 Отправитель: Cybernetic Creature Отвечает sir henry
Добрый день, elvis! С помощью функции PlaySound(). Если есть декодер мр3, то мр3 тоже будет проигрываться. Если декодера нет, то можно запустить с помощью: ShellExecute(хэндл_окна, 'open',имя_файла,nil,nil,sw_show) тогда, на какую программу у тебя зарегистрированы мр3, та и запуститься. Ответ отправлен: 25.09.2003, 08:55 Отправитель: sir henry Отвечает CJ
Доброе время суток, elvis! Ну правильно! Надо обязательно этот комнонент! Ну или ты ас, то пиши свой модуль!
Ответ отправлен: 25.09.2003, 14:49 Отправитель: CJ Отвечает Bob Johnson
Доброе время суток, elvis! Есть функция PlaySound. wav файл она сыграть сможет (причем как с диска, так и из ресурсов приложения).
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 26.09.2003, 00:40 Отправитель: Bob Johnson
Вопрос № 963
Привет эксперты. Пытаюсь работать с Dll-динамически. var h:^cardinal; hn:=Загружаю h:=GetProcAddress(hn,'RunTest'); asm jmp h // выполняю процедуру end; а вот как функции выполнить с получением результата(cardinal/byte/string) незнаю.Спасибо
Добрый день, AllDer! А зачем ты так выполняешь функцию?? var code:cardinal; code := h;<---выполняется h и результат в code
*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***
Ответ отправлен: 25.09.2003, 03:10 Отправитель: _vt Отвечает Дима Мусиенко
Добрый день, AllDer! jmp - это инструкция безусловного перехода. И то она прыгает только, по-моему, в пределах 64Kb. Вместо неё надо использовать call. Рекомендую почитать соответствующую литературу. А возвращаемое значение возвращается в регистре eax, причем в нем может возвратиться и значение и адрес, если это массив или иной тип данных, например класс. Но в данном случае луше не прибегать к ассемблеру а поступить как ответили другие эксперты. Ответ отправлен: 25.09.2003, 19:46 Отправитель: Дима Мусиенко Отвечает sir henry
Здравствуйте, AllDer! Твоя функция в DLL'ке должна возвращать результат. И еще добавляй к ней (на всякий случай :) stdcall. Ответ отправлен: 25.09.2003, 09:02 Отправитель: sir henry Отвечает ART_43
Добрый день, AllDer! h:=GetProcAddress(hn,'RunTest'); var1:=h(var2); Ответ отправлен: 25.09.2003, 10:00 Отправитель: ART_43 Отвечает Marouder
Здравствуйте, AllDer! 1. Результат в регистре eax. Вот пример. Допустим, резултат нужно записать в FuncResult (любого типа): asm call h // выполняю процедуру mov funcresult,eax //записываем результат в FuncResult. end; Обрати внимание, что не "jmp h", а "call h". А вообще-то правильнее: "call dword ptr [h]". 2. Я все никак понять не могу, почему ты используешь указатель на Cardinal? В твоем случае можно просто использовать нетипизированный указатель. var h:Pointer; Разницы в результате нет, но по правилам хорошего тона, надо делать именно так. 3. Тип String в DLL тоже использовать не надо. Во избежание глюков. Надо PCHAR использовать. 4. Не обязательно asm использовать. Можно просто: var h:function:cardinal; hh:THandle; FuncResult:Cardinal; begin hn:=Загружаю h:=GetProcAddress(hn,'RunTest'); if
(@h<>nil) then FuncResult:=h; //если адрес получен нормально, вызываем функцию h, результат отправляем в FuncResult. end;
Ответ отправлен: 26.09.2003, 08:22 Отправитель: Marouder
Вопрос № 965
Уважаемые знающие люди, помогите со следующим вопросом: Как можно узнать об изменениях на диске - создание/удаление/переименование/перемещение файла/файлов/папки/папок, и как получить сведения о создании/удалении/переименовании/перемещении файла/файлов/папки/папок - имя и путь, дата изменения/создания, старый и новый путь (если перемещали), когда удалили и прочее? А также об открытии, сохранении файла?
Приветствую Вас, FreeElectron! Yesli ti xochesh viet vse "processes" kotoriye proisxoyat vo vremya raboti tvoyey progi, toqda ti mojesh ispolzovat WM_"..." (Windows Messages). Yesli eto ne tot otvet kotoriy tebe nujen, toqda utochni vopros! Ответ отправлен: 25.09.2003, 10:17 Отправитель: THE_PRO Отвечает Marouder
Здравствуйте, FreeElectron! Можно перехватить функции CreateFile, DeleteFile, CreateFolder, DeleteFolder и т.п. Про перехват писалось в книге Рихтера "Windows для профессионалов", на Wasm.ru и ,кажется, на rsdn.ru (но на rsdn.ru - отстойная статья, чайник какой-то писал, лучше всего у Рихтера). Ответ отправлен: 26.09.2003, 08:22 Отправитель: Marouder
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.