воскресенье, 16 ноября 2008 г.

Пока, конец...

Блог заброшен в связи отсутствия интереса и времени к нему.

четверг, 27 марта 2008 г.

Начало нового проекта.

Думаю в скором будущем появиться новая программа, относительно новая, хочу сделать нечто похожее на терминал кпк или ремотадмин, чтобы можно было управлять с кпк большим братом.
Суть идеи состоит в том чтобы можно было управлять мышкой и клавой с маленького брата, большим.
На экран кпк приходит картинка экрана с монитора, плюс эту картинку можно маштабировать. Очень удобно смотреть фильмы, только со звуком еще пока не знаю как поступить.
Все это дело будет приходить через tcp/ip протокол, так что можно будет подключиться по вафле и юзать, еще будет удобно рисовать стилусом, так как мышкой рисовать не очень удобно.
Часть этой идеи мне подкинул мой друг Вахрушев Илья, так что спасибо тебе Илюха.

Выкладываю обработку Сокетов, все очень просто, разрабатывал на Lazarus`е:

unit TSock;

{$mode DELPHI}{$H+}

interface

uses
Classes, SysUtils, WinSock, Windows;

type

{ TSockServer }

TSockServer = class // Класс сокет сервера
WSADat : WSAData;
Sock,Client : TSocket;
private
public
ClientS: String;
function InitSock(Port:integer):integer;
function RecvData(Buf:pointer;Len:integer):integer;
function SendData(Buf:pointer;Len:integer):integer;
procedure CloseSock;
end;

{ TSockClient }

TSockClient = class
WSADat : WSAData;
Sock : TSocket;
private
public
ServerS: String;
function InitSock(IP:String;Port:integer):integer;
function RecvData(Buf:pointer;Len:integer):integer;
function SendData(Buf:pointer;Len:integer):integer;
procedure CloseSock;
end;


implementation

{ TSockServer }

function TSockServer.InitSock(Port: integer):integer;
var
sin : sockaddr_in;
begin
WSAStartup($0202,WSADat);
sin.sin_family := AF_INET;
sin.sin_addr.s_addr := INADDR_ANY;
sin.sin_port := htons(Port);
Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(Sock, sin, sizeof(sin));
result:=listen(Sock, SOMAXCONN);
Client := accept(Sock, @sin, 0);
ClientS:=inet_ntoa(sin.sin_addr);
end;

function TSockServer.RecvData(Buf:pointer;Len:integer):integer;
begin
result:=recv(Client, Buf, len, 0);
end;

function TSockServer.SendData(Buf: pointer; Len: integer):integer;
begin
result:=send(Client, buf, len, 0);
end;

procedure TSockServer.CloseSock;
begin
closesocket(Sock);
closesocket(Client);
WSACleanup();
end;

{ TSockClient }

function TSockClient.InitSock(IP:String;Port: integer):integer;
var
sin : sockaddr_in;
begin
WSAStartup($0202,WSADat);
sin.sin_family := AF_INET;
sin.sin_addr.s_addr := inet_addr(PChar(IP));
sin.sin_port := htons(Port);
Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
result:=connect(Sock, sin, sizeof(sin));
ServerS:=inet_ntoa(sin.sin_addr);
end;

function TSockClient.RecvData(Buf: pointer; Len: integer): integer;
begin
result:=recv(Sock, Buf, len, 0);
end;

function TSockClient.SendData(Buf: pointer; Len: integer): integer;
begin
result:=send(Sock, Buf, len, 0);
end;

procedure TSockClient.CloseSock;
begin
closesocket(Sock);
WSACleanup();
end;

end.

Ну и исходники программ чата сервер и клиент.

http://dump.ru/files/o/o38666823/

понедельник, 3 марта 2008 г.

YConvert src

Вот я наконец и вышел с праздников наверно.
Исходники на YConvert, не знаю почему, но кнопки смещаються относитьльно
панелей, короче смотрите исходники.

http://ifolder.ru/5596563

понедельник, 18 февраля 2008 г.

YConvert

Программа сделанная на Lazarus.



Выведенны кнопки для удобной печати без клавиатуры.

Качать:

http://dump.ru/files/o/o98593977/

понедельник, 11 февраля 2008 г.

Исходники к проекту VOAManager

Чу чуть криво но вроде все работает:
http://dump.ru/files/o/o920184640/ качать весь проект отсюда.
Создаем проект, но галочку на пустой не ставим.
Выйдет много файлов.
Добавляем файлы FormFunc.cpp и FormFunc.h
В них

FormFunc.cpp

#pragma once
#include "stdafx.h"
#include windows.h
#include "FormFunc.h"

struct FileCFG{int nled,
len,
ondown,
onsip,
keyon;};    // структура для файла конфигурации

int CreateWin(CREATESTRUCT* pCreateStruct)  // упращаем вывод на экран
{
LPCWSTR StaticS[6] = {L"Num Led:",L"Length:",L"On Down:",L"On Sip:",L"Key On:",L"Add Config:"};  // строки для статического текста
LPCWSTR EditS[6] = {L"1",L"50",L"1",L"1",L"0",L""}; // строки для едитов


for (int i=0;i<6;i++)>hInstance, NULL)) return 1; // создаем в цикле статики
if (!CreateWindow(L"edit", EditS[i], WS_BORDER|WS_CHILD|WS_VISIBLE,
10, (40*i)+23, 90, 18, hWndF,
HMENU(IDC_MyEDIT+i),
pCreateStruct->hInstance, NULL)) return 1; // создаем в цикле едиты
}
return 0;
}

int LoadCFG()
{
WCHAR szPath[MAX_PATH];
GetModuleFileName(g_hInst,szPath,MAX_PATH);
(*((wcsrchr(szPath,'\\'))+1))=0;
StringCchCat(szPath,MAX_PATH,L"\\VOAManager.cfg");
HANDLE hFile = CreateFile(szPath,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(!hFile) return 1;

FileCFG CFG;
DWORD dwBytesRead;

if(!ReadFile(hFile,&CFG,sizeof FileCFG,&dwBytesRead,NULL))
{
CloseHandle(hFile);
return GetLastError();
}
CloseHandle(hFile);
wchar_t* s = new wchar_t[255];
_itow(CFG.nled,s,10);
SendDlgItemMessage(hWndF,IDC_MyEDIT+0,WM_SETTEXT,0,(LPARAM)s);
_itow(CFG.len,s,10);
SendDlgItemMessage(hWndF,IDC_MyEDIT+1,WM_SETTEXT,0,(LPARAM)s);
_itow(CFG.ondown,s,10);
SendDlgItemMessage(hWndF,IDC_MyEDIT+2,WM_SETTEXT,0,(LPARAM)s);
_itow(CFG.onsip,s,10);
SendDlgItemMessage(hWndF,IDC_MyEDIT+3,WM_SETTEXT,0,(LPARAM)s);
_itow(CFG.keyon,s,10);
SendDlgItemMessage(hWndF,IDC_MyEDIT+4,WM_SETTEXT,0,(LPARAM)s);
delete s;
return 0;
}

int SaveCFG()
{

wchar_t* s = new wchar_t[255];
SendDlgItemMessage(hWndF,IDC_MyEDIT+0,WM_GETTEXT,255,(LPARAM)s);
int nl = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+1,WM_GETTEXT,255,(LPARAM)s);
int len = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+2,WM_GETTEXT,255,(LPARAM)s);
int od = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+3,WM_GETTEXT,255,(LPARAM)s);
int os = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+4,WM_GETTEXT,255,(LPARAM)s);
int ko = _wtoi(s);
delete s;

WCHAR szPath[MAX_PATH];
GetModuleFileName(g_hInst,szPath,MAX_PATH);
(*((wcsrchr(szPath,'\\'))+1))=0;
StringCchCat(szPath,MAX_PATH,L"\\VOAManager.cfg");
HANDLE hFile = CreateFile(szPath,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(!hFile) return 1;

FileCFG CFG;
DWORD dwBytesWrite;
CFG.keyon=ko;
CFG.len=len;
CFG.nled=nl;
CFG.ondown=od;
CFG.onsip=os;
if(!WriteFile(hFile,&CFG,sizeof FileCFG,&dwBytesWrite,NULL))
{
CloseHandle(hFile);
return GetLastError();
}

CloseHandle(hFile);
return 0;
}

int RunVOA()
{
HWND hWindow;
PROCESS_INFORMATION pi;

WCHAR szPath[MAX_PATH];
GetModuleFileName(g_hInst,szPath,MAX_PATH);
(*((wcsrchr(szPath,'\\'))+1))=0;
StringCchCat(szPath,MAX_PATH,L"\\VOA.exe");
// получаем путь и добавляем к пути файл ВОА

hWindow = FindWindow(L"VOA", 0); 
// у меня не работает так как вибрации у меня нет и файл VOA не запускаеться
if (hWindow)
{
CreateProcess(szPath, L"", NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
}
// находим VOA если он запущен запускаем его чтобы он выгрузился (задумка автора VOA )
if(!hWindow) //проверяем на всякий пожарный запущен ли он если нет
{
wchar_t* s = new wchar_t[10];
wchar_t* SS = new wchar_t[255];

SendDlgItemMessage(hWndF,IDC_MyEDIT+0,WM_GETTEXT,255,(LPARAM)s);
int nled = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+1,WM_GETTEXT,255,(LPARAM)s);
int len = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+2,WM_GETTEXT,255,(LPARAM)s);
int ondown = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+3,WM_GETTEXT,255,(LPARAM)s);
int onsip = _wtoi(s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+4,WM_GETTEXT,255,(LPARAM)s);
int keyon = _wtoi(s);  // смысол такой получаем все с едитов и добавляем в одну стр
SS[0]=0;
_itow(nled,s,10);
StringCchCat(SS,255,L" -nled ");
StringCchCat(SS,255,s);
_itow(len,s,10);
StringCchCat(SS,255,L" -len ");
StringCchCat(SS,255,s);
_itow(ondown,s,10);
StringCchCat(SS,255,L" -ondown ");
StringCchCat(SS,255,s);
_itow(onsip,s,10);
StringCchCat(SS,255,L" -onsip ");
StringCchCat(SS,255,s);
_itow(keyon,s,10);
StringCchCat(SS,255,L" -keyon ");
StringCchCat(SS,255,s);
SendDlgItemMessage(hWndF,IDC_MyEDIT+5,WM_GETTEXT,255,(LPARAM)s);
StringCchCat(SS,255,L" ");
StringCchCat(SS,255,s);
delete(s);
if(!CreateProcess(szPath, SS, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi))
{ // вот здесь запускаем фал с командной строкой.
return 1;
}
}
return 0;
}


FormFunc.h

#define IDC_MySTATIC 10000
#define IDC_MyEDIT 20000

extern HINSTANCE g_hInst;
extern HWND hWndF;
extern int CreateWin(CREATESTRUCT* pCreateStruct);
extern int LoadCFG();
extern int SaveCFG();
extern int RunVOA();


VOAManager.cpp

// VOAManager.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "VOAManager.h"
#include "FormFunc.h"


#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE g_hInst; // current instance
HWND g_hWndMenuBar; // menu bar handle
HWND hWndF;

// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE, LPTSTR);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;

// Perform application initialization:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}

HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_VOAMANAGER));

// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}

//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass)
{
WNDCLASS wc;

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_VOAMANAGER));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = szWindowClass;

return RegisterClass(&wc);
}

//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
TCHAR szTitle[MAX_LOADSTRING]; // title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // main window class name

g_hInst = hInstance; // Store instance handle in our global variable

#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
// SHInitExtraControls should be called once during your application's initialization to initialize any
// of the device specific controls such as CAPEDIT and SIPPREF.
SHInitExtraControls();
#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP
HWND hWnd;
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_VOAMANAGER, szWindowClass, MAX_LOADSTRING);

#if defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)
//If it is already running, then focus on the window, and exit
hWnd = FindWindow(szWindowClass, szTitle);
if (hWnd)
{
// set focus to foremost child window
// The "| 0x00000001" is used to bring any owned windows to the foreground and
// activate them.
SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001));
return 0;
}
#endif // WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP

if (!MyRegisterClass(hInstance, szWindowClass))
{
return FALSE;
}

hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}
#ifdef WIN32_PLATFORM_PSPC
// When the main window is created using CW_USEDEFAULT the height of the menubar (if one
// is created is not taken into account). So we resize the window after creating it
// if a menubar is present
if (g_hWndMenuBar)
{
RECT rc;
RECT rcMenuBar;

GetWindowRect(hWnd, &rc);
GetWindowRect(g_hWndMenuBar, &rcMenuBar);
rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top);
MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE);
}
#endif // WIN32_PLATFORM_PSPC

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);


return TRUE;
}

//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

static SHACTIVATEINFO s_sai;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case ID_MENU_LOAD:
if (LoadCFG()>0){MessageBox(hWndF,L"Config not load.",L"Error",0);};
break;
case ID_MENU_SAVE:
if (SaveCFG()>0){MessageBox(hWndF,L"Config not saved.",L"Error",0);};
break;
case ID_EXIT:
SendMessage (hWnd, WM_CLOSE, 0, 0);
break;
case IDM_HELP_ABOUT:
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
break;
#ifdef WIN32_PLATFORM_PSPC
case IDM_OK:
{
if (SaveCFG()>0){MessageBox(hWndF,L"Config not saved.",L"Error",0);};
if (RunVOA()>0){MessageBox(hWndF,L"Not run 'VOA.EXE'",L"Error",0);};
SendMessage (hWnd, WM_CLOSE, 0, 0);
break;
}
#endif // WIN32_PLATFORM_PSPC
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
#ifdef SHELL_AYGSHELL
hWndF = hWnd;
CreateWin((LPCREATESTRUCT)lParam);
LoadCFG();


SHMENUBARINFO mbi;

memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MENU;
mbi.hInstRes = g_hInst;

if (!SHCreateMenuBar(&mbi))
{
g_hWndMenuBar = NULL;
}
else
{
g_hWndMenuBar = mbi.hwndMB;
}

// Initialize the shell activate info structure
memset(&s_sai, 0, sizeof (s_sai));
s_sai.cbSize = sizeof (s_sai);
#endif // SHELL_AYGSHELL
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
#ifdef SHELL_AYGSHELL
CommandBar_Destroy(g_hWndMenuBar);
#endif // SHELL_AYGSHELL
PostQuitMessage(0);
break;

case WM_ACTIVATE:
// Notify shell of our activate message
SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
break;
case WM_SETTINGCHANGE:
SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
break;

default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
#ifdef SHELL_AYGSHELL
{
// Create a Done button and size it.
SHINITDLGINFO shidi;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
}
#endif // SHELL_AYGSHELL

return (INT_PTR)TRUE;

case WM_COMMAND:
#ifdef SHELL_AYGSHELL
if (LOWORD(wParam) == IDOK)
#endif
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;

case WM_CLOSE:
EndDialog(hDlg, message);
return (INT_PTR)TRUE;

}
return (INT_PTR)FALSE;
}

пятница, 8 февраля 2008 г.

Моя вторая программа. VOAManager

Вчера посидел по разбирался в с++.
Идеи чето не приходили в голову, и тут вспомнил про программу которая при нажатии стилусом дает кортковременную вибрацию, только настройки надо вводить с командной строке, решил сделать надстройку над этой программой, сделал.
Программа называется VOA автор constv
Ссылка на форум с программой VOA.
http://4pda.ru/forum/index.php?showtopic=68775

Назвал я её VOAManager.



Вот ссылки от куда качать VOAManager

WM2003 http://dump.ru/files/o/o034379187/
WM5  http://dump.ru/files/o/o1370462480/

На сайте указанном выше есть описание какие настройки должны быть, их и нужно вводить в поля.
VOAManager.exe должен находится в одной папке с VOA.exe вроде все.

четверг, 31 января 2008 г.

Теперь на visual C++ 2005

Создаём новый проект, выбераем smart device\ Win32 smart device project
В Name пишем имя проекта, OK


Нажимаем Next

Еще раз

ставим галочку empty project и финиш


Вот что получилось, теперь нажмем провой кнопкой на левую панель
выберем add\new item...


выберем C++ File (.cpp)


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




#include -=windows.h=-
#include -=commctrl.h=-
#include "resource.h"

HWND hWinMain;
HINSTANCE hInst;
HANDLE Thread1;

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
DWORD WINAPI WaveOut(LPVOID pParm);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine,int nCmdShow)
{
MSG msg;

hInst = GetModuleHandle(0);
hWinMain = FindWindow(NULL,(LPCWSTR)"Proj3");
if (hWinMain)
{
ShowWindow(hWinMain, SW_SHOW);
SetForegroundWindow(hWinMain);
ExitProcess(0);
}
hWinMain = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),0,(DLGPROC)MainWndProc);
if (!hWinMain) ExitProcess(0);
ShowWindow(hWinMain,SW_SHOW);
UpdateWindow(hWinMain);
Thread1 = CreateThread(NULL,NULL,WaveOut,NULL,CREATE_SUSPENDED,NULL);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg,
WPARAM wParam, LPARAM lParam)
{
switch (wMsg) {
case WM_DESTROY:
EndDialog(hWnd, LOWORD(wParam));
break;
case WM_COMMAND:
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDC_BUTTON1:
PostQuitMessage(0);
break;
case IDC_BUTTON2:
ResumeThread(Thread1);
break;
case IDC_BUTTON3:
SuspendThread(Thread1);
break;
}
break;

}
return DefWindowProc(hWnd, wMsg, wParam, lParam);
}

DWORD WINAPI WaveOut(LPVOID pParm)
{
wchar_t* s = new wchar_t[255];
while (true)
{
_ltow((long)GetTickCount(),s,10);
SendDlgItemMessageW(hWinMain,IDC_STATIC1,WM_SETTEXT,0,(LPARAM)s);
}
delete s;
return 0;
}


Тут все должно быть ясно, так как все взято с прошлого примера
Теперь нам надо добавить форму с кнопками статический текст

Снова нажимаем правой кнопкой мыши на левую панель и добавляем resource file(.rc) во вкладке resource, и в нем уже добавляем диалог.



перед нами форма с двумя кнопками, давайте их удалим, выделяем и нажимаем делет
в пустую форму заносим две кнопки и static text.


Далее жмем на форму и изменяем размер и настройки
Title menu стави false
Control = true
В настройках static изменяем ID
на IDC_STATIC1 и вытягиваем на всю ширину формы.

Забыл... добавим еще одну кнопку.
Ну вроде все пробуем, F5. 

вторник, 29 января 2008 г.

Добавление потока

Добавим кнопку на форму Stop Thread с Control_ID = 5

Для добавления потока нужно чуть изменить код.
Сразу после Program project1
добавляем строку {$mode DELPHI} эта строка нужна для того чтобы компилятор был совместим с делфи.

Uses имеет такой вид
uses
windows, sysutils, messages, Classes;

sysutils содержит дополнительные функции
Classes содержит классы

В Var добавляем Thread1: TThreadID;

После него пишем процедуру

procedure Start;
var
s: WideString;
begin
while true do //Бесконечный цикл
begin
s:=IntToStr(GetTickCount); //в строку заносим время работы виндовса
SendDlgItemMessage(handle,4,WM_SETTEXT,0,longint(PWideChar(s))); //посылаем строку label`у
end;
end;


