Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
ВнизПочему некоторые компоненты оказываются под родителем? Найти похожие ветки
← →
IDKFA (2002-10-28 13:42) [0]Народ, помогите!
Создаю динамически фрейм, содержащий дочерние компоненты!
Вот функция создания:
function CreateMyFrame(
ID_Frame:word;
ParentFrame:TWinControl;
ParentHandle:THandle;
ParentRect:TRect;
var WinHandle:THandle):integer; stdcall; export;
var
FD:TLeftColumn;
begin
Result:=0;
WinHandle:=0;
try
FD:=TLeftColumn.Create(nil);
FD.Parent:= ParentFrame;
Result:=integer(FD);
WinHandle:=FD.Handle;
if ParentHandle<>0 then
begin
SetParent(WinHandle,ParentHandle);
with FD do begin
SetWindowPos(
Handle,
HWND_TOP,
ParentRect.Left,
ParentRect.Top,
ParentRect.Right-ParentRect.Left,
ParentRect.Bottom-ParentRect.Top,
SWP_SHOWWINDOW);
Show;
end;
end;
except
On E:exception do MessageDlg(E.Message,mtError,[mbOK],0);
end;
end;
Затем убиваю этот фрейм:
procedure DeleteMyFrame(WinID:integer); stdcall; export;
var i:word;
kolvo:word;
begin
try
if WinID<>0 then
begin
kolvo:=TLeftColumn(WinID).ComponentCount-1;
for i:=0 to kolvo do
begin
{это я спецом очищал перед фреймом, думал поможет!}
TLeftColumn(WinID).Components[0].Free;
end;
TLeftColumn(WinID).Free;
end;
except
On E:exception do MessageDlg(E.Message,mtError,[mbOK],0);
end;
end;
Так вот, при первом вызове - все отображается отлично!
Затем
DeleteMyFrame
и снова
CreateMyFrame - вот теперь самое главное:
некоторые компоненты оказываюся под своим родителем!!!
Почему? Как пофиксить? Ведь label, shape, images и ряд других
отображаюся нормально!
Помогите, плиззз!!!
← →
Игорь Шевченко (2002-10-28 14:01) [1]Мало информации. Это все в DLL ? Работа ведется из главного приложения ? Где форма, где фрейм ?
← →
IDKFA (2002-10-28 14:43) [2]Вот Library:
library moicpi;
uses
Forms,
SysUtils,
Classes,
Windows,
Graphics,
Controls,
Dialogs,
lcolumn in "lcolumn.pas" {leftcolumn: TFrame},
function CreateMyFrame(
ID_Frame:word;
ParentFrame:TWinControl;
ParentHandle:THandle;
ParentRect:TRect;
var WinHandle:THandle):integer; stdcall; export;
var
FD:TLeftColumn;
begin
Result:=0;
WinHandle:=0;
try
FD:=TLeftColumn.Create(ParentFrame);
FD.Parent:= ParentFrame;
Result:=integer(FD);
WinHandle:=FD.Handle;
if ParentHandle<>0 then
begin
SetParent(WinHandle,ParentHandle);
with FD do begin
SetWindowPos(
Handle,
HWND_TOP,
ParentRect.Left,
ParentRect.Top,
ParentRect.Right-ParentRect.Left,
ParentRect.Bottom-ParentRect.Top,
SWP_SHOWWINDOW);
Show;
end;
end;
except
On E:exception do MessageDlg(E.Message,mtError,[mbOK],0);
end;
end;
procedure DeleteMyFrame(WinID:integer); stdcall; export;
var i:word;
kolvo:word;
begin
try
if WinID<>0 then
begin
kolvo:=TLeftColumn(WinID).ComponentCount-1;
for i:=0 to kolvo do
begin
Showmessage(TLeftColumn(WinID).Components[0].ClassName
+#13+
inttostr(TLeftColumn(WinID).Components[0].ComponentIndex)
);
TLeftColumn(WinID).Components[0].Free;
end;
TLeftColumn(WinID).Free;
end;
Вот фрейм:
unit lcolumn;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, testframe, ExtCtrls, Menus, Buttons, Grids;
type
Tleftcolumn = class(TFrame)
Label1: TLabel;
Button1: TButton;
ListBox1: TListBox;
SpeedButton1: TSpeedButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
procedure Tleftcolumn.Button1Click(Sender: TObject);
begin
ShowMessage("Button click!");
end;
end.
И еще проблема даже не в том, что компоненты оказываются под фреймом, а в том что некоторые(которые являются потомками TWinControl) просто создаются невидимыми! А те которые потомки TGraphicControl- типа Label, SpeedButton, Image, Shape - видимыми! Проблема как сделать оконные компоненты видимыми и почему вообще они невидимы?
Работа ведетсяиз главного приложения - мне нужно просто менять фреймы, брать их из DLL, затем если фреймы не нужны, убивать их и закрывать DLL - и все!!!
Help me!!! Народ!!!
← →
Игорь Шевченко (2002-10-28 14:50) [3]А если попробовать DLL и EXE с run-time пакетами скомпилировать, пройдет беда ?
← →
IDKFA (2002-10-28 15:16) [4]Вот код юнита:
unit main;
interface
uses
Global, Windows, Messages, SysUtils, Variants, Classes,
Graphics,Controls, Forms, Dialogs, ExtCtrls,
ImgList, ComCtrls, ToolWin, Menus, Buttons,
StdCtrls, DB, DBTables;
type
TMainForm = class(TForm)
***
procedure CreateLeftFrame(ID_Frame:word);
procedure DeleteLeftFrame;
***
{ API function }
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure Open1Click(Sender: TObject);
procedure New1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
WScreen, HScreen:integer;
Resizing:Boolean;
Start:Boolean;
ViewFrame:Boolean;
protected
FHLib:THandle;
FChildID:integer;
FChildHandle:THandle;
end;
{***** Процедура открытия dll и загрузки фрэйма *****}
procedure TMainForm.CreateLeftFrame(ID_Frame:word);
var CreateFrame:TCreateFrame;
begin
FHLib:=LoadLibrary("moicpi.dll");
if FHLib>HINSTANCE_ERROR then
begin
CreateFrame:=GetProcAddress(FHLib,"CreateFrame");
if Assigned(CreateFrame) then
FChildID:=CreateFrame(
ID_Frame,
PanelLeft,
PanelLeft.Handle,
PanelLeft.ClientRect,
FChildHandle);
end;
ViewFrame:=true;
end;
{***** Процедура удаления фрэйма и закрытия dll *****}
procedure TMainForm.DeleteLeftFrame;
var DeleteFrame:TDeleteFrame;
begin
if (FChildID>0) and (FHLib>HINSTANCE_ERROR) then
begin
DeleteFrame:=GetProcAddress(FHLib,"DeleteFrame");
if Assigned(DeleteFrame) then DeleteFrame(FChildID);
end;
if FHLib>HINSTANCE_ERROR then FreeLibrary(FHLib);
ViewFrame:=false;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
LoadOptions();
selectframe(1);{вот тут катит}
end;
{***** Процедура выбора фрэйма *****}
procedure TMainForm.SelectFrame(Number:word);
begin
{ если фрэйм был уже показан, то нужно его удалить }
if (ViewFrame) then
begin
DeleteLeftFrame;
end;
{ Load DLL }
case Number of
0:Begin { При загрузке }
end;
1:Begin
CreateLeftFrame(1);
end;
2:Begin
CreateLeftFrame(2);
end;
3:Begin
CreateLeftFrame(3);
end;
4:Begin { Help This Program}
CreateLeftFrame(4);
end;
end;
{ *********************************************** }
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
{***** Процедура уничтожения главной формы *****}
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DeleteLeftFrame;
end;
procedure TMainForm.New1Click(Sender: TObject);
begin
selectoperation(1);{не катит}
end;
procedure TMainForm.Open1Click(Sender: TObject);
begin
selectoperation(2);{не катит}
end;
end.
ViewFrame - просто флаг(был показан/не был)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c