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

Вниз

аналог MessageDlg в KOL?   Найти похожие ветки 

 
romtek   (2003-11-23 14:15) [0]

Привет всем!
(1)
Нужны дополнительные кнопки: "Yes to All" и "No to All".
В MessageDlg есть ,mrYesToAll и mrNoToAll. Чем их заменить?
(2)
Вообще писать проект на КОЛе с одной стороны заманчиво, приКОЛьно...
Но каждый раз приходится сталкиваться с  проблемой недостатка функций (к примеру,из SysUtils). Заново писать код? Новичкам, как я, это не всегда под силу.
Ещё одна вещь: При отладке некоторых значений отладчик может не показать или выдать неверное значение переменной.
Как с этим бороться?


 
Ciber SLasH ©   (2003-11-23 18:25) [1]

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


 
Vladimir Kladov   (2003-11-23 20:44) [2]

Попробуйте ShowQuestion.


 
mdw ©   (2003-11-24 10:45) [3]

>Ещё одна вещь: При отладке некоторых значений отладчик может не показать или выдать неверное значение переменной.
Как с этим бороться?

Смотреть нужно не свойство, а поле(Count -> FCount). Еще можно разименовать указатель (MyObj^).
Вопрос периодически всплывает, может в FAQ его?


 
romtek   (2003-11-24 14:45) [4]

Ciber SLasH:
>>А почему бы не заделать свой диалог ?
А почему бы не внести её в KOL? И вообще добавить кнопки BitBtn -чтоб красивее было.

Свой диалог писать каждый раз не хочется. По моему не стоит отвлекаться от главной цели при написании программы.

Vladimir Kladov:
>>Попробуйте ShowQuestion.

Вещь неплохая, но хочется исплользовать системную иконку в диалоге.
Я даже попытался переделать её под свою MsgDlg. Но:
1) Иконка и кнопки не всегда корректно отображаются.
2) также отсутствует возможность вывода текста как в MessageDlg(пример:"строка1"#13"строка2").
3) отсутствует выбор типа диалога (Confirm,Information и т.д.)

Могу показать код функции. Использую КОЛ 1.80 (может он с тех пор сильно изменился...?)


 
Vladimir Kladov   (2003-11-24 15:16) [5]

так выдерите код, поправьте для себя то, что нужно. Вывод иконки, например.


 
APXi   (2003-11-25 00:22) [6]

MessageBox


 
romtek   (2003-11-26 11:01) [7]

Вот исходник ф-ции с тестовой программой. Часть была переделана из 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.



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

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

Наверх




Память: 0.5 MB
Время: 0.03 c
3-1082631297
Top100
2004-04-22 14:54
2004.05.16
Экспорт данных из БД Оракла в таблицу Paradox


4-1080297332
frost
2004-03-26 13:35
2004.05.16
Стиль окна как в Outlook.


14-1082962967
McSimm
2004-04-26 11:02
2004.05.16
Вы нам писали...


1-1083243254
Эдуард
2004-04-29 16:54
2004.05.16
Компонент анализа строки с формулой


14-1082795903
VID
2004-04-24 12:38
2004.05.16
Ищу музыку в стиле...