Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
22nd
Июл
Парсер сайта на Делфи.
4th
Июл
Template CMS – маленькая и быстрая CMS
Разрешите представить сайтостроителям этого сообщества свою сиcтему управления сайтом Template CMS
Предназначение: сателлиты, домашние странички, мини сайты, сайты визитки.
Работа над CMS-кой еще ведется. Последняя рабочая версия 0.85
Template CMS 0.85 Основные возможности:
+ Простота установки, использования и обновления.
+ Удобный интерфейс администрирования.
+ Многоязычный интерфейс администрирования. (английский,русский,украинский +)
+ Минимальные требования к хостигу (без БД только PHP)
+ Ключевые слова и описание как для каждой страницы так и для всех.
+ Удобный редактор страниц (WYSIWYG – What You See Is What You Get ).
+ Создание бекапов сайта.
+ Смена тем оформления в один клик.
+ Легкость разработки и интеграции новых тем оформления.
+ Редактирование тем оформления прям из админки
+ Файловый менеджер с возможностью загрузки у правлением файлами на сервере.
+ Поддержка ЧПУ (с возможностью самому задавать расширения файлам .html . php etc…)
Сайт: http://templatecms.webdevart.ru/
Скриншоты: http://templatecms.webdevart.ru/galery
Сайты на этой CMS: http://templatecms.webdevart.ru/sites
Демо (0.85): http://templatecms.dtn.ru/admin.php
Пароль: demo
Ожидаемая обратная связь:
— Критика
— Предложения
— Слова поддержки
__________________
2nd
Июл
Анимация в WEB на JavaScript
Здравствуйте! В этой статье я хотел бы рассказать о создании анимации на веб-страницах с использованием скриптового языка программирования JavaScript, далее JS. Статья ориентирована на новичков.
Анимация на WEB страницах
Алексей Шульга
by Levsha100 http://www.programmersforum.ru/member.php?u=19268
По правде говоря я не являюсь поклоником JS да и вэб-программирования тоже, но родина сказала «Надо!» Я немного отошел от темы нашего сайта, ибо работы над ним еще ведутся и это, видимо, будет еще долго. Поэтому было решено написать цикл статей по JS и различным интересным трюкам.
Шаблон
Для начала нам необходимо создать заготовку- то место, куда мы будем внедрять скрипты, Вот она:
<html>
<head>
<title>Тестовая страничка</title>
</head>
<body>
</body>
</html>
Это обыкновенная HTML-страничка, я сохранил ее под именем Test.html .
Встраивание JS-скрипта
Итак, шаблон у нас есть, и теперь мы можем смело пробовать оживлять страничку с помощью скриптов, добавить JS-скрипт можно двумя основными способами- добавлением его непосредственно в веб-страницу, либо вынести его в отдельный файл, для наглядности я выбрал первый способ. Добавим скрипт в секцию body, после чего она примет вид:
<body>
<script>
//Тут находится JS-код
</script>
</body>
Для проверки можно заменить за комментированную строку такой строкой:
alert(”Hello, world” );
Этот код выведет [модальное] окно с текстом “Hello, world”.
Добавление объектов
Прежде чем мы займемся анимацией нужно что бы было то, что будет анимироваться, поэтому займемся созданием анимируемых объектов- для примера возьмем квадратные DIV-вы со стороной 10 пикселей. Прежде чем создавать собственно объекты для них необходимо задать стиль, это делается с помощью CSS. Пример:
<head>
<title>Тестовая страничка</title>
<style type=”text/css”>
.obj1style{position:absolute; width:10; height:10; background-color: #00FF00}
</style>
</head>
Наиболее важным свойством является свойство position и именно его значение absolute -оно позволяет размещать объект, к которому применен данный стиль, в любой точке веб-страницы. Свойства width и height, как нетрудно догадаться, отвечают за высоты и ширину объекта соответственно. Цвет фона объекта- зеленый.
Теперь займемся собственно добавлением объектов, для этого необходимо заменить строку:
//Тут находится JS-код
на строки:
var obj_count=10; //Сколько у нас будет объектов
for (i=1;i<=obj_count;i++){ //Цикл от 1 до количества создаваемых объектов
document.write(’<div style=”left:’);
document.write(i*20+50);
document.write(’;top:50;”MsoBodyTextIndent” style=”margin-right: -2.75pt; text-indent: 0cm;”>
document.write(i);
document.write(’”>’+'</div>’);
//вот то самое место, именно тут мы вписываем в страницу 10 DIV-ов с классом obj1style идентификаторами с именами от obj1-1 до obj1-10. Все элементы располагаются на одной высоте, отступ от левой стороны страницы высчитывается по формуле i * 20 +50, где i-это номер элемента[1..10].
}
Вместо данного кода мы могли бы написать что-то вроде:
<div style=”left:70; top:50;” id=”obj1-1″></div>
…
<div style=”left:250; top:50;” id=”obj1-10″></div>
Но это неэффективно и некрасиво да и лень мне писать так много.
I like to move it или анимируем!
Самое интересное. Итак, для начала зададимся целью, что необходимо сделать. Я решил начать с простого – объекты будут летать в неком сосуде и при ударении об стенку они будут отскакивать
* Комментарий автора
кстати данную модель можно было бы назвать “Модель идеального газа”, ибо данная анимация действительно в некой степени моделирует поведение частиц идеального газа.
Для начала после строки:
var obj_count=10;
добавим следующий код:
var VX= new Array(obj_count);
var VY= new Array(obj_count);
document.write(’<div style=”position:absolute; left:45; top:40; width:300; height:300; background:#bbbbbb;” id=”Area”></div>’);
Первые две строки создают два массива длиной 10 элементов, которые хранят значение скорости для каждого объекта. Третья же строка размещает на страничке “сосуд”, в котором будут летать наши “молекулы”, тут, в принципе, я думаю все знакомо и просто. Далее после строк начальной инициализации:
document.write(’;top:50;” id=”obj1-’);
document.write(i);
document.write(’”>’+'</div>’);
добавляем код, который будет задавать случайную скорость для каждого объекта
VX=Math.round(Math.random()*6)-3; if(VX==0){VX=1;}
VY=Math.round(Math.random()*6)-3; if(VY==0){VY=1;}
Условия “if” нужны для того что бы не было нулевых скоростей, то есть что бы небыло неподвижных объектов. Теперь перейдем к самому сердцу нашего аниматора- функции Timer она периодически ( с интервалом 50мс вызывает функцию Animate, но о ней позже.
Функция выглядит так:
function Timer()
{
setTimeout( function(){Animate();setTimeout(arguments.callee, 50);}, 0);
}
Эта функция должна вызываться(стартовать) при загрузке страницы для того что бы обеспечить такую возможность мы подправим тег body, итоговый вид после изменений показан ниже:
<body onload=”Timer()”>
Вроде разобрались, пора браться за последнюю в данном уроке и самую массивную функцию – функцию Animate, вот полный ее текст:
function Animate()
{
for(i=1;i<=obj_count;i++){
document.getElementById(”obj1-”+i).style.left=parseInt(document.getElementById(”obj1-”+i).style.left)+VX;
document.getElementById(”obj1-”+i).style.top=parseInt(document.getElementById(”obj1-”+i).style.top)+VY;
if( parseInt(document.getElementById(”obj1-”+i).style.left) <= parseInt(document.getElementById(”Area”).style.left) ){
document.getElementById(”obj1-”+i).style.left=document.getElementById(”Area”).style.left;
VX*=-1;
}
if( parseInt(document.getElementById(”obj1-”+i).style.left)+10 >= parseInt(document.getElementById(”Area”).style.left)+parseInt(document.getElementById(”Area”).style.width) ){
document.getElementById(”obj1-”+i).style.left=parseInt(document.getElementById(”Area”).style.left)+parseInt(document.getElementById(”Area”).style.width)-10;
VX*=-1;
}
if( parseInt(document.getElementById(”obj1-”+i).style.top) <= parseInt(document.getElementById(”Area”).style.top) ){
document.getElementById(”obj1-”+i).style.top=document.getElementById(”Area”).style.top;
VY*=-1;
}
if( parseInt(document.getElementById(”obj1-”+i).style.top)+10 >= parseInt(document.getElementById(”Area”).style.top)+parseInt(document.getElementById(”Area”).style.height) ){
document.getElementById(”obj1-”+i).style.top=parseInt(document.getElementById(”Area”).style.top)+parseInt(document.getElementById(”Area”).style.height)-10;
VY*=-1;
}
}
}
Как она работает? Очень просто! В цикле мы пробегаем по всем элементам, при этом выполняем следующие действия:
1. Прибавляем к X координате объекта его горизонтальную скорость, которую берем из массива VX.
2. Прибавляем к Y координате объекта его вертикальную скорость, которую берем из массива VY.
3. Проверяем, не вышел ли левый край объекта за левый край сосуда, если вышел, то ставим объект на границу и инвертируем скорость. Т.е. если летел, к примеру, шарик и он вылетел за левую границу, то мы возвращаем шар на край сосуда и пинаем его в обратную сторону, так, что модуль его горизонтальной скорости не меняться- меняется только знак
4. Аналогично, только мы проверяем вылет за правую границу.
5. В принципе тоже самое, только здесь все происходить в вертикальной плоскости- мы определяем вылет за верхнюю границу и если таковой факт был инвертируем вертикальную составляющую скорости.
6. Аналогично действию №5, за исключением того, что проверка происходит на вылет за нижнюю грань.
Смело копируем функцию перед функцией Timer() и пробуем запустить нашу маленькую демонстрацию (см. рисунок).
Заключение
В этой статье я попытался объяснить базовые принципы анимации с помощью JavaScript. Если Вам что-то непонятно, то не расстраивайтесь в следующих уроках курса я на более интересных и практичных примерах покажу как делать практичные вещи, которые будет не стыдно поставить на свой сайт а пока экспериментируйте! Также хотелось бы написать статью о оптимизации кода, ибо наш вариант далеко не идеален, поэтому ждите.
Если возникнут какие-либо вопросы то обращайтесь на форум www.programmersforum.ru, либо пишите на почтовый ящик редакции. Я или кто-либо другой попытаемся Вам помочь.
Статья из четвертого выпуска журнала “ПРОграммист”.
Скачать этот номер можно по ссылке.
Ознакомиться со всеми номерами журнала.
16th
Июн
Сохранение web-страницы с картинками. Delphi.
procedure TForm1.Button1Click(Sender: TObject);
var ms:TmemoryStream;
begin
ms:=TmemoryStream.create;
idhttp1.Get('http://lio.lv/olimps/uzdevumi.php?show=1',ms);
ms.SaveToFile('1.html');
end;
13th
Июн
Аудио вКонтакте.
И так, в последнее время развелось очень много программ – фейков для вконтакта. Некоторые программы ищут музыку вконтакте, и дают возможность скачать её. Программам этим я не доверяю, и решил сделать свою, для себя. Разубеждать меня не надо =)
Вопрос: как получить ссылку на скачивание той или иной музыки?
Исходный код audio.php перерыл, ссылок не нашел, хорошо, видать, Дуров защитил =)Может, кто поможет.. Я не прошу написать за меня код, прошу просто подсказки. Копирование из кеша неподойдет.
http://cs4586.vkontakte.ru/u2663363/audio/61bea91731fc.mp3
вот, надеюсь понятно?)) (правда запоздал немного)
вот моя старая функция(раньше то везде ссылок чистых не было)
function WB_AudioLinkMP3(sourse:string):string;
var s:string;
begin
s:=sourse;
if Pos('operate',s)=0 then exit;
Delete(s,1,PosEx('(',s,Pos('operate',s)));
Delete(s,1,Pos(',',s));
sourse:='http://cs'+Copy(s,1,pos(',',s)-1);
Delete(s,1,Pos(',',s));
sourse:=sourse+'.vkontakte.ru/u'+Copy(s,1,pos(',',s)-1);
Delete(s,1,Pos(',',s));
sourse:=sourse+'/audio/'+Copy(s,2,pos(',',s)-3)+'.mp3';
Result:=Sourse;
end;
правда он не очень оптимизирован
можно и лист бокс, раньше я когда то занимался этим(сейчас то вернусь в эту тему…но не раньше чем разберусь со своей библиотекой классов на С++/Delphi(правда С++ важнее в этом плане))
я юзал листбокс, а если парсить и далее этой кнопки(данные песни) то можно и в листвиев все запихать как угодно
Интересная тема на форуме. Советую присоединиться к обсуждению.
25th
Май
Разработка ресурса для журнала. Часть 1
С выходом третьего номера журнала [ПРОграммист] у него появился собственный сайт. Разработке этого ресурса и посвящен цикл статей.
Для начала оговорим, что мы решили разбить статью на две части, т.к это не поместиться в объеме одной статьи. Первая часть будет о написании ленты новостей, гостевой книги и вообще всего интерфейса пользователя, а вторая будет посвящена написанию панели администратора.
Первую часть будет вести Егор Горохов aka Revival1002, вторую — Алексей Шульга aka Levsha100, мы будем помогать друг другу в этом нелегком труде. Итак, начнем.
1. Дизайн
Для начала был нарисован PSD шаблон сайта в графическом редакторе Photoshop. Оттуда же мы потом и «выдирали» картинки для сайта. В результате у нас получилось это (см. рисунок 1):
Плюс такого дизайна в том, что можно оченьбыстро сделать редизайн. Для этого достаточносменить фоновую картинку и немного подкорректировать таблицы стилей CSS.
2. Верстка
Для создания закругленных углов использовалось свойство border-radius. К сожалению, пока что свойство работает не во всех браузерах, например в IE 6…8 оно игнорируется. Конечно существуют и альтернативные способы создания круглых углов, но они зачастую требуют до 9 (!) картинок блока (4 угла, 4 стороны и центр). Так как мы «очень ленивые», да и острые углы не очень портят дизайн, мы использовали простейшее решение, с надеждой на то, что вскоре все браузеры будут поддерживать данное свойство…
Для полупрозрачности главного div не было найдено (возможно мы плохо «гуглили») кроссбраузерного решения, поэтому мы пошли на хитрость, создав однопиксельный полупрозрачный png, и поставили его на фон. Но и этот способ, как оказалось имеет свои минусы. Например*, ненавистный всеми дизайнерами/верстальщиками IE6 его игнорирует.
* Комментарий автора.
Кстати, я уже давно не видел людей использующих IE6. Все мои знакомые, даже если они мало понимают в компьютерах (например девушки) используют браузеры типа Opera и Mozilla Firefox. Поэтому причин продолжать верстать под MSIE6 я уже не вижу.
Ознакомится с CSS можно по адресу:
http://procoder.info/style.css
3. Написание скриптов
Для начала, вынесем все наиболее часто используемые переменные в отдельный файл “config.php”, и потом будем его «инклудить» во все скрипты. Мы поместили туда логин\пароль от БД, путь к сайту и т.п. В дальнейшем, если мы захотим изменить что-либо, то это займет всего- лишь несколько секунд, и не потребуется вносить изменения во множество скриптов.
Итак, при заходе на сайт пользователь должен видеть: ленту новостей, журналы доступные для скачивания, гостевую книгу. Реализция происходит практически одинаково. Покажу на примере гостевой книги (см. листинг 1):
<?php require_once "config.php"; // Подключение файла конфигурации // Функция обрабатывает строку, и заменяет все bb-коды на html function bbcodes($str) { $bbcode = array( "/\[b\](.*?)\[\/b\]/is" =] "<strong>$1</strong>", "/\[u\](.*?)\[\/u\]/is" =] "<u>$1</u>", "/\[url\=(.*?)\](.*?)\[\/url\]/is" =] "<a href='$1'>$2</a>", "/\[color\=(.*?)\](.*?)\[\/color\]/is" =] "<font color='$1'>$2</font>", "/\[i\](.*?)\[\/i\]/is" =] "<i>$1</i>]", "/\[quote\](.*?)\[\/quote\]/is" =] "<div class=\"quote\">$1</div>", "/\[img\](.*?)\[\/img\]/is" =] "<img src=\"$1\">" ); $str = preg_replace(array_keys($bbcode), array_values($bbcode), $str); return $str; } // Функция взята из мануалов по PHP // Подключение к БД $db = mysql_connect($db_server, $db_user, $db_pass); mysql_select_db($db_name); // Выбираем из таблицы table_gb последние 30 записей и сортируем их по id $db_query=mysql_query("SELECT * FROM `table_gb` ORDER BY `id` DESC LIMIT 0 , 30", $db); while ($res = mysql_fetch_array($db_query)) // Вывод записей { echo "<div class=\"guest_comment\"><b>".$res['name']."- ".$res['date']."</b><br>"; echo bbcodes(wordwrap("<pre>".$res['text']."</pre>", 75)); echo "</div><br>"; } ?> // Тут находится форма, для добавления записей в БД, которая передает скрипту gb.php данные
А теперь скрипт добавляющий записи в БД (см.листинг 2):
<?php require_once "config.php"; $db = mysql_connect($db_server, $db_user, $db_pass); mysql_select_db($db_name); // Получаем данные и убираем из них спец-символы, // для защиты от XSS-атак $name = htmlspecialchars($_POST['name']); $text = htmlspecialchars($_POST['text']); $date_array = getdate(time()); $date = $date_array['mday'].".".$date_array['mon'].".".$date_array['year']; if (($text=='') or ($text=='Введите текст')) { echo "<script>alert('Запись не добавлена.');</script>"; echo '<meta http-equiv="Refresh" content="0; URL='."$index_path".'">'; } else { if (($name=='Ваше имя') or ($name=='')) {$name='Аноним';} // Добавляем запись в БД $db_query = mysql_query("INSERT INTO `table_db` ( `id` , `name` , `text` , `date` ) VALUES ('', '$name', '$text', '$date');", $db); mysql_close($db); echo "<script]alert('Запись добавлена');</script>"; echo '<meta http-equiv="Refresh" content="0; URL='."$index_path".'">'; } ?>
Аналогичным образом выводятся записи для новостей, журналов для закачки и другая информация (см. рисунок 2):
Подведем предварительные итоги…
Что есть и что планируется? Пока сделано очень мало, и нововведения** будут появляться практически каждый день. Совсем скоро будет система регистрации, что позволит комментировать статьи, новости и выставлять им оценки. У каждого пользователя будет личный кабинет. Создавать отдельный форум для сайта не планируется, так как это совместный проект Клуба ПРОграммистов www.programmersclub.ru и форум уже есть. Существующие алгоритмы тоже будут улучшены. Все предложения оставляйте либо на форуме, либо отправляйте на электронный ящик редакции.
Это статья из третьего номера журнала “ПРОграммист”.
Скачать его можно по ссылке.
Ознакомиться со всеми номерами журнала.
Обсудить на форуме — Разработка ресурса для журнала. Часть 1
7th
Май
Авторизация “В контакте”
procedure TForm1.Button1Click(Sender: TObject);
var data:tstringlist;
PageProfile, pic:string;
error:boolean;
beginpos, endpos : Integer;
ms: TMemoryStream;
jpeg: TJpegImage;
begin
IdHTTP1.AllowCookies:=true;
IdHTTP1.HandleRedirects:=false;
data:=tstringlist.create;
data.Add('email=ЛОГИН'); // логин для авторизации
data.Add('pass=ПАРОЛЬ'); // пароль для авторизации
data.Add('expire=');
data.Add('vk=');
error:=false;
try
PageProfile:=IdHTTP1.Post('http://login.vk.com/?act=login', data);
except
error:=true;
end;
if not(error) then
begin
data.Clear;
data.Add('s='+Copy(PageProfile, Pos('value', PageProfile)+7, 56));
data.Add('op=slogin');
data.Add('redirect=1');
data.Add('expire=0');
data.Add('to=');
IdHTTP1.HandleRedirects:=true;
try
PageProfile:=IdHTTP1.Post('http://vkontakte.ru/login.php', data);
except
end;
beginpos := Pos('center', PageProfile);
endpos := PosEx('/>', PageProfile, beginpos + 21);
pic := Copy(PageProfile, beginpos + 21, endpos - (beginpos + 21));
Memo1.Lines.Add(pic);
ms := TMemoryStream.Create;
jpeg := TJpegImage.Create;
try
IdHTTP1.Get(pic, ms);
ms.Position := 0;
jpeg.LoadFromStream(ms);
Image1.Picture.Graphic := jpeg;
finally
jpeg.Free; ms.Free;
end;
end
else
Memo1.Lines.Add('Авторизация не удалась');
Data.Free;
end;
7th
Как скачать файл?
Alex2009:
uses
URLMon, ShellApi;function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
except
Result := False;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
const
SourceFile = ‘http://rap-zt.at.ua/style/photo/cover2/mafon.jpg’;
DestFile = ‘c:\temp\mafon.jpg’;
begin
if DownloadFile(SourceFile, DestFile) then
begin
ShowMessage(’Файл скачанl!’);
ShellExecute(Application.Handle, PChar(’open’), PChar(DestFile),
PChar(”), nil, SW_NORMAL)
end
else
ShowMessage(’Ошибка закачки ‘ + SourceFile)
end;
3rd
Май
Пример авторизации на WordPress
Пример авторизации на WordPress и получения результата авторизации (поиск “action=logout” на странице, вместо “action=logout” может быть любое слово/ссылка для проверки):
var
post:TStringList;
result:string;
begin
post:=TStringList.Create;
try
// Параметры
post.Add(’log=admin’);
post.Add(’pwd=123456′);
post.Add(’rememberme=forever’);
post.Add(’wp-submit=Войти’);
post.Add(’redirect_to=http://site.net/wp-admin/’);
post.Add(’testcookie=1′);
// Отправляем данные
result:=IdHTTP1.Post(’http://site.net/wp-login.php’, post);
// Результат (поиск “action=logout” на странице после авторизации)
if Pos(’action=logout’, result)>0 then
MessageDlg(’Авторизация прошла успешно!(искомый текст на странице найден)’, mtInformation, [mbOK],0)
else
MessageDlg(’Авторизация Провалилась!(искомый текст не найден)’, mtInformation, [mbOK],0);
except
post.Free;
end;
28th
Авг
Создание почтового клиента в Delphi 7
В этой статье я поэтапно объясню, как создать почтовик средствами Delphi: подключение к почтовому серверу, получение и обработка почты, завершение соединения.
Облако меток
css реестр ассемблер timer SaveToFile ShellExecute программы массив советы word MySQL SQL ListView pos random компоненты дата LoadFromFile form база данных сеть html php RichEdit indy строки Win Api tstringlist Image мысли макросы Edit ListBox office C/C++ memo графика StringGrid canvas поиск файл Pascal форма Файлы интернет Microsoft Office Excel excel winapi журнал ПРОграммист DelphiКупить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)