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

» Вопросы по Delphi (версии 2009, 2010 Weaver, 2011 Fulcrum)

Автор: psa1974
Дата сообщения: 17.11.2010 14:26
Ludens
Я тоже парился как-то с этим, разочаровался было в стандартном TImageList, брался за TPngImageList - он хорош, ничего не скажешь, иначе бы он не был включен штатно в Дельфи 2010 . Однако *опой чувствовал, что что-то было не так... Не могли разрабы не заметить такой крупной грабли, если бы она была... Короче, на всякий проверь, включена ли опция "Enable runtime themes" в свойствах проекта. При выключенной опции как раз и наблюдается такая ботва, как у тебя... Обычно по умолчанию для новых проектов она включена, а если берется проект, разрабатывавшийся в ранних версиях Дельфи, то эта опция остается выключенной...
Автор: The_Immortal
Дата сообщения: 17.11.2010 17:13
Всем привет.

Ребят, не могу найти компоненты для создания клиент-серверного приложения по технологии CORBA в последней версии билдера... Куда они подевались?
Насколько я помню в старом добром 6-ом билдере CORBA можно было найти в разделе: File - New - Other - Multitier (там необходимые CORBA Client и CORBA Server).
В последнем же билдере по такому пути только какие-то Remote Data Module, Transaction Data Module =/

Кто-нибудь сталкивался с этим?

Или CORBA больше не поддерживают?


Спасибо!
Автор: 0D0A
Дата сообщения: 17.11.2010 20:56
psa1974

Цитата:
включен штатно в Дельфи 2010

Включен TPngImage, ImageList остался старый апишный.

Цитата:
"Enable runtime themes"

Не помогает это...
Автор: Andryshok
Дата сообщения: 17.11.2010 22:11

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

Лично я для таких целей давно уже пользую компоненты AlphaSkins (для жителей СНГ они тем более бесплатны) - только не их скины а их imagelist - и все пучком выходит
, все PNG как должно быть рисуются.

Добавлено:
Да, и еще они добавляют многострочное редактирование labelей и подобного
Автор: Vo1T
Дата сообщения: 18.11.2010 00:45
JEDI набор компонентов для Delphi очень хорош ImageList есть продвинутый - правда на счёт поддержки PNG незнаю но должна быть (http://sourceforge.net/projects/jvcl/)
Автор: Andryshok
Дата сообщения: 18.11.2010 11:26
Vo1T Компоненты бесспорно хороши, однак PNG реализовано там как в стандартных, о чем писалось выше
Автор: Ludens
Дата сообщения: 18.11.2010 15:51

Цитата:
Включен TPngImage, ImageList остался старый апишный.


Да, именно так, к сожалению.


Цитата:
"Enable runtime themes"

Не помогает это...


Верно, не помогает.



Добавлено:

Цитата:
Лично я для таких целей давно уже пользую компоненты AlphaSkins

Вот не хочется, блин, добавлять новые сущности — устанавливать целый еще один пакет компонент, большинство которых нафиг не нужны, и т. п. Мне представляется все-таки оптимальным решение от 0D0A. Если б его еще сильнее почистить, убрав оттуда вообще все, кроме TPngImageList, а из последнего тоже по-максимуму удалить все лишнее, все ненужные методы...
Удивительно, что до сих пор никто не сделал такого проекта.
Автор: mcka
Дата сообщения: 18.11.2010 16:04
Ludens в своем обзоре я писал:
18. Свойство Glyph до сих пор не умеет работать с BMP ARGB 32 bit.
Обойти это можно через Action и TImageList


Чтобы стандартный компонент TImageList корректно работал с иконками ARGB 32 bit нужно следующее:

1. Добавить Manifest. В последней версии включается в свойствах проекта "Enable runtime themes"
2. Добавить TImageList на форму. Обязательно установить ему методы:
ColorDepth := cd32Bit;
DrawingStyle := dsTransparent

Примечание: При изменении этих методов набор очищается

3. Добавить в набор картинку PNG ARGB 32 bit с размерами (width и height) которые указаны в TImageList.

Примечание: .ico файлы лучше не использовать, т.к. в набор добавляються не те размеры, если в файле содержится несколько иконок.
Примечание: помните про левый верхний пиксель.


P.S. Пишите программы красивые! Используйте иконки ARGB 32 bit, используйте DoubleBuffered, используйте для рисования ф-ции в модулях Themes и UxTheme, проверяйте программу на мерцание при изменении размера главного окна, проверяйте программу на другом dpi.
Автор: Ludens
Дата сообщения: 18.11.2010 16:30

Цитата:
Свойство Glyph до сих пор не умеет работать с BMP ARGB 32 bit.
Обойти это можно

Речь-то шла вовсе не о Glyph с BMP, а о Toolbar с PNG
Автор: mcka
Дата сообщения: 18.11.2010 17:02
Ludens Вот в Delphi XE использую стандарные компоненты: TMainMenu, TImageList и TToolBar

Почувствуйте любовь к каждому пикселю:






Другой набор Disable icons в TImageList НЕ использую,

но

в TImageList свой DoDraw для TMainMenu когда ItemDisable [more="код"]
Код:
type
TImageList = class(Controls.TImageList)
    protected
procedure DoDraw(Index: Integer; Canvas: TCanvas; X, Y: Integer;
Style: Cardinal; Enabled: Boolean = True); override;
    end;

TForm25 = class(TForm)
ImageList: TImageList;
//...
procedure TImageList.DoDraw(Index: Integer; Canvas: TCanvas; X, Y: Integer;
Style: Cardinal; Enabled: Boolean);
var
Options: TImageListDrawParams;

function GetRGBColor(Value: TColor): Cardinal;
begin
Result := ColorToRGB(Value);
case Result of
clNone: Result := CLR_NONE;
clDefault: Result := CLR_DEFAULT;
end;
end;

begin
if Enabled or (ColorDepth <> cd32Bit) then
inherited
else
if HandleAllocated then
begin
FillChar(Options, SizeOf(Options), 0);
Options.cbSize := SizeOf(Options);
Options.himl := Self.Handle;
Options.i := Index;
Options.hdcDst := Canvas.Handle;
Options.x := X;
Options.y := Y;
Options.cx := 0;
Options.cy := 0;
Options.xBitmap := 0;
Options.yBitmap := 0;
Options.rgbBk := GetRGBColor(BkColor);
Options.rgbFg := GetRGBColor(BlendColor);
Options.fStyle := Style;
Options.fState := ILS_SATURATE; // Grayscale for 32bit images

ImageList_DrawIndirect(@Options);
end;
end;
Автор: Ludens
Дата сообщения: 18.11.2010 17:20

Цитата:
Почувствуйте любовь к каждому пикселю

О да, вы хороший, я чувствую
Автор: Frodo_Torbins
Дата сообщения: 18.11.2010 17:24
mcka
Вроде речь идет о ситуации, когда темы выключены.
Автор: mcka
Дата сообщения: 18.11.2010 19:23
Frodo_Torbins не вопрос, обновил
Автор: MatrixNT
Дата сообщения: 18.11.2010 20:11
Доброго времени суток!
Давненько назрел вопрос... каким образом, и вообще, возможно ли получить список запущенных процессов в 64битной системе?
В 32х битной есть куча примеров на winapi через функций CreateToolhelp32Snapshot, но в 64 битной системе можно получить тока список PID процессов и имена.exe. Путь к исполняемому файлу отображается тока у 32 битных приложений
Автор: 0D0A
Дата сообщения: 18.11.2010 22:05
Ludens

Цитата:
Если б его еще сильнее почистить, убрав оттуда вообще все, кроме TPngImageList, а из последнего тоже по-максимуму удалить все лишнее, все ненужные методы...

Так уже почистил, больше убирать особо нечего


Добавлено:
mcka

В первой колонке используется TImageList c cd32Bit, dsTransparent. Во второй TPngImageList. В нижнем ряду картинка с прозрачностью 50%.
Автор: Ludens
Дата сообщения: 19.11.2010 21:09
0D0A,
скажи, пожалуйста, а твои PngComponents сделаны на основе PngComponents вот этих?
http://www.thany.org/article/32/PngComponents
Этот сайт сейчас не отвечает, скачать с него ничего невозможно, но на него многие ссылаются.
Автор: 0D0A
Дата сообщения: 20.11.2010 01:32
Ludens
Угу
Автор: Ludens
Дата сообщения: 20.11.2010 01:41
0D0A
Ясно. Странно, что проект остановился. Если б его не было, то его надо было бы выдумать. :) А тут наоборот — он был, но быть перестал. Удивительно, странно, невероятно. Похоже, не обошлось без вмешательства мистических сил. ;)
Автор: Frodo_Torbins
Дата сообщения: 20.11.2010 11:43
Ludens
Не обошлось без вмешательства кодегира. Думаете откуда у них в студии появилась поддержка png?
Автор: Ludens
Дата сообщения: 20.11.2010 13:01
Если вызвать модальную форму (Form2.ShowModal) и попытаться мышкой активизировать основную форму, то основная форма, естественно, останется неактивной, но модальная форма подмигнет три раза. А можно ли сделать так, чтоб не подмигивала?
Автор: 0D0A
Дата сообщения: 20.11.2010 13:42
Ludens

Код: procedure WMSetCursor(var message: TWMSetCursor); message WM_SETCURSOR;
procedure TMainForm.WMSetCursor(var message: TWMSetCursor);
begin
if not ((message.HitTest = HTERROR) and
(message.MouseMsg = WM_LBUTTONDOWN)) then
inherited;
end;
Автор: Ludens
Дата сообщения: 20.11.2010 14:24
0D0A
спасибо, но, о боже, неужели так хитро?
Посмотри, пожалуйста, приложения в Samples, содержащие AboutBox, — например, Football или Swat. Там вызов из меню просто AboutBox.ShowModal;, но модальная форма не мерцает при клике на основную форму.
Автор: 0D0A
Дата сообщения: 20.11.2010 17:10
Ludens
Значит у них родитель (TCreateParams.WndParent) не главная форма. Application.Handle наверно. В старых дельфях всегда так было и ничего не мигало, счас пофиксили, а тебе все равно не нравится
Автор: Ludens
Дата сообщения: 20.11.2010 21:33
0D0A

Цитата:
а тебе все равно не нравится

Ну, это не то чтобы не нравится, а, понимаешь, вот так бывает, что зациклишься на каком-то незначительном вопросе и, как дурак, не можешь сдвинуться с места, пока не найдешь ответ. Я завожу новый проект с модальной формой — мерцает. Загружаю пример из Samples с формой About (Football, например) — не мерцает. Я под лупой исследую все свойства обеих форм — не нахожу поля, ответственного за мерцание. Вообще нет ничего подозрительного. В кодах обработки событий тоже ничего подозрительного нет.
Ну, хорошо, поторошу Football, удаляя из него вообще все, кроме чистых форм. Не мерцает. Точно такой же по виду и объему проект «с нуля» — мерцает. Все абсолютно свойства форм не отличаются ничем. Свойства проекта тоже одинаковы. Но один мерцает, другой — нет.
Как, почему? Мистика?
Автор: Frodo_Torbins
Дата сообщения: 20.11.2010 21:49
Ludens
Application.MainFormOnTaskbar?
Автор: Ludens
Дата сообщения: 20.11.2010 22:03
Frodo_Torbins
не сообразил что-то. Это где такое свойство?
Автор: Frodo_Torbins
Дата сообщения: 20.11.2010 22:30
Ludens
Это в dpr-файле. Или просто Project->View source. Это свойство как раз и реализует трюк с родителями окон о котором говорил 0D0A.
Автор: Ludens
Дата сообщения: 21.11.2010 11:59
Ух ты, блин, как же я сам не заметил!
0D0A, Frodo_Torbins, спасибо вам, мужики! Закончились мои страдания :)
Автор: Aleksoid1978
Дата сообщения: 22.11.2010 03:17
MatrixNT

Цитата:
каким образом, и вообще, возможно ли получить список запущенных процессов в 64битной системе?


Чтобы получить имена х64 процессов - нужно х64 приложении.
Я так в свое время писал плагин для AtiTrayTool для детекта Crysis x64. Как раз если не удается получить имя модуля для процесса Crysis, значит он х64
Автор: Pavel_M2
Дата сообщения: 22.11.2010 08:35
MatrixNT


Цитата:

каким образом, и вообще, возможно ли получить список запущенных процессов в 64битной системе?

EnumProcess работает и на х64 винде (и также возвращает ProcessID для х64 процессов в системе, даже если она - EnumProcess, вызвана в х86 приложении).

далее используем новую функцию, появившуюся в WinVista: QueryFullProcessImageName..можно так:

function GetModuleNameByProcessID(AProcessID: DWORD): string;
const
AccessRights: array[Boolean] of DWORD = (PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, PROCESS_QUERY_LIMITED_INFORMATION);
var
HProcess: THandle;
Buffer: array[0..MAX_PATH - 1] of WideChar;
BufferSize: Integer;
begin
Result := '';
HProcess := OpenProcess(AccessRights[IsWinVista], False, AProcessID);
if HProcess <> 0 then
try
BufferSize := SizeOf(Buffer);
if IsWinVista then
begin
if QueryFullProcessImageName(HProcess, 0, PChar(@Buffer), @BufferSize) then
SetString(Result, PChar(@Buffer), BufferSize);
end
else
SetString(Result, PChar(@Buffer), GetModuleFileNameEx(HProcess, 0, PChar(@Buffer), BufferSize));
finally
CloseHandle(HProcess);
end;
end;


P.S. Не забудьте сделать динамическую (а НЕ статическую) загрузку QueryFullProcessImageName (GetProcAddress)... и обратить внимание на UNICODE или ANSI версию функции

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: Установка копоненты ZipTV


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