суббота, 18 января 2014 г.

Реализация Local Storage на Jquery


Реализация Local Storage на Jquery


/**
* Storage plugin
* Provides a simple interface for storing data such as user preferences.
* Storage is useful for saving and retreiving data from the user's browser.
* For newer browsers, localStorage is used.
* If localStorage isn't supported, then cookies are used instead.
* Retrievable data is limited to the same domain as this file.
*
* Usage:
* This plugin extends jQuery by adding itself as a static method.
* $.Storage - is the class name, which represents the user's data store, whether it's cookies or local storage.
* <code>if ($.Storage)</code> will tell you if the plugin is loaded.
* $.Storage.set("name", "value") - Stores a named value in the data store.
* $.Storage.set({"name1":"value1", "name2":"value2", etc}) - Stores multiple name/value pairs in the data store.
* $.Storage.get("name") - Retrieves the value of the given name from the data store.
* $.Storage.remove("name") - Permanently deletes the name/value pair from the data store.
*
* @author Dave Schindler
*
* Distributed under the MIT License
*
* Copyright (c) 2010 Dave Schindler
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
(function($) {
// Private data
var isLS=typeof window.localStorage!=='undefined';
// Private functions
function wls(n,v){var c;if(typeof n==="string"&&typeof v==="string"){localStorage[n]=v;return true;}else if(typeof n==="object"&&typeof v==="undefined"){for(c in n){if(n.hasOwnProperty(c)){localStorage[c]=n[c];}}return true;}return false;}
function wc(n,v){var dt,e,c;dt=new Date();dt.setTime(dt.getTime()+31536000000);e="; expires="+dt.toGMTString();if(typeof n==="string"&&typeof v==="string"){document.cookie=n+"="+v+e+"; path=/";return true;}else if(typeof n==="object"&&typeof v==="undefined"){for(c in n) {if(n.hasOwnProperty(c)){document.cookie=c+"="+n[c]+e+"; path=/";}}return true;}return false;}
function rls(n){return localStorage[n];}
function rc(n){var nn, ca, i, c;nn=n+"=";ca=document.cookie.split(';');for(i=0;i<ca.length;i++){c=ca[i];while(c.charAt(0)===' '){c=c.substring(1,c.length);}if(c.indexOf(nn)===0){return c.substring(nn.length,c.length);}}return null;}
function dls(n){return delete localStorage[n];}
function dc(n){return wc(n,"",-1);}
/**
* Public API
* $.Storage - Represents the user's data store, whether it's cookies or local storage.
* $.Storage.set("name", "value") - Stores a named value in the data store.
* $.Storage.set({"name1":"value1", "name2":"value2", etc}) - Stores multiple name/value pairs in the data store.
* $.Storage.get("name") - Retrieves the value of the given name from the data store.
* $.Storage.remove("name") - Permanently deletes the name/value pair from the data store.
*/
$.extend({
Storage: {
set: isLS ? wls : wc,
get: isLS ? rls : rc,
remove: isLS ? dls :dc
}
});
})(jQuery);



Использование:

Сначала подключаем библиотеку jQuery и вышеуказанную библиотеку:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script><script src="jquery.Storage.js"></script>
Мы будем сохранять в браузере то, что пользователь прокомментировал:
 
function data_storage() { //__ read storage
    var user = $.Storage.get('user');
    var message = $.Storage.get('message');
    //__ set targets
    if (user) $('input[name="user"]').val(unescape(user));
    if (message) $('textarea[name="message"]').val(unescape(message));
    //__ write storage
    $('#comment').submit(function () {
        if ($('input[name="user"]').length)
            $.Storage.set('user', escape($('input[name="user"]').val()));
        if ($('textarea[name="message"]').length)
            $.Storage.set('message', escape($('textarea[name="message"]').val()));
    });
}
// End storage 
Для формы в HTML:


<form action="" method="post" id="comment">
  Ваше имя: <br />
  <input name="user" type="text" size="25" /><p></p>
  Сообщение: <br />
  <textarea name="message" cols="55" rows="5"></textarea><p></p>
  <input name="id" type="hidden" value="7" />
  <input name="send" type="submit" class="btn btn-default" value="Оставить отзыв" />
</form>


Проверить поддерживает ли браузер LocalStorage можно так:


function isLocalStorageAvailable() { try { return 'localStorage' in window && window['localStorage'] !== null; } catch (e) { return false; }isLocalStorageAvailable();

Без Jquery можно было бы сделать так:


Сохранение данных:
localStorage.setItem('foo', 'bar');


Извлечение данных:
var foo = localStorage.getItem('foo');alert(foo); //bar



Можно использовать объектную нотацию для сохранения и извлечения данных:
localStorage['foo'] = 'bar';var foo = localStorage['foo'];alert(foo); //bar



Удаление данных:
localStorage.removeItem('foo'); //удалит элемент объектаlocalStorage.clear(); //удалит все элементы


Проверим превысили ли ограничение размера локального хранилища
try { localStorage.setItem('foo', 'bar');} catch (e) { if (e == QUOTA_EXCEEDED_ERR) { alert('Локальное хранилище переполнено'); }}

Однако так сохранять можно только строковые данные. 
Иногда требуется сохранять объекты - надо воспользоваться сериализацией:
var foo = {1: [1, 2, 3]};localStorage.setItem('foo', JSON.stringify(foo));var fooFromLS = JSON.parse(localStorage.getItem('foo'));




Как написать свой компонент на Delphi

Как написать свой компонент на Delphi


Для чего нужны компоненты

Дельфи имеет открытую архитектуру - это значит, что каждый программист волен усовершенствовать эту среду разработки, как он захочет. К стандартным наборам компонентов, которые поставляются вместе с Дельфи можно создать еще массу своих интересных компонентов, которые заметно упростят вам жизнь (это я вам гарантирую). А еще можно зайти на какой-нибудь крутой сайт о Дельфи и там скачать кучу крутых компонентов, и на их основе сделать какую-нибудь крутую прогу. Так же компоненты освобождают вас от написания "тысячи тонн словесной руды". Пример: вы создали компонент - кнопку, при щелчке на которую данные из Memo сохранятся во временный файл. Теперь как только вам понадобится эта функция вы просто ставите этот компонент на форму и наслаждаетесь результатом. И не надо будет каждый раз прописывать это, для ваших новых программ - просто воспользуйтесь компонентом.

Шаг 1. Придумывание идеи

Первым шагом нужно ответить себе на вопрос: "Для чего мне этот компонент и что он будет делать?". Затем необходимо в общих чертах продумать его свойства, события, на которые он будет реагировать и те функции и процедуры, которыми компонент должен обладать. Затем очень важно выбрать "предка" компонента, то есть наследником какого класса он будет являться. Тут есть два пути. Либо в качестве наследника взять уже готовый компонент (то есть модифицировать уже существующий класс), либо  создать новый класс. 
Для создания нового класса можно выделить 4 случая:
  1. Создание Windows-элемента управления (TWinControl)
  2. Создание графического элемента управления (TGraphicControl)
  3. Создание нового класса или элемента управления (TCustomControl)
  4. Создание невизуального компонента (не видимого) (TComponent)
Теперь попробую объяснить что же такое визуальные и невизуальные компоненты. Визуальные компоненты видны во время работы приложения, с ними напрямую может взаимодействовать пользователь, например кнопка Button - является визуальным компонентом.
Невизуальные компоненты видны только во время разработки приложения (Design-Time), а во время работы приложения (Run-Time) их не видно, но они могут выполнять какую-нибудь работу. Наиболее часто используемый невизуальный компонент - это Timer.
Итак, что бы приступить от слов к делу, попробуем сделать какой-нибудь супер простой компонент (только в целях ознакомления с техникой создания компонентов), а потом будем его усложнять.

Шаг 2. Создание пустого модуля компонента

Рассматривать этот шаг я буду исходя из устройства Дельфи 3, в других версиях этот процесс не сильно отличается. Давайте попробуем создать кнопку, у которой будет доступна информация о количестве кликов по ней.
Чтобы приступить к непосредственному написанию компонента, вам необходимо сделать следующее:
  • Закройте проекты, которые вы разрабатывали (формы и модули)
  • В основном меню выберите Component -> New Component...
  • Перед вами откроется диалоговое окно с названием "New Component"
  •  В поле Ancestor Type (тип предка) выберите класс компонента, который вы хотите модифицировать. В нашем случае вам надо выбрать класс TButton
  • В поле Class Name введите имя класса, который вы хотите получить. Имя обязательно должно начинаться с буквы "T". Мы напишем туда, например, TCountBtn
  • В поле Palette Page укажите имя закладки на которой этот компонент появиться после установки. Введем туда MyComponents (теперь у вас в Делфьи будет своя закладка с компонентами!).
  • Поле Unit File Name заполняется автоматически, в зависимости от выбранного имени компонента. Это путь куда будет сохранен ваш модуль.
  • В поле Search Path ничего изменять не нужно.
  • Теперь нажмите на кнопку Create Unit и получите следующее:
unit CountBtn;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
 TCountBtn = class(TButton)

  private
   { Private declarations }

  protected
   { Protected declarations }

  public
   { Public declarations }

  published
    { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [TCountBtn]);
end;

end.

Шаг 3. Начинаем разбираться во всех директивах

Что же здесь написано? да собственно пока ничего интересного. Здесь объявлен новый класс TCountBtn и процедура регистрации вашего компонента в палитре компонентов.
Директива Private. Здесь вы будете писать все скрытые поля которые вам понадобятся для создания компонента. Так же в этой директиве описываются процедуры и функции, необходимые для работы своего компонента, эти процедуры и функции пользователю не доступны. Для нашего компонент мы напишем туда следующее (запись должна состоять из буквы "F" имени поля: тип этого поля):
FCount:integer;
Буква "F" должна присутсвовать обязательно. Здесь мы создали скрытое поле Count, в котором и будет храниться число кликов по кнопке.
Директива Protected. Обычно я здесь пишу различные обработчики событий мыши и клавиатуры. Мы напишем здесь следующую строку:
procedure Click; override;
Это указывает на то, что мы будем обрабатывать щелчок мыши по компоненту. Слово "override" указывает на то, что мы перекроем стандартное событие OnClick для компонента предка.
В директиве Public описываются те процедуры и функции компонента, которые будут доступны пользователю. (Например, в процессе написания кода вы пишите имя компонента, ставите точку и перед вами список доступных функций, объявленных в диретиве Public). Для нашего компонента, чтобы показать принцип использования этой директивы создадим функцию - ShowCount, которая покажет сообщение, уведомляя пользователя сколько раз он уже нажал на кнопку. Для этого в директиве Public напишем такой код:
procedure ShowCount;
Осталась последняя директива Published. В ней также используется объявления доступных пользователю, свойств и методов компонента. Для того, чтобы наш компонент появился на форме необходимо описать метод создания компонента (конструктор), можно прописать и деструктор, но это не обязательно. Следует обратить внимание на то, что если вы хотите, чтобы какие-то свойства вашего компонента появились в Инспекторе Объектов (Object Inspector) вам необходимо описать эти свойства в директиве Published. Это делается так: property Имя_свойства (но помните здесь букву "F" уже не нужно писать), затем ставиться двоеточие ":" тип свойства, read процедура для чтения значения, write функция для записи значения;. Но похоже это все сильно запутано. Посмотрите, что нужно написать для нашего компонента и все поймете:
constructor Create(aowner:Tcomponent);override; //Конструктор
property Count:integer read FCount write FCount; //СвойствоCount
Итак все объявления сделаны и мы можем приступить к написанию непосредственно всех объявленных процедур.

Шаг 4. Пишем процедуры и функции.

Начнем с написания конструктора. Это делается примерно так:
constructor TCountBtn.Create(aowner:Tcomponent);
begin
 inherited create(Aowner);
end;
Здесь в принципе понимать ничего не надо. Во всех своих компонентах я писал именно это (только класс компонента менял и все). Также сюда можно записывать любые действия, которые вы хотите сделать в самом начале работы компонента, то есть в момент установки компонента на форму. Например можно установить начальное значение нашего свойства Count. Но мы этого делать не будем.
Теперь мы напишем процедуру обработки щелчка мышкой по кнопке:
procedure Tcountbtn.Click;
begin
  inherited click;
  FCount:=FCount+1;
end;
"Inherited click" означает, что мы повторяем стандартные методы обработки щелчка мышью (зачем напрягаться и делать лишнюю работу:)).
У нас осталась последняя процедура ShowCount. Она может выглядеть примерно так:
procedure TCountBtn.ShowCount;
begin
  Showmessage('По кнопке '+ caption+' вы сделали: '+inttostr(FCount)+' клик(а/ов)');
