Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 933
от 23.09.2007, 15:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 466, Экспертов: 73
В номере:Вопросов: 4, Ответов: 8


Вопрос № 102392: Уважаемые эксперты, прошу совета! Через функцию WinExec запускаю WinRar.exe с кучей параметров. Например winrar.exe a C:Documents and SettingsRifoРабочий стол1.rar @list.lst –t. Если в пути создаваемого архива нет пробелов – все отлично, если ест...
Вопрос № 102419: Здравствуйте Уважаемые эксперты! Большое спасибо всем кто мне ответил на предыдущий вопрос. Подскажите пожалуйста, как сделать так, чтобы при входе в поле ввода программа определяла какая раскладка клавиатуры русская или английская является а...
Вопрос № 102443: Уважаемые эксперты, есть проект написанный на Delphi 2006 VCL когда я пытаюсь открыть его в Delphi 2007 выдает ошибку об отсутствии компонента DCOM. Подскажите как избавится от этой ошибки, может по умолчанию этот компонент не подключен, где...
Вопрос № 102465: Здраствуйте. Я использую компонент TTreeView. Чтобы использовать его в процедуре я зочу предавать не сам обхект а указатель на него, объявив предварительно тип type PTreeView= ^TTreeView ... procedure DoSomething(Tree:...

Вопрос № 102.392
Уважаемые эксперты, прошу совета! Через функцию WinExec запускаю WinRar.exe с кучей параметров. Например winrar.exe a C:Documents and SettingsRifoРабочий стол1.rar @list.lst –t. Если в пути создаваемого архива нет пробелов – все отлично, если есть пробелы (как в данном примере) то ошибка - выскакивает диагностическое сообщение. Как преодолеть сие препятствие? Какими спец знаками можно заменить пробелы, чтобы WinRar-у было понятно?
Заранее благодарю.
Отправлен: 17.09.2007, 22:01
Вопрос задал: Rifo (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Louken
Здравствуйте, Rifo!

Как известно, у каждого файла и папки, полное имя состоит из имени диска, пути и собственно имени (у файлов еще и расширение). Ну это я так, вместо вступления. Дак вот, раньше, во времена DOS'a, имена не могли превышать 8-ми символов (плюс точка и 3 символа для расширения в имени файла). В Windows, имена могут иметь длинну, в совокупности, не превышающюю 255 символов, но старое правило тоже осталось в силе. Т.е., имя папки "C:Documents and SettingsAll Users" имеет аналог в записи: "C:Docume~1AllUse~1" (попробуйте ввести такое имя в строку адреса в проводнике). Вот такой подход должен помочь, в решении Вашей проблемы.
Осталось только как-то преобразовать привычное имя к старому формату (функция в приложении).

Функцию можно использовать, например так:
ShowMessage(ShortFileName('C:Documents and SettingsAll Users'));

Т.к. Вы будете иметь дело именно с файлами, то DirectoryExists замените на FileExists.

P.S. Выяснилось, что старый формат (DOS), оказывается называется коротким именем, а новый (Windows) - длинным именем.

P.P.S. Функция взята из DelphiWorld

Приложение:

Ответ отправил: Louken (статус: Студент)
Ответ отправлен: 17.09.2007, 23:01
Оценка за ответ: 5
Комментарий оценки:
Думаю, что "укорачивание" не причем. Методом проб и ошибок выяснил, что с легкостью обрабатываются и "длинные" папки и "длинные" файлы. Спасибо за подробный ответ.

Отвечает: Gh0stik
Здравствуйте, Rifo!

Дело в том, что архиватор WinRAR при работе через консольную строку использует короткие DOS-имена файлов (8 символов в имени + 3 расширение), в следствии этого у Вас и возникает ошибки. Вам просто необходимо перевести путь к файлу архива в надлежащий вид (C:Docume~1RifoРабочи~11.rar).

Для Вашей строке необходимо сделать предварительную обработку:
var FileName:string;
shotPath:array[0..255] of char;
begin
...
GetShortPathName(PChar (FileName), shotPath, Sizeof (shotPath) - 1);
ShowMessage(StrPas(shotPath));
...
end;


Good Luck!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Профессор)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 17.09.2007, 23:08
Оценка за ответ: 5
Комментарий оценки:
Думаю, что "укорачивание" не причем. Методом проб и ошибок выяснил, что с легкостью обрабатываются и "длинные" папки и "длинные" файлы. Запинка именно в пробелах. Спасибо за подробный ответ.

Отвечает: LEXASOFT
Здравствуйте, Rifo!

Попробуйте заключить в кавычки! Помогает :)
winrar.exe a "C:Documents and SettingsRifoРабочий стол1.rar" @list.lst –t.

