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

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

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

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Блин, прришлось 32-битный битмап использовать. А вообще, как будут отображены значки, скажем в 2000 системе или ранних? С темным цветом по краям или прозрачно? Просто нет возможности проверить. =)
 
Это и еще есть тупой вопрос. Почему чуть ли не во всех примерах использования функций FindFirst в finally суют Windows.FindClose, а не просто FindClose? Я так понимаю Windows с точкой перед FindClose в данном случае просто тупо обозначение модуля, из которого вытягивается сама функция с ее параметрами. Или это прям так важно Windows.FindClose всегда указывать? =)
 
И еще непонятно. Например хочется перерисовать контрол, и нужен сабкласс. Можно ли каким-то образом там обработать WM_DRAWITEM, а не WM_PAINT? Что-то не получается. =)

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 12:03 20-01-2009
lerthe61

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

Цитата:
Windows.FindClose

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

Цитата:
И еще непонятно. Например хочется перерисовать контрол, и нужен сабкласс. Можно ли каким-то образом там обработать WM_DRAWITEM, а не WM_PAINT? Что-то не получается. =)

Можно, см message (directive) в справке. Там очень неплохие примеры

Всего записей: 74 | Зарегистр. 04-05-2007 | Отправлено: 12:31 20-01-2009
ShIvADeSt



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

Цитата:
И еще непонятно. Например хочется перерисовать контрол, и нужен сабкласс. Можно ли каким-то образом там обработать WM_DRAWITEM, а не WM_PAINT? Что-то не получается

Потому что по сути контрол это отдельное окно, и если ты его сабклассишь, то он отрисовывается в событии WM_PAINT (WM_DRAWITEM - это событие основного окна о том, что перерисовывается контрол, а не само окно. В случае сабкласса - контрол является основным окном). Это мои догадки, хотя думаю я не далек от истины.

Цитата:
А вообще, как будут отображены значки, скажем в 2000 системе или ранних

А разве 2000 32-битные поддерживает? Просто насколько я помню иконки в ней убого смотрятся, но по крайней мере на тулбаре когда использовал 32 битные иконки темных областей не видел. Более ранние винды ИМХО можно забыть, да и 2к в качестве рабочей станции редкость уже.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 12:53 20-01-2009
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите плз, как разрулить проблему :
 
thePath holds the Windows Temp directory:  
 
~~~~~~~~~~~~~~~~~~~~~~~~~
var
   lng: DWORD;
   thePath: string;
begin
  SetLength(thePath, MAX_PATH) ;
  lng := GetTempPath(MAX_PATH, PChar(thePath)) ;
  SetLength(thePath, lng) ;
end;
 
К сожалению в Vista прога запущенная с правами ограниченного пользователя получает от этой функции пустую строку,если же запустить с правами админа, то получаем реальный путь.

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 18:12 20-01-2009
lerthe61

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Erazer
Возможно трабл в том, что пользователь на столько ограничен, что не имеет доступа к переменным среды.  
Попробуйте под пользователем получить значение переменной TEMP
(в консоли набрать set Temp, если не выдаст строку - это оно самое)
 
Также можно получить ошибку сразу после GetTempPath при помощи GetLastError и FormatMessage (для строкового представления)

Всего записей: 74 | Зарегистр. 04-05-2007 | Отправлено: 19:00 20-01-2009 | Исправлено: lerthe61, 19:02 20-01-2009
Frodo_Torbins

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Erazer
Может попробовать через SHGetSpecialFolderPath? Кстати у нее есть интересная приписка:

Цитата:
fCreate
Indicates if the folder should be created if it does not already exist. If this value is nonzero, the folder will be created. If this value is zero, the folder will not be created.

Может просто ваша папка еще не существует? Кстати что вам возвращает ваш код под админом?

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 19:03 20-01-2009
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lerthe61
Обычный пользователь висты с правами админа. Из проводника все проги запускаются с минимальными правами.. В манифесте стоит "asInvocker". Изучите матчасть прежде чем строить такие предположения
 
Добавлено:
Frodo_Torbins

Цитата:
Может просто ваша папка еще не существует?

Что значит не существует ? Это же не просто тупо папка это виндозная пака временных файлов. И она себе прекрасно существует, если программа запускается с правами администратора (requestedExecutionLevel level="requireAdministrator").
 
Добавлено:

Цитата:
Может попробовать через SHGetSpecialFolderPath

С удовольствием, подходящую константу не подскажете ? Полный список здесь:Ссылка
 
Добавлено:
lerthe61
Цитата:
Также можно получить ошибку сразу после GetTempPath при помощи GetLastError и FormatMessage (для строкового представления)
Боюсь что там скажут что нехватает прав, но конечно сегодня гляну как только попаду домой.
 

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 19:24 20-01-2009
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lerthe61
Спасибо, теперь понятно. Но что самое интересное, такое очень часто попадается просто в примерах, где других модулей и не используется. Вероятно по привычке не глядя размещают код. =)
 
Erazer
GetTempPath вроде бы возвращает путь временной директории в директории пользователя, а не в самой директории системы. Вот может действительно в ограниченной учетной записи такой директории просто нет?
 
P.S. Я как-то не заморачивался без всяких SetLength.
 
function ExtractTempPathA: AnsiString;
var
  lpBuffer : Array [0..MAX_PATH] of AnsiChar;
begin
  GetTempPathA(Length(lpBuffer), lpBuffer);
  Result := lpBuffer;
end;

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 20:30 20-01-2009
Erazer



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

Цитата:
Вот может действительно в ограниченной учетной записи такой директории просто нет?  

Может и так, мне в общем то все равно куда писать, мне просто нужно получить путь к папке для временных файлов. Вопрос в том КАК это сделать, так чтобы работало и в Vista без запуска проги с правами админа.

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 21:36 20-01-2009 | Исправлено: Erazer, 21:36 20-01-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Erazer
В висте новая фича - не давать узнать какого типа значение в реестре, а тем более сами данные этого значения. Вы можете получить в таком раскладе - либо экзепшен либо отсутствие данных. Моя программа делает вообще замечательный вывод - в висте нет интернет эксплорера. Ну зачем интернет юзерам давать , пусть в нём только админы сидят. Да и каталог темп давно используют только инсталлеры.
 
lerthe61
Есть ещё такая фунция - GetEnvironmentVariable('TEMP'). Она учитывает возможность того, что в консоли могли переопределить каталог TEMP для конкретного процесса, а не в реестре.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:46 20-01-2009
Erazer



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

Цитата:
Моя программа делает вообще замечательный вывод - в висте нет интернет эксплорера.
мож она не так смотрит ? Прав просто не хватает... Так их наверное получить просто надо, вопрос только в том как ?
 
 
Добавлено:
просто даже судя по тому что другие программы из под ограниченного пользователя с привилегиями типа asInvoker прекрасно работают и с реестром и с временными папками,становится ясно что все работает, вот только как?

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 21:53 20-01-2009
Frodo_Torbins

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

Цитата:
Что значит не существует ?

Некоторые из папок, к которым можно получить доступ с помощью SHGetSpecialFolderPath создаются по первому запросу.

Цитата:
С удовольствием, подходящую константу не подскажете ?

CSIDL_LOCAL_APPDATA + '\Temp' - но это конечно крайний вариант.

Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:29 20-01-2009
Erazer



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

Цитата:
Некоторые из папок, к которым можно получить доступ с помощью SHGetSpecialFolderPath создаются по первому запросу.

Так это ж некоторые а мы говорим о конкретной..
 
Добавлено:
delover

Цитата:
Есть ещё такая фунция - GetEnvironmentVariable('TEMP')

Спасиб! Расчудесная функция, она как раз вернула мне путь к ПОЛЬЗОВАтельскому каталогу временных файлов, в отличии от всех остальных дававших путь к системному каталогу.
НО, почему то помещенная в OnCreate она тоже возвращает пустую строку,а вот в OnShow прекрасно дает что положено. Кто нибудь может объяснить почему так ? Я вот только что подумал, может и другие функции точно так же возвращают пути, просто я вызывал их всегда в OnCreate и поэтому они давали пустую строку ?
Но проверять сегодня уже просто нет сил.
 
 
Добавлено:
Теперь  у меня другая проблема, 1 чел наваял сию функцию  
 
function RegGetExpandString(RootKey: HKEY; Name: String; Var Value: String): boolean;
var
  Buf: Pointer;
  BufSize: Cardinal;
begin
  Result := False;
  Value := '';
  if RegGetValue(RootKey, Name, REG_EXPAND_SZ, Buf, BufSize) then
  begin
    Dec(BufSize);
    SetLength(Value, BufSize);
    if BufSize > 0 then
      Move(Buf^, Value[1], BufSize);
    FreeMem(Buf);
    Result := True;
  end;
end;
 
И она чудненько работает под 2007, а в 2009, возвращает что надо,+ кучу мусора
Может у кого из пристутствующих хватит ума и желания подрихтовать ее чтобы она нормально взаимодействовала и с юникодным string, т.к. мне кажется вся проблема в нем... А то сам я не в силах пока - "многабукаф"

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 23:02 20-01-2009
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто нить может подсказать как заставить работать    
 
  Reg := TRegistry.Create(KEY_READ);
  Try
  Reg.SaveKey('Software\Microsoft\Windows Mail',TmpFolder + '\WMailReg1.reg');
  Finally
    Reg.Free;
  End;
в Vista без прав админа ?

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 02:10 21-01-2009
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Erazer
Проблема в этом
Opens the specified key with the security access value KEY_ALL_ACCESS and saves the specified key and all of its subkeys and values to a hive file.
 
function SaveKey(const Key, FileName: String): Boolean;
то есть при SaveKey автоматом права пытаются взяться с полным доступом, в итоге обломинго.

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

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:22 21-01-2009
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пасип! придется самамому сохранять все что нужно персонально так сказать.

Всего записей: 1729 | Зарегистр. 02-08-2003 | Отправлено: 12:03 21-01-2009
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
Вы смотрели sbrlprof? Если четно, то я закрутился. Однако,.. Сейчас пишите ближе к вечеру - inet дома и бывает возможность помочь...

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:14 22-01-2009
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
delover
А что такое sbrlprof? Даже гугил не знает... =)

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 10:33 23-01-2009
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
После переустановки системы нужно заново ставить все библиотеки, но когда их несколько, лень с каждой выполнять одни и те же телодвижения. Скажите, где можно почитать о параметрах командной строки, с которыми можно создать батник и компилять сразу несколько пакетов?

Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 14:32 23-01-2009
lerthe61

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Может сделать ProjectGroup и BuildAll?

Всего записей: 74 | Зарегистр. 04-05-2007 | Отправлено: 14:49 23-01-2009
   

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru