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

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

Автор: relictus
Дата сообщения: 30.06.2010 13:53
JAPWork

Цитата:
Разве что у меня еще стоит cnPack...

Может он как-то фиксит баг...
А у меня стоит MMX, но и без него на чистой среде баг тоже наблюдался...
Кто-нибудь еще сталкивался с этим?
Автор: Bonivur
Дата сообщения: 30.06.2010 13:54
Какой минимально возможный размер для приложения состоящего из пустой формы в Delphi 2010? У меня меньше 753 кб не получается. Пробовал прописывать

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

а с [more=этим]
{$IFNDEF DEBUG}
{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
{$SetPEFlags IMAGE_FILE_DEBUG_STRIPPED}
{$SetPEFlags IMAGE_FILE_LINE_NUMS_STRIPPED}
{$SetPEFlags IMAGE_FILE_LOCAL_SYMS_STRIPPED}
{$SetPEFlags IMAGE_FILE_AGGRESIVE_WS_TRIM}
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_NET_RUN_FROM_SWAP}
{$SetPEFlags IMAGE_FILE_EXECUTABLE_IMAGE}
{$ENDIF}
[/more]
вообще ничего не изменяется.
Автор: tanaseduard
Дата сообщения: 30.06.2010 14:06
Как добавить свои варианты кода в Code Template?
Автор: relictus
Дата сообщения: 30.06.2010 14:08
Bonivur
А если отключить "String format Checking" и "I/O checking" то можно уменьшить до 697 кило
Автор: Bonivur
Дата сообщения: 30.06.2010 14:11
relictus
То есть 697 кило - это нижний порог. Меньше этого пустой exe-шник быть не может, так?
Автор: relictus
Дата сообщения: 30.06.2010 14:21
Bonivur
Возможно, еще что-то подшаманить можно
А если выкинуть Forms и т.п. и писать на winapi, то точно можно уменьшить
Автор: spasius
Дата сообщения: 30.06.2010 15:47
вспомните еще KOL
Автор: andrewtishkin
Дата сообщения: 30.06.2010 16:02

Цитата:
А если отключить "String format Checking" и "I/O checking"

Кстати, а это сильно чревато? Или в случае чего можно эти чекинги своим кодом заменить
Автор: relictus
Дата сообщения: 30.06.2010 17:50
andrewtishkin
"String format Checking" -
Цитата:
По умолчанию, Delphi 2009 при операциях над строками, и даже просто при передаче строки параметром в функцию, добавляет кучу проверок на тип содержимого строки (кодовая страница, размер элемента). Из-за этогго код разбухает, и становится медленнее.
Чтобы этого избежать - отключаем настройку String format checking {$STRINGCHECKS
OFF} в параметрах компиляции.
Фактически, она нужна для совместимости объектного кода Delphi с C++Builder. Если вы не используете C++ - это просто ненужный код в ващей программе.


"I/O Checking" -
Цитата:
эта опция используется только при работе со файлами в стиле Паскаля, которые считаются устаревшими. По-хорошему, вы не должны использовать их и, соответственно, эту опцию.
Автор: psa1974
Дата сообщения: 30.06.2010 19:08
JAPWork
relictus
Насчет зависона при наборе русского коментария... У меня тоже как и у JAPWork ничего подобного не было. Может винды разные? У меня ХР SP3...
Потом, судя по скринам, у relictus отключен Tooltip help insight, а у меня и JAPWork включен...
Автор: 0D0A
Дата сообщения: 30.06.2010 19:40
Bonivur
У меня 509К, с одной формой (пустой 18.5К). Все методы описаны выше, только с отключенным RTTI надо перекомпилировать весь RTL, иначе изменения коснутся только файлов проекта. Опциями проекта снизить размер (проект с одной пустой формой, после применения вышеописанного) больше чем на 2К не получится :)

Потенциально, возможно, есть способы отключения генерации списка модулей проекта в секции .text (спрашивал выше :), но пока непонятно как. Похоже этот список используется в TRttiPackage.MakeTypeLookupTable, но вышеприведенные RTTI дефайны на него не влияют.

