| 
| 
 | Вопрос # 3 346/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Подскажите пожалуйста !
 При запуске приложение в событии OnActivate нужно программно определить путь к каталогу Program Files
 
|  |   Вопрос задал: Kyran29 (статус: Посетитель)Вопрос отправлен: 30 октября 2009, 22:40
 Состояние вопроса: открыт, ответов: 3.
 |  Ответ #1. Отвечает эксперт: Amidamaru Здравствуйте, Kyran29!Нужно добавить в uses юнит shlobj и использовать например функцию из приложения.
 FloderId - CSIDL_PROGRAM_FILES
 Приложение:Переключить в обычный режим function GetShellFloderPath(FloderId:integer):string;var ss1:array[0..MAX_PATH] of WideChar;beginSHGetFolderPathW(0,FloderId,nil,0,ss1);Result:=ss1;end;
|  | Ответ отправил: Amidamaru (статус: 4-ый класс)Время отправки: 30 октября 2009, 22:57
 Оценка за ответ: -1
 |  Ответ #2. Отвечает эксперт: Паровоз Здравствуйте, Kyran29!
 uses SHFolder;
const
  SHGFP_TYPE_CURRENT = 0;
var
  s:String;
begin
  SetLength(s,MAX_PATH);
  SHGetFolderPath(0,CSIDL_PROGRAM_FILES,0,SHGFP_TYPE_CURRENT,PChar(s));
  Edit1.Text:=s;
end; 
|  | Ответ отправил: Паровоз (статус: 10-ый класс)Время отправки: 30 октября 2009, 23:45
 Оценка за ответ: 5
 |  Ответ #3. Отвечает эксперт: Жикльор Здравствуйте, Kyran29!
 На самом деле все очень просто. Не нужно использовать сверху указанные варианты (ну это у кого какой вкус). Как по мне то можно просто обратится в реестр за этой информацией. Значение которое мы ищем лежит в HKLM\Software\Microsoft\Windows\CurrentVersion. Для этого мы пишем функцию которая узнает путь к ПрограмФайлес и вернет ее в результате:
 
 
 function GetProgramFilesDir: string;
 var
   reg: TRegistry;
 begin
   reg := TRegistry.Create;
   try
     reg.RootKey := HKEY_LOCAL_MACHINE;
     reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion', False);
     Result := reg.ReadString('ProgramFilesDir');
   finally
     reg.Free;
   end;
 end;А теперь просто используем ее в вашем обработчике OnActivate:
 
 
 procedure TForm1.OnActivate(Sender: TObject);
var
ProgramFiles: string;
begin
ProgramFiles:=GetProgramFilesDir;
ShowMessage(ProgramFiles);
end; З.Ы. Только не забудьте в раздел uses добавить модуль Registry.
 
|  | Ответ отправил: Жикльор (статус: 5-ый класс)Время отправки: 6 ноября 2009, 11:53
 
 |  
 Мини-форум вопросаВсего сообщений: 12; последнее сообщение — 3 ноября 2009, 12:38; участников в обсуждении: 6. 
|   | Kyran29 (статус: Посетитель), 30 октября 2009, 23:47 [#1]:Amidamaru Delphi 7 выдает ошибку.
 [Error] Unit1.pas(27): Undeclared identifier: 'SHGetFolderPathW'
 |  
|   | Kyran29 (статус: Посетитель), 30 октября 2009, 23:56 [#2]:Большое спасибо Паровоз !!! Вы меня опять выручили !!!
 |  
|   | Amidamaru (статус: 4-ый класс), 31 октября 2009, 10:14 [#3]:Изза одного символа ставить -1 ? Ктомуже у меня в 2006й делфи всё работает. |  
|   | Паровоз (статус: 10-ый класс), 31 октября 2009, 12:34 [#4]:Дело не в одном символе. Используемая функция находится не в shlobj,а в в другом модуле - SHFolder (в том числе и для Delphi 2006.) |  
|   | Паровоз (статус: 10-ый класс), 31 октября 2009, 12:40 [#5]:To Kyran29: 
 "-1" - это, конечно, слишком сурово.
 |  
|   | min@y™ (статус: Доктор наук), 31 октября 2009, 13:04 [#6]: Цитата (Kyran29): При запуске приложение в событии OnActivate нужно программно определить путь к каталогу Program Files 
 А зачем в OnActivate? Думаешь, что во время работы твоей програнны путь к Program files может измениться?
 Может всё-таки достаточно в OnCreate?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Kyran29 (статус: Посетитель), 31 октября 2009, 14:02 [#7]:min@y™ добрый день ! 
 А зачем в OnActivate? Думаешь, что во время работы твоей програнны путь к Program files может измениться?
 
 
 Путь к Program files думою не изменится.
 Можно OnCreate, можно OnPaint.
 Но мне надо OnActivate.
 |  
|   | min@y™ (статус: Доктор наук), 31 октября 2009, 14:08 [#8]: Цитата (Kyran29): Но мне надо OnActivate. 
 ЗАЧЕМ??!!11
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Kyran29 (статус: Посетитель), 31 октября 2009, 17:14 [#9]:min@y™ Надо!!!
 |  
|   | Паровоз (статус: 10-ый класс), 1 ноября 2009, 23:18 [#11]:Аватарку тоже надо убрать. Как раз для магистра это недопустимо. |  
|   | Ерёмин А.А. (статус: *Администратор), 3 ноября 2009, 12:38 [#12]: Цитата (Егор): он магистр, ему можно  Правила едины для всех и нецензура не разрешена никому, независимо от статуса. Учимся пользоваться личными сообщениями.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |