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

Вниз

Передача данных из модельной формы в главную   Найти похожие ветки 

 
DeepProg   (2005-07-06 11:13) [0]

Цель: передать TStrings из модальной формы в главную. Инструкцию брал в help"e Delphi 6 (Programmnig with Delphi->Developing the Application User Interface-> Retrieving data from Modal forms). Прошу посмотерть, чтобы понять каким образом там все должно происходить.

Почему возникает Access Violation? - память не выделена? С "безразмерными" ANSI-строками это проходит нормально
Или так в принципе делать нельзя.

type
TForm1 = class(TForm)
btnNone: TButton;
lbxSelect: TListBox;
...
private
 pSelected : Pointer;
public
 constructor CreateWithList(pItems: Pointer; AOwner: TComponent); //pSelected получит значение от pItems,
//к-рое есть адрес переменной TStrings в модуле главной формы
...

procedure TForm1.btnNoneClick(Sender:TObject);
begin
TStrings(pSelected^).Add("Nothing Selected..."); //AV here
end;


Вышеприведеный код - в модуле модальной формы.

Если сделать
TStrings(pSelected^) := lbxSelect.Items;
то AccessViolation произойдет, когда я попытаюсь обратиться к переменной (в модуле главной формы), адрес которой я передавал конструктору(кстати, пришлось весь метод Create выдирать из исходников и вставлять в этот горе-конструктор чтобы форма создавалась, иначе возникала Cannot make a visible window...)


 
Digitman ©   (2005-07-06 11:21) [1]

type
TForm1 = class(TForm)
btnNone: TButton;
lbxSelect: TListBox;
...
private
pSelected : TStrings;
public
constructor CreateWithList(pItems: TStrings; AOwner: TComponent);

procedure TForm1.btnNoneClick(Sender:TObject);
begin
pSelected.Add("Nothing Selected...");
end;

p.s.
"модальность" или "немодальность" формы НЕ имеет никакого отношения к сабжу


 
begin...end ©   (2005-07-06 11:22) [2]

type
 TForm1 = class(TForm)
   btnNone: TButton;
   ...
 private
   S: TStrings;
 public
   constructor CreateWithList(AItems: TStrings; AOwner: TComponent);
 end;

constructor TForm1.CreateWithList(AItems: TStrings; AOwner: TComponent);
begin
 Create(AOwner);
 S := AItems
end;

procedure TForm1.btnNoneClick(Sender: TObject);
begin
 S.Add("Nothing Selected...")
end


 
Плохиш ©   (2005-07-06 11:23) [3]

Замени Pointer на TStrings.


 
DeepProg   (2005-07-06 12:14) [4]

Нормально...
Метод Add класса TStrings сам по себе дает AV. По-моему у меня что-то с системой...

Digitman

> p.s.
> "модальность" или "немодальность" формы НЕ имеет никакого
> отношения к сабжу

Имеет.

Ребят, я может потихоньку съезжаю с катушек, но как может главная форма получить данные из модальной вашим методом. Ведь переданная конструктору переменная не меняется.

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


 
Digitman ©   (2005-07-06 12:21) [5]


> DeepProg   (06.07.05 12:14) [4]



> Имеет.


НЕТ, не имеет !

речь идет о правильной передаче параметра некоего метода, а не модальности чего-то там !

и фактическим параметром в дан.случае д.б. переменная типа TStrings, ссылающаяся на РЕАЛЬНО существующий объект-наследник класса TStrings ... ты ведь вызываешь метод объекта (Add), значит объект должен существовать на этот момент !


 
Юрий Зотов ©   (2005-07-06 12:23) [6]

> DeepProg   (06.07.05 12:14) [4]

> Есть адрес: модальная форма пишет туда, а главная - в курсе
> существования этого адреса

А перед вызовом модальной формы была ли выделена по этому адресу память нужного размера? Иначе как же модальная форма туда писать будет? Вот Вам и AV.

Соответственно, после закрытия модальной формы эту память нужно освободить, как только данные в ней станут уже не нужны.

А чтобы не заморачиваться с ручной работой и расчетом нужного объема памяти, проще сделать, как советуют: создать перед показом модальной формы экземпляр TStringList и передать его для заполнения (а когда станет уже ненужным - уничтожить.


 
DeepProg   (2005-07-06 12:28) [7]

Объект и существует... Для модальной формы!
А главная про него знать не знает. Хочешь сказать, что это не  так?

p.s. ты смотрел указанный раздел справки? По-твоему это в принципе не правильно?


 
msguns ©   (2005-07-06 12:28) [8]

>DeepProg   (06.07.05 12:14) [4]
>Метод Add класса TStrings сам по себе дает AV. По-моему у меня что-то с системой...

Вряд ли.. Возможно, перед Add надо все же создать объект TStrings ?

Для передачи данных, введенных пользователем, из модальных (и не только) форм в главную (и не только) лучше всего использовать записи в объекте-"заказчике" (в данном случае это - главная форма) или же в датамодуле. Если "заказчик" не главная форма, то в ней создать объект-запись (через типизированный указатель и процедуру NEW) и указатель на него передать "модальной" сразу после ее креєйта, но ДО вызова ShowModal. Поинтер, естессвенно, должен быть объявлен в public модальной. Модальная запишет полученные данные в эту запись (или любой другой объект сложной структуры, достаточной для инкапсуляции данных) и закроет себя.
Инфа же будет в объекте-"заказчике", который обработает их.
В событии OnClose формы-"заказчика" надо не забыть прибить созданный объект-контейнер (Dispose и Free, если надо).


 
DeepProg   (2005-07-06 12:31) [9]

Ууу блин. Понапутали все.
DeepProg   (06.07.05 12:28) [7]  - это для Digitman(флуд в общем).


 
msguns ©   (2005-07-06 12:32) [10]

>DeepProg   (06.07.05 12:28) [7]
>А главная про него знать не знает. Хочешь сказать, что это не  так?

Это как это ? Главная хочет получить то, о чем знать не знает ?


 
Digitman ©   (2005-07-06 12:37) [11]


> DeepProg   (06.07.05 12:28) [7]
> Объект и существует... Для модальной формы!


а зачем тогда переменная типа TStrings в модуле вызывающей формы ?


> смотрел указанный раздел справки?


что мне на него смотреть ?)
ничего нового я там не увижу


 
DeepProg   (2005-07-06 13:13) [12]

Digitman Извини: объект не существовал. Спасибо msguns: указал на это. Я TStrings собственно впервые пользуюсь без постоянной связи с XXXBox"ами.

Получилось через TStringList. Так что отдельная благодарность тов. Зотову, за то, что донес до меня общеветочную идею.



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

Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
6-1111342234
Matrex
2005-03-20 21:10
2005.07.25
как вызвать стандартное окно "Соединение с..."


1-1120728956
Aleksandr.
2005-07-07 13:35
2005.07.25
Объясните мне, на что заменять AssignStr, NewStr, DisposeStr?


14-1120442151
X9
2005-07-04 05:55
2005.07.25
Тринистор или тиристор


14-1120200294
Sha
2005-07-01 10:44
2005.07.25
Пятница - задача - снова монеты


1-1120570960
Sagrer
2005-07-05 17:42
2005.07.25
Можно ли удалить элемент динамического массива?





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