![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
аналог MessageDlg в KOL? [Delphi]
romtek © (2003-11-23 14:15:00)Привет всем!
(1)
Нужны дополнительные кнопки: 'Yes to All' и 'No to All'.
В MessageDlgесть , mrYesToAllи mrNoToAll. Чем их заменить?
(2)
Вообще писать проект на КОЛе с одной стороны заманчиво, приКОЛьно...
Но каждый раз приходится сталкиваться с проблемой недостатка функций (к примеру,из SysUtils). Заново писать код? Новичкам, как я, это не всегда под силу.
Ещё одна вещь: При отладке некоторых значений отладчик может не показать или выдать неверное значение переменной.
Как с этим бороться?
romtek (2003-11-26 11:01:00) [1]Вот исходник ф-ции с тестовой программой. Часть была переделана из ShowQuestionи немного содрано со стандартного VCL (mtInformation,...)
Посоветуйте как ее улучшить:
1) глюки с фоном иконки
2) 'строка 1'#13'строка 2' выводится в 2 строки...
3) кнопки не всегда располагаются по центру
4) другие глюки...
unit KOL_kit;
interface
uses windows, messages;
type
TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);
function MsgDlg( const S: String; Answers: String; mt: TMsgDlgType ): Integer;
implementation
uses KOL,consts;
var
Captions: array[TMsgDlgType] of string = ('Warning', 'Error', 'Information', 'Confirmation',
'');
IconIDs: array[TMsgDlgType] of PChar = (IDI_EXCLAMATION, IDI_HAND,
IDI_ASTERISK, IDI_QUESTION, nil);
procedure OKClick( Dialog, Btn: PControl );
var Rslt: Integer;
begin
Rslt := -1;
if Btn <> nil then
Rslt := Btn.Tag;
Dialog.ModalResult := Rslt;
Dialog.Close;
end;
procedure KeyClick( Dialog, Btn: PControl; var Key: Longint; Shift: DWORD );
begin
if (Key = VK_RETURN) or (Key = VK_ESCAPE) then
begin
if Key = VK_ESCAPE then
Btn := nil;
OKClick( Dialog, Btn );
end;
end;
procedure CloseMsg( Dummy, Dialog: PControl; var Accept: Boolean );
begin
Accept := FALSE;
Dialog.ModalResult := -1;
end;
var Ico: PIcon;
procedure IconPaint( Dummy: Pointer; Sender: PControl; DC: HDC );
begin
Ico.Draw( DC, 0, 0 )
end;
function MsgDlg( const S: String; Answers: String; mt: TMsgDlgType ): Integer;
var Dialog: PControl;
Buttons: PList;
PB,Btn: PControl;
AppTermFlag: Boolean;
Lab: PControl;
Y, W, I: Integer;
Title: String;
DlgWnd: HWnd;
AppCtl: PControl;
begin
AppTermFlag := AppletTerminated;
AppCtl := Applet;
AppletTerminated := FALSE;
if mt <> mtCustom
then Title := Captions[mt]
else Title := Applet.Caption;
Dialog := NewForm( Applet, Title ).SetSize( 300, 40 );
// Dialog.Font.FontName:='MS Sans Serif';
Dialog.Color:=clBtnFace;
Dialog.Icon:=THandle( -1 );
Dialog.Style := Dialog.Style and not (WS_MINIMIZEBOX or WS_MAXIMIZEBOX);
Dialog.OnClose := TOnEventAccept( MakeMethod( Dialog, @CloseMsg ) );
Dialog.Margin := 8;
//Dialog.Canvas.TextOut(48,2,S);
PB := NewPaintBox(Dialog).SetSize(32,32);
PB.OnPaint := TOnPaint( MakeMethod( nil, @IconPaint ) );
Ico := NewIcon;
Ico.LoadFromResourceID(0, integer(IconIDs[mt]), 0);
Lab := NewEditbox( Dialog, [ eoMultiline, eoReadonly, eoNoHScroll, eoNoVScroll ] ).
SetSize( 278, 20 ).SetPosition(PB.Left+PB.Width+Dialog.Margin,Dialog.Margin);
Lab.HasBorder := FALSE;
Lab.Color := clBtnFace;
Lab.Caption := S;
// Lab.Cursor:=-2;
Lab.Style := Lab.Style and not WS_TABSTOP;
Lab.TabStop := FALSE;
//Lab.LikeSpeedButton;
//Lab.CreateWindow; //virtual!!! -- not needed, window created in Perform
while TRUE do
begin
Y := HiWord( Lab.Perform( EM_POSFROMCHAR, Length( S ) - 1, 0 ) );
if Y < Lab.Height - 20 then break;
Lab.Height := Lab.Height + 4;
if Lab.Height + 40 > GetSystemMetrics( SM_CYSCREEN ) then break;
end;
Buttons := NewList;
W := 0;
if Answers = '' then
begin
Btn := NewButton( Dialog, ' OK ' ).PlaceUnder;
Btn.Left:=PB.Left;
W := Btn.Width-PB.Width;
Buttons.Add( Btn );
end
else
while Answers <> '' do
begin
Btn := NewButton( Dialog, ' ' + Parse( Answers, '/' ) + ' ' );
Buttons.Add( Btn );
if W = 0 then
Btn.SetPosition(PB.Left, PB.Top + Max(PB.Height,Lab.Height) + Dialog.Margin)
{.PlaceUnder}
else
Btn.PlaceRight;
Btn.AutoSize( TRUE );
if W > 0 then
begin
Inc( W, 6 );
Btn.Left := Btn.Left + 6;
end;
W := W + Btn.Width;
end;
W := (Dialog.ClientWidth - W) div 2;
for I := 0 to Buttons.Count-1 do
begin
Btn := Buttons.Items[ I ];
Btn.Tag := I + 1;
Btn.OnClick := TOnEvent( MakeMethod( Dialog, @OKClick ) );
Btn.OnKeyDown := TOnKey( MakeMethod( Dialog, @KeyClick ) );
Btn.Left := Btn.Left + W;
if I = 0 then
begin
Btn.ResizeParentBottom;
Dialog.ActiveControl := Btn;
end;
end;
Dialog.ClientWidth := Max(Lab.Width+PB.Width+Dialog.Margin, W) + Dialog.Margin * 2;
Dialog.CenterOnParent.Tabulate.CanResize := FALSE;
Buttons.Free;
Dialog.CreateWindow; // virtual!!!
if (Applet <> nil) and Applet.IsApplet then
begin
Dialog.ShowModal;
Result := Dialog.ModalResult;
Dialog.Free;
end
else
begin
DlgWnd := Dialog.Handle;
while IsWindow( DlgWnd ) and (Dialog.ModalResult = 0) do
Dialog.ProcessMessage;
Result := Dialog.ModalResult;
Dialog.Free;
CreatingWindow := nil;
Applet := AppCtl;
end;
Ico.Free;
AppletTerminated := AppTermFlag;
end;
end.
program testmsg;
uses
Windows,
messages,
KOL,
KOL_kit;
{$R *.RES}
var
form,btn:PControl;
procedure Click1( Dummy : Pointer; Sender : PControl );
begin
ShowQuestion('Do you...?','Yes/No/Always/Never');
end;
procedure Click2( Dummy : Pointer; Sender : PControl );
begin
MsgDlg('Do you...?','Yes/No/Always/Never',mtConfirmation)
end;
begin
form:=NewForm(Applet,'Why NOT?').CenterOnParent.SetSize(400,300);
btn := NewButton( form, 'Call ShowQuestion').SetSize(200,22).CenterOnParent;
btn.OnClick := TOnEvent( MakeMethod( nil, @Click1 ) );
btn := NewButton( form, 'Call MsgDlg').SetSize(200,22).PlaceUnder;
btn.OnClick := TOnEvent( MakeMethod( nil, @Click2 ) );
run(form);
end.
APXi (2003-11-25 00:22:00) [2]MessageBox
Vladimir Kladov (2003-11-24 15:16:00) [3]так выдерите код, поправьте для себя то, что нужно. Вывод иконки, например.
romtek (2003-11-24 14:45:00) [4]Ciber SLasH:
>>А почему бы не заделать свой диалог ?
А почему бы не внести её в KOL? И вообще добавить кнопки BitBtn -чтоб красивее было.
Свой диалог писать каждый раз не хочется. По моему не стоит отвлекаться от главной цели при написании программы.
Vladimir Kladov:
>>Попробуйте ShowQuestion.
Вещь неплохая, но хочется исплользовать системную иконку в диалоге.
Я даже попытался переделать её под свою MsgDlg. Но:
1) Иконка и кнопки не всегда корректно отображаются.
2) также отсутствует возможность вывода текста как в MessageDlg(пример: 'строка1'#13'строка2').
3) отсутствует выбор типа диалога (Confirm,Information и т.д.)
Могу показать код функции. Использую КОЛ 1.80 (может он с тех пор сильно изменился...?)
mdw (2003-11-24 10:45:00) [5]>Ещё одна вещь: При отладке некоторых значений отладчик может не показать или выдать неверное значение переменной.
Как с этим бороться?
Смотреть нужно не свойство, а поле(Count -> FCount). Еще можно разименовать указатель (MyObj^).
Вопрос периодически всплывает, может в FAQ его?
Vladimir Kladov (2003-11-23 20:44:00) [6]Попробуйте ShowQuestion.
Ciber SLasH (2003-11-23 18:25:00) [7]А почему бы не заделать свой диалог ?