-
Здравствуйте, мастера. Доброе время суток. В моём приложении: хотел сделать минимизацию окна по нажатию кнопку Esc. Получилось, но не очень складно. При минимизации у меня видно как сворачивается форма, а затем и апплет. Но хотелось бы чтобы избавится от этого дефекта. У моего соседа на более быстром компе совсем не видно. Вот код : program Project1;
uses
windows,
messages,
kol;
type TOnEvent = procedure( Sender: PObj )of object;
var
form,form2,Label1,Button1,
Button2,EditBox1,EditBox2,
Button3,Button4,ListBox1,
Button5,Button6,Button7,
Button8,Button9 :PControl;
i:byte;f:textfile;s:string;
TheWindow:HWND;
function KeyPressed(VKey: Integer): LongBool;
asm
push eax
call GetKeyState
and eax, 0080h
shr al, 7
end;
procedure Button1Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
var Classname: String;
h: hwnd;
begin
if (GetVersion< $80000000)
then Classname:='Consolewindowclass'
else Classname:='tty';
h:=FindWindow(pchar(Classname),nil);
EditBox1.Text:=Int2Str(integer(h));
end;
procedure Button2Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
var
WindowText: array[0..255] of char;
ThePoint: TPoint;
begin
ThePoint.X :=10; ThePoint.Y :=10; TheWindow := WindowFromPoint(ThePoint);
If (GetWindowText(TheWindow, WindowText, 255))<>0 then
begin
EditBox1.Text :=Int2Str(TheWindow);
EditBox2.Text:= WindowText;
end
Else
EditBox2.Text := 'Данное окно не имеет описания';
end;
procedure Button3Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin if EditBox2.text = 'FolderView' then
begin
showmessage('Не тронь петуха:)');
exit;
end;
ListBox1.Clear;
if FileExists(FileFullPath('Exception List.txt')) then assign(f,'Exception List.txt');
try
reset(f);
while not eof(f) do begin
readln(f,s);
ListBox1.add(s);
end;
close(f);
except
end;s:=''; for i:=0 to ListBox1.Count-1 do
if editbox2.Text=ListBox1.Items[i] then
begin exit;end;
winexec(pchar(EditBox2.Text),SW_NORMAL);
Setparent(TheWindow,applet.Handle);
end;
procedure Button4Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin
if not Assigned( Form2 ) then
NewForm( form ,'Form2');
if editbox2.Text='' then
begin
showmessage('пустая строка');
exit;
end;
ListBox1.Clear;
if FileExists(FileFullPath('Exception List.txt')) then assign(f,'Exception List.txt');
try
reset(f);
while not eof(f) do begin
readln(f,s);
ListBox1.add(s);
end;
close(f);
except
end;s:=''; Form2.Show;
end;
procedure Button8Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin ListBox1.add(editbox2.Text);
end;
procedure Button5Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin for i:=0 to ListBox1.Count-1 do s:=s+ListBox1.Items[i]+#13#10;
if FileExists(FileFullPath('Exception List.txt')) then assign(f,'Exception List.txt');
try
rewrite(f);
write(f,s);
close(f);
except
end;s:=''; form2.Hide;button1.Focused:=true;
end;
procedure Button6Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin ListBox1.Delete(ListBox1.curindex);
end;
procedure Button7Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin ListBox1.Clear;
end;
procedure Button9Click(dummy:pointer;Sender:PControl; var mouse:TMouseEventData);
begin form2.Hide;button1.Focused:=true;
end;
procedure Close_form2(DummySelf,Sender: PControl; var Accept: Boolean);
begin
if Assigned( Form2 ) then begin
accept:=false;
form2.Hide;button1.Focused:=true;
end else
accept:=true;
end;
function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
begin
Result := False;
if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
Applet.BoundsRect := Form.BoundsRect;
if KeyPressed(VK_ESCAPE) then
ShowWindow(form.Handle,SW_MINIMIZE);
end;
Begin
form:=NewForm(Applet,'Мои документы' ).SetPosition( 192, 107 ).SetClientSize( 329, 98 );
Label1 := NewLabel( form, 'дескриптор' ).SetPosition( 0, 40 ).SetSize( 81, 0 );
Button1 := NewButton( form, 'FindwindowConsol' ).SetPosition( 8, 8 ).SetSize( 129, 0 );
Button2 := NewButton( form, 'FindwindowWnD' ).SetPosition( 144, 8 ).SetSize( 113, 0 );
Button3 := NewButton( form, 'Enum' ).SetPosition( 8,68 ).SetSize( 113, 0 );
Button4 := NewButton( form, 'Except' ).SetPosition( 148,68 ).SetSize( 113, 0 );
EditBox1 := NewEditBox( form, [ ] ).SetPosition( 80, 40 );
EditBox1.Color := clWindow;
EditBox2 := NewEditBox( form, [ ] ).SetPosition( 184, 40 );
EditBox2.Color := clWindow;
Form2:= NewForm(form,'').SetPosition( 202, 192 ).SetClientSize( 320, 222 );
form2.Hide;
Form2.Style := Form.Style and not (WS_MINIMIZEBOX or WS_MAXIMIZEBOX); ListBox1 := NewListBox( form2, [ loNoIntegralHeight ] ).SetPosition( 6, 6 ).SetSize( 241, 169 );
ListBox1.Color := clWindow;
ListBox1.CurIndex := 0;
Button5:= NewButton( form2, 'Сохранить' ).SetPosition( 156,192).SetSize( 74, 0 );
Button6:= NewButton( form2, 'Удалить' ).SetPosition( 80,192).SetSize( 72, 0 );
Button7:= NewButton( form2, 'Очистить' ).SetPosition( 250,148).SetSize( 68, 0 );
Button8:= NewButton( form2, 'Добавить' ).SetPosition(8,192).SetSize( 68, 0 );
Button9:= NewButton( form2, 'Отмена' ).SetPosition( 236,192).SetSize( 68, 0 );
Button1.OnClick:=TonEvent(MakeMethod(nil,@button1click));
Button2.OnClick:=TonEvent(MakeMethod(nil,@button2click));
Button3.OnClick:=TonEvent(MakeMethod(nil,@button3click));
Button4.OnClick:=TonEvent(MakeMethod(nil,@button4click));
Button5.OnClick:=TonEvent(MakeMethod(nil,@button5click));
Button6.OnClick:=TonEvent(MakeMethod(nil,@button6click));
Button7.OnClick:=TonEvent(MakeMethod(nil,@button7click));
Button8.OnClick:=TonEvent(MakeMethod(nil,@button8click));
Button9.OnClick:=TonEvent(MakeMethod(nil,@button9click));
Form.OnMessage:=TOnMessage(MakeMethod(nil,@AB00));
form2.OnClose:=TOnEventAccept(MakeMethod(nil,@Close_form2));
Run(form);
end.
-
Оно может и работает, но почему так? function AB00( var Message;var Msg: tagMSG;var Rslt: Integer): Boolean; замените ShowWindow(form.Handle,SW_MINIMIZE);на form.WindowState:= wsMinimized;Ну и еще пару замечаний. зачем Вы проверяете на каждом сообщении if KeyPressed(VK_ESCAPE) then ... ? будьте проще: if (Msg.message = WM_KEYDOWN) and ( Msg.wParam = VK_ESCAPE) then .. и второе. Создайте всеже Applet (Applet:= NewApplet('!!!!!!!');), оно не помешает... Соответственно минимизируйте не форму, а Applet (AppletMinimize) Еще, чисто "академический" интерес, что значит это? if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
Applet.BoundsRect := Form.BoundsRect;
-
Здравстуйте, mdw © . Первое ,большое спасибо, что так быстро ответили. Отвечаю по порядку на каждый вопрос, задаю свои по ходу изложения. “Оно может и работает, но почему так? function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean ” Зелен. Не хватает опыта программирования. Сделал так: function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
begin
Result := False;
if (Msg.message = WM_KEYDOWN) and ( Msg.wParam = VK_ESCAPE) then
form.WindowState:= wsMinimized;
end; Убрал функцию function KeyPressed. Здесь, где AB00(var Message;var Msg: tagMSG…); должно быть по-другому, но не знаю как. Чувствую, но не знаю, как делать надо. И наверно может других параметров не хватает. Дефект пропал. “Создайте всеже Applet (Applet:= NewApplet('!!!!!!!');), оно не помешает... Соответственно минимизируйте не форму, а Applet (AppletMinimize)” Создал так. …..
Applet:= NewApplet('');
form:=NewForm
…..
Run(form);
applet.Free;
end.
сообщение тогда так:
function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean;
begin
Result := False;
if (Msg.message = WM_KEYDOWN) and ( Msg.wParam = VK_ESCAPE) then
Applet.Perform( WM_SYSCOMMAND, SC_MINIMIZE, 0 );
end;
В этом случае минимизация происходит в другую сторону, не как у обычной формы. Поэтому мне этот вариант не очень подходит. Скажите, а почему Вы так настаиваете на Applet’е? “Еще, чисто "академический" интерес, что значит это? if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
Applet.BoundsRect := Form.BoundsRect; ” Всё просто, иногда начинаешь искать наобум всё, что мало-мальски годится, не особо вчитываясь в то, что делаешь ;) Выписка из FAQ по KOL&MCK: «Вопрос : Когда используется переменная Applet, анимация при минимизации происходит не с позиции главной формы, а от верхнего левого угла экрана. Как это поправить? Использовать событие Applet.OnMessage: function TSomeObject.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
if (Msg.message = WM_MOVE) or (Msg.message = WM_SIZE) then
Applet.BoundsRect := Form.BoundsRect;
Result := False;
end;
Или, воспользоваться методом (в MCK - событием) MinimizeNormalAnimated.»
-
> Оно может и работает, но почему так >
Собстаенно намекал на следующее. Почему: function AB00(var Message;var Msg: tagMSG;var Rslt: Integer): Boolean; а не function AB00(dummy:pointer;var Msg: tagMSG;var Rslt: Integer): Boolean; оно понятно, что скомпилится в тоже само (var~pointer), но все же....ладно, проехали.
Про апплет, имеется ввиду, Run(Applet); ну и минимизировать AppletMinimize (процедура такая).
> Скажите, а почему Вы так настаиваете на Applet’е?
Поищите по форуму, посмотрите KOL.pas, а если кратко, то если используется больше 2х форм, то используйте Applet, дабы потом долго и мучительно не отлавливать невразумительные баги...
-
Большое Спасибо за Ответ!!!
Замечания учту на будущее;) Тем более что нужно скоро писать приложение >больше 2х форм
|