Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

FeyFre wrote:(ибо не могу обновить скрипт по причине ucoz)
А есть зеркало со скриптами, но я ленюсь по две ссылки копировать. :)
Instructor wrote:TimerExample.js
Спасибо!
se7h wrote:этот работает и, как положено, попросился в сеть через NOD32 Smart Security
Тогда не понятно, в чем отличие от основного скрипта.

Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

Infocatcher
на стационарном компе заработало, видно что-то с ноутом...

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Infocatcher
measuresConverter-test.js LINE 1427
// We don't have native JSON support :(
А что это за необдуманное заявление?

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

se7h
Уже лучше.
Видимо, все же в сеть не пускает.

FeyFre

Code: Select all

WScript.Echo(typeof JSON); // "undefined"
Впрочем, вики утверждает, что в IE8 есть встроенная поддержка.
Но в более старых версиях все равно только eval() с проверками, а это небезопасно.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Infocatcher, а оно и было рассчитано на eval с проверками, и до сих пор этим страдают много скриптов. И ничего, живут.(Причем, в некоторых случаях eval пердпочтительней)
Кроме того, RFC4627 любезно предоставило регулярное выражение для валидации JSON.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

FeyFre
Это да, но eval() я не очень хочу, а проверки, пусть и готовые, в данном случае уже излишни – уже и так работает, а кода мало.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:TimerExample.js
И все же это не совсем аналог.
Пока все таймеры не сработают, дальнейший код не выполняется.
А хотелось именно неблокирующее «откладывание» – чтобы интерфейс перерисовывался.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Infocatcher
Что-бы интерфейс перерисовывался там и стоит AkelPad.WindowGetMessage() но он тебе не подходит. Единственное что могу посоветовать - делать твой аякс запрос в отдельном потоке(вот только тут многопоточность фиг организуешь, я уже пробовал), либо делай его как положено - асинхронным.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

KDJ wrote:make extra buttons to:
- currency sorting by name/code,
- update/force update exchange rate.
And the message "Wait for download data" while update.
Added: measuresConverter-test.js
Now used only asynchronous requests with progress indication.

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Infocatcher wrote:... but Russian «Сортировать по имени» is too long ...
You can do it like this:

Image

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

KDJ
I not sure, «update» is not sorting.
And it's better to group all additional items, I think.

Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

Infocatcher
"Сортировать" или "Сортировка" или "Упорядочить" - вариантов много

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Infocatcher
Well, maybe so:

Image

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

KDJ
Looks better, thanks.
But for «Force update» we get long «Принудительное обновление». Also we have hotkey and Ctrl/Shift+click or right-click for «force update».
Script updated: measuresConverter-test.js

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Как будет работать

Code: Select all

restoreWindowPosition(hWnd);
function restoreWindowPosition(hWnd) {
	var dlgX = ...;
	var dlgY = ...;

	var rcWnd = getWindowRect(hWnd);
	var rcDesktop = getWindowRect(oSys.Call("user32::GetDesktopWindow"));
	if(!rcWnd || !rcDesktop)
		return;

	var edge = 16;

	var minX = rcDesktop.left - (rcWnd.right - rcWnd.left) + edge;
	var minY = rcDesktop.top;
	var maxX = rcDesktop.right - edge;
	var maxY = rcDesktop.bottom - edge;

	var hWndTaskbar = oSys.Call("user32::FindWindowEx" + _TCHAR, 0, 0, "Shell_TrayWnd", 0);
	if(hWndTaskbar) {
		var rcTaskbar = getWindowRect(hWndTaskbar);
		if(rcTaskbar.left == rcDesktop.left && rcTaskbar.right == rcDesktop.right) { // bottom or top
			var h = rcTaskbar.bottom - rcTaskbar.top;
			if(rcTaskbar.bottom == rcDesktop.bottom) // bottom
				maxY -= h;
			else if(rcTaskbar.top == rcDesktop.top) // top
				minY += h;
		}
		else if(rcTaskbar.top == rcDesktop.top && rcTaskbar.bottom == rcDesktop.bottom) { // right or left
			var w = rcTaskbar.right - rcTaskbar.left;
			if(rcTaskbar.right == rcDesktop.right) // right
				maxX -= w;
			else if(rcTaskbar.left == rcDesktop.left) // left
				minX += w;
		}
	}

	dlgX = Math.max(minX, Math.min(maxX, dlgX));
	dlgY = Math.max(minY, Math.min(maxY, dlgY));
	oSys.Call("user32::SetWindowPos", hWnd, 0, dlgX, dlgY, 0, 0, 0x15 /*SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE*/);
}
function getWindowRect(hWnd) {
	var lpRect = AkelPad.MemAlloc(16); //sizeof(RECT)
	if(!lpRect)
		return null;
	oSys.Call("user32::GetWindowRect", hWnd, lpRect);
	var rcWnd = parseRect(lpRect);
	AkelPad.MemFree(lpRect);
	return rcWnd;
}
function parseRect(lpRect) {
	return {
		left:   AkelPad.MemRead(lpRect,      3 /*DT_DWORD*/),
		top:    AkelPad.MemRead(lpRect +  4, 3 /*DT_DWORD*/),
		right:  AkelPad.MemRead(lpRect +  8, 3 /*DT_DWORD*/),
		bottom: AkelPad.MemRead(lpRect + 12, 3 /*DT_DWORD*/)
	};
}
при наличии нескольких мониторов? А то мне не проверить. :)
И как вообще положено проверять, попадет ли окно в рабочую область?
Locked