Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 4

Автор: SerGap
Дата сообщения: 06.05.2009 19:54
Frodo_Torbins
Отчасти согласен, но абсолютно не собирался заставлять обычного юзера сидеть под админом, речь немного о другом, а именно - дать право текущему юзеру вносить изменения в указанной паке. Почему-же только портабл? Заглянем в папку любой установленной программы, что там увидим? - кучу файлов, почему они не в "\Users\*\AppData\Roaming" ? наверно людям пишущим данный софт было выгодно/удобно чтоб файлы располагались рядышком с главным файлом. Так что вирмейкерам я не помощник.
А если по теме то если в верном направлении двигаюсь то интересует хоть самый простой примерчик по использованию этого http://msdn.microsoft.com/en-us/library/aa379579(VS.85).aspx

Автор: Frodo_Torbins
Дата сообщения: 06.05.2009 20:56
SerGap
Поехали дальше

Цитата:
Почему-же только портабл? Заглянем в папку любой установленной программы, что там увидим? - кучу файлов, почему они не в "\Users\*\AppData\Roaming" ?

Либо эти файлы никогда не меняются в процессе работы, либо прога не соответствует требованиям висты. Пример того как надо делать: Софт от майкрософта, FireFox, WinRAR, софт от Adobe, Nero...
Чем еще полезна папка Roaming? Изначально она создавалась для перемещаемых профилей. Пользователь логинится на любой компьютер в сети, и на этот комп с сервера копируются все данные этого пользователя, в том числе и папка Roaming. Если софт написан правильно, он подхватит настройки из этой папки, пусть даже раньше пользователь работал с этим софтом совсем на другой машине.
Или другой вариант: после установки винды эта папка была перемещена на диск D. Потом винда нечаянно слетела. Пользователь провел стандартную переустановку с форматированием диска C, установил софт. Запускает например браузер, и опа... все настройки на месте, как будто винда и не слетала.

Кстати, а в чем удобство хранить файлы рядом с программой? Путь ведь все равно всегда надо указывать полностью. Всякие Memo1.Lines.LoadFromFile('Myfile.txt') работают только до первого вызова OpenDialog-а.
P.S. С примером, к сожалению, помочь не могу.
Автор: SerGap
Дата сообщения: 06.05.2009 21:33
Frodo_Torbins
Хорошо, убедили
Но в целях самообразования хотелось бы с функцией SetNamedSecurityInfo разобраться.
К сожалению ничего полезного гугл не выдает, одни реплики - "я сделал, у меня получилось", а как до конкретных примеров доходит, так сразу пропадает человек куда-то. Вобщем заковыристая какая-то функция.

PS
Еще вопрос немного в эту же тему, как программу от имени администратора запустить?
Для того чтоб в Program Files папку для своей программы создать.
Автор: Frodo_Torbins
Дата сообщения: 06.05.2009 22:16
SerGap

Цитата:
Еще вопрос немного в эту же тему, как программу от имени администратора запустить?

В манифесте надо прописать, что этой проге нужны права админа. Вот пример. Хотя гдето я читал, что достаточно, чтобы в названии экзе-файла было слово "Setup"
Автор: afiget
Дата сообщения: 06.05.2009 22:50

Цитата:
Кстати, а в чем удобство хранить файлы рядом с программой?

После переустановки винды переустановка программы не нужна, все и так работает, нужно лишь вытащить ярлык поближе
Автор: SerGap
Дата сообщения: 06.05.2009 23:12
Не получилось с манифестом, не хочет папку создавать. Но как я посмотрел этих манифестов пруд пруди, наверно нужно подобрать нужный. Буду пробовать.
Автор: Frodo_Torbins
Дата сообщения: 07.05.2009 12:42
afiget
Тут речь шла только о часто изменяемых файлах - как правило файлах настроек. Если программа не умеет их самостоятельно создавать при необходимости и не запускается без этих файлов, то это тоже можно считать глюком. Так что ваш сценарий тожде должен работать, просто потеряются пользовательские настройки.

Сейчас игрался с ситемой виртуализации висты. Прикольно Можно писать в "Program Files", а файлы все равно попадают в "\Users\*\AppData\Local\VirtualStore\Program Files". Дочего же майкрософт со своей совместимостью дошел.
Автор: afiget
Дата сообщения: 07.05.2009 13:42

Цитата:
Тут речь шла только о часто изменяемых файлах - как правило файлах настроек. Если программа не умеет их самостоятельно создавать при необходимости и не запускается без этих файлов, то это тоже можно считать глюком.

Я не об этом. Мои слова были в контексте вашего предыдущего (перед процитированным) предложения:

Цитата:
и опа... все настройки на месте, как будто винда и не слетала


Т.е. при помещении файлов настроек (в том числе и пользовательских) рядом с программой делает это самое "опа" гораздо более приятным, т.к. достигается быстрее и удобнее
Автор: Frodo_Torbins
Дата сообщения: 07.05.2009 16:42
afiget

Цитата:
Т.е. при помещении файлов настроек (в том числе и пользовательских) рядом с программой делает это самое "опа" гораздо более приятным, т.к. достигается быстрее и удобнее

Для вас то оно может и удобнее, но вот для пользователей не очень, т к обычно по такой схеме настройки будут одни для всех пользователей. Да и администратор не сможет заблокировать доступ к папке, чтобы защитиь ее от шаловливых ручек всяких кулхацкеров. Именно для таких программ вся эта вистовая виртуализация и придуманна. Тоесть хотите вы того или нет, а файлы все равно будут хранится где положено
P.S. Правда работает эта виртуализация только для обычных пользователей, как я понял.
Автор: afiget
Дата сообщения: 08.05.2009 00:07

Цитата:
т к обычно по такой схеме настройки будут одни для всех пользователей

Смотря как сделать.
Мы взяли на вооружение принцип работы с пользовательскими настройками из 1С. Есть файл, который содержит сведения о раздельных директориях пользователей. И есть эти самые непересекающиеся каталоги, в которых хранятся локальные пользовательские настройки.
При этом админ может указывать основное хранилище настроек (БД или сетевой каталог), откуда копируются пользовательские настройки на компьютер, за который пользователь сел в первый раз (пользователи могут переходить от машины к машине).
Админ или пользователь могут указать местораположение каталога с настройками на каждом компьютере. Даже могут на одном указать директорию рядом с программой, на другом - \Users\*\AppData\Local...
А может вообще отказаться от сохранения настроек на конкретном компьютере (и обновления основного хранилища).

Кстати, мне вспомнилось, как у одного из клиентов делали реорганизацию сети (была одноранговая сеть, заводили всех в домен). Профили (стандартные виндовые) копировались на некоторых машинах по полтора часа. В подобных случаях наша программа показывает просто спринтерские результаты.
Автор: Frodo_Torbins
Дата сообщения: 08.05.2009 16:24
afiget
C такой схемой от программиста в общем то и не зависит, где будут файлы лежать. Тут уж как админ распорядится.
Автор: InSe0F
Дата сообщения: 08.05.2009 17:16
всем салют.
ищю библиотеки под DShow для win Vista

Единественное что нашел это dx9
вроде бы все нормально, вот проблема с компиляцией
(лежит тут http://sourceforge.net/project/showfiles.php?group_id=53131&package_id=87408&release_id=168907)
при компл. вылезает ошибка
[DCC Error] DirectDraw.pas(359): E2154 Type 'IDirectDrawSurface' needs finalization - not allowed in variant record

Если кто может помочь с комплиляцией или мб есть библиотека под Висту, буду рад помощи)
Очень надо(
Автор: V1s1ter
Дата сообщения: 08.05.2009 18:41
InSe0F
Есть: Asphyre, omega, Clootie, UnDelphiX, xorDX8, XScene Engine, DirectXPanel.
Я не пользовался ими в плане мултимедии, соскочил на OpenGL, но библиотеки остались.
Помоему все с исходниками.
О них можно в сети почитать.
Если надо выложу.
Автор: InSe0F
Дата сообщения: 08.05.2009 18:49
V1s1ter
буду рад
мне вообще надо написать activeX который будет видео каптурить с web камеры
Так что если есть ещё по активиксу примерчик, было бы вообще замечательно

это дипломный проект, сам код обработки изображений уже написан, осталось оболочку сделать, хочу, чтобы объект был универсален
Автор: V1s1ter
Дата сообщения: 08.05.2009 20:39
InSe0F
http://rapidshare.com/files/230657241/3Dx.rar.html
~30 метров всякого добра, наскольго окажется полезным не знаю...

Добавлено:
InSe0F
Да, забыл, пароль стандартный.
Автор: AlekXL
Дата сообщения: 09.05.2009 01:22
Есть почти стандартный тулбар, брошенный на форму, кнопки, и еще на тулбар брошен TLabel с установленным autosize, то эта надпись либо вообще не отбражается, либо отображается неверно при попытке поменять текст надписи.
Суть вопроса в том, чтобы разместить на тулбаре надпись с заранее неизвестным размером.
{TDE}
Автор: delover
Дата сообщения: 09.05.2009 02:25
AlekXL
WinControl.Canvas.TextWidth(Label1.Test)
Автор: InSe0F
Дата сообщения: 09.05.2009 14:39
V1s1ter
респект)

Добавлено:
а кто нить может семпликов простых по актив иксу, а то пока мест не доводилось работать
Автор: boruss
Дата сообщения: 10.05.2009 09:02
up
Автор: Kursist
Дата сообщения: 10.05.2009 21:31
Такой вопрос:
Есть динамический массив:
DinArr: array[0..2] of array of Byte;
И 3 статических массива:
StatArr00: array[0..5] of Byte =(2,2,3,2,2,2);
StatArr01: array[0..1] of Byte =(2,2);
StatArr02: array[0..2] of Byte =(2,2,3);

Нужно что-то вроде:
DinArr[0]:=StatArr00;
DinArr[1]:=StatArr01;
DinArr[2]:=StatArr02;

Ругается, что разные типы (динамический и статический массивы).
Понимаю, можно сделать в цикле откопировать значение одного массива в другой, а можно как-то сразу присвоить целый массив (динамическому массиву статический, может как-то по указателю-ссылке)?

Пытался сделать общий тип:
Type
TmyList =array of Byte;
var
DinArr: array[0..2] of TmyList;
Arr00:TmyList = (2,2,3,2,2,2); <--Так не разрешает инициализировать дин.массив сразу


Пораскинул мозгами и сам решил:
Использую TList:
arrList.Add(@Path01);
arrList.Add(@Path02);
arrList.Add(@Path03);

а потом через PByteArray обращаюсь.
Автор: InSe0F
Дата сообщения: 11.05.2009 02:35
Kursist
жгешь) читай Архангельского что ли для начала

Цитата:
а можно как-то сразу присвоить целый массив

ещё бы чего) это тебе не скриптовый язык, тут память четко выделяться должна
Автор: V1s1ter
Дата сообщения: 11.05.2009 04:10
Kursist
Обойти можно, но не советую.
Если надо быстро сделать копию, то обратьи внимание на функцию Move, модуль System.
Предварительно не забуть выделить память под второй (дублирующий) масив.
Если надо получить несколько типизированных указателей, но масив в памяти ОДИН, тодя динамических масивов это просто присваивание. Для статических лучше сделать типизованые указатели. Про директиву absolute почтай, может это твой случай.
А вообще надо сначала цель указать, а потом спросить как...
Автор: svs123456789
Дата сообщения: 11.05.2009 09:42

Цитата:
Так что ваш сценарий тожде должен работать, просто потеряются пользовательские настройки.
Frodo_Torbins
возьмем для примера тандерберд или оперу, какой в них смысл без настроек??
чел настраивал оформление прог , закладки и получал почту
Автор: Frodo_Torbins
Дата сообщения: 11.05.2009 10:57
svs123456789
Давайте чел будет сам решать, как ему поступать со своими настройками. Если он достаточно продвинут, что ему лень каждый раз их переделывать, то для него не будет проблем позаботится об их сохранении. Для этого нужно включить в проводнике отображение скрытых файлов, зайти в папку "AppData" своего профиля, вызвать меню папки "Roaming" и перейти на вкладку "Расположение".
Если же чел не продвинут, то очень может быть, что UAC у него включен (не забываем про грядущую семерку). Тогда для таких прог система включит виртуализацию, и всеравно не даст им ничего сохранить в свою папку.
Автор: Kursist
Дата сообщения: 11.05.2009 13:47
InSe0F
Я знаю. Да, иногда сталкиваюсь с "ламерскими" ситуациями. А книги Архангельского (несколько) у меня всегда под рукой - поэтому сначала книги листаю, перед тем как спрашивать на форуме.
V1s1ter
Спасибо.

Опишу цель.
Пишу игру. Есть персонажи, которые двигуются по определенному маршруту. Маршрут задается заранее (то есть, статически). Персонажи двигаются в 4 направлениях, у каждого свой маршрут, поэтому:
Path01:array [0..9] of Byte = (2,2,3,2,2,2,3,3,4,4);
Path02:array [0..11] of Byte = (1,2,4,2,0,2,3,1,1,4,2,2);

Проблему решил, использовав TList (храню в нем ссылки на статические массивы). Выкладываю рабочий код.
Необходимо было получить унифицированный (через одну и ту же процедуру) доступ к разным путям (то есть, в каждой сцене свое колличество персонажей, а значит, количество маршрутов. Но сами маршруты уже известны заранее.

Использовал TList:
globPathList.Add(@Path01);
globPathList.Add(@Path02);
globPathList.Add(@Path03);

Получение направления (для каждого персонажа):
for loop := 0 to globHeroList.Count - 1 do
begin
pID:=THero(globHeroList.Items[loop]).Info.PathID;
pStep:=THero(globHeroList.Items[loop]).Info.PathStep;
if THero(globHeroList.Items[loop]).Info.PathStep> High(PByteArray(globpathList.Items[pID])^)
then THero(globHeroList.Items[loop]).Info.PathStep:=0;

Direction:=PByteArray(globpathList.Items[pID])^[pStep];
...


На данный момент сижу над решением другой проблемы - поиск ошибки:
Нужно обнулять PathStep, когда Персонаж доходит до конца маршрута, для этого нужно получить длину массива, на который ссылается globpathList.

Первоначальная реализация была такой:
Path:array [0..2,0..7] of Byte =((3,4,4,4,2,2,2,1),(3,2,2,0,4,4,1,0),(1,1,1,2,4,3,3,3));
А получение направления:
pID:=THero(globHeroList.Items[loop]).Info.PathID;
pStep:=THero(globHeroList.Items[loop]).Info.PathStep;
Direction:=Path[pID,pStep];

Это хорошо работает для 1 сцены, а если их много, это можно обойти сделав: Path:array [0..n,0..m] - где в каждой новой сцене n - номер пути у персонажей будет все возрастать, но есть проблема в такой реализации - одинаковый размер (длина маршрута) для каждого персонажа, а нужен разный размер.

Подскажите, пожалуйста, где у меня ошибка в этом выражении:
High(PByteArray(globpathList.Items[pID])^) т.е. как правильно получить высоту массива, на который ссылается указательс, сохраненный в TList? Спасибо.
Автор: V1s1ter
Дата сообщения: 11.05.2009 14:36
Kursist
Предлагаю поступить немного по другому.
В место статических массивов использовать динамические. Они медленее, но думаю в Вашем случае это совсем не критично. Зато Вы получите два преимущества: читабельный код и возможность использовать многомерный массив без затрат памяти под "выравнивание" как в статическом. Маршруты можно создат при инициализации в коде процедуры, но я настйчево рекомедную считать из файла.
Пример. Трехмерный "разнодлинный" массив.
type
TByteArray: array of Byte;
TByteMatrix: array of TByteArray;
TByteVolume: array of TByteMatrix;
var
V: TByteVolume;

SetLength(V, 3);
SetLength(V[0], 12);
SetLength(V[0, 12], 10);
SetLength(V[2], 7);

Запись пути при инициализации
V[0, 12, 0] := ;
V[0, 12, 1] := ;
...
V[0, 12, 9] := ;

процедура обработки одного пути
procedure OnePath(OneV: TByteArray);
begin
for i :=0 to Length(OneV) do ;
end

вызов OnePath(V[0, 12]);

Для скорости инициализации в файле с путями можно сначала записать длину(разсер) пути, а затем сами данные. Такой подход позволит сразу выделить нужную память, а потом ее заполнить.

И еще IMHO, если что-то в програме сложно, значить что-то сделали не так.


Добавлено:
Опс,
не
for i :=0 to Length(OneV) do ;
а
for i :=0 to Length(OneV)-1 do ;
Непридирайтесь, я только расказал идею, а непривел отлаженный код...
Автор: Kursist
Дата сообщения: 11.05.2009 15:04
V1s1ter
Спасибо за быстрый ответ!
off:Из-за читабельности кода мне массивы больше нравятся, чем TList (Правда, у TList не замечал утечек памяти, в отличие от динамических массивов) - Не надо заморачиваться каждый раз приведением типов. Да, согласен, инициализация динамического массива из файла в данном случае оптимальней, и код читабельней, но мне стало уже интересно разобраться с этой процедурой (для общего развития):

if THero(globHeroList.Items[loop]).Info.PathStep> High(PByteArray(globpathList.Items[pID])^)

Оттрассировал программу, получается, что High(PByteArray(globpathList.Items[pID])^) равно 32767 - это явно не высота массива, а его адрес.
Автор: V1s1ter
Дата сообщения: 11.05.2009 15:32
Kursist

Цитата:
High(PByteArray(globpathList.Items[pID])^)

В отличие от динамических массивов, хранящих количество переменных на них ссылающихя и размер выделенной для них памяти, статистические массивы этого не хранят. Поэтому, вышеуказзанное выражение вернет макимальный индекс для типа PByteArray. Если внимательно посмотреть на этот тип, то можно узнать, что
PByteArray = ^TByteArray;
а
TByteArray = array[0..32767] of Byte;
тогда какое число вернет High(PByteArray(Неважно, что здесь)^) ?
Автор: Maks150988
Дата сообщения: 11.05.2009 15:33
Здравствуйте. Понадобилась юникодовая LowerCase. Сделал так:


Код: function LowerCaseW(szString: WideString): WideString;
var
Ch : WideChar;
L : Integer;
Source: PWideChar;
Dest : PWideChar;
begin
L := Length(szString);
SetLength(Result, L);
Source := Pointer(szString);
Dest := Pointer(Result);
while L <> 0 do
begin
Ch := Source^;
if ((Ch >= 'A') and (Ch <= 'Z')) or ((Ch >= 'А') and (Ch <= 'Я')) then
Inc(Ch, 32);
Dest^ := Ch;
Inc(Source);
Inc(Dest);
Dec(L);
end;
end;
Автор: Kursist
Дата сообщения: 11.05.2009 16:00
V1s1ter
Извиняюсь за оффтоп.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.