Добавлено:
psa1974
На русском виснет, да. Как-то хаотично... Может неделю работать, а может сразу после открытия файла упасть. Из за этого, после перехода, пришлось все русские комметарии переводить :) Чистая среда, без экспертов. Что делать - непонятно. В QC куча репортов, может поправят.
Автор: Bonivur
Дата сообщения: 30.06.2010 20:18
0D0A
То что мне помогло для уменьшения веса :
1) Добавление [more=данной секции]
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
[/more] в .dpr файл проекта перед секцией uses.
2) Отключение "String format Checking" и "I/O Checking" в опциях проекта.
3) Установка Build configuration в Release.
4) Отключение Enable runtime themes на вкладке Application в опциях проекта (лучше использовать XPManifest).
Автор: 0D0A
Дата сообщения: 30.06.2010 20:27
Bonivur
С отключенным "Enable runtime themes" получается 508К, но это можно не учитывать, тк. можно сказать, что манифест, это обязательная вещь в наше время, а валидный (не тот который добавляет галка :), он еще больше.
Автор: Bonivur
Дата сообщения: 30.06.2010 20:42
0D0A
Странно, а у меня с XPManifest наоборот размер меньше чем с включенной опцией и БЕЗ манифеста. А есть ли разница во внешнем виде на Windows 7 при использовании манифеста и при включении галки Enable themes?

Добавлено:
relictus

Цитата:
А если отключить "String format Checking" и "I/O checking" то можно уменьшить до 697 кило

Отключал я их. Меньше 752 кб пустая форма не получается.

Добавлено:
Вопрос - как в Delphi 2010 определить кодировку текста (Win1251, DOS, KOI-8) ? Раньше я пользовался модулем Xlat.pas но теперь он не работает. Есть ли готовые компоненты / решения?
Автор: psa1974
Дата сообщения: 30.06.2010 22:09
Bonivur

Цитата:
как в Delphi 2010 определить кодировку текста

модуль System:
функции StringElementSize - получить размер одного типичного символа данной строки;
функции StringCodePage - получить кодовую страницу данной строки;
процедура SetCodePage - установить кодовую страницу данной строки" (с дополнительным логическим параметром "конвертировать прямо сейчас").
Автор: Medium
Дата сообщения: 30.06.2010 22:09

Цитата:
Вопрос - как в Delphi 2010 определить кодировку текста (Win1251, DOS, KOI-8) ? Раньше я пользовался модулем Xlat.pas но теперь он не работает. Есть ли готовые компоненты / решения?

Начиная с версии 2009 в Delphi появился класс TEncoding (в модуле SysUtils), облегчающий работу с различными кодировками. Там должно быть все, что нужно.
Автор: Bonivur
Дата сообщения: 30.06.2010 22:42
psa1974

Цитата:
функции StringElementSize - получить размер одного типичного символа данной строки;
функции StringCodePage - получить кодовую страницу данной строки;
процедура SetCodePage - установить кодовую страницу данной строки" (с дополнительным логическим параметром "конвертировать прямо сейчас").

С KOI-8 и 866 DOS не работают

Medium

Цитата:
Начиная с версии 2009 в Delphi появился класс TEncoding (в модуле SysUtils), облегчающий работу с различными кодировками. Там должно быть все, что нужно.

Аналогично. Encoding требует указания кодовой страницы. А ее еще узнать надо.

P.S. Решил я проблему свою. Хотя и через одно место
Автор: 0D0A
Дата сообщения: 01.07.2010 07:25
Bonivur

Цитата:
Странно, а у меня с XPManifest наоборот размер меньше чем с включенной опцией и БЕЗ манифеста. А есть ли разница во внешнем виде на Windows 7 при использовании манифеста и при включении галки Enable themes?

Эта галка, как раз, и добавляет манифест.
Автор: Bonivur
Дата сообщения: 01.07.2010 10:00
0D0A

Цитата:
Эта галка, как раз, и добавляет манифест.

Зачем тогда оставлять этот компонент (XPManifest) ??? Если уж пришлось изменять код для перехода с 7 на 2010, то галку мы бы как-нибудь сумели поставить

Вопрос ко всем - есть ли где почитать об изменениях с Delphi 7 до 2010? Какие компоненты добавили, что нового и.т.д.
Автор: 0D0A
Дата сообщения: 01.07.2010 10:20
Bonivur

Цитата:
Зачем тогда оставлять этот компонент (XPManifest) ??? Если уж пришлось изменять код для перехода с 7 на 2010, то галку мы бы как-нибудь сумели поставить :)

Его не надо добавлять. Теоритически, вобще должен выдаваться ворнинг о дублировании ресурсов. Наверно галка смотрит, что манифест уже есть и не добавляет второй раз. Вобще в висте появились дополнительные полезные поля в манифесте и разумно не ставить галку, а добавлять свой.
Автор: AnalogXP
Дата сообщения: 01.07.2010 14:27
Маленькая история о манифестах:
В своей программе использую сторонний компонент ActiveX, который нужно регистрировать. Регистрировал я его через манифест файл.
Но возникли проблемы:
В опциях IDE стояла галочка "Enable runtime themes", но я не мог понять почему под XP программа не поддерживала темы, а под Win7 были проблемы с регистрацией компонента ActiveX.
Оказалось:
Проблема была в том, что я использовал два манифеста: тот что модуль (ресурс, та самая галочка) и тот что файл.
Убрал галочку "Enable runtime themes", и все.
На вопрос зачем использовать отдельный манифест, был дан такой ответ:

Цитата:
чтобы разрулить правила использования манифеста в ХП и Висте. У них приоритет определения какой манифест использовать — разный. Для ХП приоритет — внешний манифест, затем внутренний, у Висты — наоборот.

Автор: Frodo_Torbins
Дата сообщения: 01.07.2010 19:34

Цитата:
Вопрос ко всем - есть ли где почитать об изменениях с Delphi 7 до 2010? Какие компоненты добавили, что нового и.т.д.

У Марко Канту неплохой цикл книжек: http://www.marcocantu.com/books/default.htm (2005 можно не читать).
Автор: Bonivur
Дата сообщения: 01.07.2010 19:50
Frodo_Torbins
Спасибо. Читал Кэнту для 6 дельфи. Не знал, что он продолжает дело.
Автор: Bonivur
Дата сообщения: 02.07.2010 00:06
У меня в Дельфи 2010 почему-то не работает Help Insight. Постоянно неактивен. Не вызывается и по шорткату Shift+Ctrl+H. Установка с нуля, полная. Сами файлы для help insight присутствуют.

Сам разобрался. Просто в Дистиллере включил галку Remove .NET crap. Не надо было этого делать
Автор: Bazzill
Дата сообщения: 04.07.2010 14:36
Frodo_Torbins

Цитата:
Похоже spasius говорил об этой демке: \Demos\DelphiWin32\VCLWin32\Doc\TextEdit но это немного не то. В демке Demos\DelphiWin32\VCLWin32\RichEdit можно на форму кинуть попапменю и назначить его ричэдиту (свойство PopupMenu). Потом в это меню добавляете несколько пунктов, для каждого выбираете нужный Action из списка.


Суть понятна, более подходит пример из \Demos\DelphiWin32\VCLWin32\Doc\TextEdit, а не RichEdit, так как в первом примере как-раз PopUpMenu создаются для Copy/Paste.

Но вылезла другая проблема.. на компоненте TMemo есть стандартное встроенное PopupMenu, причем язык пунктов меню подстраивается под язык винды: русское меню в русской, английское меню в английской винде.

Кто-нибудь знает как это устроено? Может это какое-то системное меню, которое можно использовать для своих целей (для RichEdit)?

Ведь если самому PopupMenu строить для RichEdit, то там только один язык будет.
Автор: Frodo_Torbins
Дата сообщения: 04.07.2010 15:59
Bazzill

Цитата:
Кто-нибудь знает как это устроено? Может это какое-то системное меню, которое можно использовать для своих целей (для RichEdit)?
Да, это системное меню, но никакого апи для него нету.

Цитата:
Ведь если самому PopupMenu строить для RichEdit, то там только один язык будет.
Так у вас во всем приложении один язык.
Автор: 0D0A
Дата сообщения: 04.07.2010 16:18
Bazzill
Стандартного контекстного меню у RichEdit нет. Но никто не мешает взять ситемное из ресурсов (в user32.dll оно лежит) и юзать. Для слабых духом, можно просто заголовки айтемов там взять, если так волнует проблема перевода :)
Автор: Bazzill
Дата сообщения: 04.07.2010 17:40
Frodo_Torbins

Цитата:
Так у вас во всем приложении один язык.


Не везде, во всяких Попапах мессаг заголовки и прочее на родном языке винды. Open/Save диалоги например на родном языке выскакивают.



0D0A

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


А как это сделать?

Я что-то не уверен что смогу ковырять user32.dll
Автор: 0D0A
Дата сообщения: 04.07.2010 17:45
Bazzill

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
procedure RichEdit1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
procedure FormDestroy(Sender: TObject);
private
FEditMenu: HMENU;
FEditSubMenu: HMENU;
procedure LoadEditContextMenu;
procedure WMCommand(var message: TWMCommand); message WM_COMMAND;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


const
ID_SELALL = 177;
ID_CUT = 768;
ID_COPY = 769;
ID_PASTE = 770;
ID_DELETE = 771;
ID_UNDO = 772;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if (FEditMenu <> 0) then
DestroyMenu(FEditMenu);
end;

procedure TForm1.LoadEditContextMenu;
begin
if (FEditMenu = 0) then
begin
FEditMenu := LoadMenu(GetModuleHandle('user32.dll'),
MAKEINTRESOURCE(1));

if (FEditMenu <> 0) then
begin
FEditSubMenu := GetSubMenu(FEditMenu, 0);

if (FEditSubMenu <> 0) then
begin
// Удаляем непонятное
RemoveMenu(FEditSubMenu, 32769, MF_BYCOMMAND);
RemoveMenu(FEditSubMenu, 32768, MF_BYCOMMAND);
RemoveMenu(FEditSubMenu, 32787, MF_BYCOMMAND);
RemoveMenu(FEditSubMenu, 8, MF_BYPOSITION);
end;
end;
end;
end;

procedure TForm1.RichEdit1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: Boolean);
begin
LoadEditContextMenu;

if (FEditSubMenu <> 0) then
begin
Handled := True;

// Тут изменяем состояние айтемов, если надо
// EnableMenuItem(FEditSubMenu, ID_COPY, MF_GRAYED or MF_BYCOMMAND);
// EnableMenuItem(FEditSubMenu, ID_CUT, MF_GRAYED or MF_BYCOMMAND);
// и т.д.

// Показываем
MousePos := RichEdit1.ClientToScreen(MousePos);
TrackPopupMenu(FEditSubMenu, TPM_LEFTALIGN or TPM_RIGHTBUTTON,
MousePos.X, MousePos.Y, 0, Handle, nil);
end;
end;

procedure TForm1.WMCommand(var message: TWMCommand);
begin
inherited;

case message.ItemID of
ID_SELALL:
ShowMessage('Select All');
ID_CUT:
ShowMessage('Cut');
ID_COPY:
ShowMessage('Copy');
ID_PASTE:
ShowMessage('Paste');
ID_DELETE:
ShowMessage('Delete');
ID_UNDO:
ShowMessage('Undo');
end;
end;

end.
Автор: Bazzill
Дата сообщения: 04.07.2010 21:28
0D0A

Спасибо. Поизучаю.

Добавлено:
Сразу возникает вопрос, ведь меню то системное, виндовое, а мы удаляем пункты меню лишние.

Может быть такое, что эффект будет во всей винде и во всех программах?

В функции GetSystemMenu можно например указывать, получить реальное системное меню или его копию, если реальное, то алес капут придет всем программам в винде.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

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


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