Форум: "Основная";
Текущий архив: 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