Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.29;
Скачать: CL | DM;

Вниз

... = class(TOpenDialog)   Найти похожие ветки 

 
Goblinus   (2002-08-18 17:08) [0]

Недавно тут спрашивал, ка добавить свой контрол в OpenDialog. Посоветовали посчмотреть исходники TOpenPictureDialog. Короче, мучаюсь уже часа два - никак не получается наследование. Почему?


Код:

...
TgblOpenDialog = class(TOpenDialog)
private
FchkBox: TCheckBox;
public
constructor Create(AOwner: TComponent); override;
end;

procedure Register;

implementation

uses
...

constructor TgblOpenDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FChkBox := TCheckBox.Create(AOwner);
with FChkBox do begin
Name := "CheckBox";
Caption := "...";
SetBounds(???, ???, 50, ??);
Visible := True;
end;
end;

procedure Register;
begin
RegisterComponents("gbl", [TgblOpenDialog]);
end;

end.


 
Юрий Зотов   (2002-08-18 17:35) [1]

CheckBox не появится, пока ему не назначен Parent. А назначать в данном случае нечего, поскольку OpenDialog - невизуальный компонент (по той же причине возникают и проблемы с SetBounds).

OpenDialog в своем Execute просто вызывает API-шную функцию GetOpenFileName и уже она создает окно стандартного системного диалога. Вот на это окно и надо вешать CheckBox, но сделать это не так просто (см. описание GetOpenFileName, структура OPENFILENAME, поле lpTemplateName и др.).

Не будет ли проще средствами Delphi создать свою диалоговую форму?


 
Goblinus   (2002-08-18 18:04) [2]


> OpenDialog в своем Execute просто вызывает API-шную функцию
> GetOpenFileName и уже она создает окно стандартного системного
> диалога. Вот на это окно и надо вешать CheckBox, но сделать
> это не так просто (см. описание GetOpenFileName, структура
> OPENFILENAME, поле lpTemplateName и др.).

Почему же тогда с TOpenPictureDialog всё в порядке?


> Не будет ли проще средствами Delphi создать свою диалоговую
> форму?

Если по функциональности - как OpenDialog, то не проще :-(


 
Юрий Зотов   (2002-08-18 18:58) [3]

Что значит "с TOpenPictureDialog всё в порядке"? Вы хотите сказать, что вставить свой контрол в TOpenPictureDialog можно так, как Вы это делаете в своем коде?

Есть сомнения.

Задачу можно несколько упростить, используя свойство Template, но делать свой ресурс все равно придется.


 
Suntechnic   (2002-08-18 19:28) [4]

>Юрий Зотов © (18.08.02 18:58)
Да нет. Всё гораздо проще. И свой шаблон диалога создавать совсем необязательно.
>Goblinus © (18.08.02 18:04)
Если я не ошибаюсь так диалог расширять таким образом я вам советовал, только не пойму в чём сложность? Во-первых вы не весь код привели. Вам ещё необходимо переопределить DoShow. Во-вторых посмотрите ещё раз внимательно исходники TOpenPictureDialog.


 
Goblinus   (2002-08-18 20:35) [5]

Что-то я н понимаю.
Я написал в DoShow:

procedure TgblOpenDialog.DoShow;
var
PreviewRect, StaticRect: TRect;
begin
GetClientRect(Handle, PreviewRect);
StaticRect := GetStaticRect;
PreviewRect.Left := StaticRect.Left + (StaticRect.Right - StaticRect.Left);
Inc(PreviewRect.Top, 4);
FChkBox.BoundsRect := PreviewRect;
FChkBox.ParentWindow := Handle;
inherited DoShow;


 
Suntechnic   (2002-08-18 20:49) [6]

>Goblinus © (18.08.02 20:35)
Ты делай так же как в примере. Не просто добавляй CheckBox, а поклади его на panel.
...и ещё... в create передаётся не AOwner а self. А вот владельцем CheckBox должен уже быть panel.
Вообщем вниметельнее изучи исходники.


 
Goblinus   (2002-08-19 00:17) [7]


> Suntechnic © (18.08.02 20:49)

Спасибо за подсказки! Осталась лишь две проблемы:
1). Как переместить CheckBox под ComboBox выбора маски файлов?
FPicturePanel.Left и Top? Но тогда они не меняют своего места положения при ресайзе.
2). Почему у меня на Caption"e CheckBox"a отображается только ПЕРВАЯ ПОЛОВИНА ПЕРВОЙ БУКВЫ, а не всё слово?


 
Suntechnic   (2002-08-19 02:12) [8]

>Goblinus © (19.08.02 00:17)
Если хочешь ComboBox под ComboBox поместить, тогда придётся свой шаблончик диалога набросать.
Создаёшь файл
MyDlg.rc
Текст файла:
MYDLGTEMPLATE DIALOG 0, 0, 300, 76
STYLE 0x404L | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Sans Serif"
LANGUAGE LANG_NEUTRAL , SUBLANG_NEUTRAL
{
LTEXT "", 1119, 0, 0, 204, 76, SS_LEFT | WS_CHILD | NOT WS_VISIBLE | WS_GROUP
}

Включаешь файл в проект и далее пишешь следующий код:
unit Unit1;
interface

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

{ TMyDialog }
type
TMyDialog = class(TOpenDialog)
private
FCheckBoxPanel: TPanel;
FCheckBox: TCheckBox;
protected
procedure DoShow; override;
published
public
constructor Create(AOwner: TComponent); override;
function Execute: Boolean; override;
end;

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
openDialog: TMyDialog;
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TMyDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCheckBoxPanel := TPanel.Create(Self);
with FCheckBoxPanel do
begin
Name := "CheckBoxPanel";
Caption := "";
SetBounds(204, 5, 169, 200);
BevelOuter := bvNone;
BorderWidth := 6;
TabOrder := 1;
FCheckBox := TCheckBox.Create(Self);
with FCheckBox do
begin
Name := "CheckBox1";
Caption := "My CheckBox";
SetBounds(6, 6, 157, 23);
AutoSize := False;
Parent := FCheckBoxPanel;
end;
end;
end;

procedure TMyDialog.DoShow;
var
PreviewRect, StaticRect: TRect;
begin
GetClientRect(Handle, PreviewRect);
StaticRect := GetStaticRect;
PreviewRect.Left := StaticRect.Left;
PreviewRect.Top := StaticRect.Bottom - 5;
FCheckBoxPanel.BoundsRect := PreviewRect;
FCheckBoxPanel.ParentWindow := Handle;
inherited DoShow;
end;

function TMyDialog.Execute;
begin
if NewStyleControls and not (ofOldStyleDialog in Options) then
Template := "MYDLGTEMPLATE" else
Template := nil;
Result := inherited Execute;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
openDialog := TMyDialog.Create(self);
try
openDialog.Execute
finally
openDialog.Free;
end;
end;

end.

Единственное так это позиционируй CheckBox внутри Panel на то место где тебе надо.


 
Suntechnic   (2002-08-19 02:14) [9]

Сорри... вместо Если хочешь ComboBox под ComboBox поместить... следует читать Если хочешь CheckBox под ComboBox поместить...


 
Goblinus   (2002-08-19 02:40) [10]

Итоговый код с 2-мя новыми проблемами (те две устранены):

constructor TgblOpenDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPicturePanel := TPanel.Create(Self);
with FPicturePanel do
begin
Name := "PicturePanel";
Caption := "";
SetBounds(195, 286, 138, 22);
BevelOuter := bvNone;
BorderWidth := 6;
FChkBox := TCheckBox.Create(Self);
with FChkBox do
begin
Name := "CheckBox";
Checked := True;
Caption := "


 
Suntechnic   (2002-08-19 02:54) [11]

>Goblinus © (19.08.02 02:40)
Как убрать панель, которая справа появляется и на которой нет ничего?
За это пространство справа и отвечает шаблон диалога из ресурса. Разберись с моим примером. Там пространство справа убирается и добавляется снизу.


 
Goblinus   (2002-08-20 00:09) [12]

Всё работает! Спасибо!!!!



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
3-95689
Kinder
2002-08-07 15:04
2002.08.29
Копирование баз


3-95704
Sim0n
2002-08-08 08:54
2002.08.29
помогите разобраться с DBGrid


14-95949
IronHawk
2002-08-03 23:59
2002.08.29
Где » архивы старых форумов « ???


1-95807
skandig
2002-08-19 22:06
2002.08.29
диаграммы из Acces


14-95976
Елена
2002-07-30 08:59
2002.08.29
Шестая версия