Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-21832
natalinka
2002-09-06 09:18
2002.11.07
выключить компьютер


14-21768
sancho
2002-10-18 20:44
2002.11.07
Help file


1-21572
Igor__
2002-10-29 04:26
2002.11.07
Web-Browser


1-21568
Di_wind
2002-10-25 23:00
2002.11.07
WebBrowser


1-21680
danilka
2002-10-28 11:45
2002.11.07
StringGrid, DrawGrid - кто-нибудь обьединял ячейки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский