|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI |
|
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI
|
Обратный инженер Сообщения: 644 |
Профиль | Отправить PM | Цитировать Итак,вопрос начинающего программиста заключается в следующем - имеется следующий текст кода:
Цитата:
Не мог бы кто-нибудь разъяснить это дело? P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" . |
||
------- Отправлено: 17:41, 19-11-2004 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Ну нет ничего проще, чем заглянуть в папку .\vcl\source\ и хорошенько там покопаться. Итогом может стать например это:
function GetLine(hwnd: Cardinal; Index: Integer): String; // Получает строку под номером Index из контрола с Handle = hwnd var Text: array[0..4095] of Char; begin Word((@Text)^) := SizeOf(Text); SetString(Result, Text, SendMessage(hwnd, EM_GETLINE, Index, Longint(@Text))); end; procedure ReplaceLine(hwnd: Cardinal; Index: Integer; const S: String); // Заменяет строку под номером Index в контроле hwnd на строку S var SelStart: Integer; begin SelStart := SendMessage(hwnd, EM_LINEINDEX, Index, 0); if SelStart >= 0 then begin SendMessage(hwnd, EM_SETSEL, SelStart, SelStart + SendMessage(hwnd, EM_LINELENGTH, SelStart, 0)); SendMessage(hwnd, EM_REPLACESEL, 0, Longint(PChar(S))); end; end; procedure AddToLine(hwnd: Cardinal; Index: Integer; what: String); // Добавляет к строке под номером Index строку what begin ReplaceLine(hwnd, Index, GetLine(hwnd, Index) + what); end; Замечу, что TMemo относится к "классу" (точнее, типу) EDIT |
Отправлено: 21:44, 19-08-2005 | #51 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Savant
Я немного недопонял насчёт параметра Index, который мы передаём процедуре AddToLine, т.е. откуда мы его возьмём...или... |
------- Отправлено: 14:38, 20-08-2005 | #52 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Мде, заклинило меня на этом Append , с StrCat чего-то попутал (подумал, что надо добавить одну строку в конец другой, а не новую строку в Memo ). Второе намного проще:
procedure AppendLine(hwnd: Cardinal; const S: String); // соответствует методу Append begin SendMessage(hwnd, EM_SETSEL, MaxInt, MaxInt); SendMessage(hwnd, EM_REPLACESEL, 0, Longint(PChar(S + #13#10))); end; function AddLine(hwnd: Cardinal; const S: String): Integer; // соответствует методу Add begin AppendLine(hwnd, S); Result := SendMessage(hwnd, EM_LINEFROMCHAR, -1, 0) - 1; end; |
Отправлено: 18:11, 20-08-2005 | #53 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Savant
Спасибо,вот теперь всё получилось . |
------- Отправлено: 19:28, 20-08-2005 | #54 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Вот возникла у меня тупиковая ситуация:
var Buffer : array of Byte; // Есть массив байтов Pos : Integer; Bytes : DWORD; есть 32-битная переменная begin Bytes := Buffer[Pos+01]; Тут хочу переслать четыре байта end; mov al, [edx+01] ; в EDX располагается массив ...т.е. пересылается только один байт вместо четырёх.Приходится уже вручную править это место на: mov eax, [edx+01] Подскажите пожалуйста,где я туплю и как заставить компилятор пересылать в данном случае двойное слово,а не один байт. |
------- Отправлено: 23:39, 10-02-2006 | #55 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать вар. 1 (следить за границами!!!)
способ универсальный, когда откуда-то надо достать нужное кол-во байтов с любой позиции var Buffer: array of Byte; // Есть массив байтов Pos: Integer; Bytes: Cardinal; BytesPtr: ^Cardinal; begin BytesPtr := @Buffer[Pos+01]; Bytes := BytesPtr^; ... применительно к динамическим массивам |
Отправлено: 16:29, 11-02-2006 | #56 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Savant
Спасибо,что откликнулся и помог . Воспользовался первым вариантом - получилось. P.S. Хотел бы уточнить - существуют ли всё-таки какие-то различия между типами DWORD и Cardinal ?? |
------- Отправлено: 17:01, 11-02-2006 | #57 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать DillerInc
Цитата:
32-битное беззнаковое целое, 4 байта в памяти. |
|
Отправлено: 20:03, 11-02-2006 | #58 |
Новый участник Сообщения: 25
|
Профиль | Отправить PM | Цитировать Буду очень признателен тому, кто поможет решить такую задачу : при нахождении на форме кусора без движения 3 секунды - он должен исчезать , если пошевелить мышкой - появлятся ( как это сделано в видеоплеерах , например Light Alloy при просмотре видео на весь экран ) .
|
Отправлено: 20:54, 11-03-2006 | #59 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать serg700
Давай пробовать . Значит есть такая WinAPI-функция TrackMouseEvent,которая способна следить за состоянием курсора и отправлять соответствующие сообщения.Эти сообщения будут приниматься и обрабатываться с помощью функции WindowProc приложения. Функция TrackMouseEvent принимает в качестве параметра указатель на структуру TRACKMOUSEEVENT,заполняя которую мы указываем особенности слежения за курсором. Итак,нам понадобится создать функцию,обрабатывающую различные сообщения, - WindowProc: var Hovering : Boolean; // переменная типа Boolean,которая сигнализирует о зависании курсора TME : TTrackMouseEvent; function WindowProc(hWnd : HWND; uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall; begin Result := DefWindowProc(hWnd, uMsg, wParam, lParam); if uMsg = WM_MOUSEMOVE then begin { Заполняем структуру TRACKMOUSEEVENT } TME.cbSize := SizeOf(TME); TME.dwFlags := TME_HOVER; // Вариант с зависанием курсора TME.hwndTrack := hWnd; // Описатель,который используется первым параметром в WindowProc TME.dwHoverTime := 3000; // три секунды зависания TrackMouseEvent(TME); // Вызываем саму функцию if Hovering then // Если курсор зависал и был спрятан, begin ShowCursor(True); // то показываем его Hovering := False; end; end; // uMsg = WM_MOUSEMOVE if uMsg = WM_MOUSEHOVER then // Если поступает сообщение begin // о зависании курсора,то Hovering := True; // прячем его ShowCursor(False); end; // uMsg = WM_MOUSEHOVER end; // WindowProc P.S. Я точно не уверен возможно ли таким образом реализовать функцию WindowProc на чистом Delphi,т.е. с применением всяких там VCL и т.п. Я это делал на примере минимального Delphi-приложения,где используется только WinAPI. P.P.S. Вероятно описанная WindowProc не является полнофункциональной,т.к. я старался объяснить только принцип актуального вопроса. |
------- Отправлено: 14:21, 13-03-2006 | #60 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[флейм] GGK и уголовная ответственность за использование нелицензионного ПО | SPB | Лицензирование продуктов Microsoft | 9 | 20-06-2007 12:38 | |
Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке? | XCodeR | Программирование и базы данных | 4 | 12-03-2007 19:51 | |
Delphi - Win32 API | Delphi | Странности с Winapi Timer | Mavlyudov | Программирование и базы данных | 4 | 14-11-2005 10:10 | |
Delphi - Delphi, WinAPI | Корректное завершение программы | fossil | Программирование и базы данных | 6 | 10-08-2005 14:52 | |
Delphi - *Решено* | Использование WinAPI под Delphi | Savant | Программирование и базы данных | 2 | 14-01-2005 21:40 |
|