Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие форм в БД как в 1С 7.7, Как спроектировать форму для выбора? 
V
    Опции темы
kabanoff
  Дата 20.4.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 20.4.2008

Репутация: нет
Всего: нет



Друзья!  smile 

У меня БД в SQL Server, использую ADO (связку ADOConnection, ADOTable, DataSource). Ситуация следующая:
на Форме1 есть Эдит1. При выборе Эдит1 создается и открывается Форма2 с возможными вариантами выбора.

Хочу, чтобы выбор нужного значения на Форме2 закрывал Форму2 и помещал в Форма1.Эдит1 значение нужной колонки выбранной строки (ну вообщем, как в 1С 7.7 (да и 8.0), кто знаком).

1) Все формы в памяти не держу, создаю по мере необходимости.

2) Назначить вручную свой обработчик форме2 уже пробовал, сработал он только на OnClose (впринципе, понятно почему).

...
procedure FormOnDblClisk(Sender: TObject);
begin
...
end;

...
begin
  AChangeForm:=TChangeForm.Create(Self);
  AChangeForm.OnDblClick:=FormOnDblClick;
...

Есть другие варианты?  smile 
PM MAIL   Вверх
Rodman
Дата 20.4.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



а если просто создать глобальную переменную и через нее передавать инфу?!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
kabanoff
Дата 21.4.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 20.4.2008

Репутация: нет
Всего: нет



Это выход для частного случая, когда проектируешь каждый раз новую форму и знаешь, куда возвращать результат.
А если идти нормальным методом и создать одну "универсальную" форму?

Существуют ли способы передачи значения от одной форме - другой и обратно без явного их указания? может WinAPI?

Передавать значение по ссылке пробовал, вот кусок кода:

***

//форма-родитель
...
   AChangeForm:=TChangeForm.Create(Self);
   AChangeForm.InitMyField(Edit2.Text); //моя процеура
   ...
   AChangeForm.Show;

//открываемая форма
...
interface

type
  TChangeForm = class(TForm)
    ...
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    procedure DBGrid1DblClick(Sender: TObject);
  private
    ...
    MyField: ^string;
  public
    ...
    procedure InitMyField(str: string);
  end;

implementation
....
procedure TChangeForm.InitMyField(str: string);
begin
  MyField:=@str;
end;

procedure TChangeForm.DBGrid1DblClick(Sender: TObject);
begin
  MyField^:=ADOQuery1.FieldByName('Наименование').AsString;
  Close;
end;

***
Данный метод работает, но в Edit значение не возвращается. Если поставить TChangeForm.InitMyField(VAR str: string); то компилятор выругается, мол передаваемый Edit2.Text не идентифицирован ([Pascal Error] CreateDoc.pas(112): E2033 Types of actual and formal var parameters must be identical). Как быть?
PM MAIL   Вверх
pseud
Дата 21.4.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Код


//форма- объект класса TChangeForm
...
   AChangeForm:=TChangeForm.Create(Self);
   try
     if AChangeForm.ShowModal = mrOK then
       Edit2.Text := AChangeForm.ReturnValue;
   finally
     AChangeForm.Free;
   end;
     

//класс TChangeForm
...
interface

type
  TChangeForm = class(TForm)
    ...
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    procedure DBGrid1DblClick(Sender: TObject);
  private
    ...
  public
    ...
    ReturnValue: string;
  end;

implementation
....

procedure TChangeForm.DBGrid1DblClick(Sender: TObject);
begin
  ReturValue := ADOQuery1.FieldByName('Наименование').AsString;
  ModalResult := mrOK;
end;


Это сообщение отредактировал(а) pseud - 21.4.2008, 10:21


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
kabanoff
Дата 21.4.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 20.4.2008

Репутация: нет
Всего: нет



Спасибо за ответ!  smile 

А если форма MDIChild (ShowModal не прокатит)?
PM MAIL   Вверх
pseud
Дата 21.4.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(kabanoff @  21.4.2008,  12:07 Найти цитируемый пост)
А если форма MDIChild (ShowModal не прокатит)?


ну тогда готовься:

Код


//форма- объект класса TChangeForm
...
   AChangeForm:=TChangeForm.Create(Self);
   AChangeForm.SetDataHolder(Edit2, 'Text');
   AChangeForm.Show;

//класс TChangeForm
...
interface

type
  TChangeForm = class(TForm)
    ...
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    procedure DBGrid1DblClick(Sender: TObject);
  private
    ...
    AHolderControl: TControl; 
    AHolderProperty: string;
  public
    ...
    procedure SetDataHolder(AHolderControl: TControl; AHolderProperty: string);
  end;

implementation

uses
  TypInfo;
....

procedure TChangeForm.SetDataHolder(AHolderControl: TControl; AHolderProperty: string);
begin
    FHolderControl := AHolderControl;
    FHolderProperty := AHolderProperty;
end;

procedure TChangeForm.DBGrid1DblClick(Sender: TObject);
  function HolderTypeKind: TTypeKind;
  var
    PropInfo: PPropInfo;
  begin
    Result := tkUnknown;
    PropInfo := GetPropInfo(FHolderControl, FHolderProperty);
    if PropInfo <> nil then
      Result := PropInfo^.PropType^.Kind;
  end;
var
  tk: TTypeKind;
  val: string;
begin
    val := ADOQuery1.FieldByName('Наименование').AsString; 
    tk := HolderTypeKind;
    if (tk in [tkString, tkLString, tkWString]) then
       SetStrProp(FHolderControl, FHolderProperty, val);

    Close;
end;


конечно, код сырой. но куда копать - видно ))

Это сообщение отредактировал(а) pseud - 21.4.2008, 14:01


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
kabanoff
Дата 22.4.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 20.4.2008

Репутация: нет
Всего: нет



WOW! Выглядит ужасающе!  smile  Но использовать можно.

Впервые слышу про процедуру SetDataHolder! Век живи - век учись.

Спасибо большое pseud!!!  smile

Добавлено через 1 минуту и 24 секунды
Тема закрыта. Всем спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.