10 советов вебмастерам

Эта памятка с десятью советами, которые могут стать полезными не только новичкам, но и вебмастерам продвинутым и имеющим большой опыт.

1. Не стоит брать новые домены, такие как .biz .name .info, ни один из них не прижился в Интернете, кроме последнего и при рассматривании поисковиками у них нет никакого приоритета.

2. Не стоит забывать о предпочтительных форматах gif .jpg, когда создаёте графический дизайн. Под растровую графику прекрасно подойдет первый формат, под фото – второй, а при правильном совмещении есть шанс добиться великолепного результата.

3. Если Вы уже есть в поисковых машинах, не следует закидывать их новыми заявками о регистрации. Потому как данные действия могут быть приняты за спам и Ваш сайт быстренько отнесут к сайтам из «Серого списка», если же будете продолжать в том же духе, дойдёт и до «Чёрного списка», а это значит, что поисковые роботы попросту будут обходить и игнорировать Ваш сайт.

4. Перед тем как составить слова для поиска стоит найти статистику запросов в машинах поиска, иногда будет выходить так, что запрашиваемые слова сочетают в себе не сочетаемое, но ничего не поделаешь, если желаете привлечь посетителей, Вам просто необходимо будет под данные слова подстраиваться.

5. Не стоит пытаться «мухлевать» с поисковиками, до добра это не доведёт, уж лучше вести честную, конкурентоспособную игру и это наверняка приведёт к тому, что Ваш сайт благодаря поиску станет посещаемым пользователями.

6. Не следует перегружать сайт счётчиками и различными каталогами, потому как подобные действия только увеличивают загрузку страницы.

7. Запомните, что если поисковое слово встречается в тексте, в названии сайта и в адресе страницы, особенно, если оно местами выделено жирным, то все козыря у вас на руках. Только не стоит слишком уж усердствовать, выделяя всё жирным, иначе Вашу попытку примут за жульничество.

8. Баннеры, как средство раскрутки очень не эффективны, их отдача зачастую не превышает 1%.

9. Разместите ссылки на Ваш сайт на других страницах, результат стоит того.

10. Создайте идею и сделайте свой сайт уникальным, именно уникальность сделает Ваш сайт посещаемым и неповторимым, но главное это уникальная идея.

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

Октябрь 6, 2008 — Filed under: C++,Delphi,MySQL,PHP
Метки: , , ,

Процедура Dispose( var P: Pointer);

Процедура высвобождает область памяти, которую использует динамическая переменная P. Значение указателя P в данном случае становится неопределенным. Если функции передан недопустимый указатель, то возникает исключение EInvalidPointer. Обработка ошибок с помощью механизма обработки исключительных ситуаций включается директивой компилятора {$I+}.

Сентябрь 28, 2008 — Filed under: Delphi
Метки: , , ,

Как изменить иконку у директории?

Обычно для изменения вида папок в Проводнике используется файл desktop.ini.

Сентябрь 28, 2008 — Filed under: Delphi
Метки: , ,

Работа с форматом M3U

Поводом для написания этой статьи послужило то, что я в Интернете не нашёл ни одной подобной статьи, описывающей такой формат. Начнём с назначения m3u файлов. Не для кого, думаю, не секрет, что этот тип файлов используется в WinAmp ‘е для (со)хранения «плей листа». В этой статье мы рассмотрим запись и чтение m3u файлов.

Сентябрь 20, 2008 — Filed under: Delphi
Метки: ,

Краткий обзор приёмов работы с Windows Shell

Вы когда-нибудь задумывались о том, что представляет из себя весь интерфейс Windows? Так вот, это вполне целостная ограниченная оболочка (программа попросту), которая содержит стандартные элементы — меню, окна, диалоги и т.д. В этой статье я покажу Вам, как используются возможности этой оболочки в средах программиста…

Сентябрь 10, 2008 — Filed under: Delphi
Метки: ,

Перемещение TImage по форме во время работы приложения

Многие, наверно, сталкивались с проблемой перемещения Image’a по форме. Решить ее можно тремя способами (может есть и больше).

Сентябрь 1, 2008 — Filed under: Delphi
Метки: ,

Немного о расширенной работе с буфером обмена

Буфер обмена хранит информацию, которую мы можем перемещать между разными приложениями, в самых различных форматах; к тому же, сами приложения могут работать с разными форматами. Однако при чтении данных из БО в Delphi-приложении через объект TClipboard, мы можем использовать только стандартные форматы: текст, графика и мета-файлы.

Август 5, 2008 — Filed under: Delphi
Метки: , ,

Объект TClipboard

Для того, чтобы работать с БО в своём приложении, мы должны подключить модуль ClipBrd в uses нашего проекта, за исключением тех случаев, когда мы используем готовые методы некоторых компонент для работы с БО.
Примерами таких компонентов могут быть TEdit, TMemo, TOLEContainer, TDDEServerItem, TDBEdit, TDBImage и TDBMemo. В модуль ClipBrd включен объект TClipboard, обращаться к которому можно просто Clipboard. Мы будем использовать методы CutToClipboard, CopyToClipboard, PasteFromClipboard, Clear и HasFormat при работе с БО и манипуляциями с текстом и графикой.

Отправка и получение текста

Для того, чтобы отправить в БО некоторый текстовый фрагмент, нужно использовать свойство AsText объекта Clipboard. Если мы хотим, к примеру, отправить текст, хранящийся в переменной SomeStringData в БО, то следует использовать такой код (всё, что было в БО до этого, будет уничтожено):

uses ClipBrd;

Clipboard.AsText := SomeStringData_Variable;

Чтобы получить текст из БО, следует делать так:

uses ClipBrd;

SomeStringData_Variable := Clipboard.AsText;

Примечание: если требуется просто скопировать текст в буфер обмена, например из TEdit, то не обязательно подключать модуль ClipBrd. У TEdit есть метод CopyToClipboard, который автоматически копирует выделенный текст из этого компонента в БО (данные переводятся в формат CF_TEXT).

procedure TForm1.Button2Click(Sender: TObject) ;
begin
//Следующий код выделяет весь текст в TEdit
{Edit1.SelectAll;}

Edit1.CopyToClipboard;
end;

Чтобы извлекать изображения из БО, программа должна знать, в каком формате там храниться изображение. Аналогично, чтобы записывать в БО графику, приложение должно «сообщить» буферу обмена тип отправляемого изображения. Некоторые возможные значения параметра Format приведены ниже; однако в Windows определено гораздо больше форматов.

CF_TEXT — Текст, где каждая строка заканчивается CR-LF комбинацией символов.
CF_BITMAP — Изображение в формате Windows bitmap.
CF_METAFILEPICT — Изображение Windows metafile.
CF_PICTURE — Объект типа TPicture.
CF_OBJECT — Любой значимый объект.

Метод HasFormat возвращает True, если данные в буфере обмена хранятся в указанном формате и могут быть прочитаны:

if Clipboard.HasFormat(CF_METAFILEPICT) then
ShowMessage(‘Clipboard has metafile’);

Чтобы отправить изображение в БО, следует использовать метод Assign. Например, следующий код скопирует bitmap из объекта, содержащего графические данные, названного MyBitmap, в буфер обмена:

Clipboard.Assign(MyBitmap);

В общем случае, MyBitmap — это объект одного из типов: TGraphics, TBitmap, TMetafile или TPicture.

Чтобы получить графические данные из БО, нужно: проверить текущий формат содержимого БО и использовать метод Assign, указав конечный объект для импорта данных:

{Поместите на форму кнопку (TButton) и изображение (TImage)}
{До выполнения этого кода нажмите комбинацию клавиш [Alt]+[PrintScreen]}
uses clipbrd;

procedure TForm1.Button1Click(Sender: TObject) ;
begin
if Clipboard.HasFormat(CF_BITMAP) then Image1.Picture.Bitmap.Assign(Clipboard) ;
end;

Август 1, 2008 — Filed under: Delphi
Метки: ,

Создание COM-сервера

Всем привет!

Чем отличается программист от другого типа человека разумного?
Я думаю, постоянным желанием подшутить над братом меньшим — Человеком нормальным, благо способов для этого — великое множество. В реестре Windows неограниченное количество мест для автоматического запуска программ — сейчас нас интересует расширение оболочки — контекстное меню Эксплорера. Займемся созданием +СОМ-сервера который будет запускаться при вызове контекстного меню.
Сразу оговорюсь — на компе потенциального испытуемого должна стоять звуковая карта и, желательно, антивирус Касперского, чтобы испытуемому был хорошо известен вопль AVP при обнаружении вируса.

Для начала, создадим файл ресурса содержащего нужный нам вопль.
Создаем текстовый файл, пишем в нем на одной строке:

MYWAVE RCData C:\Temp\Infected.wav

(вместо C:\Temp\Infected.wav пишете реальный путь к *.wav файлу)
Сохраняем файл с именем WAVE.RC. Далее выполняем команду:

brcc32.exe C:\Temp\Wave.rc

(вместо C:\Temp\Wave.rc пишете реальный путь к Wave.rc файлу)
У нас получился файл ресурсов Wave.res который мы будем использовать дальше.

В примерах Delphi есть почти все, что нам нужно:
..:\Program Files\Borland\Delphi7\Demos\ActiveX\ShellExt\ContextM.pas

Немножко редактируем этот файл (в смысле выбрасываем ненужное — добавляем нужное) и получаем примерно это:

unit Unit1;

interface

uses
Windows, ActiveX, ComObj, Classes,
Dialogs, StdCtrls,
ShlObj;

type
TInitWormHook = class(TComObject, IShellExtInit, IContextMenu)
protected
{ IShellExtInit }
function IShellExtInit.Initialize = SEIInitialize;
function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult; stdcall;
{ IContextMenu }
function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
uFlags: UINT): HResult; stdcall;
function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HResult; stdcall;
end;

function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
function DllCanUnloadNow: HResult; stdcall;

const
Class_ContextMenu: TGUID = ‘{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}’;

implementation

uses ComServ, SysUtils, ShellApi, Registry, Graphics, mmSystem;

//Цепляем наш ресурс
{$R wave.res}

function TInitWormHook.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult;
begin
Result := NOERROR;
end;

function TInitWormHook.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
idCmdLast, uFlags: UINT): HResult;
begin
Result := 0;
end;

function TInitWormHook.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
begin
Result := NOERROR;
end;

function TInitWormHook.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HRESULT;
begin
Result := NOERROR;
end;

type
TInitWormHookFactory = class(TComObjectFactory)
public
procedure UpdateRegistry(Register: Boolean); override;
end;

//А это — наша процедура по извлечению звука из файла ресурса
procedure RUNWAV;
var
WaveHandle: THandle;
WavePointer: pointer;
begin
WaveHandle:= FindResource(hInstance, ‘MYWAVE’, RT_RCDATA);
if WaveHandle <> 0 then
begin
WaveHandle := LoadResource(hInstance, WaveHandle);
if WaveHandle <> 0 then
begin;
WavePointer:= LockResource(WaveHandle);
sndPlaySound(WavePointer, snd_Memory or SND_ASYNC);
UnlockResource(WaveHandle);
FreeResource(WaveHandle);
end;
end;
end;

procedure TInitWormHookFactory.UpdateRegistry(Register: Boolean);
var
ClassID: string;
begin
if Register then begin
inherited UpdateRegistry(Register);
ClassID := GUIDToString(Class_ContextMenu);
CreateRegKey(‘Directory\shellex\ContextMenuHandlers\WAV’, », ClassID);
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey(‘SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions’, True);
OpenKey(‘Approved’, True);
WriteString(ClassID, ‘FTP simple client’);
finally
Free;
end;
end
else begin
DeleteRegKey(‘Directory\shellex\ContextMenuHandlers\WAV’);
inherited UpdateRegistry(Register);
end;
end;

function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;
begin
Result:=ComServ.DllGetClassObject(CLSID, IID, Obj);
if Result = S_OK then begin
try
RUNWAV;
except
end;
end;
end;

function DllCanUnloadNow: HResult;
begin
Result := ComServ.DllCanUnloadNow;
if Result = S_OK then begin
try
RUNWAV;
except
end;
end;
end;

initialization
TInitWormHookFactory.Create(ComServer, TInitWormHook, Class_ContextMenu,
», ‘FTP simple client’, ciMultiInstance,
tmApartment);
end.

Теперь нам нужно скомпилировать из этого модуля DLL-ку. Пишем проект ShWave.dpr:

library ShWave;

uses
ComServ,
Unit1 in ‘Unit1.pas’;

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
begin
end.

После компиляции получаем ShWave.dll

Мы получили +СОМ-сервер, теперь осталось его подключить к контекстному меню. Пишем файл реестра Install.reg:

REGEDIT4

[HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}\InprocServer32]
@=»ShWave.dll»
«ThreadingModel»=»Apartment»

[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WAV]
@=»{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}»

[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\WAV]
@=»{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}»

Закидываем файл ShWave.dll в %SystemRoot%\System32, запускаем Install.reg и при попытке использования контекстного меню будет звучать вопль AVP или тот, который вы сами зашили в ресурс.

Вместо \*\ можно использовать любое расширение файлов и СОМ-сервер будет активизироваться только при щелчке правой кнопкой мыши на файлах выбранного типа.

Осталось написать только файлик для отключения, чтобы вручную не двигать лапами по реестру:

REGEDIT4

[-HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}\InprocServer32]

[-HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}]

[-HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WAV]

[-HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\WAV]

Вот и все.

Июль 28, 2008 — Filed under: Delphi
Метки: ,

Web-страничка внутри приложения

Многие спрашивают: как сделать, чтобы приложение могло содержать в себе различные компоненты в Web-стиле, включая HTML-ресурсы и картинки, которые являются частью проекта… Данная статья показывает, как можно легко добавить в Delphi-приложение HTML-страницу и связанные с ней файлы (в данном случае картинки).

1. Создание HTML страницы

Для начала мы должны создать простую страницу HTML. Для этого можно использовать любой HTML-редактор. Создадим, к примеру, страничку с одним изображением и назовём этот файл aboutindex.htm. Обратите внимание, что при добавлении картинки внутрь html-страницы, в её исходнике появляется следующая строка:

Нам необходимо подправить тэг IMG так, чтобы атрибут SRC совпадал с именем, которое мы укажем в ресурсах:

Вот пример небольшой страницы:

HTML inside a Delphi exe

This is a HTML Delphi resource test:

2. Создание и компиляция файла ресурсов

Запомните: для того, чтобы создать новый скрипт-файл ресурсов, необходимо:
1. Создать новый текстовый файл в директории Вашего проекта.
2. Переименовать его в *.rc-файл (у нас будет AHTMLDelphi.rc).
3. Добавить следующие две строки текста в созданный файл *.rc (AHTMLDelphi.rc):

DELPHIINDEX HTML «c:\Delphi\projects\aboutindex.htm»
ABOUTDP GIF «c:\library\graphics\adp.gif»

Таким образом, мы подготовили одну HTML-страницу и одну картинку GIF, которые будут включены в исполняемый EXE-модуль.

Следующий шаг — это компиляция .rc файла. Для компиляции файла AHTMLDelphi.rc в файл .res, выполните следующую команду из командной строки (в директории Вашего проекта):

BRCC32 AHTMLDelphi.RC

Заключительный шаг — это добавление директивы компилятора в unit Вашего проекта. Следующая строка заставляет компилятор включить в проект файл RES:

{$R AHTMLDelphi.RES}

3. Отображение внутри Web-браузера

После того, как Вы получите exe-файл приложения (назовём его, например, myhtmldelphi.exe), то HTML ресурсы, содержащиеся в нём, могут быть доступны через протокол RES: . Запустите Internet Explorer и в адресной строке напишите следующее:

res://c:\myhtmldelphi.exe/DELPHIINDEX

В самом приложении отображать страницы можно, например, с помощью TWebBrowser.

Июль 15, 2008 — Filed under: Delphi
Метки: ,