Форум: "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.038 c