end;
Здесь выводится сообщение в котором показывается количество кликов по кнопке (к тому же выводится имя этой кнопки, ну это я добавил только с эстетической целью).
И если вы все поняли и сделали правильно, то у вас должно получится следующее:
unit CountBtn;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;
 
type
 TCountBtn = class(TButton)
  private
   { Private declarations }
  FCount: integer;
  protected
   { Protected declarations }
  procedure Click;override;
  public
   { Public declarations }
  procedure ShowCount;
  published
   { Published declarations }
  property Count:integer read FCount write FCount;
  constructor Create(aowner:Tcomponent); override;
 end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
 RegisterComponents('Mihan Components', [TCountBtn]);
end;
 
constructor TCountBtn.Create(aowner:Tcomponent);
begin
 inherited create(Aowner);
end;
 
procedure Tcountbtn.Click;
begin
 inherited click;
 FCount:=FCount+1;
end;
 
procedure TCountBtn.ShowCount;
begin
 Showmessage('По кнопке '+ caption+' вы сделали: '+inttostr(FCount)+' клик(а/ов)');
end;

end.
Скорее сохранитесь, дабы не потерять случайным образом байты набранного кода:)).

Шаг 5. Устанавливаем компонент

Если вы сумели написать и понять, все то что здесь предложено, то установка компонента не должна вызвать у вас никаких проблем. Все здесь делается очень просто. В главном меню выберите пункт Component -> Install Component. перед вами открылось диалоговое окно Install Component. В нем вы увидите две закладки: Into exsisting Package и Into new Package. Вам предоставляется выбор установить ваш компонент в уже существующий пакет или в новый пакет соответственно. Мы выберем в уже существующий пакет.
В поле Unit File Name напишите имя вашего сохранненого модуля (естественно необходимо еще и указать путь к нему), а лучше воспользуйтесь кнопкой Browse и выберите ваш файл в открывшемся окне.
В Search Path ничего изменять не нужно, Делфьи сама за вас все туда добавит.
В поле Package File Name выберите имя пакета, в который будет установлен ваш компонент. Мы согласимся с предложенным по умолчанию пакетом.
Теперь нажимаем кнопочку Ok. И тут появиться предупреждение Package dclusr30.dpk will be rebuilt. Continue? Дельфи спрашивает: "Пакет такой-то будет изменен. Продолжить?". Конечно же надо ответить "Да". И если вы все сделали правильно, то появиться сообщение, что ваш компонент установлен. Что ж можно кричать Ура! Это ваш первый компонент.

Создание свойств своего типа

Теперь мы попробуем создать свойство нестандартного типа. Рассмотрим это на примере метки - TLabel. У этого компонента есть такое свойство: Alignment. Оно может принимать следующие значения: taLeftJustify, taCenter, taRightJustify. Приступаем к созданию свойства. Ничего интересного мне придумать не удалось, но тем не менее я вам покажу это на примере того свойства, которое я придумал. Оно очень простое и поможет вам разобраться. Свойство будет называться ShowType (тип TShowTp), в нашем компоненте оно будет отвечать за отображение свойства Count. Если пользователь установит свойство ShowType в Normal, то кнопка будет работать, как и работала. А если пользователь присвоит этому свойтсву значение CountToCaption, то количество кликов, будет отображаться на самой кнопке.
Для начале нам необходимо объявить новый тип. Описание типа нужно добавить после слова Type. Вот так это выглядело вначале:
type
TCountBtn = class(TButton)
Вот так это должно выглядеть:
type
 TShowTp = (Normal, CountToCaption);
 TCountBtn = class(TButton)
Здесь мы объявили новый тип TShowTp, который может принимать только два значения. Все значения, которые вы хотите добавить перечисляются через запятую.
Теперь нам понадобиться создать поле этого типа. Это мы уже умеем и делать и поэтому не должно вызвать никаких сложностей. В директиву Private напишите:
FShowType:TShowTp;
Мы создали поле ShowType, типа TShowTp.
Конечно же необходимо добавить это свойство в инспектор объектов:
property ShowType: TshowTp read FshowType write FShowType;
Ну и наконец, чтобы наш компонент реагировал на изменение этого свойства пользователем надо слегка изменить обработчик события OnClick. После небольшой модификации он может иметь примерно такой вид:
procedure Tcountbtn.Click;
begin
 inherited click;
 FCount:=Fcount+1;
 if ShowType = Normal then
   Caption:=Caption;
 if ShowType = CountToCaption then
   Caption:='Count= '+inttostr(count);
end;
Объясню что произошло. Вначале мы увеличиваем счетчик на единицу. Затем проверяем какое значение имеет свойство ShowType. Если Normal, то ничего не делаем, а если CountToCaption, то в надпись на кнопке выводим количество кликов. Не так уж и сложно как это могло показаться с первого раза.

Имплантируем таймер в компонент

Очень часто бывает, что вам необходимо вставить в компонент, какой-нибудь другой компонент, например, таймер. Как обычно будем рассматривать этот процесс на конкретном примере. Сделаем так, что через каждые 10 секунд значение счетчика кликов будет удваиваться. Для этого мы встроим таймер в нашу кнопку. Нам понадобиться сделать несколько несложных шагов.
После раздела uses, где описаны добавленные в программу модули, объявите переменную типа TTimer. Назовем ее Timer. Приведу небольшой участок кода:
unit CountBtn;

interface
        
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;
        
var Timer: TTimer;
type
Дальше в директиву Protected необходимо добавить обработчик события OnTimer для нашего таймера. Это делается так:
  
procedure OnTimer(Sender: TObject);
Поскольку наш таймер это не переменная, а компонент, его тоже надо создать, для этого в конструктор нашей кнопки напишем:
  
constructor TCountBtn.Create(aowner:Tcomponent);
begin
 inherited create(Aowner);
 Timer:=TTimer.Create(self);
 Timer.Enabled:=true;
 Timer.OnTimer:=OnTimer;
 Timer.Interval:=10000;
end;
Здесь создается экземпляр нашего таймера и его свойству Iterval (измеряется в миллисекундах) присваивается значение 10000 (то есть 10 секунд если по простому).
Собственно осталось написать саму процедуру OnTimer. Я сделал это так:
  
procedure TCountBtn.OnTimer(Sender: TObject);
begin
 FCount:=FCount*2;
end;
Вот примерно то, что у вас должно получиться в конце:
unit CountBtn;
  
interface
  
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;
  
var Timer: TTimer;
type
 TShowTp = (Normal, CountToCaption);
 TCountBtn = class(TButton)
  
 private
  { Private declarations }
  
 FCount:integer;
 FShowType:TShowTp;

 protected
  { Protected declarations }
 procedure OnTimer(Sender: TObject);
 procedure Click;override;

 public
  { Public declarations }
 procedure ShowCount;

 published
  { Published declarations }
 property Count:integer read FCount write FCount;
 constructor Create(aowner:Tcomponent);override;
 property ShowType: TshowTp read FshowType write FShowType;
end;
  
procedure Register;
  
implementation
  
procedure Register;
begin
 RegisterComponents('Mihan Components', [TCountBtn]);
end;
  
constructor TCountBtn.Create(aowner:Tcomponent);
begin
  inherited create(Aowner);
  Timer:=TTimer.Create(self);
  Timer.Enabled:=false;
  Timer.OnTimer:=OnTimer;
  Timer.Interval:=1000;
end;
  
procedure Tcountbtn.Click;
begin
  inherited click;
  FCount:=Fcount+1;
  Timer.Enabled:=true;
  if ShowType = Normal then
  Caption:=Caption;
  if ShowType = CountToCaption then
    Caption:='Count= '+inttostr(count);
end;
  
procedure TCountBtn.ShowCount;
begin
  Showmessage('По кнопке '+ caption+' вы сделали: '+inttostr(FCount)+' клик(а/ов)');
end;
  
procedure TCountBtn.OnTimer(Sender: TObject);
begin
  FCount:=FCount*2;
end;
  
end.
Если у вас что-то не сработало, то в начале проверьте все ли у вас написано правильно. Затем проверьте может у вас не хватает какого-нибудь модуля в разделе Uses.

Переустановка компонента

Очень часто бывает необходимо переустановить ваш компонент. Если вы попробуете сделать это путем выбора Component->Install Component, то Дельфи вас честно предупредит о том, что пакет уже содержит модуль с таким именем. Перед вами открывается окно с содержимым пакета. В нем вы должны найти имя вашего компонента и удалить его (либо нажать кнопочку Remove). Теперь в пакете уже нет вашего компонента. Затем проделайте стандартную процедуру по установке компонента.


Горячие клавиши в Windows, браузере и Gmail почте

Горячие клавиши в Windows, браузере и Gmail почте

Горячие клавиши в Windows


Сочетание клавиш Действия
Клавиша  "Win" - windows(бычно находится в низу слева, между «Ctrl» и «Alt» и может отображаться картинкой)  Открывает и сворачивает меню «Пуск»
Win + Break Открывает «свойства системы»
Win + D Сворачивает или восстанавливает все окна
Win + М Сворачивает все окна
Win + Shift + M Восстанавливает все свернутые окна
Win + Е Открывает окно «Мой компьютер»
Win + F Открывает окно «Поиска»
Win + F1 Вывод центра справки Windows
Win + R Открывает окно «Выполнить»
Win + U Открывает окно «Диспетчер служебных программ»
Win + Tab На панели задач переключение между кнопками
Win + Pause Открывает окно «Свойства системы»
Ctrl + Esc   Открывает меню пуск меню "Пуск"
Ctrl + F4 Закрывает текущее окно в программе
Ctrl + C Копирует выделенный фрагмент или файл
Ctrl + X     Вырезает выделенный фрагмент или файл
Ctrl+ V Вставить фрагмент, файл
Ctrl + Z Отменяет последние действия
Ctrl + A Выделить все (весь текст или все файлы)
Ctrl+ P Печать
Ctrl + Shift + Esc     Вызов «Диспетчера задач»
Ctrl + Alt + Delete Вызов «Диспетчера задач», при повторном нажатии перезагрузка компьютера в экстренном режиме
Ctrl + N Создает новый документ, проект или подобное действие.
Ctrl + O Вызвает диалог выбора файла для открытия документа
Удерживать CTRL во время перемещения Создаёт копию файла
Удерживать CTRL + SHIFT во время перемещения файла Создаёт ярлык выбранного элемента
Alt + Tab Переключение активного окна от одного элемента к другому.
Alt + F4 Закрыть окно или выйти из программы
Alt + Пробел Выводит системное меню для текущего окна
Alt + Стрелка влево Шаг назад в проводнике
Alt + Стрелка вправо Шаг вперёд в проводнике
Alt + Enter Посмотреть свойства выбранного элемента
Shift + F10 Выводит опции для выделенного элемента
Shift + СТРЕЛКА в нужную сторону от курсора Выделяет знак в тексте
Shift + Ctrl + СТРЕЛКА в нужную сторону от курсора Выделяет слово в тексте
Shift с любой стрелкой Выделяет нескольких элементов в окне или на рабочем столе, или в тексте документа
Shift +Delete Удаляет выделенный файл, не помещая в корзину
Нажмите клавишу SHIFT пять раз Включает и отключает залипание клавиш

Горячие клавиши в браузере

Google chrome.

При нажатии клавиш Ctrl+T в браузере Google chrome будет создана новая вкладка.
При нажатии клавиш Ctrl+N в браузере Google chrome будет создано новое окно.
При нажатии клавиш Ctrl+D в браузере Google chrome откроется окошка для создания новой закладки.
Если нажать клавиши Ctrl+Shift +N в браузере Google chrome откроется окно в режиме инкогнито.
Например, если вы будите работать в режиме инкогнито, то Google chrome не будет записывать посещенные вами сайты в историю, то есть после завершения работы в Google chrome в режиме инкогнито вся история поиска, cookie и журнал посещенных web сайтов будет автоматически стерта в вашем браузере.
При нажатии клавиши Ctrl+Shift+O в браузере Google chrome откроется диспетчер закладок.
При нажатии клавиш Ctrl+S в браузере Google chrome откроется окошко для сохранения данной страницы.
Если нажать клавиши Ctrl+A в браузере Google chrome будет выделана вся страница.
Если нажать клавиши Ctrl+Z то в браузере Google chrome будет отменено последние действие.
Если нажать клавиши Ctrl+Y то в браузере Google chrome будет восстановлено последние отмененное действие.
При нажатии клавиш Ctrl+P в браузере Google chrome будет произведена печать данной страницы.
При нажатии клавиш Ctrl+R в браузере Google chrome обновится данная страница.
С помощью клавиш Ctrl+F в браузере Google chrome в верхнем правом углу откроется панель поиска по данной страницы.
Если нажать клавиши Ctrl+W в браузере Google chrome закроется активная вкладка.
Если нажать клавиши Ctrl+Shift+W в браузере Google chrome закроются все активные вкладки и будет произведен выход из браузера.
При нажатии клавиши Alt+F4 будет произведен выход из браузера.
При нажатии клавиши F11 в браузере Google chrome раскроется полноэкранный режим просмотра данной страницы, при обратном нажатии клавиши F11 в браузере Google chrome перейдет в обычный режим просмотра данной страницы. Если нажать и удерживать клавишу Ctrl затем покрутить колесико вниз или вверх, то масштаб данной страницы изменится.
Если нажать клавиши Ctrl+0 то масштаб в браузере Google chrome изменится на первоначальный масштаб просмотра страницы (100%).
Если нажать клавиши Shift+Esc в браузере Google chrome откроется диспетчер задач.
При нажатии клавиш Ctrl+Shift+Del в браузере Google chrome откроется окошко, в котором вы сможете очистить все данные по просмотру – это журнал посещенных сайтов, вся история поиска, история загрузок, cookie, кэш и другое. При нажатии клавиш Ctrl+Shift +J в браузере Google chrome откроется консоль JavaScript.
При нажатии клавиш Ctrl+Shift+T в браузере Google chrome будут открываться последние закрытые вкладки.
При нажатии клавиш Ctrl+H в браузере Google chrome откроется журнал историй.
При нажатии клавиш Ctrl+J в браузере Google chrome откроется вкладка «загрузки».

Firefox


- Поднять или опустить страницу. Пробел – опустить страницу, Shift+пробел – поднять страницу.
- Найти. Ctrl+F или Alt-N для следующей страницы.
- Добавить страницу в закладки. Ctrl+D.
- Быстрый поиск./.
- Новая вкладка. Ctrl+T.
- Перейти на панель поиска. Ctrl+K.
- Перейти в адресную строку. Ctrl+L.
- Увеличить размер текста. Ctrl+=. Уменьшить размер текстаCtrl+-
- Закрыть вкладку. Ctrl-W.
- Обновить страницу. F5.
- Перейти на домашнюю страницу. Alt-Home.
- Восстановить закрытую страницу. Ctrl+Shift+T.
- Закладки по ключевым словам. Это наиболее продуктивно. Если вы часто заходите на сайт, вы делаете закладку (конечно!), затем перейдите к свойствам закладок (щёлкните по ним правой кнопкой мыши). Добавьте короткое ключевое слово в строку ввода ключевых слов, сохраните, и после этого вы можете просто вводить в адресную строку (Ctrl+L) это ключевое слово и сразу же переходить на сайт.


Горячие клавиши в почте Gmail


- Написать новое письмо. C.
- Ответить на письмо. R.
- Ответить всем.A.
- Переслать письмо. F.
- Сохранить текущее письмо и открыть следующее письмо.Y+O.
- Удалить письмо и открыть следующее. #+O (или Shift-3+O).
- Отправить написанное письмо. Tab-Enter.
- Поиск. /.
- Навигация. Перемещение вниз J и вверхK по списку контактов.
- Список сообщений. N и P передвигают курсор на следующее или предыдущее сообщение и списке сообщений.
- Игнорировать. M– письма с отмеченными адресами перестают попадать в список входящих писем и архивируются.
- Выбрать цепочку писем. X – цепочка писем будет выбрана. Её можно заархивировать, применить к ней ярлык и выбрать для неё действие.
- Сохранить черновик. Control-S.
- Перейти к списку сообщений. G+I.
- Перейти к помеченным письмам. G+S.
- Перейти к адресной книге. G+C.





пятница, 17 января 2014 г.

Скелет плагина на jQuery с использованием методов

Скелет плагина на jQuery с использованием методов


(function($){
    var methods = {
        init : function(options) {
            console.log('init');
        },
        show : function( ) {
     
        },
        hide : function( ) {
     
        },
        update : function(content) {
            console.log(content);
        }
    };
    $.myPlug = function(method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || ! method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error( 'Метод с именем ' +  method + ' не существует для $.chats' );
        }
    };
})(jQuery);
$.myPlug(); // init
$.myPlug('update', 'Привет мир'); // Привет мир
$.myPlug('blalbla') // $.error



или

$.tooltip = {
  update: function() {},
  init: function() {},
  show: function() {} // и т.п.
}

