Обсуждение программирования на Delphi в конференции ru.delphi
Windows XP
Привет Вам, Maks.
MK> *1 Вопрос:*
MK> Можно ли программно менять темы Windows XP,
MK> если да, то как?
SetWindowTheme - можно даже только для своего окна. Эффект рулёзный. Также
посмотри на OpenThemeData и на DrawThemeBackGroundEx.
MK> *2 Вопрос:*
MK> Можно ли переключать программно меню Пуск,
MK> с классического на XP`еновое, если да, то как?
Видимо SystemParametersInfo или через IShellMenu::XXX, но ни то ни другое
для менюшки "Пуск" лично не пробовал.
MK> *3 Вопрос*
MK> Можно ли программно производить теже манипуляции
MK> с Таскбаром и показом часов, если да то как?
Что значит "те же"? Работать с таскбаром удобно через ITaskBarList::XXX
или через ShellNotifyIcon. Если интересует именно внешний вид, то
SystemParametersInfo.
З.Ы. Это вопросы не по эхотагу совсем, ага.
Hу вот и всё. Я рад, если Вам понравилось.
* Origin: Земля - приют на миг, а жизнь - чудесный вздор! (2:5022/81.16)
CRC32 файла
Привет Вам, aleXander.
aF> Hужно как можно быстрее вычислять контрольную сумму файла,
aF> например CRC32. Дело в том, что файл может быть несколько
aF> гигабайт, поэтому в память его загружать целиком нельзя.
aF> Сейчас я использую для этого TFileStream, читаю кусками по 1 мб.
aF> Выходит не слишком быстро, imho, может еще быстрее можно?
aF> Да и у TFileStream недостаток серьёзный: он не видит файлы
В WMI есть такой класс Win32_FileSpecification. В нём определены в
частности и поля для CRC и т.д. Вот в сторону WMI и следует копать, особенно в
сторону Windows Installer'a 2.0 и выше. В нём эта функциональность уже
реализована и не худшим образом.
Hу вот и всё. Я рад, если Вам понравилось.
* Origin: Земля - приют на миг, а жизнь - чудесный вздор! (2:5022/81.16)
pipe
Hello everybody.
Прокомментируйте нижеследующий модуль работы с чтением из трубы.
Работает, но где-то здесь вроде ошибка?
И конструкция
while true do begin
PipeFromDemod:=tPipeFromDemod.Create(...
PipeFromDemod.Free;
end;
Тоже вызывает ошибку, хотя по алгоритму не должна.
unit Pipe;
interface
uses
Windows, Classes, SysUtils,
Dialogs,
Security,
TypeArrayOfByte;
const
cMaxDataFromDemodSize=$FFFF;
type
tPipeFromDemod=class(tThread)
FPipeName: string;
FPipeHandle: tHandle;
FKadrProcessorHandle: tHandle;
FWM_Kadr: THandle;
FEvent: tHandle;
FEventQuit: tHandle; //event on termination
FEventOnQuit: tHandle; //event on termination
FEvents: array[1..2] of THandle;
FpData: pArrayofByte;
FpSending: pArrayofByte;
procedure Execute; override;
public
constructor Create(APipeName: string; AKadrProcessorHandle: tHandle;
AWM_Kadr: THandle);
destructor Destroy; override;
procedure Terminate;
end;
implementation
// tPipeFromDemod
constructor tPipeFromDemod.Create(APipeName: string; AKadrProcessorHandle:
tHandle; AWM_Kadr: THandle);
var
sa: SECURITY_ATTRIBUTES;
begin
inherited Create(true);
FKadrProcessorHandle:=AKadrProcessorHandle;
FWM_Kadr:=AWM_Kadr;
FPipeName:=APipeName;
sa:=CreateSecurityAll;
FPipeHandle:=CreateNamedPipe(PChar(FPipeName),
PIPE_ACCESS_INBOUND or //данные идут только от клиента к серверу
PIPE_ACCESS_DUPLEX or //убрать потом
FILE_FLAG_OVERLAPPED, //Overlapped режим
PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or //данные читаются из
пайпа как поток сообзений
PIPE_WAIT, //блокирующий режим
PIPE_UNLIMITED_INSTANCES, //максимальное количество экземпляров пайпа
$FFFF, $FFFF, //рамеры буферов чтения записи
NMPWAIT_USE_DEFAULT_WAIT,
[@] sa); //указатель на дескриптор безопасности
FreeMem(sa.lpSecurityDescriptor);
if FPipeHandle=INVALID_HANDLE_VALUE then
raise Exception.Create('CreateNamedPipe: '+SysErrorMessage(GetLastError));
FEvent:=CreateEvent(nil, //no SA
true, //manual reset
true, //initial state is signaled
nil); //no name
if FEvent = 0 then
raise Exception.Create('CreateEvent: '+SysErrorMessage(GetLastError));
FEventQuit:=CreateEvent(nil, //no SA
true, //manual reset
false, //initial state is nonsignaled
nil); //no name
if FEventQuit = 0 then
raise Exception.Create('CreateEvent: '+SysErrorMessage(GetLastError));
FEvents[1]:=FEvent;
FEvents[2]:=FEventQuit;
FEventOnQuit:=CreateEvent(nil, //no SA
true, //manual reset
false, //initial state is nonsignaled
nil); //no name
GetMem(FpData, cMaxDataFromDemodSize);
FreeOnTerminate:=True;
Resume;
end;
destructor tPipeFromDemod.Destroy;
var
dwWait: dword;
begin
SetEvent(FEventQuit);
dwWait:=WaitForSingleObject(FEventOnQuit, 5000);
case dwWait of
WAIT_OBJECT_0: begin
// ShowMessage('WAIT_TIMEOUT 0')
end;
WAIT_TIMEOUT: begin
ShowMessage('WAIT_TIMEOUT 1')
end;
end;
DisconnectNamedPipe(FPipeHandle);
CloseHandle(FPipeHandle);
CloseHandle(FEvent);
CloseHandle(FEventQuit);
FreeMem(FpData);
if Assigned(FpSending) then
FreeMem(FpSending);
CloseHandle(FEventOnQuit);
inherited;
end;
procedure tPipeFromDemod.Execute;
var
ovl: TOverlapped;
le: DWORD;
dwWait: DWORD;
fSuccess: boolean;
cbRet: DWORD;
lpNumberOfBytesRead: dword;
begin
while not Terminated do begin
sleep(1);
DisconnectNamedPipe(FPipeHandle);
FillChar(ovl, sizeof(ovl), 0);
Ovl.hEvent:=FEvent;
if not ConnectNamedPipe(FPipeHandle, [@] ovl) then begin
le:=GetLastError;
case le of
ERROR_IO_PENDING: begin
dwWait:=WaitForMultipleObjects(2, PWOHandleArray( [@] FEvents), false,
INFINITE);
case dwWait of
WAIT_OBJECT_0: begin
fSuccess:=GetOverlappedResult(FPipeHandle, ovl, cbRet, false);
if not fSuccess then continue;
end;
WAIT_OBJECT_0+1: begin
Terminate;
end;
end;
end;
ERROR_PIPE_CONNECTED: begin
end;
else begin
Terminate;
end;
end;
end else begin
continue;
// Terminate;
end;
while not Terminated do begin
sleep(1);
if not ReadFile(FPipeHandle, FpData^, $FFFF, lpNumberOfBytesRead, [@] ovl)
then begin
le:=GetLastError;
case le of
ERROR_IO_PENDING: begin
dwWait:=WaitForMultipleObjects(2, PWOHandleArray( [@] FEvents), false,
INFINITE);
case dwWait of
WAIT_OBJECT_0: begin
fSuccess:=GetOverlappedResult(FPipeHandle, ovl,
lpNumberOfBytesRead, false);
if not fSuccess then break;
end;
WAIT_OBJECT_0+1: begin
Terminate;
break;
end;
end;
end;
else begin
//pipe is broken or some errors
//need to reconnect
break;
end;
end;
end;
if (lpNumberOfBytesRead>0) then begin
GetMem(FpSending, lpNumberOfBytesRead);
Move(FpData^, FpSending^, lpNumberOfBytesRead);
PostMessage(FKadrProcessorHandle,
FWM_Kadr,
integer(lpNumberOfBytesRead), integer(FpSending));
FpSending:=nil;
end;
end;
end;
SetEvent(FEventOnQuit);
end;
procedure tPipeFromDemod.Terminate;
var
dwWait: dword;
isTerminated: boolean;
begin
isTerminated:=Terminated;
inherited Terminate;
if not isTerminated then begin
SetEvent(FEventQuit);
dwWait:=WaitForSingleObject(FEventOnQuit, 5000);
case dwWait of
WAIT_OBJECT_0: begin
// ShowMessage('WAIT_TIMEOUT 0')
end;
WAIT_TIMEOUT: begin
ShowMessage('WAIT_TIMEOUT 1')
end;
end;
end;
end;
end.
Lexa
* Origin: Буратино - ты сам себе злобный (2:5061/122.12)
Unicode котролы с поддержкой WinXP themes
From: "aleXander Olegovich Fedorov" <xof [@] email.su>
Hi,
Мне нужны супер контролы. Супер они потому, что должны
одновременно поддерживать Windows XP Themes (то есть
XP-ишные скины) и работать нормально с Unicode.
Конкретнее, нужен комбобокс. Перерыл сайт Torry - неудачно...
Те контролы, что я нашел, не поддерживают WinXP skins.
Очень желательно, чтобы были бесплатные. Если таких не знаете,
говорите те которые Вам известны, пусть даже и платные.
Hо если кто-то знает бесплатные,все равно не поленитесь сюда
пожалуйста сообщить!
xof
* Origin: Demos online service (2:5020/400)
компонент DES
Buenas Dias All!
Ищется фpиваpный компонент для 7ой Delphi, шифpyющий данные по алгоpитмy DES.
Киньте линком плиз?
Multo Fortune!
* Origin: [Welcome 2 the Butterfly's Cave!] (2:466/44.9)
Re: компонент DES
From: "Alexey Goloborchy" <alexey [@] bicomtel.ru>
> Ищется фpиваpный компонент для 7ой Delphi, шифpyющий данные по алгоpитмy
DES.
> Киньте линком плиз?
Библиотека DEC. www.inspired.sk/delphi/components/component.php?ID=55
Алексей.
* Origin: BiComTel (2:5020/400)
Re: ТОЛЬКО одна копия пpоцесса
"Nikolay Krysuk" <Nikolay.Krysuk [@] p49.f1.n454.z2.fidonet.org>
> И не только Хэндл! А если машину перегрузили Reset'om? файлик та не
> удалиться! Для исключения такой ситуации используются логи, в которых
> записывается время, дата запуска машины, а прога при загрузке проверяет
> время/дату создания файл-флага и сравнивает с тем, которое в логе
> записалось.
> Таким средневековым методом можно сделать.
> А вообще - это из прошлого тысячилетия. Мьютексами можно! Только почитать
> повнимательней надо. Там что-то с Global нужно похимичить ..
Hичего с Global особенного химичить не надо. Просто задаешь имя mutex-а в
виде "Global\..." и всего-то. И он будет один на всех юзеров. Читайте
справку по CreateMutex в Platform SDK Documentation.
Что касается всяких файликов, создаваемых в каталоге программы, сие есть
ересь и безграмотность. Ибо вовсе не факт что программа может писать в свой
каталог.
* Origin: South Ural Network (2:5010/70)
Re: Работа с почтой ч/з Delphi
> "Tulinov Aleksandr" <delphin [@] sbor.net> сообщил/сообщила в новостях
>> Как отправлять/получать почту из Delphi? В хелпе почитал - не нашел :(
"Vladimir Polyakov" <spectr [@] cislink.ru>
> Я через Indy отправлял. Рулит - очень несложно в применении и хорошо
> работает.
Рекомендую также рассмотреть способ отправки через MAPI, т.е. с
использованием почтовой программы зарегистрированной в системе.
* Origin: South Ural Network (2:5010/70)
как из Дельфи определить имя принтера в виндах
From: "Сергей Бородин" <bor1 [@] bmg.dp.ua>
А подскажите как из Дельфи определить имя принтера в виндах?
* Origin: Alkar Teleport News Server (2:5020/400)
как из Дельфи определить имя принтера в виндах
Здравствуй, Сергей.
07 Oct 05, Сергей Бородин писал(а) к All:
СБ> А подскажите как из Дельфи определить имя принтера в виндах?
uses Printers;
....
ShowMessage(Printer.Printers.Text);
mad
* Origin: carpe diem (2:468/57.205)