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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2012, 14:21   #1
Aiden
Пользователь
 
Регистрация: 12.09.2007
Сообщений: 34
По умолчанию Вызов метода MDIChild формы из другой формы.

Есть 2 формы, обе MDIChild:

Первая форма:
Код:
unit DB;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, ComObj; 

PDBase = ^TDBase;
TDBase = class(TForm)
    xls: TStringGrid;
  private
    vBase:string;
  public
    procedure Load;
    property Base:string read vBase write vBase;
  end;

var
  DBase: TDBase;

implementation

uses RecordEdit;

procedure TDBase.Load;
begin
if FileExists(vBase) then begin
  //код вырезал для экономии места. Тут загрузка данных из БД в СтрингГрид
end;
end;


procedure TDBase.xlsDblClick(Sender: TObject);
var
Form:TRecordEditor;
begin
  Form:=TRecordEditor.Create(Owner);
  Form.Base:=vBase;
  Form.Rec:=xls.Selection.Top;
  Form.Href:=@Self;
  Form.Load;
  Form.Caption:='1';
end;
end;

end.
Вторая форма
Код:
unit RecordEdit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, ComObj, DB;

type
  TRecordEditor = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    vBase:string;
    vHref:PDBase;
  public
    property Base:string read vBase write vBase;
    property Href:PDBase read vHref write vHref;
    { Public declarations }
  end;

var
  RecordEditor: TRecordEditor;

implementation

{$R *.dfm}

procedure TRecordEditor.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
Href^.Load;
Action:=caFree;
end; 

end.
Вкратце описание - Форма 2 создается формой 1 при двойном клике в СтрингГриде. После закрытия Формы 2 данные в форме 1 должны обновиться при помощи метода Load формы 1. Для получения формы, создавшей форму 2 передаю указатель на нее. В принципе почти все нормально - метод вызывается, НО - переменная vBase "inaccessible value". Даже если по тому-же указателю установить свойство Base - ничего не меняется. Собственно вопросы:
1. Почему? По логике вещей по указателю на экземпляр класса я должен иметь возможность нормально работать с ним.
2. Каким образом можно это реализовать (обращение к методу другой MDIChild формы)?
Aiden вне форума Ответить с цитированием
Старый 28.04.2012, 14:40   #2
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Зачем вам вообще указатель - PDBase = ^TDBase;?

И по описанию вашей логики, я понял, что TRecordEditor должен быть показыватся модально, нет?
=master= вне форума Ответить с цитированием
Старый 28.04.2012, 14:51   #3
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

А в принципе я бы тут сделал не так, либо mvc прикрутил, либо на худой конец class function добавил в TRecordEditor.
=master= вне форума Ответить с цитированием
Старый 28.04.2012, 16:09   #4
Aiden
Пользователь
 
Регистрация: 12.09.2007
Сообщений: 34
По умолчанию

Постараюсь полностью описать что хочу сделать:
Необходимо разработать редактор баз данных состоящий из 2 частей - формы с набором записей в базе данных и формы для редактирования данных записей. Реализовать все в одной форме не получается, т.к. некоторых базы содержат в себе несколько десятков полей, пользователь просто запутается в них. Для реализации этого создал 2 формы:

Форма TDBase, которая отображает все записи в базе данных. Форма отображает все записи базы данных, путь к которой хранится в переменной vBase. Список полей, которые необходимо отобразить, хранятся в одноименном ini файле. По клику на конкретную запись открывается форма TRecordEditor, которая позволяет отредактировать выбранную запись.

Форма TRecordEditor - отображает полностью всю запись с возможностью редактирования. По закрытию этой формы данные сохраняются, после чего форма, из которой была открыта запись, должна обновиться (чтоб пользователь увидел результаты изменения записи). За обновление формы у меня отвечает метод Load формы TDBase.

Вот какраз в обновлении формы TDBase после закрытия формы TRecordEditor и возникает проблема. В моем понимании - форма TRecordEditor должна содержать указатель на форму из которой она была вызвана (форму-родитель), для того чтоб знать, какую именно форму надо обновить после закрытия. Имея указатель на форму-родитель, я вызываю метод формы родителя (Href^.Load, где Href - указатель на форму-родитель). Метод вызывается нормально - но главная гадость - метод не видит внутренних переменных экземпляра класса (т.е. эту самую переменную vBase формы TDBase). Почему так происходит - понять не могу Хотелось - бы узнать почему (боюсь мне с этим сталкиваться придется еще не раз) и узнать, каким еще образом можно решить данную задачу. C inaccessible value сталкивался только в том случае, когда пытался обратиться к свойству не инициализированного класса. МБ я не правильно передаю указатель на экземпляр класса?

class function - не устраивает, т.к. во первых экземпляр формы у меня уже создан, во вторых - метод работает с внутренними переменными класса и объектами, размещенными на форме. Не хотелось-бы переписывать и адаптировать.
mvc - придется все переделывать. Не хотелось-бы, но если альтернатив нет - куда ж деться.

П.С. TRecordEditor - не модальная.

Последний раз редактировалось Aiden; 28.04.2012 в 16:16.
Aiden вне форума Ответить с цитированием
Старый 28.04.2012, 16:22   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Что мешает, если уж пошли по такому пути, свойство сделать типа TDBase? И загнать в него из 1-ой формы DBase или Self, которые и так уже указатели. Можно и конструктор 2-ой формы переопределить и передать ему в качестве параметра это же.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.04.2012, 16:27   #6
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Для того чтобы вызвать метод формы указатель как "собаке пятая нога", vHref : TDBase вот так достаточно, а указатели удалите, чтобы не сталкиватся там где не надо.
Про модальность я так и не понял, вы даете возможность редактировать сразу 100 записей за раз, и в чем прикол? Я еще понимаю когда окно редактирования одно (не модальное) но на кой их сразу куча?
=master= вне форума Ответить с цитированием
Старый 28.04.2012, 16:44   #7
Aiden
Пользователь
 
Регистрация: 12.09.2007
Сообщений: 34
По умолчанию

Модальность не устраивает тем, что пока модальное окно не закроешь - в другую базы не залезть. Зачем надо в другую базу лезть если редактируешь одну из записей - не понятно. Поэтому запрет на редактирование нескольких записей устанавливаю через перебор дочерних окон с проверкой свойства Base. Если форма TRecordEditor с свойством Base, равным свойству Base формы TDBase уже существует - просто вывожу предупреждение.

Заменил указатель на TDBase - все работает. Большое спасибо.

Последний раз редактировалось Aiden; 28.04.2012 в 16:46.
Aiden вне форума Ответить с цитированием
Старый 28.04.2012, 16:53   #8
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Поэтому запрет на редактирование нескольких записей устанавливаю через перебор дочерних окон с проверкой свойства Base. Если форма TRecordEditor с свойством Base, равным свойству Base формы TDBase уже существует - просто вывожу предупреждение.
Добавте поле в TDBase на TRecordEditor, и никакие переборы не нужны (не забывая очищать его).
=master= вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрый вызов метода формы из другого потока Swarog Общие вопросы Delphi 3 21.05.2011 20:34
Вызов переменной из другой формы pavellyba Общие вопросы Delphi 2 26.03.2011 12:42
Вызов переменной из другой формы darkahoy Общие вопросы .NET 8 19.11.2010 14:46
delphi вызов одной формы из другой hi-end1 Помощь студентам 4 17.10.2009 19:53
Работа с компонентами и их вызов из другой формы Патрон Общие вопросы Delphi 3 09.12.2008 04:20