Текущий архив: 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.48 MB
Время: 0.007 c