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

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

Автор: psa1974
Дата сообщения: 24.09.2009 05:52
0D0A
А что предполагать? Откомпилируйте с использованием отладочной инфы и сравните с результатом, получаемым при использовании $(BDS)\lib

Лично у меня эффект воспроизвести не удалось - при использовании $(BDS)\lib размер ехе 903 168 байт, по вашей методе - 1 018 368 байт! Все с точностью наоборот (Плюс ко всему Variants.pas дельфя вообще не захотела компилировать).
Автор: JustAMaaan
Дата сообщения: 24.09.2009 08:16
Поставил 2010, воткнул на него с плясками PNGComponents, открываю проект от D2007, получаю "The project cannot be loaded because the required personality is not available". Гугляднекс говорит, мол "у всех бывает, не у всех проходит, создайте проект заново и напихайте в него старые файлы". Однако меня такой подход не фпирает, кто-нибудь знает способ попроще?
Автор: 0D0A
Дата сообщения: 24.09.2009 08:20
psa1974
Это все-таки новое RTTI. Чтобы был эффект надо добавить в проект

{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}

Те эти директивы не влияют на уже скомпиленные библиотечные модули.

Автор: data man
Дата сообщения: 24.09.2009 08:32
JustAMaaan

Цитата:
кто-нибудь знает способ попроще?

А зачем использовать PNGComponents (с плясками), если начиная с D2009 есть встроенная поддержка PNG ?

0D0A
Из Docwiki

Цитата:
Use {$WEAKLINKRTTI ON} to suppress the default behavior of including all method into the binary. The $WEAKLINKRTTI directive only affects linking. It does not affect unit compilation. It is the only way to control how much RTTI is generated in the final executable without recompiling the original units with different settings for the $RTTI directive.
Автор: JustAMaaan
Дата сообщения: 24.09.2009 08:50
data man

Цитата:
А зачем использовать PNGComponents (с плясками), если начиная с D2009 есть встроенная поддержка PNG ?

Там эта поддежка ограничена только чтением и записью картинок, но никак не их использованием в качестве глифов. На кнопки PNG с прозрачностью как глифы ну никак не натягиваются, без прозрачности - такое же уродство, как BMP.
Автор: data man
Дата сообщения: 24.09.2009 09:27
JustAMaaan
Это довольно странно - ведь поддержка основана именно на PNGComponents (ver. 1.564). И различий немного - замена PСhar на PAnsiChar, PByte и т.д.
Хотя проблема может быть именно из-за этого - resourcestrings с одинаковыми именами, например.

Цитата:
На кнопки PNG с прозрачностью

Кнопки стандартные или из пакета PNGComponents ?
Может стОит переделать PngSpeedButton и другие контролы так, чтобы использовать TPngImage вместо TPngObject ?
Автор: JustAMaaan
Дата сообщения: 24.09.2009 10:56
data man

Цитата:
Это довольно странно - ведь поддержка основана именно на PNGComponents (ver. 1.564)

Не на PNGComponents, a на PNGImage.


Цитата:
Хотя проблема может быть именно из-за этого - resourcestrings с одинаковыми именами, например.

Оно даже проект открыть не даёт, personality моя ему не нравится Если бы давало - остальные заморочки наверняка в принципе решаемы, с переносом из Delphi 7 на Delphi 2007 тоже пришлось пару дней повозиться, но зато половину сторонних компонентов после этого удалось выкинуть за ненадобностью.


Цитата:
Кнопки стандартные или из пакета PNGComponents ?

Нет, из набора компонентов. Иначе зачем бы их ставить.
Автор: data man
Дата сообщения: 24.09.2009 11:09
JustAMaaan

Цитата:
Не на PNGComponents, a на PNGImage.

Точно, ошибся.

Цитата:
Может стОит переделать PngSpeedButton и другие контролы так, чтобы использовать TPngImage вместо TPngObject ?

А это уже сделано, оказывается http://cc.embarcadero.com/Item/26127

Цитата:
This is an adaption for Delphi 2009 of the PngComponents created by Martijn Saly (www.thany.org), which makes use of the new built-in PngImage support.

The original Png units from Gustavo Daud are no longer part of the package (mostly because I'm not sure if I may distribute them). So if you want to use it with an earlier version of Delphi, you have to get hands on the original package first. The sources should be compatible downto Delphi 7.

This version includes the DEP fix.

I also added a fix that properly loads DFMs made with older Delphi versions, which contain PNG images in TImage components. For this to work you have to install the package in the IDE and use PngFunctions somewhere in your project. Don't bother if you already use at least one of PngComponents.
Автор: 0D0A
Дата сообщения: 24.09.2009 11:23
data man

Цитата:
It is the only way to control how much RTTI is generated in the final executable without recompiling the original units with different settings for the $RTTI directive.

Ну в целом примерно понятно


Цитата:
Ну, уже сделано, оказывается http://cc.embarcadero.com/Item/26127

Все хорошо, только при закрытии среды вылезает AV в rtl140.bpl если открывалась форма с TPngImageList.
Автор: data man
Дата сообщения: 24.09.2009 12:15
0D0A

Цитата:
Все хорошо, только при закрытии среды вылезает AV в rtl140.bpl если открывалась форма с TPngImageList.

А в этом ничего странного - там же используется патчинг методов.
Так что проблема, IMO, именно в PNGComponents.
Можно попробовать закомментить

Код:
if ImageListCount = 0 then
ApplyMethodPatches;
Автор: 0D0A
Дата сообщения: 24.09.2009 14:15
data man
Вобщем закоментарил всё про патчи, перекомпилял пакеты: AV вылетает все равно, компонент продолжает работать, картинки рисуются как надо, с альфаканалом... Чудеса.
Автор: data man
Дата сообщения: 24.09.2009 14:31
0D0A
Мне еще непонятно зачем в PngFunctions.pas сделано так ?

Код: {$IF RTLVersion >= 20.0 }
type
TPNGObject = class(TPngImage);
begin
TPicture.RegisterFileFormat('', '', TPNGObject);
{$IFEND}
Автор: 0D0A
Дата сообщения: 24.09.2009 14:42
data man

Цитата:
TPngImage и так уже зарегистрирован


Угу. И если предпологается работать только с пнг, а не добавлять в лист иконки и пр. - можно половину закомментировать, включая патчи, типа так:


Код:
function TPngImageList.Add(Image, Mask: TBitmap): Integer;
var
Item: TPngImageCollectionItem;
// Patch: TMethodPatch;
Icon: HICON;
begin
if TObject(Self) is TPngImageList then
if Image = nil then
Result := -1
else begin
BeginUpdate;
try
Item := FPngImages.Add(True);
CreatePNG(Image, Mask, Item.FPngImage);
Result := Item.Index;
Icon := PngToIcon(Item.PngImage, Item.Background);
ImageList_AddIcon(Handle, Icon);
DestroyIcon(Icon);
Change;
finally
EndUpdate;
end;
end
else
// begin
// Patch := FindMethodPatch('Add');
// if Patch <> nil then begin
// Patch.BeginInvokeOldMethod;
// try
// Result := TCustomImageList(Self).Add(Image, Mask);
// finally
// Patch.FinishInvokeOldMethod;
// end;
// end
// else
Result := -1;
// end;
end;
Автор: Aleksandr N
Дата сообщения: 24.09.2009 17:51
Просвятите тёмного: D2010 юникодовский?
Автор: 0D0A
Дата сообщения: 24.09.2009 17:54
Aleksandr N

Цитата:
Просвятите тёмного: D2010 юникодовский?

Да.
Автор: andrewtishkin
Дата сообщения: 24.09.2009 18:50
psa1974

Цитата:
Лично у меня эффект воспроизвести не удалось - при использовании $(BDS)\lib размер ехе 903 168 байт, по вашей методе - 1 018 368 байт! Все с точностью наоборот (Плюс ко всему Variants.pas дельфя вообще не захотела компилировать).

У меня тоже dcu-шки при компиляции получились больше и exe-шник само собой тоже

А про Variants.pas - это вообще песня Ещё в D2009 заметил эту проблему, но только вчера удосужился почитать в интернете, в чём тут дело. Нашёл в QC обращения, ещё для D2006 даже. В общем, Variants зависит от пары других важных модулей, его надо компилировать отдельно, а не в составе своей программы...

Для интереса проверил - DCC32 скомпилировало нормально. Но размер dcu-шки получился заметно больше, чем у той, что в папке lib
Автор: 0D0A
Дата сообщения: 24.09.2009 19:26
andrewtishkin

Цитата:
У меня тоже dcu-шки при компиляции получились больше и exe-шник само собой тоже


Особо не извращаясь с компиляцией всего, можно сделать так:
Отключить дефайнами (в dpr-файле) новое RTTI и добавить в начало Library Path основные сорцы VCL: Classes, Controls, Forms, StdCtrls (дальше по вкусу), ну и то, что они потянут за собой (Variants не потянут ). На средневзвешенном приложении получается уменьшение размера ехе на ~150К.

Добавлено:
Еще интересная тема... В ехе файле, модули проекта теперь перечисляются в двух местах! Только побороли PACKAGEINFO и на тебе
Автор: andrewtishkin
Дата сообщения: 24.09.2009 19:46
0D0A
Ох, не знаю, не знаю. И таким макаром на 1 кб exe-шник вырос (ну это без отключения RTTI) и на 2 кб - с отключением RTTI. Так что не буду извращаться дальше, только директивами обойдусь, мне хватит )
Автор: 0D0A
Дата сообщения: 24.09.2009 20:10
andrewtishkin

Цитата:
Ох, не знаю, не знаю


Хехе, ну значит мне повезло. Я это заметил когда пофиксил застарелый баг в Menus и подменил библиотечный - размер уменьшился на 5К, попробовал заменить остальное - помогло

Добавлено:

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

Еще ни разу небыло такого, чтобы не приходилось патчить VCL, так что если извращаться, то по максимуму
Автор: EugeneBoss3
Дата сообщения: 25.09.2009 03:54
Народ! Помогите расшиться с программным кодом выдает ошибку при создании индекса, типа "уже используется". Компонент EhLib и Accuracer
=================================================
procedure TForm1.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh);
var
iColumn: Integer;
sIndexOld, sIndexNew,
sIndexFieldNamesOld : string;
bActive, bExclusive: Boolean;
begin
iColumn := Column.Field.Index;
sIndexNew := Column.FieldName;
sIndexOld := atbUsers.IndexFieldNames;

if (Column.Title.SortMarker = smNoneEh)
then Column.Title.SortMarker:= smDownEh;

try
with atbUsers do
begin
bActive := Active;
bExclusive := Exclusive;
Close;
// таблица должна быть открыта в монопольном (exclusive) режиме
Exclusive := True;
Open;
IndexDefs.Update;
// очистить список индексов
DeleteAllIndexes;
case Column.Title.SortMarker of
smDownEh:
begin
// создание индекса
AddIndex('NewIndex', sIndexNew, []);
IndexFieldNames:= sIndexNew;
Column.Title.SortMarker:= smUpEh;
end;
smUpEh:
begin
// создание индекса
AddIndex('NewIndex', sIndexNew, [ixDescending]);
IndexFieldNames:= sIndexNew;
Column.Title.SortMarker:= smDownEh;
end;
end;
IndexDefs.Update;
Close;
Exclusive := bExclusive;
Active := bActive;
end;
finally
if not (atbUsers.Active) then atbUsers.Active := True;
atbUsers.First;
end;
end;
=================================================
Автор: JustAMaaan
Дата сообщения: 25.09.2009 04:19
0D0A

Цитата:
Все хорошо, только при закрытии среды вылезает AV в rtl140.bpl если открывалась форма с TPngImageList.

Странно. Я этот компонент активно использую, у меня закрывается нормально. Правда, я в дистиллере ставил галку что-то типа "не грузить левую дот-нетовскую байду".


Цитата:
Я это заметил когда пофиксил застарелый баг в Menus и подменил библиотечный

А что за баг?
Автор: 0D0A
Дата сообщения: 25.09.2009 06:10
JustAMaaan

Цитата:
Странно. Я этот компонент активно использую, у меня закрывается нормально.

Наверно версии разные.
У меня с Code Central (http://cc.embarcadero.com/Item/26127), типа для 2009, там в PngFunctions есть строчка:
TPicture.RegisterFileFormat('', '', TPNGObject);
На ней вылетает. В оригинале этого нет


Цитата:
А что за баг?

Vista. Темы включены. Создаем PopupMenu, добавляем айтемы: 1, 2, разделитель, 3, 4. Смотрим, запоминаем ширину . Устанавливаем свойство Images (можно пустой ImageList). Смотрим, запоминаем ширину. Удаляем сепаратор. Смотрим, запоминаем ширину. Сравниваем полученые значения ширины, много думаем Создаем submenu. Смотрим как рисуется стрелочка (обращаем внимание на цвет) у выделенного и невыделенного айтема с подменю. Удаляем ImageList, опять смотрим как рисуется стрелочка. Сравниваем цвета
Автор: psa1974
Дата сообщения: 25.09.2009 07:02
0D0A
Вот специально проверил работу с TPngImageList... С тем что с Code Central (тут ни строки не менял), и с тем, что я сам портирую еще начиная с Дельфи 7 (порт, сделанный под 2009 идеально заработал в 2010)... Тупо форма, на ней TPngImageList с десятком картинок, 2 кнопки с подключенным TPngImageList, одна кнопка PngBitBtn... Никаких AV.

Не воспроизводится!
Автор: 0D0A
Дата сообщения: 25.09.2009 07:10
psa1974

Цитата:
Не воспроизводится

Это ведь хорошо Ты просто запутал дельфю со своими портами У меня перестало тока после конкретной чистки.
Автор: data man
Дата сообщения: 25.09.2009 08:07
EugeneBoss3
Для этого есть отдельные темы
Вопросы по Ehlib
Вопросы по компонентам для Delphi, C++ Builder
Автор: andrewtishkin
Дата сообщения: 25.09.2009 21:00

Цитата:
Vista. Темы включены. Создаем PopupMenu

Хм. Да, с шириной что-то интересное, и со стрелочкой (black/white). В QC бага этого случайно нету (раз он застарелый...)?
Любопытно бы и на решение проблемы кода взглянуть Если это не секрет, конечно
Автор: 0D0A
Дата сообщения: 26.09.2009 10:39
andrewtishkin

Цитата:
Хм. Да, с шириной что-то интересное, и со стрелочкой (black/white). В QC бага этого случайно нету (раз он застарелый...)?
Любопытно бы и на решение проблемы кода взглянуть Если это не секрет, конечно


С шириной вот так:


Код:
procedure TMenuItem.MeasureItem(ACanvas: TCanvas; var Width, Height: Integer);

procedure MeasureVistaMenuItem;
begin

// Adjust size if separator
if Caption = cLineCaption then
begin
GetThemePartSize(LTheme, Handle, MENU_POPUPSEPARATOR, 0, nil, TS_TRUE, LSize);
GetThemeMargins(LTheme, Handle, MENU_POPUPSEPARATOR, 0, TMT_SIZINGMARGINS, nil, LMargins);
Height := LSize.cy + LMargins.cyBottomHeight;

// Inc(Width, LSize.cx); // теоритически правильно, но LSize.cx получается слишком большим (144)

Inc(Width, 51); // криво, но получается наиболее приближено к реальности
Exit; // дальше считается длинна заголовка, имхо лишнее для сепаратора
end
end;

begin
...
end;
Автор: ZanderZ
Дата сообщения: 28.09.2009 04:36
При установке документации 2010 вываливается с ошибкой "Could not access network location \ help" в чем может быть проблема ??
Автор: JustAMaaan
Дата сообщения: 28.09.2009 10:53
Что-то в 2010 засады и попадосы на каждом шагу. Конструкция with MyCoolFunction do... с использованием полей возвращаемого значения больше не воспринимается как допустимая
Автор: psa1974
Дата сообщения: 28.09.2009 11:06
JustAMaaan

Цитата:
Конструкция with MyCoolFunction do... с использованием полей возвращаемого значения больше не воспринимается как допустимая

Я утраивал разборки на эту тему здесь выше на 9 странице.
Начало Итог

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

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


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