Вверх ↑
Этот топик читают: Гость
Администрация
Ответов: 15294
Рейтинг: 1518
#286: 2016-10-27 19:30:51 ЛС | профиль | цитата
Netspirit писал(а):
Но я то что могу сделать? Если пакет будет официально переделан на эту библиотеку - так будем писать на ней. А пока что даже компилятор официально в текущем пакете не поддерживается.

Все таки для FPC более интересен проект Lazarus, который может собирать приложения для Linux, FreeBSD, Mac OS X, Microsoft Windows, Android. Именно на него и стоит ориентироваться.
карма: 26
0
Ответов: 2059
Рейтинг: 131
#287: 2016-10-28 10:41:41 ЛС | профиль | цитата
Netspirit писал(а):
тебя сглазили, что-ли? Что-то раньше за тобой такого "заплетания языка" не замечал. Ты там береги себя.

Есть такое дело после инсульта. + выпил чутка.
Буду стараться писать кратко

Чтобы сделать такой http://forum.hiasm.com/getfile/37895 компонент, в понятиях KOL, мне потребовалось три дня.
Не сомневаюсь, что кто-то и за день сделает.
А чтобы переделать готовое и просто добавить точки и нарисовать иконку нужно не более пары часов.
Вот и весь сказ.

Редактировалось 2 раз(а), последний 2016-10-28 11:08:33
карма: 6

0
Ответов: 233
Рейтинг: 12
#288: 2016-10-29 19:57:33 ЛС | профиль | цитата
Netspirit, проверь схему SpeedTest в Elements\delphi\Example\FTCG - почему тут FPC быстрее в 5 раз?
карма: 2

0
Ответов: 413
Рейтинг: 57
#289: 2016-10-29 22:31:49 ЛС | профиль | цитата
Добрый день.
Netspirit писал(а):
Нестандартные компоненты не портируются под новый компилятор, потому что требуют добавления в каждый компонент некоторого кода, отсутствующего в оригинальном пакете. Для того, чтобы нормально адаптировать сторонние компоненты с учетом нового компилятора, нужно на официальный SVN внести измененный Share.pas.

Что нужно дописывать в Share.pas и что в конкретный элемент? Это стандартная запись? Можно ли самостоятельно внести соответствующие записи в интересующие сторонние компоненты? К примеру в NumberToString.
карма: 0

0
Ответов: 4621
Рейтинг: 746
#290: 2016-10-31 12:08:00 ЛС | профиль | цитата
Poputchik писал(а):
Что нужно дописывать в Share.pas
Можно взять Share.pas из адаптированного пакета из этой темы. Но то, что он будет заменен у каждого индивидуально значит, что компонент не будет работать у остальных.

Poputchik писал(а):
Можно ли самостоятельно внести соответствующие записи в интересующие сторонние компоненты?
Уточняю:
1) Для работы с новым FPC x32 практически никаких изменений вносить не нужно, но в случае наличия ошибок компиляции/работы компонента можно внести такие правки в этот компонент, которые будут работать в оригинальном и адаптированном пакетах без дополнительных изменений.
2) Для работы стороннего компонента в адаптированном пакете под 64-битным FPC, кроме первого пункта нужно поправить компонент для поддержки 64 бита.
Для работы такого компонента в оригинальном пакете в файл каждого компонента нужно добавить запись

{$IFNDEF FPC_NEW} // В старых Delphi и FPC нет NativeInt
type
NativeInt = Integer;
PNativeInt = ^NativeInt;
NativeUInt = Cardinal;
PNativeUInt = ^NativeUInt;
{$ENDIF}
либо выложить на SVN измененный Share.pas, в котором эта запись присутствует.

--- Добавлено в 2016-10-31 12:51:54

Iliya писал(а):
почему тут FPC быстрее в 5 раз?
Наверное, такие особенности компиляторов. По кнопке Classic (200 000 циклов) действительно FPC в 5 раз быстрее. А вот по кнопке FTCG (100 000 000 циклов) FPC уже в 8 раз медленнее. То же, но 10 000 000 циклов - на 25% медленнее.

Редактировалось 5 раз(а), последний 2017-12-04 12:10:30
карма: 26

0
Ответов: 4621
Рейтинг: 746
#291: 2016-10-31 18:00:59 ЛС | профиль | цитата
Есть один вопрос. В ListEdit.pas есть кастомный контрол TListEdit, который используется, в частности, в StringTable. Для обработки сообщений в этом классе используется подмена оконной процедуры с помощью MakeObjectInstance(NewWndProc). Больше нигде в других компонентах это не применяется. Почему не используется TControl.OnMessage или TControl.AttachProc?

