Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

Invalid Typecast   Найти похожие ветки 

 
DeadMeat ©   (2007-05-22 09:13) [0]

Здрасте.
Какая та странная ошибка появилась. В одном проекте код работает, в другом - ошибка Invalid Typecast.
Вот код:

 with dbConnection do
   for i := 0 to DataSetCount - 1 do
     begin
       Application.MessageBox(PAnsiChar(DataSets[i].Name), "test", 0);
     end;

Здесь dbConnection это TADOConnection компонент.
Он подключен. ДатаСетов у меня 12 (DataSetCount возвращает 12). Даже если убрать MessageBox, а оставить просто
buf := DataSets[i].Name
объявив buf как string, ошибка остается. Но в другом проекте, тот же код не дает этой ошибки. В чем может быть дело?
Я не исключаю, что дело в другом коде, но ЧТО может так влиять?


 
ANB ©   (2007-05-22 11:00) [1]

Попробовать посмотреть, какой класс прицепился к dbConnection и к DataSets[i].
Ошибка в рантайме или при компиляции ?


 
DeadMeat ©   (2007-05-22 11:06) [2]

Ошибка в рантайме. Класс вроде как тотже самый: TCustomADODataSet.


 
ANB ©   (2007-05-22 11:08) [3]


> DeadMeat ©   (22.05.07 11:06) [2]

Запости uses обоих модулей - где работает и где нет (только напиши, какой рабочий, какой нет). Да - а имена всем компонентам присвоены ?


 
ЮЮ ©   (2007-05-22 11:18) [4]

>Класс вроде как тотже самый: TCustomADODataSet.

И откуда, интересно, объекты такого класса появились в приложении?


 
ANB ©   (2007-05-22 11:24) [5]


> И откуда, интересно, объекты такого класса появились в приложении?

Да это ща по телепатору разберемся :)


 
DeadMeat ©   (2007-05-22 11:49) [6]


> ANB ©   (22.05.07 11:08) [3]

Вот список от НЕ рабочего варианта:
Forms, DB, ADODB, frxADOComponents, frxClass, Classes;
Это у меня просто DataModule

А вот список от рабочего:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage,
cxEdit, DB, cxDBData, cxGridLevel, cxClasses, cxControls, cxGridCustomView,
cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid,
dxDockControl, dxBar, dxRibbon, dxBarExtItems, ActnList, cxTextEdit,
cxCalendar;

Обширный чуток. Много лишнего. Но я решил ничего не кастрировать, чтобы не вышло, что я чтото поменял и заработало.

Имена есть у всех.


> ЮЮ ©   (22.05.07 11:18) [4]

Это тот, который возвращается от dbConnection.DataSets[i]. Я сам его не использую.

To All
А теперь еще не много пояснений.
Суть следующая. У меня есть базовое приложение (это то, где все работает и где куча юнитов). Оно подключает *.DLLку в которую "передает" свой dbConnection. В этой *.DLLке я могу с ним работать без проблем. Открывать соединение и т.п. Вот в этой *.DLLке и не работает перечисление этого списка. Хотя количество возвращается. Одновременно с этим, оно работает в базовом приложении. Т.е. список и объект даже еще и один и тот же. То, что dbConnection мне доступен полностью, я вроде как уверен. Ибо вылетел бы какой-нить AV если бы что не так было. Но вылетает чуток другое.
В тоже время, я могу достучаться до нужного мне датасета (если вытаскивать именно один, нужный) с помощью FindComponent, потому как в *.DLLку я еще и Applcation главного приложения передаю. Достучавшись, я могу с ним (DataSetом) делать что хочу. В том числе и имя вывести. Т.е. здесь тоже ошибок нету.


 
sniknik ©   (2007-05-22 11:56) [7]

для передачи строк между приложением и dll должен быть общий менеджер памяти... рекомендация из коментария при создании модуля dll по этому поводу соблюдена?


 
DeadMeat ©   (2007-05-22 12:37) [8]


> sniknik ©   (22.05.07 11:56) [7]

Если Вы имеете ввиду добавить ShareMem в Uses основного приложения (в *.DPR) и в Uses *.DLLки, то да. Это я сделал. Может еще чтото кроме простого добавления надо?


 
ANB ©   (2007-05-22 12:55) [9]


> Может еще чтото кроме простого добавления надо?

Аха. Для работы с объектами приложения из подгружаемой библиотеки надо :
1. Использовать вместо DLL - BPL
2. Включить флажок "Использовать ран-тайм пакеты".

См. http://www.softwarer.ru/packages.html


 
sniknik ©   (2007-05-22 14:48) [10]

> 1. Использовать вместо DLL - BPL
> 2. Включить флажок "Использовать ран-тайм пакеты".
да вроде не обязательно...
можно и в простых DLL работать со свойствами обьектов, во всяком случае вот это
TButton(Sender).Caption:= DBGrid1.DataSource.DataSet.Name;
никаких исключений не вызвало. при том что, таблица и датосоурс в приложении, грид в длл на форме тамже и этот "код", строчка на нажатии кнопки. т.е. приблизительная ситуация из вопроса, когда из одного модуля обращение к компонентам другого.
(программка просто побаловаться делалась, обычно я так не делаю и никому не рекомендую делать... т.е. по идее описанное в [6] имхо изврат подлежащий переделке)

единственное что еще вижу "нестандартного" (возможно у тебя нет) это, процедура инициализации dll, в dll же, со строкой Application.Handle:= Handle;, т.е. передается Handle основного приложения.


 
DeadMeat ©   (2007-05-22 14:57) [11]

Сама инициализация в *.DLLке идет следующим образом:
function InitReport(App: TApplication; dbConnector: TADOConnection): boolean;
begin
 Result := true;

 MainApp := App;
 dbConnection := dbConnector;

 dmMainData := TdmMainData.Create(Application);
 frmMainForm := TfrmMainForm.Create(Application);

 Application.Icon.Assign(frmMainForm.Icon);
end;


ЗЫ. За Result := true просьба не ругать. У меня проект еще далек от завершения.
После такой инициализации, я спокойно могу вызывать ShowModal и т.п.
Проблема возникла пока лишь в этом перечислении.


 
ANB ©   (2007-05-22 18:24) [12]


> можно и в простых DLL работать со свойствами обьектов, во
> всяком случае вот это

Можно. Я пробовал. Только внезапно ошибки начинают появляться. Плавающие. Статью читал ? Саша Просторов весьма подробно расписал, почему это происходит и почему ошибки плавающие.


 
DeadMeat ©   (2007-05-22 18:54) [13]

Вообщем решил с нуля переписать (благо там не много сейчас), т.к. все равно много ошибок по дорогое откопал.
Сделал болванку. Самое нужное накидал. Добавил свои старые *.DLLки назад и проверил с галочкой Build with runtime packages. Все работает как часы.
Спасибо за инфу. Статью почитал. Посмотрим что будет, когда до "ума" доведу.

Всем спасибо за советы.


 
DeadMeat ©   (2007-05-23 11:21) [14]

Ну чтож. Вроде как проблема решена.
Но возникла чуток другая. Учитывая, что я никогда не использовал этот флажек (хотя знал примерно чего он делает), я несколько в ступоре, насчет распространения. Понятно, что нужно все *.BPLки положить в папку с проектом, но вот вопрос, неужели ВСЕ? Я так насчитал, их там около 10 и выше. Нельзя ли както их в одну слить?


 
ANB ©   (2007-05-23 11:50) [15]


> Нельзя ли както их в одну слить?

Можно, но задерешься. Среди прочих придеться и стандартные делфовые BPL давать.
Короче - либо целая куча библиотек, либо один экзешник. Я обычно предпочитаю последнее. Геморроя потом меньше.


 
DeadMeat ©   (2007-05-23 11:56) [16]


> ANB ©   (23.05.07 11:50) [15]

Насчет гемороя согласен, но как показал эксперимент, в случае использования *.DLLок для общения с компонентами главной программы, такой выход походу единственный (без геморойный).
Т.е. видать выбор из двух зол:
1. без проблемная (и без геморойная в создании) связь *.DLLки с главной программой, но куча библиотек
2. проблемная (хотя не факт, зависит от размера гемороя при реализации) работа *.DLLки с главной программой, но всего один *.EXE

Может есть еще варианты?


 
ANB ©   (2007-05-23 12:00) [17]


> в случае использования *.DLLок для общения с компонентами
> главной программы

А нафига такое извращение ?
ИМХО - DLL если и пользовать, то только если выхода нету - например это сторонняя библиотека.
А уж лазить из DLL в объекты основного экзешника - ловля приключений и имеет смысл только если все приложение построено на библиотеках.


 
DeadMeat ©   (2007-05-23 12:43) [18]


> ANB ©   (23.05.07 12:00) [17]

Ну у меня ситуация какая. Приложение. К нему набор отчетов со своими диалогами, которые я в самой делфе рисую. Вот чтобы не перекомпилить постоянно приложение и не добавлять к нему новые и новые формы, я сделал вот так. Хотя конечно можно было бы эти диалоги реализовывать и в самом FastReport, но дело в том, что не только я один их буду рисовать, а другим проще это именно в делфе делать. Да и удобней там. Можно всю логику отдельного отчета сделать в привычной среде, а уже сам вывод сделать через FastReport. По крайней мере других мыслей как реализовать подобную гибкость у меня нету. Может подскажете?


 
ANB ©   (2007-05-23 12:53) [19]


> Вот чтобы не перекомпилить постоянно приложение и не добавлять
> к нему новые и новые формы, я сделал вот так.

А сделать одну форму, на которую динамически накидывать компоненты (список которых мона гденибудь в файле конфигурации отчетов хранить) ?
У FastReport дизайнер отчетов тоже без проблем вызывается в рантайме (а шаблон можно хранить в файле).
Конструктор форм делфи довольно легко к приложению прикручивается, если нужно компоненты хитро размещать.
Таким образом, можно прямо в основное приложение встроить универсальный конструктор отчетов. заодно будет крутая маркетинговая фича. :)


 
DeadMeat ©   (2007-05-23 13:02) [20]


> ANB ©   (23.05.07 12:53) [19]

А еще скриптовый движек, чтобы код зашивать (в принципе тотже FastScript). Все это конечно можно реализовать, но сколько гемора?
Вот правда насчет конструктора не совсем понял. Это стандартная штука или тоже самому рисовать?
Сам дизайнер от FastScript я встраивал. Раньше... когда я хранил отдельно только отчеты сами, я встроил чисто дизайнер. Оттуда можно было все что угодно делать. Отдельно, таким образом, лежали только файлы FastReport"а. Но возникла вот такая задача, самому туда еще и код вшивать. Диалоги перед отчетами и т.п.


 
ANB ©   (2007-05-23 13:15) [21]


> Это стандартная штука или тоже самому рисовать?

Стандартная. Но порисовать для подключения немного придется. Плюс есть грабля - работоспособность сильно зависит от версии делфи.


 
DeadMeat ©   (2007-05-23 13:39) [22]

А где можно об этом почитать? Пригодится думаю.


 
ANB ©   (2007-05-23 13:41) [23]


> А где можно об этом почитать?

Х.З. Мне подкинули эту фичу казанские ребята. К сожалению, сырцы с примерами дома. Хотя на королевстве я кажись статейки с примерами видел.


 
Loginov Dmitry ©   (2007-05-23 13:52) [24]

> Понятно, что нужно все *.BPLки положить в папку с проектом,
> но вот вопрос, неужели ВСЕ?


Возможно, что достаточно будет только эти:
- VCLxx.bpl
- RTLxx.bpl
- DBRTLxx.bpl

Остальные - по мере необходимости


 
DeadMeat ©   (2007-05-23 14:06) [25]


> Loginov Dmitry ©   (23.05.07 13:52) [24]

К сожалению это не так. Ведь у меня там и ADO и DevExpress и FastReports. Я уже насчитал 26 штук. Любую убираю - матерится.


> ANB ©   (23.05.07 13:41) [23]

Ну а хотя бы примерные слова, по которым искать. Может чего и найдется.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.048 c
15-1188343540
Bad_B
2007-08-29 03:25
2007.09.30
Хранилище для информации


2-1188875907
diimon
2007-09-04 07:18
2007.09.30
IntToStr без System.pas


2-1188981955
Bast
2007-09-05 12:45
2007.09.30
idsmtp и idpop3


2-1189077582
Yogan
2007-09-06 15:19
2007.09.30
SMTP, POP3 сервер


1-1184761986
Semion
2007-07-18 16:33
2007.09.30
действие MouseDown по X,Y координате





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский