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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2009, 19:46   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

чтото не вижу чтоб переменной ProgForm присваивалось значение какое то..
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.11.2009, 19:47   #12
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Цитата:
чтото не вижу чтоб переменной ProgForm присваивалось значение какое то..
Это не переменная, а форма типа MDIChild создаваемая динамически.

Экспериментально выяснил, что ошибка из-за обращения к форме ProgForm, программа просто не знает что это за форма. Подскажите как ей указать на это?
Как создаю форму написано выше.
Шипулин А. В.

Последний раз редактировалось Шульц; 02.11.2009 в 19:49.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 19:58   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Это не переменная, а форма типа MDIChild создаваемая динамически.
как бы то ни было это переменная(учим азы)
Код:
procedure TMainForm.CreateChildForm
        (const childName : string;a:integer);
var Child: TForm;
begin
Case a of
 0:
  Child := TEIForm.Create(Application);//Создание формы информации
 1:
  begin
   If PF=False then//Проверка создана уже форма или нет.
    begin
     Child := TProgForm.Create(Application);//Создание формы для программ
     ProgForm:=Child;//например так
     PF:=True;
    end;
  end;
end;
Child.Caption := childName;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.11.2009, 19:58   #14
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

вообше шопопало.. не советую использовать одну и ту же переменную (темболее локальную) для создания разных дочерних форм..
1) при использовании локальной переменной.. при выходе с процедуры у тебя рвутся все завязки на эту форму.. и тебе остается ее искать средством перебора всех дочерних ворм..
2) при использовании глобальной переменной у тебя потеряется ссылка на прошлую дочернюю форму при создании новой.. и опять таки.. остается только искать перебором..

лучше сделать так:

Код:
procedure TMainForm.CreateChildForm
        (const childName : string;a:integer);
begin
Case a of
 0:
   begin
     EIForm := TEIForm.Create(Application);//Создание формы информации
     EIForm.Caption := childName;
  end;
 1:
  begin
   If PF=False then//Проверка создана уже форма или нет.
    begin
     ProgForm := TProgForm.Create(Application);//Создание формы для программ
     ProgForm.Caption := childName;
     PF:=True;
    end;
  end;
end;
end;
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"

Последний раз редактировалось Ntlegend; 02.11.2009 в 20:05.
Ntlegend вне форума Ответить с цитированием
Старый 02.11.2009, 20:04   #15
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Сделал оба варианта, безрезультатно. Та же ошибка, на той же строке при обращение к форме.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 20:10   #16
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Цитата:
вообше шопопало.. не советую использовать одну и ту же переменную (темболее локальную) для создания разных дочерних форм..
1) при использовании локальной переменной.. при выходе с процедуры у тебя рвутся все завязки на эту форму.. и тебе остается ее искать средством перебора всех дочерних ворм..
2) при использовании глобальной переменной у тебя потеряется ссылка на прошлую дочернюю форму при создании новой.. и опять таки.. остается только искать перебором..

лучше сделать так:

Код:


procedure TMainForm.CreateChildForm
(const childName : string;a:integer);
begin
Case a of
0:
begin
EIForm := TEIForm.Create(Application);//Создание формы информации
EIForm.Caption := childName;
end;
1:
begin
If PF=False then//Проверка создана уже форма или нет.
begin
ProgForm := TProgForm.Create(Application);//Создание формы для программ
ProgForm.Caption := childName;
PF:=True;
end;
end;
end;
end;

__________________
Так тоже делал, не находит формы, ошибка памяти.. что делать даже не представляю. В общем вопрос теперь становится так, как вытащить данные о компоненте из дочерней формы.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 20:36   #17
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Может пора полный код ( или макет ) в студию?
А то по приведенным кодам можно разобраться или применяя экстросенсорные возможности, или заваливая кучей вопросов.

- Где объявлены переменные ProgForm у Вас?
( в первом варианте procedure TMainForm.CreateChildForm она вообще локальная, что же Вы использовали тогда в TDorRForm.OkButClick(Sender: TObject);, или думаете, что одноименные переменные в разных модулях это одно и тоже? ).
- что такое TDorRForm? ( если форма модального диалога вызываемая из дочерних форм, то можно при ее вызове передавать ей ссылку на вызвавшую ее форму )
- дочерние формы ( хотя бы одного типа ) создаются в нескольких экземплярах ( для обработки разных однотипных данных ) или для чего применяется MDI ?
...
s.Creator вне форума Ответить с цитированием
Старый 02.11.2009, 21:11   #18
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Модуль в котором создается форма:
Код:
unit Error;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, ToolWin, GridsEh, DBGridEh, DBCtrls,
  StdCtrls, Menus;

type
  TMainForm = class(TForm)
    DBGridEh1: TDBGridEh;
    ToolBar1: TToolBar;
    MainMenu1: TMainMenu;
    BagTrecker1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    StatusBar1: TStatusBar;
    procedure DBGridEh1DblClick(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure CreateChildForm(const childName : string;a:integer);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  PF:Boolean;
  ProgForm,EIForm: TForm;

implementation

uses DMForError, ErrorInfa, Prog;

{$R *.dfm}

procedure TMainForm.CreateChildForm
        (const childName : string;a:integer);
begin
Case a of
 0:
   begin
     EIForm := TEIForm.Create(Application);//Создание формы информации
     EIForm.Caption := childName;
  end;
 1:
  begin
   If PF=False then//Проверка создана уже форма или нет.
    begin
     ProgForm := TProgForm.Create(Application);//Создание формы для программ
     ProgForm.Caption := childName;
     PF:=True;
    end;
  end;
end;
end;


procedure TMainForm.DBGridEh1DblClick(Sender: TObject);
begin
CreateChildForm('Полная информация об ошибки № '+IntToStr(DMFE.TFEF.FieldByName('ID_Error').AsInteger),0);
end;

procedure TMainForm.N9Click(Sender: TObject);
begin
DBGridEh1.Visible:=False;
CreateChildForm('Программы',1);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
PF:=False;
end;

end.
Модуль для ProgForm
Код:
unit Prog;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, SUIPageControl,
  SUITabControl, SUIMgr, SUIButton, GridsEh, DBGridEh, SUIImagePanel,
  SUIGroupBox, VirtualTrees, ToolWin;

type
  TProgForm = class(TForm)
    PanelForBut: TPanel;
    PageControl: TsuiPageControl;
    suiTabSheet1: TsuiTabSheet;
    suiTabSheet2: TsuiTabSheet;
    suiTabSheet3: TsuiTabSheet;
    ConcelBut: TsuiButton;
    SaveBut: TsuiButton;
    suiGroupBox1: TsuiGroupBox;
    Panel1: TPanel;
    ProgCB: TComboBox;
    Panel6: TPanel;
    suiGroupBox2: TsuiGroupBox;
    OpisVersion: TMemo;
    DescriptionProg: TMemo;
    ToolBar1: TToolBar;
    ToolBar2: TToolBar;
    VTVersion: TVirtualStringTree;
    AddProgBut: TsuiImageButton;
    DelProgBut: TsuiImageButton;
    RedProgBut: TsuiImageButton;
    suiGroupBox5: TsuiGroupBox;
    Panel4: TPanel;
    suiGroupBox6: TsuiGroupBox;
    VersionEdit: TEdit;
    ADate: TDateTimePicker;
    VTModule: TVirtualStringTree;
    Panel5: TPanel;
    suiGroupBox3: TsuiGroupBox;
    ModuleEdit: TEdit;
    suiGroupBox4: TsuiGroupBox;
    OpisModule: TMemo;
    ScrollBox1: TScrollBox;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CreateParams(var Params: TCreateParams); override;
    procedure AddProgButClick(Sender: TObject);
    procedure RedProgButClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ProgForm: TProgForm;
  VersionSL,ModuleSL:TStringList;
  DORF:Boolean;

implementation

uses DMForError, DB, DBTables, Error, DORProg;

{$R *.dfm}

procedure TProgForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
PF:=False;
Action := caFree;
end;

procedure TProgForm.CreateParams(var Params: tCreateParams);
begin
  inherited CreateParams(Params);   
  Params.Style := Params.Style and not WS_OVERLAPPEDWINDOW or WS_BORDER
end;

procedure TProgForm.AddProgButClick(Sender: TObject);
begin
DORF:=False;
DorRForm.Show; 
end;

procedure TProgForm.RedProgButClick(Sender: TObject);
begin
DORF:=True;
DorRForm.Show;
end;

end.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 21:11   #19
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

И модуль для формы добавления.
Код:
unit DORProg;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, SUIButton, StdCtrls;

type
  TDorRForm = class(TForm)
    suiButton1: TsuiButton;
    OkBut: TsuiButton;
    NazEdit: TEdit;
    Label1: TLabel;
    Panel1: TPanel;
    LeftTitle: TImage;
    RightTitle: TImage;
    CenterTitle: TImage;
    procedure OkButClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DorRForm: TDorRForm;

implementation

uses Error, Prog, DMForError, DB;

{$R *.dfm}

procedure TDorRForm.OkButClick(Sender: TObject);
var
i,i1,IDP:Integer;
p:Boolean;
begin
if NazEdit.Text<>'' then
 begin
  {-- Поиск дубликата--}
  i:=0;
  p:=False;

  i1:=ProgForm.ProgCB.Items.Count-1;
  for i:=0 to i1 do
   if ProgForm.ProgCB.Items.Strings[i]=NazEdit.Text then
    p:=True;

  if p=False then //Если дубль не найден
   begin
    If DORF=False then //Если происходит добавление
     begin
      with DMFE.QFPF1 do
       begin
        DMFE.QEx(DMFE.QFPF1,'select ID_Proga from Prog.db',False);
        if ProgForm.ProgCB.Items.Count>0 then//определение будущего ID проги
         begin
          Last;
          IDP:=FieldByName('ID_Proga').AsInteger+1;
         end
        else
         IDP:=1;
        Close;
        SQL.Clear;
        SQL.Add('insert into Prog.db (ID_Proga,Nazvanie) values (:IDP, :Naz)');
        Params.ParseSQL(SQL.Text,true);
        ParamByName('IDP').AsInteger:=IDP;//ID_Prog
        ParamByName('Naz').AsString:=NazEdit.Text;//Название
        ExecSQL;
        with ProgForm do
         begin
          ProgCB.Items.Add(NazEdit.Text);
          ProgCB.ItemIndex:=ProgCB.Items.Count-1;
          PageControl.ActivePageIndex:=0;
         end;
       end;
     end
    else //Если происходит редактирование
     begin
      with DMFE.QFPF1 do
       begin
        Close;
        SQL.Clear;
        SQL.Add('update Prog.db Nazvanie=:Naz where Nazvanie="'+ProgForm.ProgCB.Text+'"');
        Params.ParseSQL(SQL.Text,true);
        ParamByName('Naz').AsString:=NazEdit.Text;//Название
        ExecSQL;
       end;
     end;
    Close;//Закрыть форму
   end
  else //Если найден дубль
   begin
    ShowMessage('Программа с таким наименованием уже существует!');
   end;
 end
else //Если пустое имя
 ShowMessage('Введите наименования программы!');
end;

procedure TDorRForm.FormShow(Sender: TObject);
begin
if DORF=True then
 NazEdit.Text:=ProgForm.ProgCB.Text
else
 NazEdit.Text:='';
end;

end.
Все конечно немного в кострированом виде, но это не повлияет на суть.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 02.11.2009, 21:37   #20
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

С первого взгляда:
Удерживая <Ctrl> щелкните по ProgForm
- в TDorRForm.OkButClick ( думаю попадете в модуль unit Prog; к переменной )
- в TMainForm.CreateChildForm ( думаю останетесь в том же модуле unit Error; на одноименной переменной )

Про остальное:
Посоветовал бы вообще избавиться от всех глобальных переменных
( разве что оставить MainForm: TMainForm; )

Последний раз редактировалось s.Creator; 02.11.2009 в 21:44.
s.Creator вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка чтения файла Umnik1 Общие вопросы Delphi 12 25.06.2013 22:57
Ошибка обращения к памяти Zeraim Общие вопросы Delphi 7 01.12.2008 17:08
ошибка чтения KiSH333 БД в Delphi 12 22.08.2008 11:09
ошибка памяти. UMmi Общие вопросы Delphi 3 23.11.2006 07:06