И ещё. В стандартном примере Example\Forms\MTStrTbl\With_EditCtrl.sha вылетает ошибка при попытке изменить мышью ширину столбца таблицы (на всех компиляторах).
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#292: 2016-10-31 19:13:38 ЛС | профиль | цитата
Netspirit писал(а):
И ещё. В стандартном примере Example\Forms\MTStrTbl\With_EditCtrl.sha вылетает ошибка при попытке изменить мышью ширину столбца таблицы (на всех компиляторах).

Чсзать, я так и не понял, почему. Может попробуешь найти откуда ноги растут у этого бага?

А вот ListEdit.pas не моя разработка, потому ничего не могу сказать про то, что там накручено.
карма: 22

0
Ответов: 413
Рейтинг: 57
#293: 2016-10-31 21:03:25 ЛС | профиль | цитата
Не хочет компилировать когда в схем есть strMask

Редактировалось 2 раз(а), последний 2016-10-31 21:10:18
карма: 0

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#294: 2016-11-01 00:58:41 ЛС | профиль | цитата
nesco писал(а):
Чсзать, я так и не понял, почему

Уже нашел и исправил.

Редактировалось 1 раз(а), последний 2016-11-01 00:58:57
карма: 22

0
Ответов: 4621
Рейтинг: 746
#295: 2016-11-01 11:45:45 ЛС | профиль | цитата
Poputchik писал(а):
Не хочет компилировать когда в схем есть strMask
У меня компилирует и работает. Может, что-то другое мешает? Что пишет в "Отладке"?

nesco писал(а):
Уже нашел и исправил.
Спасибо.

Редактировалось 1 раз(а), последний 2016-11-01 11:46:08
карма: 26

0
Ответов: 413
Рейтинг: 57
#296: 2016-11-01 21:13:39 ЛС | профиль | цитата
Netspirit писал(а):
Что пишет в "Отладке"?

В большой схеме в отладке пишет:
"hiMultiElement_1B8AC00.pas(1102,36) Error: Identifier not found "Create_hi"
hiMultiElement_1B8AC00.pas(1103,36) Error: Identifier not found "Create_hi"
hiMultiElement_1B8AC00.pas(1245) Fatal: There were 2 errors compiling module, stopping
"
После удаления из схемы strMask, находящегося в MultiElement, схема компилируется и работает.
Схема из формы и самого strMask:
Add(MainForm,2953706,21,112)
{
link(onCreate,15526572:doCompare,[])
}
Add(StrMask,15526572,77,126)
{
}
Сразу по завершению компиляции выскакивает окно с ошибкой:

В других версиях компилятора такой ошибки нет, в делфи тоже.
Если задать данные для сравнения и саму маску то программа из формы и strMask компилируется и работает.
Выйти из ситуации можно если исключить поступление в потоке, или на верхнюю точку данных типа NULL:
Add(MainForm,2953706,21,112)
{
link(onCreate,3965539:doCase,[])
}
Add(StrMask,15526572,126,126)
{
}
Add(Case,3965539,70,126)
{
link(onNextCase,15526572:doCompare,[])
}
Могу только предположить, что для этого компилятора в компонент нужно внести какие-то изменения (типы данных изменить или еще что, не профессионал - не знаю)

Редактировалось 7 раз(а), последний 2016-11-01 21:56:21
карма: 0

0
Ответов: 4621
Рейтинг: 746
#297: 2016-11-02 12:28:39 ЛС | профиль | цитата
nesco писал(а):
Уже нашел и исправил.
nesco, не работает текущая реализация этого компонента.
1) Поле CustomData автоматически освобождается по FreeMem(fCustomData) в деструкторе TControl.Destroy, а мы в него заносим THIMST_UseEditCtrl, который должен освобождаться по TObject(fCustomData).Free. Это приводит к падению при закрытии программы (на компиляторе Delphi не всегда заметно, поскольку, видимо, не успевает выдать сообщение об ошибке, на FPC - стабильно падает).

2) Компонент THIMST_UseEditCtrl создается и уничтожается автоматически. Поэтому такая цепочка могла бы приводить к падению при закрытии программы (но по причине первого пункта не выполняется):
- уничтожается ThiMTStrTbl
- в ThiWin.Destroy уничтожается контрол в поле Control
- TControl.Destroy уничтожает прописанное в CustomData, то-есть, наш THIMST_UseEditCtrl
- следующее автоматическое уничтожение THIMST_UseEditCtrl пытается уничтожить уже уничтоженный объект

Исправить можно, если в CustomData прописывать не Self, а созданную по GetMem переменную типа PPointer, в которую занести Self. Тогда FreeMem(fCustomData) освободит эту переменную, а THIMST_UseEditCtrl останется нетронутым.

3) Но это - тупиковый путь. ThiMTStrTbl тоже назначает свою оконную процедуру. Для доступа к самому себе из этой процедуры, он прописывает себя в Control.Tag. Как мы уже убедились, THIMST_UseEditCtrl тоже хочет добавить свою процедуру, а поскольку поле Control.Tag уже используется, то пришлось себя прописывать в CustomData. А если будет третий компонент, которому тоже нужно будет обрабатывать сообщения от этого Control? Куда он себя пропишет?
Это, видимо, является причиной вопроса и к ListEdit.pas.

НУЖНО:
- ловить сообщения от Control только в ThiMTStrTbl либо через AttachProc, либо по перекрытию ThiWin._onMessage.
- добавить в ThiMTStrTbl поле PList и пару методов SubscribeToMsg(MsgMethod: TOnMessage)/UnsubscribeFromMsg(MsgMethod: TOnMessage).
- каждый клиент к менеджеру ThiMTStrTbl, который хочет получать сообщения (например, наш THIMST_UseEditCtrl), вызывает SubscribeToMsg и указывает метод, который нужно вызывать при поступлении сообщения
- метод ThiMTStrTbl.SubscribeToMsg создает список подписчиков PList (если ещё не создан), и добавляет туда этот метод
- в процедуре обработки сообщений ThiMTStrTbl обрабатывает интересующие его сообщения, а потом пробегается по PList и передает сообщение всем подписавшимся обработчикам.

Поскольку такой подход может требоваться и в других компонентах, то, чтобы не повторять эти методы в каждом таком компоненте, это можно интегрировать прямо в ThiWin. Получается, если визуальный компонент наследует ThiWin, то к такому компоненту можно будет подписываться на сообщения без плясок с Control.Tag, Control.CustomData (потому, что они позволяют подписать только 2 компонента, ну и ещё наследник может перекрыть ThiWin._onMessage).

Дополнительный вопрос. Я не в курсе, как происходит процес уничтожения связки менеджер-клиент. То-есть, когда мы в клиенте указываем менеджера в свойстве _prop_MSTControl, клиент сохраняет ссылку на него у себя. Что будет (если такое возможно), если менеджер будет уничтожен раньше, чем клиент? Клиент ведь будет и дальше обращаться к несуществующему менеджеру.

Редактировалось 2 раз(а), последний 2016-11-02 12:43:41
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#298: 2016-11-02 13:55:13 ЛС | профиль | цитата
Netspirit писал(а):
Получается, если визуальный компонент наследует ThiWin, то к такому компоненту можно будет подписываться на сообщения без плясок с Control.Tag, Control.CustomData

А что делать, если надо перекрыть аналогичный обработчик в ThiMTStrTbl, что, кстати, и делает THIMST_UseEditCtrl, он дает команду на удаление обработчика ThiMTStrTbl и переназначает свой?. Тут я не очень понял.
Кстати, а у тебя есть готовый пример такой реализации подписки на обработку сообщений?

--- Добавлено в 2016-11-02 14:13:23

Netspirit писал(а):
Дополнительный вопрос. Я не в курсе, как происходит процес уничтожения связки менеджер-клиент. То-есть, когда мы в клиенте указываем менеджера в свойстве _prop_MSTControl, клиент сохраняет ссылку на него у себя. Что будет (если такое возможно), если менеджер будет уничтожен раньше, чем клиент? Клиент ведь будет и дальше обращаться к несуществующему менеджеру.

Чсзать, я не рыл этот вопрос, тут автора технологии менеджеров (Dilma) спрашивать надо.

Редактировалось 1 раз(а), последний 2016-11-02 14:13:23
карма: 22

0
Ответов: 4621
Рейтинг: 746
#299: 2016-11-02 14:15:16 ЛС | профиль | цитата
nesco писал(а):
он дает команду на удаление обработчика ThiMTStrTbl и переназначает свой?
Где? Не вижу. Он просто добавляет ещё один обработчик через AttachProc(). KOL это предусматривает - AttachProc/DetachProc реализованы через список, и мы могли бы этим воспользоваться, если туда можно было бы передать метод объекта, а не простую процедуру - в простой процедуре мы вынуждены плясать с CustomData, так как не имеем другого доступа к нужному экземпляру THIMST_UseEditCtrl (в таких случаях должна быть предусмотрена передача пользовательского параметра в AttachProc, что решается, если мы сделаем свой вариант, принимающий метод объекта).

nesco писал(а):
Кстати, а у тебя есть готовый пример такой реализации подписки на обработку сообщений?
Сейчас работаю над этим.
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#300: 2016-11-02 14:38:56 ЛС | профиль | цитата
Netspirit писал(а):
Где? Не вижу

  FMSTControl.detachwndproc;

Обработчик WndProcTabGrid есть и в ThiMTStrTbl, и в THIMST_UseEditCtrl, поэтому первый надо заменить

Редактировалось 1 раз(а), последний 2016-11-02 14:41:26
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)