Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Вниз

... = 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
3-95645
perov
2002-08-07 14:19
2002.08.29
Блокировка


4-96022
HighWay
2002-06-25 20:13
2002.08.29
Как вызвать событие в другом приложении?


3-95691
Nazareth
2002-08-08 16:01
2002.08.29
Странная закладка


6-95936
RedArc
2002-06-19 17:36
2002.08.29
Почтовый робот


3-95724
NDR
2002-08-09 14:09
2002.08.29
F1,F2,F3





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский