Scripts discussion (2)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Instructor
Случайно выбрал bold, начал переключать, он так жирным и остается. А если в последней строке
AkelPad.Font(lpFontList[0], 0, lpFontList[1]);
0 на 1 заменить, то универсальность идеи теряется. Может еще ввести параметр типа(жирный, косой, без изменений и тп)? Не сочтите что я обнаглел, просто мысли)) Мне и первый вариант нравился.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

Не знаю, есть ли смысл доставать данные о типе шрифта из программы и сравнивать со списком, да и не знаю откуда и как их доставать. Себе просто эти данные добавил.

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18278#p18278
// Version v1.2 mod
//
//
//// Cycle switch between fonts.

//Options
var lpFontList=[["MS Sans Serif", 1, 8],
                ["Courier New", 3, 10],
                ["Arial", 2, 9],
                ["Courier New", 4, 8]];

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var lpLogFont;
var pFontName="";
var nFontSize=0;
var i;

if (lpLogFont=AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/))
{
  AkelPad.SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, hWndEdit, lpLogFont);
  pFontName=AkelPad.MemRead(lpLogFont + 28 /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
  nFontSize=AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 3 /*AECS_POINTSIZE*/, 0);
  AkelPad.MemFree(lpLogFont);
}

if (pFontName && nFontSize)
{
  for (i=0; i < lpFontList.length; ++i)
  {
    if (lpFontList[i][0] == pFontName && lpFontList[i][2] == nFontSize)
      break;
  }
  if (++i >= lpFontList.length) i=0;
  AkelPad.Font(lpFontList[i][0], lpFontList[i][1], lpFontList[i][2]);
} 

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

Post by KDJ »

Visitor7
Try this script:
FontCycleSwitch.js

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

KDJ
Интересный вариант. Когда открываю текст именно вашего скрипта, раскрываю окно на полный экран и прохожу несколько циклов смены шрифтов, отображение текста начинает страшно глючить.
Картинка
Нажатие F5 спасает.

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

Post by KDJ »

Visitor7
Fixed.
The script must be saved in ANSI format.

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

Post by Infocatcher »

Можно как-нибудь починить возможность доступа к глобальному объекту?

Code: Select all

var global = this;
global.x = {};
WScript.Echo(x);
Выдает
Ошибка: Объект не поддерживает это свойство или метод
Код: 800A01B6
Источник: Ошибка выполнения Microsoft JScript
А если запустить через wscript.exe, то работает.

Полезно при создании библиотек или использовании чужого кода с кучей глобальных переменных.
Как-то так:

Code: Select all

(function() {
	var foo = 1;
	var bar = 2;
	this.f = function() {
		return foo + bar;
	}
})();
WScript.Echo(f());
WScript.Echo(typeof foo); // "undefined"

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

KDJ
Глюк исчез в режиме "развернуть на весь экран", но остался в режиме "полный экран".

Instructor
А как получить FontType из Akelpad, ну подобно как вы брали
pFontName=AkelPad.MemRead(lpLogFont + 28 /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
nFontSize=AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 3 /*AECS_POINTSIZE*/, 0);
Не дает мне покоя этот вопрос))

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KDJ
In this script, use ini-file would not be superfluous, because the since store settings/data with the code is a perversion.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

KDJ
А, я понял. Глюк остался как был, но зависит от того, на каком мониторе раскрывать на полный экран. У меня два, 2-ой главный, на нем глюк отображения и происходит при раскрытии на поный экран или развороте на весь экран(после применения вашего скрипта). А на 1-м не главном мониторе растягивается на весь экран нормально, а в полноэкранный режим вообще не переходит, Akelpad ведь не поддерживает пока мультимонитор.
А вообще, ваш вариант интересен тем, что при больших списках шрифтов может дать большую производительность. Вариант Инструктора каждый раз перебирает список, а ваш каждый раз пишет на диск. При малом списке перебор в разы быстрее записи.

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

Post by KDJ »

Visitor7 wrote:...
А как получить FontType из Akelpad, ну подобно как вы брали
pFontName=AkelPad.MemRead(lpLogFont + 28 /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
...
FontType can be read from lpLogFont structure:

Code: Select all

var nWeight = AkelPad.MemRead(lpLogFont + 16 /*offsetof(LOGFONTW, lfWeight)*/, 3 /*DT_DWORD*/);
var bItalic = AkelPad.MemRead(lpLogFont + 20 /*offsetof(LOGFONTW, lfItalic)*/, 5 /*DT_BYTE*/);
var nFontType;
if (nWeight < 600)
  nFontType = 1;
else
  nFontType = 2;
if (bItalic)
  nFontType += 2;

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

Post by KDJ »

VladSh
Oh, yes. I made two versions:
FontCycleSwitch.js
FontCycleSwitch_PerverseCode.js
viewtopic.php?p=18299&hilit=#p18299

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

Post by KDJ »

ChooseFont_function.js
Changed: now dialog box is centered in parent window.

Offline
Posts: 88
Joined: Sun Jun 03, 2012 8:15 am

Post by Visitor7 »

KDJ
Спасибо, как-то так сделал, вроде все работает:

Code: Select all

// http://akelpad.sourceforge.net/forum/viewtopic.php?p=18278#p18278
// Version v1.2 mod2
//
//
//// Cycle switch between fonts.

//Options
var lpFontList=[["MS Sans Serif", 1, 7],
                ["Courier New", 3, 10],
                ["Tahoma", 2, 10],
                ["Lucida Console", 4, 13],
                ["Arial", 0, 11]];

//Variables
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit=AkelPad.GetEditWnd();
var lpLogFont;
var pFontName="";
var nWeight;
var bItalic;
var nFontType;
var nFontSize=0;
var i;

if (lpLogFont=AkelPad.MemAlloc(92 /*sizeof(LOGFONTW)*/))
{
  AkelPad.SendMessage(hMainWnd, 1233 /*AKD_GETFONTW*/, hWndEdit, lpLogFont);
  pFontName=AkelPad.MemRead(lpLogFont + 28 /*offsetof(LOGFONTW, lfFaceName)*/, 1 /*DT_UNICODE*/);
  nWeight = AkelPad.MemRead(lpLogFont + 16 /*offsetof(LOGFONTW, lfWeight)*/, 3 /*DT_DWORD*/);
  bItalic = AkelPad.MemRead(lpLogFont + 20 /*offsetof(LOGFONTW, lfItalic)*/, 5 /*DT_BYTE*/);
  nFontSize=AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 3 /*AECS_POINTSIZE*/, 0);
  AkelPad.MemFree(lpLogFont);
}

if (pFontName && nWeight && nFontSize)
{

 if (nWeight < 600)
   nFontType = 1;
 else
   nFontType = 2;
 if (bItalic)
   nFontType += 2;

  for (i=0; i < lpFontList.length; ++i)
  {
    if (!lpFontList[i][1])
      lpFontList[i][1]=nFontType;
    if (lpFontList[i][0] == pFontName && lpFontList[i][1]==nFontType && lpFontList[i][2] == nFontSize)
      break;
  }

  if (++i >= lpFontList.length) i=0;
  AkelPad.Font(lpFontList[i][0], lpFontList[i][1], lpFontList[i][2]);

} 


Я был не прав, это не ваш скрипт глючил, а функция Akelpad перерисовки экрана при смене шрифта.

Назначаю горячие клавиши:
Font 1 --- Font("Courier New", 1, 8 ) --- Alt+1
Font 2 --- Font("Arial", 1, 17) ------------ Alt+2

Разрешение монитора 1024x768, Akelpad развернут на полный экран, перенос по словам включен(с выключенным нормально). Раскрытый в Akelpad текст:

Code: Select all

// FontCycleSwitch.js - ver. 2012-06-03a
//
// Cycle switch between fonts. Alternative version of FontSwitch.js by Instructor.
//
// Call("Scripts::Main", 1, "FontCycleSwitch.js")
//
// Note: This script modifies itself

//here you can insert the desired fonts:
var aFonts = [
               ["Courier New",    0, 11],
               ["MS Sans Serif",  1, 7],
               ["Tahoma",         2,  9],
               ["Lucida Console", 3, 12],
               ["Arial",          4, 15]
             ];

//////////////
var nFont = 2;

if (nFont >= aFonts.length)
  nFont = 0;

AkelPad.Font(aFonts[nFont][0], aFonts[nFont][1], aFonts[nFont][2]);

var sScrFile = WScript.ScriptFullName;
var sScrText = AkelPad.ReadFile(sScrFile).replace(/(var\s+nFont\s*=\s*)(\d+)(\s*;)/, "$1" + ++nFont + "$3");
var oFSO     = new ActiveXObject("Scripting.FileSystemObject");
var oFile    = oFSO.OpenTextFile(sScrFile, 2, true, 0);

oFile.Write(sScrText);
oFile.Close();


После нескольких нажатий на Alt+1, Alt+2, Alt+1, Alt+2, Alt+1, Alt+2.... получаю на экране такой результат:
Картинка.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

KDJ
I meant to store it:

Code: Select all

"Courier New",    0, 11
"MS Sans Serif",  1, 17
"Tahoma",         2,  9
"Lucida Console", 3, 12
"Arial",          4, 15
so that the user did not change the script, and changed the configuration file.

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

Post by KDJ »

VladSh
That may be so: FontCycleSwitch.js
Locked