В procedure2 пишем

if Thread1=0 then
Thread1:=BeginThread(@Start)
else
ResumeThread(Thread1);


Создадим еще одну процедуру, угадайте как её назовем :)

procedure procedure3;
begin
suspendthread(Thread1);
end;


а обработку кнопки сделайте сами.

Всю программу можно скачать отсюда.



http://dump.ru/files/o/o031322806/
MD5 хеш файла: cbdcac516e8ed101e27a4f6bfff939e6

понедельник, 28 января 2008 г.

Первая программа

Все настройки произведены, теперь напишем простенькую программку с нескольками кнопками и Label`ами на API.

Все проекты рекомендую держать в одной папке например
мои докУменты\Lazarus Projects\

В ручную форму создавать я не буду, и создам её с помощью редактора ресурсов, для этого я использовал Resource Builder 2.6.4.1

Вот что у меня получилось:



В свойствах формы
Styles выставленно - DS_CONTROL
Windows Style выставленно - WS_POPUP WS_SYSMENU WS_CAPTION
в True остальное в False

Размер формы 168 на 223

На форме помещены три кнопки и два лэйбла(не знаю как пишется по руский)
Теперь выставляем Control_ID для всех элементов так
Кнопка с Caption=Label выставляем 0
Кнопка с Caption=Exit выставляем 1
Кнопка с Caption=Thread выставляем 3
Label0 выставляем 2
Label1 выставляем 4
Это нужно для того чтобы следующий код работал как надо.

Сохраняем под именем Form.res (не rc)
Вроде с формой все.
Теперь приступим к лазарю.
Нажимаем создать... и выбераем Program

Перед нами чистый проект.
Можно весь текст удалить и вставить вот это:

program project1;
{$R Form.res}  // Добавление ресурсов где находится форма

uses
windows, messages; // Без них никак, библеотеки

var
handle: Hwnd; //Handle окна
Msg: TMsg;  // для получения системных сообщений
inst: THandle; 

procedure procedure1; // Процедура нажатия кнопки Label
begin
SendDlgItemMessage(handle,
2,WM_SETTEXT,0,longint(PWideChar('Privet')));
// SendDlgItemMessage посылает сообщение Label0 об установки текста
// При создании формы мы указывали Control_ID у Label0 он равен 2
// WM_SETTEXT указывает что нужно установить текст
// longint(PWideChar('Privet')) это указатель на строку, так как мы используем константу то приходиться делать вот так.
end;

procedure procedure2; 
// Процедура нажатия кнопки Thread
begin
//Можете поэксперементировать здесь
end;

function WindowProc(Wnd:hwnd; uMsg:uint; wP:Wparam;lP:Lparam):Lresult; Stdcall;
// функция обработки сообщений главного окна
var nCode, ctrlID : word;
begin
if Umsg=wm_initdialog then
begin
result:=cardinal(true); // что делать при инициализации
end;
if Umsg=wm_command then
begin  // вот здесь обрабатываются наши кнопочки
nCode:=hiWord(wP);
ctrlID:=loWord(wP);
if ctrlid=1 then // Exit Button
begin
postquitmessage(0);
Result:=cardinal(true);
end;
if ctrlid=0 then procedure1; // Label Button
if ctrlid=3 then procedure2; // Thread Button
result:=cardinal(true);
end;
if umsg = wm_destroy then // уничтожение окна
begin
postquitmessage(0);
enddialog(wnd,0);
Result:=cardinal(true);
end;
if umsg = wm_close then // закрытие окна
begin
postquitmessage(0);
enddialog(wnd,0);
Result:=cardinal(true);
end;
result:=cardinal(false);
end;

var
h: HWND; //нужен для нахождения окна

begin
//szWindowClass , szTitle
h := FindWindow(nil,'Proj3'); // находим окно с заголовком Proj3
if (h<>0)then // Если нашли то покажем его и завершим эту программу
begin // подумайте для чего это нужно
ShowWindow (h, SW_SHOW);
SetForegroundWindow(h);
ExitProcess(0);
end;
inst:=GetModuleHandle(nil);
handle:=CreateDialog(inst,'DIALOG_0',0,@WindowProc); // Создание окна
if ((handle=INVALID_HANDLE_VALUE)or(handle=0)) then
begin
MessageBox(0,'Cant`t create dialog','Error ',0);
ExitProcess(0);
end;

showwindow(handle,SW_SHOW);
UpdateWindow(handle);

while GetMessage(@Msg, 0, 0, 0) do
begin
TranslateMessage(@msg);
DispatchMessage(@msg);
end;

end.


Попробуйте скомпилировать
и посмотреть что получится.

Настройка компилятора.
Проект\Параметры компилятора...

Закладки:

Пути\Другие модули
Пишем "$(LazarusDir)\lcl\interfaces\wince\" конечно без ковычег



Обработка



Код



Связывание



Все теперь можно пробывать.
Проще всего запускать программу на эмуляторе, а можно и на КПК.
Я пользуюсь первым.

Настройка эмулятора.

Скачиваем эмулятор и image файл к нему, у меня все установилось с Visual Studio 2005 правда там только Win CE 2003.
Все ссылки на эмуляторы и актив синк есть на этом сайте http://www.ladoshki.com/161_articles_Эмуляторы_Windows_Mobile_на_домашнем_компьютере.htm

Запускаем эмулятор в меню File\Configure...
прописать путь к вашим проектам.


Подчеркнуто синим.
Теперь будет проще, нажимаем в Лазаре Ctrl + F9 ждем строки
Проект успешно собран и переходи в эмуль, там тыкаем на приложение и все, смотрим своё творчество.

пятница, 25 января 2008 г.

Настройка и установка Lazarus

Установка Lazarus

скачиваем два файла с http://sourceforge.net/project/showfiles.php?group_id=89339

Lazarus-0.9.24-fpc-2.2.0-20071114-win32.exe
Lazarus-0.9.24-fpc-2.2.0-20071105-cross-arm-wince-win32.exe

Сначало устанавливаем первый
потом второй в тужу папку


Установка KOL и MCK

1. Скачиваем KOL и MCK для Lazarus с http://www.kolnmck.ru/files1.shtml или самая свежая версия svn http://sourceforge.net/projects/kol-ce/. Выкладываем скачанные файлы, например, в папку "...\Lazarus\KOL". Чтобы в дальнейшем не пришлось исправлять пути в пакете MCK, желательно сохранить структуру каталогов:
"...\Lazarus\KOL\kol" и "...\Lazarus\KOL\mck".
2. Устанавливаем МСК. Для этого:

* Открываем пакет MirrorKOLPackage.lpk (меню "Компоненты"->"Открыть файл пакета").



В результате открывается окно "Пакет MirrorKOLPackage".



* Компилируем [1] пакет, если все успешно, то получаем сообщение: "Compiling package MirrorKOLPackage 2.72" completed".



* Проверим "Настройки"[2] пакета. Вкладка "Встраивание в IDE": "Tип пaкeтa" должен быть "Toлькo для paзpaбoтки", а "Oбнoвить/пepeбpaть" - "Pучнaя кoмпиляция (нe aвтoмaтичecки)".



* Нажимаем кнопку "Установить" [3], на вопрос "Bы xoтитe пepeбpaть Lazarus ceйчac?" отвечаем "Да".



В результате Lazarus будет пересобран, в палитру компонентов будет добавлена вкладка "KOL" c зеркалами KOL-компонентов.
В случае успешной операции, Lazarus, после сборки, должен запуститься сам. Если этого не произошло (бывает иногда), значит что-то пошло не так, и обычно нужно повторить установку еще раз.


Установка KOL-компонентов сторонних разработчиков

1. Дополнительные компоненты KOL можно скачать отсюда: http://www.kolnmck.ru/files2.shtml. Те компоненты, которые поддерживают Lazarus и WinCE отмечены в соответствующей колонке.
2. Установка аналогична установке MСK.

Внимание!!! При использовании нескольких пакетов KOL-компонентов (например MirrorKOLPackage, KOLUpDown, DirTreeView, GRush Controls и т.д.), Lazarus, при установке\переустановке какого либо пакета, может иногда выдавать ошибку что не найден(ы) ранее установленый(е) пакет(ы). В этом случае обычно помогает открытие и перекомпиляция этого ранее установленого пакета.


Создание KOL- проекта

1. Создаем новый проект (меню "Пpoeкт"->"Создать проект").
2. Сохраняем его (меню "Файл"->"Сохранить все"). Например, "C:\Test\project1.lpi" .
3. Кладем на форму компонент TKOLProject, устанавливаем его свойство "projectDest", например, KOLProject.



4. Кладем на форму компонент KOLForm.
5. Сохраняем проект (меню "Файл"->"Сохранить все").
6. Открываем наш созданный KOL-проект. (меню "Пpoeкт"->"Открыть проект"). Он называется "KOLProject.lpi"
7. Сразу после открытия Lazarus ругается. Что то типа "Unit1.pas(15,4) Fatal: Can't open include file "MCKfakeClasses.inc".
Выполняем следующие действия:
- Открываем "Параметры компилятора проекта" (меню "Пpoeкт"->"Опции компилятора"). Прописываем пути к KOL



- Открываем pas-файл формы (Unit1.pas), ищем в нем строку "{$I Unit1.lrs}" и если находим, то удаляем ее нахрен.
- Подвигать форму :)).
8. Компилируем проект (меню "Запуск"->"Сборка") . Теперь должно получиться. Если все хорошо, то видим сообщение "Проект "KOLProject" успешно собран. :) ".



9. Exe-файл появился на диске "C:\Test\KOLProject.exe" и даже запускается! Вот только размер удручает: 1 011 718 байт.....
10. Открываем "Параметры компилятора проекта" (меню "Пpoeкт"->"Опции компилятора"), вкладка "Связывание". Убираем галку у "Bыдaть нoмepa cтpoк в oшибкax вpeмeни иcпoлнeния (-gl)" и ставим на "Bыpeзaть cимвoлы из бинapникa (-Xs)".



11. Компилируем проект. И... пришло счастье - размер 42 528 байт!
12. Теперь можно положить несколько кнопок, и еще каких нибудь компонентов.:))
13. При использовании компонентов из дополнительных пакетов (например KOLUpDown, DirTreeView, GRush Controls и т.д.) необходимо перед компиляцией проекта (после добавления компонента на форму) удалить эти пакеты из секции "Tpeбyeмыe пaкeты" проекта. Иначе Lazarus будет пытаться компилировать их. Впрочем, MirrorKOLPackage тоже иногда пытается компилить, поэтому тоже лучше удалять.



Также необходимо указать пути к этим компонентам (см. п. 7).

14. Опции компилятора, которые необходимо задать для проекта указаваются с ключом "-d" в "Параметрах компилятора проекта" (меню "Пpoeкт"->"Опции компилятора"), вкладка "Другое", "Параметры пользователя".




Компиляция под WinCE

Продолжаем мучить наш многострадальный проект ""KOLProject.lpi". Откомпилируем его под WinCE.

1. Открываем "Параметры компилятора проекта" (меню "Пpoeкт"->"Опции компилятора").
- Вкладка "Пути": устанавливаем "Tип элeмeнтa yпpaвлeния LCL (дpyгoe)" равным "wince".



- Вкладка "Код", "Цeлeвaя Плaтфopмa" : устанавливаем "Для кaкoй OC (-T)" равным "WinCE", "Для ЦП: (-P)" равным "arm"



- Нажимаем "Ok" :)).
2. Для KOLForm назначаем свойства defaultSize = True и defaultPosition = True
3. Компилируем, получаем программу для WinCE.



Возможные проблеммы

1. Под WinCE возникает ошибка при компиляции файла ресурсов "KOL-CE.rc".
Возможные решения:
В случае, если не используется меню, можно просто закоментировать в файле "Kol.pas" строку {$R KOL-CE.rc}.
Также можно откомпилировать "KOL-CE.rc" самому командной строкой "arm-wince-windres KOL-CE.rc KOL-CE.res", а в файле "Kol.pas" строку {$R KOL-CE.rc}. заменить на {$R KOL-CE.res}.
2. При использовании директивы UNICODE_CTRLS, а в WinCE она используется автоматически всегда, в Lazarus имеется проблема с использованием русского языка. Причина проблемы в том, что FPC 2.1.5 (и ранние версии) не понимает кодировку 1251 при переводе из ANSI в WIDE. Со временем обещают исправить. Сейчас можно использовать resourcestring или такую конструкцию:
function Ansi2Wide(S: AnsiString): WideString; begin Result:= S; end;
Тогда присвоение типа: Button1.Caption:= Ansi2Wide('йй'); работает правильно.

Автор: Дмитрий Матвеев
Из материалов: http://www.kolnmck.ru/lessons/lazarus_use.shtml