Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Ответить
Настройки темы
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Итак,вопрос начинающего программиста заключается в следующем - имеется следующий текст кода:
Цитата:
// Показываем результат
lbOutput.Caption := Trim(edInput1.Text)+' '+cbSign.Items[cbSign.ItemIndex]+' '+
Trim(edInput2.Text)+' = ' ;
...для меня остаётся непонятным,по какому принципу выставляются знаки апострофа и плюса('+)в данном примере.
Не мог бы кто-нибудь разъяснить это дело?

P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" .

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 17:41, 19-11-2004

 

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить 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;
>>Т.к. если послать сообщение классу STATIC...
Замечу, что TMemo относится к "классу" (точнее, типу) EDIT

Отправлено: 21:44, 19-08-2005 | #51



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
Я немного недопонял насчёт параметра Index, который мы передаём процедуре AddToLine, т.е. откуда мы его возьмём...или...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 14:38, 20-08-2005 | #52


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить 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


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
Спасибо,вот теперь всё получилось .

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 19:28, 20-08-2005 | #54


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить 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


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


вар. 1 (следить за границами!!!)
способ универсальный, когда откуда-то надо достать нужное кол-во байтов с любой позиции
Код: Выделить весь код
var
  Buffer: array of Byte; // Есть массив байтов
  Pos: Integer;
  Bytes: Cardinal;
  BytesPtr: ^Cardinal;
begin
  BytesPtr := @Buffer[Pos+01];
  Bytes := BytesPtr^;
...
вар. 2
применительно к динамическим массивам
Код: Выделить весь код
var
  Buffer: array of Byte; // Есть массив байтов
  Pos: Integer;
  Bytes: Cardinal;
begin
  Bytes := Cardinal(Copy(Buffer, Pos+01, 4));
...

Отправлено: 16:29, 11-02-2006 | #56


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
Спасибо,что откликнулся и помог .
Воспользовался первым вариантом - получилось.

P.S. Хотел бы уточнить - существуют ли всё-таки какие-то различия между типами DWORD и Cardinal ??

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 17:01, 11-02-2006 | #57


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
Цитата:
Хотел бы уточнить - существуют ли всё-таки какие-то различия между типами DWORD и Cardinal ??
Абсолютно одно и то же.
32-битное беззнаковое целое, 4 байта в памяти.

Отправлено: 20:03, 11-02-2006 | #58


Аватара для serg700

Новый участник


Сообщения: 25
Благодарности: 1

Профиль | Отправить PM | Цитировать


Буду очень признателен тому, кто поможет решить такую задачу : при нахождении на форме кусора без движения 3 секунды - он должен исчезать , если пошевелить мышкой - появлятся ( как это сделано в видеоплеерах , например Light Alloy при просмотре видео на весь экран ) .

Отправлено: 20:54, 11-03-2006 | #59


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить 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
Функция TrackMouseEvent словно бы одноразовая,т.е. сгенерировав одно сообщение,она перестаёт функционировать,поэтому её необходимо каждый раз запускать заново.Именно поэтому я поставил её инициацию в обработчик сообщения передвижения курсора (WM_MOUSEMOVE) .

P.S. Я точно не уверен возможно ли таким образом реализовать функцию WindowProc на чистом Delphi,т.е. с применением всяких там VCL и т.п.
Я это делал на примере минимального Delphi-приложения,где используется только WinAPI.
P.P.S. Вероятно описанная WindowProc не является полнофункциональной,т.к. я старался объяснить только принцип актуального вопроса.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 14:21, 13-03-2006 | #60



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[флейм] 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




 
Переход