Форум: "Основная";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
ВнизПоделитесь опытом создания компонента (TCustomDbGrid) Найти похожие ветки
← →
62mkv (2003-04-10 09:15) [0]Здравствуйте ! Мне хотелось бы увидеть ответ на такой вот вопрос : возможно ли создать компонент потомок ТCustomDbGrid, соблюдая все приличия теории (как то наследование и полиморфизм), а не копируя полностью модуль DbGrids ? (или переписывая его заново) У меня это по крайней мере не получилось, вот я и думаю - то ли лыжи не едут то ли я ... тугодум ;)) (этот вопрос наверное в орешник зашлют :)
Не получилось потому, что там (IMHO !) многовато приватных полей
и статических методов... в связи с этим попытки изменить поведение таких методов как InternalLayout и DrawCell приводят к каскадному копированию всех остальных методов ;))
И еще подскажите пожалуйста где можно достать книжку Конопки по разработке компонент? и имеет ли смысл ее искать ?
Спасибо
← →
evvcom (2003-04-10 10:49) [1]Ну насчет DrawCell - это зря сказано. DrawCell описан как виртуальный метод и директивой
override
замечательно переписывается "соблюдая все приличия теории". А насчет InternalLayout надо подумать, а настолько ли это необходимо переписывать именно его, может то что нужно можно реализовать и в другом месте (виртуальном или динамическом методе)?
← →
62mkv (2003-04-10 12:56) [2]Ну DrawCell я действительно зря статическим назвал, просто мне пришлось вносить изменения в его внутренние функции, и вызвать inherited никак не получалось... а вообще главные головняки были вызваны тем, что мне пришлось менять определение типа TColumn, и в связи с этим практически переписывать все к нему относящееся, так как нормально (через override) переопределить даже виртуальные методы не удается, если параметры изменились, а перегрузка тоже не работает.. и потом, самое странно для меня было открытие - то что в Object Pascal, оказывается имеет значение в каком модуле пытаются получить доступ к приватным полям !!
Другая большая проблема была в том что создать редактор свойств и компонента для потомка Columns и DbGrid. похоже что нет необходимых для этого исходных текстов (нет, можно конечно и их с нуля написать, но ведь это не правильно !!)
← →
malkolinge (2003-04-10 13:09) [3]переопредели свойство Cells и все дела :)
← →
62mkv (2003-04-10 13:22) [4]В DbGrid есть свойство Cells ??
← →
malkolinge (2003-04-10 13:29) [5]Ой :) я с обычным перепутал :) Так а вообще что ты хочешь сделать ?
← →
62mkv (2003-04-10 13:59) [6]Короче очень надо реализовать DbGrid с, так сказать, persistent selection $)) т.е. чтобы пользователь выделял записи не через {Ctrl, Shift} + мышка, а слева была пустая колонка, где можно было бы поставить галочку.. ну как CheckListbox, только DbGrid... $)
Соответственно такое выделение было бы относително статичным, например, список выделенных записей (точнее, значений уникального поля выделенных записей), можно сохранить, выделить повторно, использовать в SQL-запросе и т.д. К тому же можно будет не бояться отпустить Ctrl $))
В моей программе это активно используется, но там сделано через поле БД "IS_SELECTED", что имеет два ОГРОМНЫХ недостатка :
1) выделение действует на всех пользователей...
2) неоднородность интерфейса или необходимость вносить такое в каждую таблицу... собственно именно эти соображение заставили меня озаботиться созданием компонента, так как неоднократно были жалобы от юзеров, что "вот Саша выделил, а они ко мне в список попали !!!"... да и Ctrl этот злосчастный всех припарил уже...
короче я возмечтал, как я сейчас создаю компонент и все цветтет и пахнет... чувствую моя могилка раньше зацветет... ;)))
кстати готовые решения не хотелось бы использовать, да и теперь это уже дело принципа ...;))
← →
evvcom (2003-04-10 14:03) [7]Что значит "в каком модуле пытаются получить доступ к приватным полям"?
← →
62mkv (2003-04-10 14:10) [8]TClass = class (..)
private
FPrivate1:...
..
end
если используешь в том же юните, где этот класс объявлен, то к данному полю (методу) можно обращаться где угодно, даже вне классов вообще !а вот если из другого ,через uses, то вообще нигде не обратишься, даже из потомков ! такая вот петрушка...в С++ такого не было, насколько я помню...
← →
evvcom (2003-04-10 14:54) [9]Ну да, все правильно. Могу открыть маленький секрет. Если также есть свойство, чтение которого реализованное так:
property Priv: TAnyType read FPrivate1;
а записи нет (ReadOnly) или имеется, но через вызов SetPriv(...), а хочется эту переменную прописать напрямую, то в этом случае компилятор можно обмануть:
var pPriv: ^TAnyType;
begin
pPriv := @Priv; // Адрес приватной FPrivate1
pPriv^ := <значение типа TAnyType>; // Вот она запись в private
end;
← →
62mkv (2003-04-10 15:08) [10]Самая заморочка там даже не в том чтобы писать в приватное поле, а в том, чтобы переопределить его тип, при этом так чтобы методы класса-предка работали с ним, как с НОВЫМ типом...
В реализации DBGrid есть множество присваиваний приватным полям напрямую.. если бы через свойства, то еще можно было бы наверное обмануть как то..
← →
evvcom (2003-04-10 15:26) [11]Ну и не ломай голову, раз тебя настолько не устраивает TCustomDBGrid, а переписывай его заново от TCustomGrid, исправляя все, что не устраивает.
← →
62mkv (2003-04-10 15:33) [12]Дак вот !!!!!!!!! фак..... я уже полдня в дауне от сего пребываю...
все создал вроде как надо... все типы переименовал, чтоб с родным DbGrids не пересекались (если интересно могу сырцы получившегося сбросить), и вот печальный но закономерный итог : бросаешь компонент на форму - Delphi закрывается ;(((((((((
сначала выдал один раз что то вроде стэкоферфлоу, и более молчок.. причем пока это был TDbGrid, все было нормально...
есть также готовый проект, где все что надо работает...тоже могу скинуть...
← →
malkolinge (2003-04-10 15:38) [13]
> Ну и не ломай голову, раз тебя настолько не устраивает TCustomDBGrid,
> а переписывай его заново от TCustomGrid, исправляя все,
> что не устраивает.
Ничего себе :)
Кстати виртуальные методы будут(долджны работать) с новым свойством. Я в это верю :) а что касаеться статических, то тут лажа :)
← →
62mkv (2003-04-10 15:41) [14]мда.. спасибо парни (или нет ?? в данном случае не особо принципиально...) за поддержку беседы... все таки форум онлайн - классная тема... побрел я покуда домой, распечатал щас интерфейсную часть модуля dbgrids, попробую на сон грядущий почитать ;))) мож че придумаю...
← →
evvcom (2003-04-10 15:41) [15]Да нет, скидывать ничего не надо. А прежде чем регить компонент, отладь его. Т.е. вручную пропиши MyGrid := TMyGrid.Create, и т.д. По нему хоть отладчиком можно будет полазить. Как отладишь, тогда и пробуй регить и на форму кидать.
← →
62mkv (2003-04-10 15:46) [16]Кстати, дельная мысль !!! я уже в полном отчаянии пребывал, но сейчас попробую ! Спасибо.
← →
62mkv (2003-04-10 15:49) [17]да кстати прости(те) за предложение скинуть..
← →
MXA (2003-04-10 17:53) [18]помню чем-то подобным и я когда-то пытался заниматься - сделал вывод, что если разработчики сделали свойство или метод приватным, значит так надо и лучше не пытаться это обойти (ну кроме редких простых случаев), проще заново все самому написать, так что настоятельно рекомендую обдумать другие варианты.
ну хотя-бы что-нибудь вроде спец поля в датасете + OnDrawColumnCell.
кроме того, как я понял у тебя часть данных (инф о выделеннии) будет хранится в гриде - это не есть хорошо
← →
62mkv (2003-04-11 05:58) [19]кроме того, как я понял у тебя часть данных (инф о выделеннии) будет хранится в гриде - это не есть хорошо
2MXA: Это как раз и есть хорошо, потому что грид есть вещь динамическая, то есть у каждого экземпляра процесса - своя. а вот в том виде в каком сейчас реализовано (как раз таки спец. поле)- это НЕ ЕСТЬ хорошо ! ;)) текущая работа любого пользователя
а) видна
б) мешает в работе
всем остальным...
сейчас так и сделано, т.е. спец поле+OnDrawColumnCell...
← →
62mkv (2003-04-11 06:46) [20]ЭВРИКА !!! вроде работает... действительно, нужно было не кидать компонент сразу на форму, а сначала отладить процесс его инициализации т.е. так :
MDB:=TMkvDbGrid.Create(Form1);
try
try
Mdb.Width := 100;
Mdb.Height := 100;
Mdb.Left := 10;
Mdb.Top := 10;
Mdb.Parent := Form1;
Mdb.Show;
except
showmessage(MDB.ClassName);
end;
finally
MDB.Free;
end;
Спасибо EVVCOM ! Теперь будет до ума доводить !
Дабы не ставить точку, хочется еще два вопроса задать :
1) Нужна ли все-таки книжка Конопки (если кто ее читал ;) и где можно достать, если она полезна ??
2) Поделитесь (если есть чем), идеями как в DbGride внутреннюю сортировку реализовать... я знаю во многих стандартных наборах компонентов такое реализовано, но раз уж есть свой в таких трудах рожденный, придется в него эту функциональность добавлять
← →
62mkv (2003-04-11 06:50) [21]Спасибо EVVCOM ! Теперь будет до ума доводить !
В смысле - буду ;))
← →
62mkv (2003-04-11 12:58) [22]Все-таки это было стратегически невыгодное решение...
работать то мой компонент работает, но вот использовать для него предопределенные редактор свойств компонента TDbGrid я не могу...
не хватает dsgnintf.dcu... и мозгов ;))
Как бы победить то эту петрушку... блин...
← →
evvcom (2003-04-11 14:21) [23]Напиши свой редактор свойств.
← →
62mkv (2003-04-11 15:07) [24]Нда... к тому все и идет ;)) жутко интересное это дело, млин - создание компонентов...
кстати такой вопрос - в Delphi 5 наверное по другому реализовано кое что, в частности, не проканывают такие штуки (я по книге Калверта "Delphi 4" пробую кое-что сделать), например
1) не получается создать иконку для компонента - все делаю как у него - создаю .dcr файл с рисунком 24х24, обзываю ресурс рисунка так же как и компонент, сохраняю в тот же каталог, что и модуль - и ничего не происходит ;((
2) с применением процедуры RegisterPropertyEditor не получается модуль даже скомпилить - материться что dsgnintf.dcu не найден...
а вообще, разработка компонента - жутко интересное дело !!
я серъезно, между прочим ;))
← →
evvcom (2003-04-11 15:21) [25]Все работает. Я dcr пробовал еще в первом, потом во втором Дельфи. Сейчас кое-какие компоненты качал, и там dcr есть. Все нормально ставится. Да возьми хоть TAdvStringGrid 2.4, о котором сегодня уже не раз говорилось в других топиках. Посмотри, как там написаны эти dcr.
А на dsgnintf.dcu путь в опциях проекта пропиши. Эта dcu лежит в других путях, не указанных по умолчанию.
← →
cg_shura (2003-04-11 16:04) [26]Конопка - вещь первой необходимости (после книги о формонакидательстве - для общего знакомства). Нормальная работа в Delphi и состоит в создании компонент.
imho, из всех прочитаных мною о Delphi книг только две из них действительно стоящие и рассматривают конкретную тематику:
1. Уже упомянутый Рей Конопка - Создание пользовательских компонент в Delphi
2. Рей Лишнер - Секреты Delphi 2 (не обращайте внимание на версии, идеология не изменилась)
Также для нормальной работы нужно хорошо знать теорию ООП.
← →
62mkv (2003-04-13 05:10) [27]2evvcom: В дистрибутиве Delphi 5 не нашел я dsgnintf.dcu, только в 3-й получилось... если ее использовать, пойдет, как думаете ?
2cg_shura: Спасибо за моральную поддержку ! Теперь надо книжку поискать !
← →
evvcom (2003-04-14 01:40) [28]Прошу прощения, dcu нет, зато есть ...\Delphi5\Source\Toolsapi\dsgnintf.pas
← →
62mkv (2003-04-14 06:31) [29]Так я его вижу уже давно ?? А как скомпилить то его ? в проект включить ? Начинает еще кучи других модулей не хватать .... ;((
← →
evvcom (2003-04-14 08:22) [30]Включи в Project>Options...>Directories\Conditionals>Search Path путь $(DELPHI)\Source\Toolsapi, должно заработать. Там далее подключаются модули, на которые есть или dcu или pas
← →
62mkv (2003-04-14 08:41) [31]Спасибо, попробую обязательно...
← →
erikivaov (2003-04-14 19:13) [32]А готовый grid нельзя использовать :) Я для этих целей использую EhGrid или в OnDrawColumnCell рисую комбобокс. Я дополнительное поле делается элементарно.
Select *, 0 as IS_SELECTED from myTable
Event на изменение поля тоже написать несложно.
P.S.
Зачем так извращатся?
← →
62mkv (2003-04-15 06:01) [33]неплохая мысль...
кстати ТАКОЙ запрос работать не будет, по крайней мере в LocalSQL. насчет извращаться... возможно ты и прав... однако мне моя идея все равно нравится. рано или поздно я ее добью все таки именно в таком виде в каком хотелось бы видеть, т.е. обратная совместимость со стандартным дбгридом + новое поведение в методах, а не в событиях.
еще хотелось бы от кого-нибудь услышать как конкретно в Delphi 5 добиться собственных иконок на палитре компонентов.. все вроде делаю как в хелпе - и ниче не получается !
← →
evvcom (2003-04-15 09:03) [34]В dcr должно быть Contents->Bitmap-><имя класса>
В файле регистрации *.pas должно быть {$R <имя файла>.dcr}. Если <имя файла> соответствует имени файла регистрации, то можно {$R *.dcr}. И делай ReBuild.
Наверное, возможны и другие варианты.
← →
62mkv (2003-04-15 09:52) [35]СПАСИБО !!!!!! Ведь поди ж ты, НИ СЛОВА про это не было в хедпе сказано !!! как и в книге Калверта ! Спасибо еще раз !
← →
evvcom (2003-04-15 10:05) [36]НА ЗДОРОВЬЕ!!!
Я ж тебе уже говорил, возьми компоненты сторонних производителей, у которых уже все это работает, и посмотри, как у них это написано.
← →
62mkv (2003-04-15 12:16) [37]Дык.... вот... собственно я конкретно над этой бедой не особо долго бился, минут 15,... пока ты не написал ;))
а вообще даже сторонних производителей не надо - даже в стандартной поставке (Delphi5\Demos\) есть примеры... руки вот только до них во время не дошли ;))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.008 c