---------
>>>Этот текст уменьшается, значит от Вас уносят монитор<<<
Ответ отправил: LEXASOFT (статус: 7-ой класс)
Ответ отправлен: 18.09.2007, 06:01
Оценка за ответ: 5
Комментарий оценки:
Добавил кавычки - заработало!!! Большое спасибо!


Вопрос № 102.419
Здравствуйте Уважаемые эксперты!
Большое спасибо всем кто мне ответил на предыдущий вопрос.
Подскажите пожалуйста, как сделать так, чтобы при входе в поле ввода программа определяла какая раскладка клавиатуры русская или английская является активной и устанавливала русскую, если активной была английская ?
За ранее благодарю.
Геннадий.
Отправлен: 18.09.2007, 07:55
Вопрос задал: Geb2003 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gladiator
Здравствуйте, Geb2003!
В таймере проверяешь текущую раскладку и изменяешь на нужную (См. приложение)

Приложение:

Ответ отправил: Gladiator (статус: Студент)
Ответ отправлен: 18.09.2007, 08:10

Отвечает: Zubex
Здравствуйте, Geb2003!

Менять раскладку клавиатуры считается плохой стиль программирования, поэтому я советую Вам при входе в поле ввода запоминать последнюю раскладку, а при выходе восстанавливать в исходное состояние.

Пример в приложении.

Удачи.

Приложение:

---------
Если не знаешь что сказать - лучше промолчи...

Ответ отправил: Zubex (статус: 7-ой класс)
Ответ отправлен: 18.09.2007, 09:55


Вопрос № 102.443
Уважаемые эксперты,
есть проект написанный на Delphi 2006 VCL
когда я пытаюсь открыть его в Delphi 2007 выдает ошибку об отсутствии компонента DCOM. Подскажите как избавится от этой ошибки, может по умолчанию этот компонент не подключен, где его включить ?
Отправлен: 18.09.2007, 11:51
Вопрос задал: Кэр Лаэда (статус: Практикант)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 16)

Отвечает: din
Здравствуйте, Кэр Лаэда!
Компоненты DataSnap должны быть в файле dclmcn100.bpl, если этот файл есть в наличии (<Директория установки Делфи 2007>in), просто установите эти компоненты, если файла нет, то это ограничение редакции.
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Специалист)
Ответ отправлен: 18.09.2007, 16:20
Оценка за ответ: 2
Комментарий оценки:
читайте минифорум


Вопрос № 102.465
Здраствуйте.
Я использую компонент TTreeView.
Чтобы использовать его в процедуре я зочу предавать не сам обхект а указатель на него, объявив предварительно тип

type
PTreeView= ^TTreeView
...
procedure DoSomething(Tree:PTreeView);
begin
end;

Однако позже я не могу передать указатель:
...
DoSomething(@TreeView1);

Компилятор говорит что указатель возможен только для констант или переменных ("variable required")

Подскажите как правильно использовать указатели в данном случае.

Отправлен: 18.09.2007, 14:14
Вопрос задал: Yujin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Примак Руслан Николаевич
!!!
Здравствуйте, Yujin!

!!!

Компилятор вам говорит, что требуется передать переменную, а не константу. Вы пытаетесь передать адрес указателя (@TreeView1), который являясь числом рассматривается компилятором как константа.
Есть несколько решений:
1. Объявите переменную типа TVPtr: PTreeView и присвоейте ей значение TVPtr := @TreeView1, и затем передайте в качестве параметра DoSomething(TVPtr);
2. Использование типа указателя не обязательно в вашем случае, если вы объявите procedure DoSomething(Tree:TTreeView); вы добъетесь того же эффекта, компилятор будет оперировать с указателем на дерево, а не со всей памятью.
3. Объявите procedure DoSomething(const Tree:PTreeView); Тем самым указывая, что параметр меняться не будет. Это по сути, уловка, поскольку значение указателя на память не меняется при изменении самой памяти. Этим приемом пользоваться не рекомендуется, т.к. путается логика работы программы. По идее указывая const вы указываете, что объект не болжен меняться, а по сути - позволяете его менять.


То что Вы пишете в своём ответе не имеет смысла. Пожалуйста, почитайте про классы в Дельфи.
Эксперт sir henry.
-----
sir henry (Академик)
Ответ отправил: Примак Руслан Николаевич (статус: 4-ый класс)
Ответ отправлен: 18.09.2007, 14:28
Оценка за ответ: 5
Комментарий оценки:
хороший ответ спасибо

Отвечает: Виктор Пырлик
Здравствуйте, Yujin!

Уж незнаю, зачем вам это надо, но вот код, каторый вполне работает.

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 18.09.2007, 18:02


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.60 от 22.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное