Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 16:03   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Ошибка при присвоении tStringList

Привет всем!
Короче дело такое.
Программа состоит из EXE и несколькох DLL. При запуске в EXE формируется некий список someEXEList: tStringList.
Затем в EXE он без проблем присваевается someEXEComboBox: tComboBox
Код:
   someEXEComboBox.items := someEXEList;
потом он (someEXEList) передаётся в DLL как указатель и там присваивается переменой someDLLList: tStringList
Код:
   someDLLList := pSomeEXEList//: pointer;
Проблема в том, что если написать
Код:
someDLLComboBox{: tComboBox}.items := someDLLList;
или
Код:
someDLLComboBox.items := tStringList(pSomeEXEList);
То выскакивает ошибка


При этом я без проблем срабатывает функция
Код:
showMessage(someDLLList.strings[1])
и даже
Код:
someDLLList.add('someNewString');
, которая отлично добавляет строчку даже в someEXEComboBox.

Так в чём-же проблема? Мне надо, что-бы при изменении любого из
someEXEList
someDLLList
someEXEComboBox.items
someDLLComboBox.items


Менялись бы и все остальные.

p.s. не помогает даже
Код:
someDLLComboBox.items := tComboBoxStrings(someDLLList);
Компилятор говорит, что tComboBoxStrings - embarcadero знает что...
Altera вне форума Ответить с цитированием
Старый 23.07.2009, 16:29   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Странно.. А если через задницу - Clear + AddStrings ?
Black Fregat вне форума Ответить с цитированием
Старый 23.07.2009, 16:38   #3
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

TStringList(pSomeEXEList^)
Evgeniy26 вне форума Ответить с цитированием
Старый 23.07.2009, 16:48   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Black Fregat
Странно.. А если через задницу - Clear + AddStrings ?
Через задницу мне не нужно. я ведь написал!

Цитата:
Сообщение от Evgeniy26
TStringList(pSomeEXEList^)
А через передницу не получается....
Altera вне форума Ответить с цитированием
Старый 23.07.2009, 16:55   #5
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

TStringList(pSomeEXEList) - это уж точно не сработает. Ты приводишь указатель к TStringList хотя его не разименовал ^.

Последний раз редактировалось Evgeniy26; 23.07.2009 в 16:58.
Evgeniy26 вне форума Ответить с цитированием
Старый 23.07.2009, 16:55   #6
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Вот вам метод вызова

EXE
Код:
...
var someDllProcedure: procedure(const pList: pointer); stdCall
...
someDllProcedure(someEXEList);
...
DLL
Код:
procedure someDllProcedure(const pList: pointer); stdCall;
var
someDLLList: tStringList;
someDLLComboBox: tComboBox;
begin
   ...
   someDLLList := pList;
  
   someDLLComboBox := tComboBox.create(nil);
   someDLLComboBox.items := someDLLList ;
   ...     

end;
Ps. shareMem добавил в DPR exe и dll самым первым пунктом в uses

Последний раз редактировалось Altera; 23.07.2009 в 17:00.
Altera вне форума Ответить с цитированием
Старый 23.07.2009, 17:00   #7
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Код:
procedure someDllProcedure(const pList: pointer); stdCall;
var
someDLLList: tStringList;
someDLLComboBox: tComboBox;
begin
   ...
   someDLLList := tStringList(pList^);
  
   someDLLComboBox := tComboBox.create(nil);
   someDLLComboBox.items := someDLLList ;
   ...     

end;
Что такое - someEXEList.
Если это TStringList:
Код:
someDllProcedure(@someEXEList);

Последний раз редактировалось Evgeniy26; 23.07.2009 в 17:04.
Evgeniy26 вне форума Ответить с цитированием
Старый 23.07.2009, 17:05   #8
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Evgeniy26 Посмотреть сообщение
Код:
procedure someDllProcedure(const pList: pointer); stdCall;
var
someDLLList: tStringList;
someDLLComboBox: tComboBox;
begin
   ...
   someDLLList := tStringList(pList^);
  
   someDLLComboBox := tComboBox.create(nil);
   someDLLComboBox.items := someDLLList ;
   ...     

end;
Что такое - someEXEList.
Я щас пункт 3.1 буду нарушать ского.
Если бы было-бы так просто Я бы и сам допёр....



Для тех кто мне не верит вот:
Вложения
Тип файла: rar sdsdsdqw1wds.rar (429.0 Кб, 9 просмотров)

Последний раз редактировалось Altera; 23.07.2009 в 17:15.
Altera вне форума Ответить с цитированием
Старый 23.07.2009, 17:47   #9
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
Altera
Мне надо, что-бы при изменении любого из
someEXEList
someDLLList
someEXEComboBox.items
someDLLComboBox.items

Менялись бы и все остальные.
Боюсь так не получится.
Причина: при присваивании:
Код:
ComboBox1.Items := StrLst;
происходит копирование данных, а не присваивание указателей (как ты , видимо, ожидал).
Попробуй пример:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  StrLst: TStringList;
begin
  StrLst := TStringList.Create;
  StrLst.Add('1');
  ComboBox1.Items := StrLst;
  StrLst.Add('2');
end;
В ComboBox1 будет только 1.
Если заглянуть в исходники, там действительно увидим копирование данных.

Насчет ошибки.

Ошибка возникает из-за того, что класс TStringList из exe-файла и класс TStringList из dll - это разные классы.

При присваивании происходит проверка типов, они не совпадают и вылетает исключение:
Код:
procedure TPersistent.AssignTo(Dest: TPersistent);
begin
  Dest.AssignError(Self);
end;
Здесь обсуждалась эта проблема, только с TButton, но это не суть важно:
http://www.delphikingdom.com/asp/ans...IDAnswer=68178
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 23.07.2009 в 19:08.
Daramant вне форума Ответить с цитированием
Старый 23.07.2009, 20:00   #10
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Ну хорошо, ладно.... копируются данные а не указатель. Но вопрос по-прежнему остаётся.
Почему
Код:
someDLLComboBox{: tComboBox}.items := someDLLList{ tStringList};
в DLL выдаёт ошибку?
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при компиляции MasterofCDM Общие вопросы Delphi 2 11.11.2008 09:35
Ошибка при отключении ОС GREK Операционные системы общие вопросы 1 24.09.2008 16:50
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53
Ошибка при присваивании NeiL Общие вопросы Delphi 5 16.04.2008 22:24
Ошибка при компиляции zak Общие вопросы C/C++ 2 11.12.2007 18:24