Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как динамически добавить фрейм на форму?


ttt ©   (2002-08-08 15:10:00) 

Пишу
frame:=TFrame1.Create(Form1);
Form1.InsertControl(frame);
На первой строке получаю ошибку: "Control "Frame1" has no parent window". Как тут быть?


Набережных С.   (2002-08-08 20:37:00) [1]

Вероятно, в конструкторе фрейма сидит SetFocus.
Если так, то замени его на ActiveControl.


ttt   (2002-08-08 16:42:00) [2]

Похоже, заковырка в самом фрейме. С другим фреймом всё работает.


Skier   (2002-08-08 16:21:00) [3]

>ttt

function GetReport( AAppHandle: THandle; FormType,Form,Data,Pattern: PChar;year,month,day,smena,numsmen,year1,month1,day1,smena1: variant !!!)


Вообще удивительно как у тебя всё это работает !
Тебе бы книжки почитать про DLL...


Ura   (2002-08-08 16:19:00) [4]

1. Проверь Aplication проги и в DLL Равный?
2. Может надо для репорта еще и TScree передать?


ttt   (2002-08-08 16:15:00) [5]

Есть dll.

library Reports;

uses
SysUtils,
Classes,
Dialogs,
Forms,
Controls,
DB,
DBTables,
Excel2000,
DateUtils,
Math,
Variants,
...
PeriodDefFrame in "PeriodDefFrame.pas" {Frame1: TFrame},
ProgressForm in "ProgressForm.pas" {ProgressFrm};

function GetReport(FormType,Form,Data,Pattern:shortstring;year,month,day,smena,numsmen,year1,month1,day1,smena1:variant):boolean;
var frame1:TFrame1;
begin
...
ProgressFrm:=TProgressFrm.Create(Application);
frame1:=TFrame1.Create(Application);// ОШИБКА ЗДЕСЬ
frame1.Parent:=ProgressFrm;
...
end;

exports
...
GetReport;

begin
...
end.


Frame:

unit PeriodDefFrame;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DB, DBTables, ComCtrls, ExtCtrls, StdCtrls, Excel2000, OleServer, Spin,
Variants, DateUtils, Math, ActiveX, Buttons;

type
TFrame1 = class(TFrame)
BeginGroupBox: TGroupBox;
YearLabel: TLabel;
MonthLabel: TLabel;
DayLabel: TLabel;
SmenaLabel: TLabel;
YearSpinEdit: TSpinEdit;
MonthComboBox: TComboBox;
DayComboBox: TComboBox;
SmenaRadioGroup: TRadioGroup;
NumSmenComboBox: TComboBox;
EndGroupBox: TGroupBox;
Year1Label: TLabel;
Month1Label: TLabel;
Day1Label: TLabel;
Smena1Label: TLabel;
Year1SpinEdit: TSpinEdit;
Month1ComboBox: TComboBox;
Day1ComboBox: TComboBox;
Smena1RadioGroup: TRadioGroup;
PatternWorkbook: TExcelWorkbook;
ExcelApplication1: TExcelApplication;
DataWorkbook: TExcelWorkbook;
QueryPeriod: TQuery;
QuerySmen: TQuery;
QueryMonth: TQuery;
pbReport: TProgressBar;
plReport: TLabel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
QueryPeriod0: TQuery;
QuerySmen0: TQuery;
QueryMonth0: TQuery;
procedure ShowButtonClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FRepSrcID: integer;
FRepSrcName: string;
FPatternName: string;
FPatternID: integer;
{ Private declarations }
procedure CalcDataSheet;
procedure SetRepSrcID(const Value: integer);
procedure SetRepSrcName(const Value: string);
procedure SetPatternID(const Value: integer);
procedure SetPatternName(const Value: string);
procedure DataPrepare(pathSrc:string; var DataWorkbook:_WorkBook);
procedure PatternPrepare(pathPattern:string);
procedure xlReport1AfterBuild(Report: TxlReport);
procedure xlReport1Progress(Report: TxlReport; const Position,
Max: Integer);
procedure xlReport1BeforeBuild(Report: TxlReport);
public
{ Public declarations }
ProgressLabel:TLabel;
ProgressBar:TProgressbar;
xlReport1:TxlReport;
property RepSrcID:integer read FRepSrcID write SetRepSrcID;
property RepSrcName:string read FRepSrcName write SetRepSrcName;
property PatternID:integer read FPatternID write SetPatternID;
property PatternName:string read FPatternName write SetPatternName;
procedure CheckAvailableControls;
procedure DoBeforeCreate;
procedure DoBeforeDestroy(Sender: TObject);
end;

implementation
...
end;


Затем вызывается функция из dll:

unit Unit3;
...
TFunc= function(FormType,Form,Data,Pattern:shortstring;year,month,day,smena,numsmen,year1,month1,day1,smena1:variant):boolean;

...

procedure TForm3.Button2Click(Sender: TObject);
var f:TFunc;
Handle:integer;
begin
try
handle:=LoadLibrary("Reports.dll");
if Handle<>0 then
begin
f:=GetProcAddress(handle,"GetReport");
f(DBEdit1.Text,DBEdit2.Text,DBEdit3.Text,DBEdit4.Text,2000,8,8,1,null,null,null,null,null);
end;
finally
FreeLibrary(handle);
end;
end;

...


AL2002   (2002-08-08 15:53:00) [6]

Напиши, какая ошибка.


Skier   (2002-08-08 15:48:00) [7]

>ttt
Где ты всё это пишешь ? В каком месте ??
Код ПОЛНОСТЬЮ в студию...


ttt   (2002-08-08 15:42:00) [8]

Тот же результат


AL2002   (2002-08-08 15:35:00) [9]

Frame1:=TFrame1.Create(nil);


ttt   (2002-08-08 15:25:00) [10]

В том-то и дело, что до второй строки вообще программа не доходит, а ошибка после первой строки(Create). Хоть так, хоть сяк пиши - ничего не меняется.


Nikolai_S   (2002-08-08 15:19:00) [11]

Ну естественно это фрейм нужно сначала создать:

var
Frame1: TFrame1;
begin
Frame1 := TFrame1.Create(Form1);
Frame1.Parent := Form1;
end;


Nikolai_S   (2002-08-08 15:18:00) [12]

Frame1.Parent := Form1;

Одной этой строки достаточно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо