Перейти к содержимому

Фотография

Полезные процедуры и функции


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 32

#21 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 06 декабря 2008 - 15:54

Вот сподобился зайти и проиндексировать сделанное другими авторами, но не тут-то было. Моя же тема мне же для редактирования и не доступна. Остается ждать разрешений или обойдемся без индексирования?

Насчет вариаций на тему split. Код, предложенный в начале, ориентирован строго на DelphiScript. Там даже пометочка есть, что тот, кто пишет на JavaScript, спокойно используют УЖЕ ИМЕЮЩУЮСЯ функцию в анналах самого языка!!!


Ой, кажись сам дурак. Зашел под galogen а оказывается я galogenIT :clapping: Но под galogenом тоже пустило, знать когда-то раньше регистрировался аналогично :)
  • 0
С уважением, Эдуард!

#22 w1zl3

w1zl3

    Новый участник

  • Members
  • Pip
  • 33 сообщений
  • ФИО:Иванюшин Павел Владимирович
  • Город:Украина, г. Харьков

Отправлено 11 декабря 2008 - 09:01

Хотел бы выложить примеры по работе с экселем, а точнее создание, заполнение и редактирование файла xls. Т.к. в примерах ТК есть только пример чтения, думаю кому то эти примеры станут полезными.

function Main()
{
  var ExcelApp = Sys.OleObject("Excel.Application");
  ExcelApp.Application.Visible = true;
  var workbook = ExcelApp.Workbooks.Add(); // Создается новая таблица

  //метод cell(x,y) дает возможность обращаться к ячейке таблицы, рассматривая таблицу как матрицу. 
  ExcelApp.ActiveSheet.Cells(1,1).Value = "Some text";	//Присваивание ячейке A1 текста "some text".
  ExcelApp.ActiveSheet.Cells(1,1).Font.Bold = true;	   //Текст в ячейке A1 делает выделеным.
  ExcelApp.ActiveSheet.Cells(1,1).Font.Size = 16;		 //Устанавливает размер шрифта в ячейке А1 равный 16.
  ExcelApp.ActiveSheet.Cells(1,1).Font.color = 265;	   //Устанавливает цвет текста в ячейке. Толком непонял как он работает;)

  workbook.SaveAs(path); // созданая таблица сохраняется по указаному пути path
  ExcelApp.Quit();			 // Эксель закрывается
}


Также можно использовать метод Range вместо Cell. Метод Range дает возможность обращаться не к одной ячейке, а к диапазону ячеек, это очень ужобно, если вам нужно задать стиль таблицы - цвет, шрифт, границы и.т.п.


function Main()
{
  var ExcelApp = Sys.OleObject("Excel.Application");
  ExcelApp.Application.Visible = true;
  var workbook = ExcelApp.Workbooks.Add();


  ExcelApp.ActiveSheet.Range("A1","B3").Value = "someText";  
  ExcelApp.ActiveSheet.Range("A1","B3").BorderAround(1 /*xlContinuous*/,4 /*xlThick*/, 0 /*xlColorIndexAutomatic*/, null); //метод BorderAround прорисовывает границы по заданому диапазону. Чтобы разобраться с входящими параметрами советую пройти сюда - http://www.microsoft.com/technet/scriptcenter/resources/officetips/jun05/tips0621.mspx

  workbook.SaveAs(path);
  ExcelApp.Quit();
}

Сейчас продолжаю разбираться с работой в экселе, если найду еще что-нибудь полезное, то обязательно поделюсь, хотя думаю этих простых примеров достаточно, чтобы понять как все работает. Возможно эта информация для некоторых не будет новой, но уверен, что многим поможет :P


P.S.: может кто то добавит еще что то полезное? :)
http://www.delphikin...?catalogid=1274 - еще одна интересная ссылка по работе с экселем.
  • 0

#23 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 18 января 2009 - 18:15

Спасибо за вклад
  • 0
С уважением, Эдуард!

#24 Deadlock

Deadlock

    Новый участник

  • Members
  • Pip
  • 16 сообщений

Отправлено 19 января 2009 - 09:39

Функция получения GUID, JS.
[codebox]function GenerateGuid()
{
var defdll,ftype,guid,Lib;

defdll=DLL.DefineDLL("ole32");
ftype=DLL.DefineType("TGUID",vt_i4,"D1",vt_ui2,"D2",vt_ui2,"D3",vt_ui2,"D4",vt_i4,"D5",vt_ui2,"D6");
defdll.DefineProc("CoCreateGuid",ftype,vt_i4);
guid = DLL.New("TGUID");

Lib = DLL.Load("C:\\WINDOWS\\system32\\ole32.dll","ole32");
Lib.CoCreateGuid(guid);

return IntToHex(guid.D1,8)+"-"+IntToHex(guid.D2,4)+"-"+IntToHex(guid.D3,4)+"-"+IntToHex(guid.D4,4)+"-"+IntToHex(guid.D5,8)+IntToHex(guid.D6,4);
}[/codebox]
  • 0

#25 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 19 января 2009 - 11:15

Функция получения GUID, JS.
...

Вот более простой вариант (также JScript):
function CreateGUID()
{
  var lib = new ActiveXObject("Scriptlet.TypeLib");
  var guid = lib.GUID;
  return guid.substring(1, 37);	 // XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
  // return guid.substring(0, 38);  // {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
}

  • 0

#26 DrBlast

DrBlast

    Активный участник

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 10 марта 2009 - 09:48

Работа с контекстным меню, элементы которого подгружаются динамически. Для .Net проектов.
При клике в контекстном меню по координатам, можно промахнуться мимо нужного пункта (например, разработчики добавили новый пункт меню или поменяли группировку).
Дабы не вычислять куда кликать по координатам, теперь можно воспользоваться следующей функцией:
function ClickMenuItem(Menu, ItemName) //Menu - путь до контекстного меню, ItemName - искомый пункт меню
{
	var RowId = -1;
	for (var i = 0; i < Menu.Items.Count; i++)
		if (Menu.Items.Item_2(i).Text == ItemName)
			RowId = i; 
	
	if (RowId == -1) 
	{
		Log.Error("Пункт меню не найден");
		return -1;
	}
	else Log.Message("Выбран " + RowId + " пункт меню");
	
	Menu.Click(Menu.Items.Item_2(RowId).Width / 2.0, Menu.Items.Item_2(RowId).Height / 2.0 + Menu.Items.Item_2(RowId).Bounds.Top); 
}

Конечно в результе все равно получается клик по координатам, но уже осмысленный.

Маппингом контекстного меню пользоваться нельзя. Необходимо писать полный путь до него: Sys.Process("myApp").WinFormsObject("contextMenuStrip1")
  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#27 galogenIt

galogenIt

    Постоянный участник

  • Members
  • PipPipPip
  • 192 сообщений
  • ФИО:Эдуард

Отправлено 25 марта 2009 - 07:34

Хорошая функция. Правда есть проблемы с ней (по крайней мере у меня).

1. работа с подменю
2. невсегда удается получить имя элемента
  • 0
С уважением, Эдуард!

#28 DrBlast

DrBlast

    Активный участник

  • Members
  • PipPip
  • 139 сообщений
  • ФИО:Евгений
  • Город:Москва

Отправлено 26 марта 2009 - 16:04

Апдейт функции, теперь выбор может осуществляться в горизонтальном и вертикальном меню

function ClickMenuItem(Menu, ItemName, isHorizontal)
{
	var RowId = -1;
	for (var i = 0; i < Menu.Items.Count; i++)
		if (Menu.Items.Item_2(i).Text == ItemName)
			RowId = i; 
	
	if (RowId == -1) 
	{
		Log.Error("Пункт меню не найден");
		return -1;
	}
	else Log.Message("Выбран " + RowId + " пункт меню");
	
	if (isHorizontal)
		Menu.Click(Menu.Items.Item_2(RowId).Width / 2.0  + Menu.Items.Item_2(RowId).Bounds.Left, Menu.Items.Item_2(RowId).Height / 2.0);
	else   
		Menu.Click(Menu.Items.Item_2(RowId).Width / 2.0, Menu.Items.Item_2(RowId).Height / 2.0 + Menu.Items.Item_2(RowId).Bounds.Top);		
}

работа с подменю

тут скорее придется 2 раза вызывать эту функцию.

Почему может не работать:
Маппить контекстное меню нельзя, по крайне мере у меня не получилось. В случае замаппленного контекстного меню количество и порядок Item не совпадает с тем, что есть на самом деле.
Вызов функции:
ClickMenuItem(Sys.Process("<myapp>").WinFormsObject("contextMenuStrip1"), 'Принять')

  • 0
Если ничего не помогает, прочтите наконец инструкцию!

#29 VitalyD

VitalyD

    Опытный участник

  • Members
  • PipPipPipPip
  • 285 сообщений
  • Город:Санкт-Петербург

Отправлено 01 февраля 2010 - 12:08

Удобное чтение настроек из INI файла:

function ReadINIFile(ini_file) {
	var INI = {};
	var FSO = new ActiveXObject("Scripting.FileSystemObject");
	if ((FSO.FileExists(ini_file)) && (FSO.GetFile(ini_file).Size > 0)) {
		with (FSO.OpenTextFile(ini_file)) {
			var text = ReadAll();
			Close();
			var arr_lines = text.split('\n');
			var section, param, value;
			for (var i in arr_lines){
				if (/^\[(\w+)\]/.test(arr_lines[i])){
					section = RegExp.$1;
					INI[section] = {};
				}
				if (/^([^;#][^=]*?)\s*=\s*([^\r\n]*?)\s*$/.test(arr_lines[i])){
					param = RegExp.$1;
					value = RegExp.$2;
					INI[section][param] = value;
				}
			}
		}
		return INI;
	}
 }
С использованием данной функции получаем удобный объект для доступа к настройкам.
Например можно делать так:

var settings = ReadINIFile("C:\\mySettings.ini");
var Param1 = settings.SectionName.ParamName

  • 0

#30 Al_chimic

Al_chimic

    Новый участник

  • Members
  • Pip
  • 16 сообщений

Отправлено 15 апреля 2010 - 12:45

Работа с контекстным меню, элементы которого подгружаются динамически. Для .Net

Конечно в результе все равно получается клик по координатам, но уже осмысленный.

Маппингом контекстного меню пользоваться нельзя. Необходимо писать полный путь до него: Sys.Process("myApp").WinFormsObject("contextMenuStrip1")


У меня работает с маппингом.
Можно также использовать метод PerformClick вместо Click:
Menu.Items.Item_2(RowId).PerformClick;

  • 0

#31 Paulitto

Paulitto

    Новый участник

  • Members
  • Pip
  • 39 сообщений

Отправлено 04 сентября 2010 - 15:01

Для TestComplete есть много готовых примеров работы с excel, но когда мне понадобилось нечто подобное для таблиц OpenOffice, оказалось сложно что либо найти.

Вот пример функции как записать данные в таблицу OpenOffice (JScript):

/*******************************************************************
Arr - массив массивов                                              *
Filename - полный путь к файлу, если такого нет, то он создается   *
********************************************************************/

function SaveArrayToCalc(Arr, FileName)
{
 try
 { 
  //создаем обьект Desktop через который и происходит работа с OpemOffice 
  var oServiceManager = Sys.OleObject("com.sun.star.ServiceManager");
  var oDesktop        = oServiceManager.createInstance("com.sun.star.frame.Desktop");
  
  // добавляем hidden == true в массив параметров открытия документа (чтоб OpenOffice документ не был виден на экране) 
  var VariantArray    = new Array();
  var Mystruct =  oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
  Mystruct.Name = "Hidden";
  Mystruct.Value = true;
  VariantArray[0] = Mystruct;
  
  //создаем документ, (чтобы открыть уже существующий документ, в кач первого параметра необходимо передать путь к нему в виде url)  
  var oDoc            = oDesktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, VariantArray);
  //получаем первый лист таблицы
  var oSheet          = oDoc["getSheets"]().getByIndex(0); 
	
  //заполняем первый лист массивом массивов
  for (var j=0; j<Arr.length; j++)
  for(var i=0; i<Arr[j].length; i++)
     oSheet.getCellByPosition(i, j).setString(Arr[j][i]);
  
 //сохраняем документ, путь также в виде url
  oDoc.storeAsURL("file:///"+aqString.Replace(FileName, "\\", "/"), VariantArray);
 //закрытие документа 
  oDoc.Close(false);
 }
 catch(exception)
  {
    Log.Warning("Unable to save the data to ods table", exception.description);
  }

}
Массив массивов вместо двумерного выбрал потому что может иметь разную длину строк, хотя это уже можно поменять как кому нравится.

Читать данные с таблицы можно аналогичным образом передавая в функции LoadComponentFromURL путь к документу в url формате и используя getString вместо setString.
  • 1

#32 TC_Noob

TC_Noob

    Новый участник

  • Members
  • Pip
  • 45 сообщений

Отправлено 27 января 2011 - 12:40

Хочу поделится вот какой идеей, возможно, для кого-то она покажется очевидной и не нужной, а для кого и полезной.

Проблема (с чем я столкнулся)

В процессе прогонки скрипта в TestComplete иногда бывают ситуации, когда нужно запаузить скрипт, но есть одно НО, с чем я и столкнулся, у меня так запускает TestComplete, что кнопка пауза не работает, причина - отсутствие прав.
Просьба сделать нормальные права "разрушилась" ибо политика безопасности и всё такое, поэтому, пришлось немного пофантазировать и вот к чему пришёл, написать свою форму, в которой три кнопки, Play, Pause и Stop

Вот код (VB):

Public action
Sub Main
	Dim i

	action = "Play"
	UserForms.UserForm1.Show
	
	Do
		aqUtils.Delay(10000)
	Loop
	
	
End Sub

Sub UserForm1_PlayBtn_OnClick(Sender)
	action = "Play"
End Sub

Sub UserForm1_cxButton2_OnClick(Sender)
	action = "Pause"
	Do
		If action = "Play" Then Exit Do
		call aqUtils.Delay(1000, "Пауза")
	Loop
End Sub

Sub UserForm1_cxButton3_OnClick(Sender)
	Runner.Stop
End Sub

Каждая кнопка на своей процедуре "Play" на "UserForm1_PlayBtn_OnClick(Sender)", "Pause" на "UserForm1_cxButton2_OnClick(Sender)", "Stop" на "UserForm1_cxButton3_OnClick"
  • 0

#33 TC_Noob

TC_Noob

    Новый участник

  • Members
  • Pip
  • 45 сообщений

Отправлено 15 марта 2011 - 13:24

Работа с ассоциативным массивом VBScript

Sub Ex
' Инициализируем переменные '
Dim objDictionary, ItemsArray, KeysArray, Item
' Создаём объект ассоциативный массив '
Set objDictionary = CreateObject("Scripting.Dictionary")
' Заполняем массив данными '
Call objDictionary.Add ("Name", "Scott") ' где "Name" - элемент массива, "Scott" - значение элемента массива '
Call objDictionary.Add ("Name2", "Scott2")
Call objDictionary.Add ("Name3", "Scott3")
' Прочесть значение из массива '
Item = objDictionary.Item("Name")
' Определить наличие элемента в массиве '
if objDictionary.Exists("Name") then ShowMessage("Присутствует")
' Получить массив всех элементов массива '
KeysArray = objDictionary.Keys
' Получить массив всех значений всех элементов массивов '
ItemsArray = objDictionary.Items
' Удалить элемент массива со значением '
objDictionary.Remove("Name")
' Очистка всего массива '
objDictionary.RemoveAll
' Очищаем объект массив '
Set objDictionary = Nothing
End Sub

  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных