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

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

Автор: EugeneBoss3
Дата сообщения: 14.06.2010 02:18
Frodo_Torbins
А можно на примере показать, хотя бы на 90°
Автор: Frodo_Torbins
Дата сообщения: 14.06.2010 10:15
EugeneBoss3
Ну вот например [more=код добавления поворота к уже существующему шрифту]
Код: [no] procedure FlipFont(Font: TFont; Degree: Integer);
const
CardinalBool: array[Boolean] of Cardinal = (0, 1);
PitchVal: array[TFontPitch] of Cardinal = (DEFAULT_PITCH, VARIABLE_PITCH,
FIXED_PITCH);
var
Weight: Integer;
Italic, Underline, StrikeOut: Cardinal;
begin
with Font do
begin
if fsBold in Style then
Weight := FW_BOLD
else
Weight := FW_NORMAL;
Italic := CardinalBool[fsItalic in Style];
Underline := CardinalBool[fsUnderline in Style];
StrikeOut := CardinalBool[fsStrikeOut in Style];

Handle:=CreateFont(Height, 0, Degree*10, Degree*10, Weight, Italic,
Underline, StrikeOut, Charset, Out_TT_Precis, Clip_Default_Precis,
Default_Quality, PitchVal[Pitch], PChar(Name));
end;
end;[/no]
Автор: lezval
Дата сообщения: 15.06.2010 08:51
Здравствуйте. Есть программа на delphi7, в которой происходит выгрузка в excel. В 2003 все выгружается, а в 2007 выдает ошибку открытия файла, причем если excel2007 установлен на XP, то выгрузка проходит через раз. Если на Win7, то ошибка всегда. Писать программу могу только на XP с excel2003, проверять где угодно. Подскажите как решить проблему или ссылку где посмотреть?
Автор: mdid
Дата сообщения: 15.06.2010 09:32
lezval
переделайте выгрузку через OLE...ибо скорее всего вы юзаете стандартный компонент
Автор: ShIvADeSt
Дата сообщения: 15.06.2010 09:33

Цитата:
Подскажите как решить проблему или ссылку где посмотреть?

Добавить для начала окна сообщзений на каждом этапе открытия выгрузки. Может пути неправильно формируются, тогда перед открытием екселя ShowMessage(путь к файлу). Ну и везде try
except и смотрим что не так. Права доступа к файлу проверить заодно.
Автор: lezval
Дата сообщения: 15.06.2010 18:02
mdid
Спасибо. Как сам сразу не подумал. Вот что значит забросить на пол года программирование.
Автор: Maks150988
Дата сообщения: 23.06.2010 00:53
Использую код для проверки привилегий администратора.


Код: function IsUserAdmin: Boolean;
const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
var
hToken : THandle;
ptGroups : PTokenGroups;
dwSize : DWORD;
psidAdmin: PSID;
i : Integer;
bSuccess : Boolean;
begin

Result := FALSE;

bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, TRUE, hToken);

if ((not bSuccess) and (GetLastError = ERROR_NO_TOKEN)) then
bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hToken);

if bSuccess then
try

GetMem(ptGroups, 1024);
bSuccess := GetTokenInformation(hToken, TokenGroups, ptGroups, 1024, dwSize);

if bSuccess then
try

AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin);

{$R-}
for i := 0 to ptGroups.GroupCount - 1 do
if EqualSid(psidAdmin, ptGroups.Groups[i].Sid) then
begin
Result := TRUE;
Break;
end;
{$R+}

finally
FreeSid(psidAdmin);
end;

finally
FreeMem(ptGroups);
CloseHandle(hToken);
end;

end;
Автор: ShIvADeSt
Дата сообщения: 23.06.2010 07:26
Maks150988

Цитата:
Если пользователь не администратор - программы выдает сообщение и закрывается. Соответсвенно мне один пользователь написал что происходит такая вот ситуация, но он работает под доменной учёткой, входящей в доменную группу, прописанной в группе локальных администраторов компьютера (не в Domain Admins). Может кто знает как еще проверить привилегии администратора.

Попробуй так

Код:
const
SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;

function CheckTokenMembership(TokenHandle: THANDLE; SidToCheck: Pointer; var IsMember: BOOL): BOOL; stdcall; external advapi32 name 'CheckTokenMembership';

function IsAdmin: Boolean;
var
psidAdministrators: PSID;
bSuccess: BOOL;
begin
Result := False;
bSuccess:=AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators);
if bSuccess then
if (CheckTokenMembership( 0, psidAdministrators, bSuccess)) then Result:=bSuccess;
FreeSid(psidAdministrators);
end;

Автор: Maks150988
Дата сообщения: 23.06.2010 10:26
ShIvADeSt
Ага, а есть еще:

Код:
function IsUserAdmin: LongBool; stdcall; external 'setupapi.dll' name 'IsUserAdmin';
Автор: ShIvADeSt
Дата сообщения: 23.06.2010 10:44
Maks150988

Цитата:
function IsUserAdmin: LongBool; stdcall; external 'setupapi.dll' name 'IsUserAdmin';

Тоже вариант, я проверил - работает нормально. Все зависит от операционки. Если тебе надо до 2к винды (а оно еще где то юзается?) то твой пример изначальный, если с 2000 то мой точно работает, а вот насчет setupapi я не знаю когда ее внедрили. Проверь либу на основных ОСях, если работает - то ИМХО самое то, минимум кода, максимум пользы.
Автор: Maks150988
Дата сообщения: 23.06.2010 11:38
ShIvADeSt
На MSDN локальной нашел такую функцию. Минимальная система Windows 2000, впринципе у меня программа и под эту систему заточена, так что тогда да, лучше этот вариант использовать раз работает замечательно.
Автор: Man_Without_Face
Дата сообщения: 23.06.2010 16:48
Доброго времени суток, есть вопрос по halcyon:
Создаю поле с датой:
CHDS.CreateFields.Add('SLLASTDATE;d;8;0');
Создается поле формата dd.mm.yyyy. Вопрос как создать поле формата
dd.mm.yyyy hh.mm.ss?
Автор: volser
Дата сообщения: 23.06.2010 20:05
Man_Without_Face
Дата не хранится ни в каком формате, она хранится как дробное число. При выводе на экран это число преобразуется в строку нужного формата.
Автор: Man_Without_Face
Дата сообщения: 24.06.2010 09:00
volser ок, но как с помощью халькона создать поле datetime а не date?
Автор: Aleksandr N
Дата сообщения: 24.06.2010 11:34
Банальный вопрос, но не могу получить результат.
Есть список файлов, после сортировки список выглядит так:
1
10
11
...
19
2
20
...
Каким образом можно привести список к виду:
1
2
3
...
???
Все мне известные алгоритмы не подошли.
Автор: mdid
Дата сообщения: 24.06.2010 12:30
Aleksandr N
сортировка методом пузырька?по идее это первое что должно прийти на ум
Man_Without_Face
если он не умеет то вам же намекнули что даты храниться как вещественное число...вот и создайте поле типа float а в клиенте уже преобразовывайте
Автор: RomanTim
Дата сообщения: 24.06.2010 13:32
Aleksandr N
Когда сравниваешь два элемента списка - если оба переводятся в числа, то сравнивай эти числа, иначе строки.
Автор: Man_Without_Face
Дата сообщения: 24.06.2010 14:06
mdid

Цитата:
а в клиенте уже преобразовывайте

Не совсем понял в каком клиенте?

Автор: mdid
Дата сообщения: 24.06.2010 14:37
Man_Without_Face
ну в программе которая будет открывать этот dbf...хотя он все равно преобразуется автоматом если открыть через asDateTime..в общем проблем быть не должно
Автор: Man_Without_Face
Дата сообщения: 24.06.2010 15:56
mdid Да но у меня нет доступа к программе, которая будет открывать dbf
Автор: Aleksandr N
Дата сообщения: 24.06.2010 16:38
mdid
Посмотрю повнимательней.
Да, подходит. Но имена файлов могут оказаться и в виде слов. Тогда этом метод не подойдет. Как в этом случае?
Автор: G36
Дата сообщения: 24.06.2010 18:35
Добрый день.

Delphi 7 + CnWizards
У класса TThread (например) есть событие OnTerminate. Я создаю наследника этого класса и хочу использовать именно это событие, но ни мой класс, ни TThread не являются компонентами, а значит привычно кликнуть по вкладке Events Инспектора объектов нельзя. Как в таком случае использовать события?

Update:

Frodo_Torbins
Благодарю. Кажется, работает.
Автор: Frodo_Torbins
Дата сообщения: 24.06.2010 19:14
G36
Создайте в своем классе метод вида "procedure Nnn(Sender: TObject)". Ну а дальше простым присваиванием вешаете его на OnTerminate. И вот еще думаю пригодится: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
Автор: lezval
Дата сообщения: 24.06.2010 19:31
Aleksandr N
Тогда в первую очередь надо ориентироваться на длину элемента списка, какое длиннее, то и больше. Если длина одинаковая, то сравниваем как обычные строки. Хотя и здесь есть проблема. Как сравнивать, например, "2" и "1а", кто из них больше? В общем надо четко сформулировать критерий, а дальше корректировать под него любой метод сортировки.
Автор: Aleksandr N
Дата сообщения: 24.06.2010 19:48
lezval
Я пытаюсь переделать имеющуюся функцию под имеющуюся проблему:

procedure TIntList.QuickSort(L, R: Integer; SCompare: TIntListSortCompare);
var
I, J, P: Integer;
begin
repeat
I := L;
J := R;
P := (L + R) shr 1;
repeat
while SCompare(Self, I, P) < 0 do Inc(I);
while SCompare(Self, J, P) > 0 do Dec(J);
if I <= J then begin
ExchangeItems(I, J);
if P = I then P := J
else if P = J then P := I;
Inc(I);
Dec(J);
end;
until I > J;
if L < J then QuickSort(L, J, SCompare);
L := I;
until I >= R;
end;

Может у кого появятся мысли...
Автор: Frodo_Torbins
Дата сообщения: 24.06.2010 20:08
Aleksandr N
Можно добавить в начало строк нолики чтобы все числа имели одинаковый формат. Например для трехзначных чисел получим: "001 ...", "007 ...", "049 ...", "200 ...".
Автор: Aleksandr N
Дата сообщения: 24.06.2010 20:29
Frodo_Torbins
Логично, но не подойдёт.

В Тотале это-же как-то делается, без видимых усилий.
Автор: volser
Дата сообщения: 24.06.2010 20:56
Aleksandr N
В тотале сортируется по строкам, а вам нужно сравнивать по своему алгоритму. Напишите метод SCompare сравнения двух элементов списка и будет вам счастье.
Автор: Aleksandr N
Дата сообщения: 24.06.2010 21:01
volser
Я весь мозг вывихнул, не получается. Функция выше - это переделанная автором функция из Classes.
Автор: Frodo_Torbins
Дата сообщения: 24.06.2010 21:09
Aleksandr N
В любом случае строки нужно будет парсить. А дальше уже либо сравнивать сначала цифровую часть, потом строковую, либо приводить строки к общему формату а потом уже сравнивать.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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