Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-91147
Elvira
2003-04-08 08:58
2003.04.28
Blob-поля


14-91503
Sir Alex
2003-04-10 12:05
2003.04.28
Миграция пользователей в Active Directory и Домен


14-91526
Delirium^.Tremens
2003-04-09 11:41
2003.04.28
Задолбавшие вопросы


3-91235
Сергей
2003-04-11 08:07
2003.04.28
Как лечить изменение полей Date


6-91445
VD601
2003-03-05 14:15
2003.04.28
К localhost поключается, а к произвольному серваку никак...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский