|
Member
Регистрация: 21.08.2003
Адрес: Россия
Пол: Male
Сообщения: 388
|
Цитата:
ЕЖ:
Ну вот тебе на пальцах:
|
Спасибо!  И за разъяснения.
Проблемка разрешилась следующим образом:
Цитата:
program winmin;
uses
windows,
messages;
{!Модули windows и messages самые необходимые — они обязательно должны быть
объявлены в начале каждой Вашей программы!}
const
ID_EDIT=1001;
ID_BUTTON=1002;
var wc : TWndClassEx;//Переменная шаблона класса окна
MainWnd : HWND; //Описатель главного окна
Mesg : TMsg; //Переменная для цикла сбора сообщений
hStatic:HWND;
hEdit:HWND;
hButton:HWND;
chBuff:widestring;
{ Далее следует оконная процедура главного окна. Обратите внимание на служебное
слово stdcall оно вынуждает компилятор генерировать особый вид кода, который
может быть вызван любой windows-программой, без этого служебного слова
программа не сможет работать вообще!}
function WindowProc(MainWnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
Begin
{Далее происходит цикл обработки сообщений}
case msg of
WM_CREATE:
begin
hStatic:=CreateWindow('static', 'Введите строку и нажмите кнопку OK',
WS_CHILD or WS_VISIBLE or SS_CENTER, 30,10,300,20,MainWnd,0,hInstance,NIL);
hEdit := CreateWindow('edit', NIL,
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT, 30, 40, 300, 30,
MainWnd, ID_EDIT,hInstance,NIL);
hButton := CreateWindow('button', 'OK',
WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,130, 85,100, 30,
MainWnd,ID_BUTTON,hInstance,NIL);
SetFocus(hEdit);
end;
WM_COMMAND:
begin
case (LOWORD(wParam)) of
ID_EDIT:
if ((HIWORD(wParam)) = EN_ERRSPACE)
then MessageBox(MainWnd,'Мало памяти','Win Min',MB_OK);
ID_BUTTON:
begin
SendMessage(hEdit,WM_GETTEXT, 255, Integer(@chBuff));
MessageBox(MainWnd,@chBuff, 'Win Min', MB_OK);
SetWindowText(hEdit,#10);//
SetFocus(hEdit);
end;
end;
end;
wm_destroy ://Сообщение посылаемое при уничтожении окна
Begin
postquitmessage(0); //exit;
Result:=0;
End;
else Result:=DefWindowProc(MainWnd,msg,wparam,lparam);
end;
End;
{Переменные xPos,yPos,nWidth,nHeight в принципе не нужны, однако я их завел
(и вам рекомендую) для лучшей читабельности программы}
var xPos,yPos,nWidth,nHeight : Integer;
begin
{ Далее идет заполнение шаблона класса окна
подробное описание полей этой записи см. после текста программы}
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:='WinMin : Main';
RegisterClassEx(wc);//Регистрация нового класса в системе
{ Заполнение переменных xPos,yPos,nWidth,nHeight}
xPos:=200;
yPos:=150;
nWidth:=600;
nHeight:=400;
{ Создание главного окна}
MainWnd:=CreateWindowEx(
0, //флаги расширенных стилей
'WinMin : Main', //имя класса окна, данное при заполнении структуры wc
'Win Min', //заголовок окна
ws_overlappedwindow,//флаги стилей окна
xPos, //горизонтальная позиция окна
yPos, //вертикальная позиция окна
nWidth, //ширина окна
nHeight, //высота окна
0, //описатель родительского окна (parent) или окна-владельца (owner)
0, //описатель меню окна (меню нет, нет и описателя)
Hinstance, //описатель приложения
nil //address of window-creation data
);
ShowWindow(MainWnd,SW_SHOW);//Отображаем окно
//Цикл обработки сообщений
//он может слегка видоизменяться, но эти строчки присутсвуют всегда
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.
|
Нашлась функция приведения Integer(@chBuff)
SendMessage(hEdit,WM_GETTEXT, 255, Integer(@chBuff));
Так же взял параметр WM_GETTEXT. Так нормально работает. И добавляется 255 (количество извлекаемых символов, как я понял). Т.е. если пишешь 5 извлечется 4, на единицу меньше.
И резервирование памяти не потребовалось.
__________________
The Man Who Sold The World (© Nirvana)
So What! (© Metallica)
Последний раз редактировалось Zueuk; 24.12.2004 в 19:29.
|