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

Вниз

аналог 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 вся ветка

Форум: "KOL";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
4-1079877330
DoG
2004-03-21 16:55
2004.05.16
HooK на WindowCreate !


9-1073399784
Hookey
2004-01-06 17:36
2004.05.16
Подскажите математико-экономические алгоритмы...


14-1083009008
Yanis
2004-04-26 23:50
2004.05.16
Отгадай


1-1083311730
Ш-К
2004-04-30 11:55
2004.05.16
FreeAndNil


8-1076917402
Petro
2004-02-16 10:43
2004.05.16
Как нанести условн.знаки на полигон?Векторная карта на DC, ...





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