и вызывать как $.tooltip.show()

Перехват ошибок SQL на Delphi

Перехват ошибок SQL на Delphi


Механизм, как "запретить - разрешить" выводить сообщение об ошибке подключения программы на Delphi через SQL через компонент TADOConnection..


Это чтобы не выводить:

procedure TAnswerList.Update(ADO : TADOQuery);
begin
with ADO do
begin
if Active then Close;
SQL.Text:=concat('UPDATE ANSWER_LIST SET ',
'NAME = "', self.Name, ', ',
'NOMER_ID = "', IntToStr(self.Nomer), ', ',
'CREDITOR_ID = "', IntToStr(self.CreditorId), ' ',
'WHERE ID = ' + IntToStr(self.id));
try
ExecSQL;
finally
end;
end;
end;

Это чтобы грамотно выводить:

procedure TAnswerList.Update(ADO : TADOQuery);
begin
with ADO do
begin
if Active then Close;
SQL.Text:=concat('UPDATE ANSWER_LIST SET ',
'NAME = "', self.Name, ', ',
'NOMER_ID = "', IntToStr(self.Nomer), ', ',
'CREDITOR_ID = "', IntToStr(self.CreditorId), ' ',
'WHERE ID = ' + IntToStr(self.id));
try
ExecSQL;
except
On E:Exception Do
begin
ShowMessage(concat('Update answer list failure. ',e.Message,#13#10,SQL.Text));
Exit;
end;
end;
end;

Функция замены текста в строке на Delphi

Функция замены текста в строке на  Delphi



function TForm1.Replace(Str, X, Y: string): string;
{Str - строка, в которой будет производиться замена.
 X - подстрока, которая должна быть заменена.
 Y - подстрока, на которую будет произведена заменена}

var
  buf1, buf2, buffer: string;

begin
  buf1 := '';
  buf2 := Str;
  Buffer := Str;

  while Pos(X, buf2) > 0 do
  begin
    buf2 := Copy(buf2, Pos(X, buf2), (Length(buf2) - Pos(X, buf2)) + 1);
    buf1 := Copy(Buffer, 1, Length(Buffer) - Length(buf2)) + Y;
    Delete(buf2, Pos(X, buf2), Length(X));
    Buffer := buf1 + buf2;
  end;

  Replace := Buffer;
end;

Сохранение состояния компонента в строку в Delphi

Сохранение состояния компонента в строку в Delphi



function TMainForm.ComponentToString(Component: TComponent): string;
var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;
    end;
  finally
    BinStream.Free
  end;
end;



function TMainForm.StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);
    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;


среда, 8 января 2014 г.

ID3v1 теги в mp3 файлах, получить всю информацию о треке на VBA


ID3v1 теги в mp3 файлах, получить всю информацию о треке на VBA 


Sub CreateReport_Mp3FileProperties()
    Dim iFileName$, iPath$, iRow&, iColumn&
    Dim iFolder As Object, iMp3File As Object
     
    iPath = "B:\Muzic Hits\": iRow = 2
 
    Set iFolder = CreateObject("Shell.Application").Namespace(CVar(iPath))
    If Not iFolder Is Nothing Then
       iFileName = Dir(iPath & "*.mp3")
       If iFileName <> "" Then
          Workbooks.Add xlWBATWorksheet
          Application.ScreenUpdating = False
          Do
               Application.StatusBar = iFileName
               Set iMp3File = iFolder.ParseName(iFileName)
               For iColumn = 0 To 50 '
                   Cells(iRow, iColumn + 1) = iFolder.GetDetailsOf(iMp3File, iColumn)
               Next
               iFileName = Dir
               iRow = iRow + 1
          Loop While iFileName <> ""
          For iColumn = 0 To 50 ' Headers Report
              Cells(1, iColumn + 1) = iFolder.GetDetailsOf(iFolder.Items, iColumn)
          Next
          Application.StatusBar = False
          Application.ScreenUpdating = True
       Else
          MsgBox "No files .mp3", , ""
       End If
    Else
       MsgBox "Folder is not found", , ""
    End If
End Sub

Соединить все файлы в один в папке, с расширением .sql


Склеить все sql файлы в один через командный файл (.cmd или .bat)


cls
@echo GO KLEI
cd B:\klei
 copy /b *.sql all.sql
pause




Постоянные читатели

Популярные сообщения