Последние записи
- 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
25th
Авг
Создание логотипа для журнала ПРОграммист
Предлагаю здесь выкладывать работы, которые претендуют на то, чтобы стать логотипом журнала ПРОграммист. Я знаю, что здесь есть много креативных людей. Не лучший ли это случай проявить свою фантазию и дизайнерские навыки?
Внимание!
Логотип будет размещаться в левом верхнем углу, там где надпись “ПРОграммист” на каждой странице
Следовательно, исходить нужно из этих предпосылок, т.е. не делать мелких деталей.
Кроме того, нужен логотип-баннер (для обмена ссылками) журнала
Его тоже можно здесь выкладывать.
21st
Авг
Полупрозрачность в Delphi
И так, как сделать окошко в дельфи прозрачным с красивыми тенями и другой мутью.
Перво наперво, качаем gdiplus.dll (если есть желание) с MS Official Site
Потом смотрим мои (DIB) и не мои (GdiPlus) модули в аттаче.
И так… Подготовим плацдарм для нашего окошка
код:
const
WndClassName = ‘Trulyalya’;
var
WndClass: TWndClass = (
style: CS_DBLCLKS;
cbClsExtra: 0;
cbWndExtra: 0;
hbrBackground: 0;
lpszMenuName: NIL;
lpszClassName: WndClassName;
);
…
initialization
WndClass.lpfnWndProc := @DefWindowProc; // I hope…
WndClass.hInstance := HInstance;
WndClass.hIcon := LoadIcon(HInstance, ‘MAINICON’);
WndClass.hCursor := LoadCursor(0, IDC_ARROW);
Windows.RegisterClass(WndClass);
finalization
Windows.UnregisterClass(WndClassName, HInstance);
И так у нас есть зарегиный класс, вот ведь счастье ну мы не собираемся на этом останавливаться и пойдем до конца! Теперь давайте создадим окошко
Код:
hWnd := CreateWindowEx(WS_EX_TOOLWINDOW or WS_EX_LAYERED,
WndClass.lpszClassName, NIL, WS_POPUP or WS_VISIBLE, 0, 0, 0, 0, 0, 0, HInstance, NIL);
Думаю то что здесь, понять не составит труда. Теперь стоит понять, что у нас есть окошко со стилем WS_EX_LAYERED и это дает нам по сути установить и отобразить любое 32х битное изображение разумеется в формате ARGB никакие PNG и т.п. на прямую не ставятся. Как же это сделать?
Код:
Context: GpGraphics;
Tmp: TDIB;
Image: TDIB;
Rect: TRect;
begin
// Rect := GetWindowRect(); / GetClientRect(); не помню как точно, сами разберетесь
Tmp := TDIB.Create(Rect.right – Rect.left, Rect.bottom – Rect.top); // создаем битмап по размеру окна
Image := TDIB.Create(’my_image.png’); // загрузим какое то изображение
GdipCreateFromHDC(Tmp.DC, Context); // создадим контекст GDI+ c Tmp
GdipSetSmoothingMode(Context, SmoothingModeAntiAlias); // antialias включим
GdipSetCompositingMode(Context, CompositingModeSourceCopy); // рисование с перекрытием
GdipSetInterpolationMode(Context, InterpolationModeHighQualityBicubic); // качественно масштабировать изображения
GdipDrawImageRectRect(Context, Image.Bitmap,
0, 0, Tmp.Width, Tmp.Height, // покрываем все окно
0, 0, Image.Width, Image.Height, // берем все изображение
UnitPixel, NIL, NIL, NIL);
GdipDeleteGraphics(Context);
Image.Free();
И так, мы узнали размер окна, создали битпам для окна, загрузили картинку, связали GDI+ с Tmp и нарисовали с помощью GDI+ нашу картинку, потом все освободили. Теперь у нас есть Tmp на с отрисованной картинкой. Осталось дело за малым, отобразить на окне.
Код:
BlendFunc: TBlendFunction;
ZPoint: TPoint;
LeftTop: TPoint;
Size: TSize;
Rect: TRect;
begin
with BlendFunc do
begin
BlendOp := AC_SRC_OVER;
BlendFlags := 0;
AlphaFormat := AC_SRC_ALPHA;
SourceConstantAlpha := 255; // не желательно менять это, да станет прозрачней, но тормаза начнутся, лучше перерисовать сам битмап в более прозрачный.
end;
// Rect := GetWindowRect(); / GetClientRect(); не помню как точно, сами разберетесь
ZPoint := Point(0, 0);
LeftTop := Point(Rect.left, Rect.top);
Size.cx := Rect.right – Rect.left;
Size.cy := Rect.bottom – Rect.top;
UpdateLayeredWindow(hWnd, 0, @LeftTop, @Size, Tmp.DC, @ZPoint, 0, @BlendFunc, ULW_ALPHA);
Разумеется, не забудьте сделать это Tmp.Free();
Опять такие, это мануалчик, проверять не могу сейчас, да и думаю тут суть ясна, садитесь и пробуйте.
DIB.rar
20th
Авг
Регистры и смещение
Смещение – это адрес в памяти, относительно точки отсчета. В данном случае точка отсчета не начало памяти, а адрес начала сегмента.
Эти извращенства были придуманы когда компьютеры были большими, а память маленькой. При таком раскладе команда занимает меньше места (адрес получается более коротким, а память-то совсем маленькая), для поддержки всего этого есть регистр, хранящий адрес начала сегмента, процессор сам заботится о том, что бы приплюсовать (или сделать конкатенацию, смотря как там устроено) смещение к базе, при работе с памятью.
Ну, сегментная модель памяти осталась в прошлом (и слава богу). В Win32 используется плоская модель памяти – это когда вся память представлена одним большим массивом из байт. Соответственно, многие из сегментных сегментов потеряли смысл и сегодня они эквивалентны (указывают на одну и ту же область памяти).
Очень грубо понять сегмент и смещение можно так: сегмент – это переменная типа массив 0..65535 из байт (к примеру). Смещение – это индекс в массиве. Чтобы обратиться к ячейке памяти (т.е. элементу массива) вам нужно взять адрес начала массива (сегмент) и прибавить к нему индекс (смещение). Т.е. когда вы говорите просто “индекс 15″ – вы не можете узнать, про какой байт идёт речь, пока вы не скажете от какого массива этот индекс. Иными словами, индекс имеет смысл, только будучи приписан к массиву (”индекс относителен к началу массива”). Аналогично и смещение задаёт сдвиг от начала сегмента.
Связано это с тем, что 16-ти разрядное число не может адресовать много памяти. Зато два числа (сегмент + смещение) дают большую свободу. Эта модель – не более, чем обходной путь. В 32-х разрядном мире смысла в этих изворотах нет.
Ну а параграф – это просто 16 байт.
Лучше всего это понять, рисуя на бумажке. Неужто в книге нет иллюстраций?
Вообще, эту информацию можете смело пропустить – я не думаю, кто она хоть как-то применима в мире Win32, если только вы не станете писать приложения под Windows 3.1.
P.S. Возможно, вам будет интересно.
12th
Авг
Радиолюбительский эфир в Интернете…
…так сказать в продолжение изысканий
…для тех кто увлекается или кто интересуется или не имеет возможности приобрести настоящую станцию-трансивер, но горит желанием узнать в чем тусня – есть два сервиса (наиболее стабильных) покрутить виртуальную ручку настройки и послушать эфир:
1- http://www.globaltuners.com/receiver/list.php?free=1 (требуется регистрация)
2- http://websdr.ewi.utwente.nl:8901 (вещание в MPEG потоке)
Для облегчения процесса и чтоб не лазить по сайтам с регистрацией, склепал онлайн-приемник потоков с радиолюбительских серверов (к примеру, SDR приемник Vivenna2 в Австрии часто ловит станцию с перевернутым речевым-спектром, кто сталкивался – знает) >>> см. вложения
p.s.: можно конечно сграбить адреса и винампом слухати, но это не наш метод вот адреса:
Vienna 2 – DX Node / Austria / Icom IC-756=http://212.108.34.182:8888/audio/low
Vienna 1 – CNode / Austria / Icom PCR-1500=http://212.108.34.182:8000/audio/low
Vidablick / Sweden / Icom AH-7000=http://62.119.128.101:8900/audio/low
Odenwald / Germany / Icom PCR-1000=http://94.249.216.106:3333/audio/low
Bratislava / Slovakia / Icom PCR-1000 25-1300MHz=http://62.168.109.2:5505/audio/low
Breda / Netherlands / Icom PCR-1000=http://82.170.170.203:3333/audio/low
p.s.: также есть возможность выйти в эфир на реальной станции (цифровой трансивер) посредством VoIP через Интернет (уже существуют готовые приложения) – VoIP радиолюбительский интернет-репитер >>> см. вложения
Вложения:
онлайн-приемник вещательных станций + радиолюбительских серверов.zip
VoIP радиолюбительский интернет-репитер.zip
описание_VoIP радиолюбительский интернет-репитер.pdf
7th
Авг
Через какой порт лучше управлять шаговым двигателем?
Через COM, или LPT? А может USB?
В теме обсуждается, какой порт выбрать для управления шаговым двигателем. Присоединится к обсуждению.
4th
Авг
Обозреватель раздела “БД в Delphi”
— название темы;
— автор темы;
— автор вложения в теме;
— прямая ссылка на скачивание вложения;
— прямая ссылка на саму тему.
Возможности:
— поиск вложения по названию темы. Чтобы найти вложение, если известно точное название темы, то просто копируете и вставляете название темы в соотвествующее поле для поиска и выполняете поиск. По синим ссылкам вверху программы, Вы можете прямиком попасть как на само вложение, так и на саму тему.
— возможность поиска по ссылке на тему;
— возможность поиска темы по ссылке на вложение.
Саму программу Вы можете скачать по ссылке ниже.
P.S. Модераторы, я посчитал нужным сделать данную тему со статусом “Важная”, т.к. она имеет самое непосредственное отношение именно к разделу, в котором она выложена. Я буду допросматривать остальные страницы раздела. Пока просмотрел только 30 страниц. По мере увеличения моей БД, я буду выкладывать новые версии сюда.
Жду отзывов и предложений от скачавших . Думаю, что она может пригодится.
————————————————————————
Обновил БД в программе. Теперь количество записей увеличилось до 111
4th
Еще одна CMS от нашего форумчанина
Друзья, я вот от нечего делать начал писать свою CMS. Написана она на php, и еще очень сырая. Готово лишь процентов 50. Но тем не менее, пользоваться этой цмс-кой уже можно, хотя и не совсем удобно. А местами даже и страшно. CMS писал с нуля, сам (естественно, что яваскрипт фрейморки написаны не мной и еще некоторые шаблоны html),пишу этот проект уже с мая месяца. Основной уклон сайта который вы увидете на видео – музыка и общение. Сайт построен на оконной системе. Иными словами, внешним видом главная страница сайта напоминает рабочий стол windows. Все теже окна и
ярлычки которые можно таскать… На этой ЦМС уже мона постить новости,материалы(файлы),регистриро ваться,авторизироваться,писать комментарии, и вообщем еще некоторый минимально-необходимый функционал. Так-же в ЦМС встроен небольшой поисковичок. Да и еще…по скольку это всего лишь тестовая версия, то не обращайте особо внимания на картинки и ярлыки…их все равно заменю)))
Видео
P.S:Рекомендую смотреть видео в полноэкранном режиме и в высоком качестве, дабы все нормально видеть. Хотя вообщем и так все понятно.
Вообщем не судите строго…это первый мой крупный проект с претензиями на CMS. Думаю, что в скором времени доделаю её..
3rd
Авг
ПРОграммируемый робот, управляемый с КПК
raxp:
…книжка замечательного автора Дугласа Вильямса …будет полезна не только фанатам роботостроения, но и программистам в других областях. Вы спросите почему?
Краткие выдержки из содержания:
- работа с микроконтроллерами и ИК передатчиками
- изготовление аппаратной части (электр.начинка робота, . инфракрасный дальномер, движки), печатной платы и т.д. и т.п.
- как задействовать ИК канал связи / + код
- ПО под PalmOS
- ПО под WinCE
- видеосвязь (работа с VFW) / + код
- отправка данных с помощью FTP / + код
- беспроводное управление и линия передачи данных до робота (wi-fi) / + код
- детектор движения / + код
…сопровождается исходным кодом.
ПРОграммируемый робот управляемый с КПК.zip
по теме роботостроения надыбал дюже интересный видеоролик
1st
Авг
Общие принципы работы с сайтом vkontakte.ru
И так начнем. Я выкладываю функции которые мне известны И У КОТОРЫХ 100% РАБОТОСПОСОБНОСТЬ!
АВТОРИЗАЦИЯ ВКОНТАКТЕ:
function vk_login(Login, Pass : string; IdHTTP : TIdHTTP): Boolean;
var
sl : TStringList;
text : string;
begin
sl := TStringList.Create;
sl.Add('email=' + Login + '&pass=' + Pass + '&expire=&vk=');
text := IdHTTP.Post('http://login.vk.com/?act=login',sl);
if Pos('Aoia',text)<>0 then begin
MessageBox(Application.Handle,'Iaaa?iua aaiiua: Eiaei , Ia?ieu','Ioeaea',0);
Result := False;
end else begin
text := Copy(text,Pos('name=' + #39 + 's' + #39,text)+16,PosEx(#39,text,Pos('name=' + #39 + 's' + #39,text)+17)-Pos('name=' + #39 + 's' + #39,text)-16);
IdHTTP.Request.CustomHeaders.Add('Cookie:remixchk=5; remixsid=' + text);
Result := True;
end;
sl.Free;
end;
ВЫЗОВ ФУНКЦИИ:
vk_login(Edit1.Text,Edit2.Text,IdHTTP1);
ПОЛУЧЕНИЕ СООБЩЕНИЙ ВКОНТАКТЕ:
function VK_ParsEmail(s:string; IdHTTP1:TIdHTTP): TStringList;
var
i : Integer;
mess_full, mess_text,
mess_id, mess_new,
mess_aut, mess_aut_id,
mess_date, mess_title : string;
sl : TStringList;
begin
Result := TStringList.Create;
i := 1;
s := Copy(s,PosEx('</tr>',s,Pos('<div id="messages_wrap">',s))+6,PosEx('</table>',s,Pos('<div id="messages_wrap">',s))-PosEx('</tr>',s,Pos('<div id="messages_wrap">',s))-6);
while PosEx('<tr ',s,i)<>0 do
begin
mess_full := Copy(s,PosEx('<tr ',s,i),PosEx('</tr>',s,PosEx('<tr ',s,i))-PosEx('<tr ',s,i));
// Iieo?aiea id niiauaiey
mess_id := Copy(mess_full,Pos('id="',mess_full)+8,PosEx('"',mess_full,Pos('id="',mess_full)+9)-Pos('id="',mess_full)-8);
// iiaia ee yoi niiauaiea
if Pos('class='+#39+'newRow'+#39,mess_full)<>0 then mess_new := '1' else mess_new := '0';
if mess_new = '1' then
begin
// Io eiai niiauaiea
mess_aut := Copy(mess_full,PosEx('">',mess_full,Pos('<div>',mess_full)+19)+2,PosEx('</a>',mess_full,PosEx('">',mess_full,Pos('<div>',mess_full)+19)+3)-PosEx('">',mess_full,Pos('<div>',mess_full)+19)-2);
// EA iieuciaaoaey, eioi?ue i?eneae niiauaiea
mess_aut_id := Copy(mess_full,Pos('href="',mess_full)+7,PosEx('">',mess_full,Pos('href="',mess_full)+8)-Pos('href="',mess_full)-7);
// Aaoa, eiaaa i?eoei niiauaiea
mess_date := Copy(mess_full,Pos('class="date">',mess_full)+13,PosEx('</div',mess_full,Pos('class="date">',mess_full)+14)-Pos('class="date">',mess_full)-13);
//Oaia niiauaiey
mess_title := Copy(mess_full,PosEx('<span>',mess_full,Pos('new messageSubject',mess_full))+6,PosEx('</span>',mess_full,Pos('new messageSubject',mess_full))-PosEx('<span>',mess_full,Pos('new messageSubject',mess_full))-6);
// Oaeno niiauaiey
mess_text := IdHTTP1.Get('http://vkontakte.ru/mail.php?act=show&id='+ mess_id);
mess_text := Copy(mess_text,PosEx(';">',mess_text,Pos('class="messageText"',mess_text))+3,PosEx('</div>',mess_text,Pos('class="messageText"',mess_text))-PosEx(';">',mess_text,Pos('class="messageText"',mess_text))-3);
end;
Result.Add(mess_aut+' '+mess_aut_id+' '+mess_date+' '+mess_text);
i := PosEx('<tr ',s,i)+2;
Sleep(300);
end;
end;
ВЫЗОВ ФУНКЦИИ:
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Lines := VK_ParsEmail(IdHTTP1.Get('http://vkontakte.ru/mail.php'),IdHTTP1);
end;
Следите за темой на форуме. Форумчанин Dionix настроен серьезно.
26th
Июл
Обсуждаем оболочки С/С++
Tema_Crazzzy:
Доброго всем времени суток!
Я перепробовал кучу оболочек под С/С++ и остался доволен лишь парой, а скорее всего одним (Dev cpp) ….А какая оболочка по душе вам? И почему?
Облако меток
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 (Компьютерное железо)