Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

аналог 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]

А почему бы не заделать свой диалог ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо