Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как в SendMessage передать строку? [D7, XP]


Страницы:   1 2

tytus ©   (2008-05-15 12:00:00) 

Добрый день всем. Есть такой код:
const CX_MYMESSAGE  = WM_USER+40;
...
  private
    procedureCXMYMESSAGE(var Message: TMessage); messageCX_MYMESSAGE;


...

procedureTMainFm.CXMYMESSAGE( var Message: TMessage);
begin
  Message.WParam:=Integer(PChar(Edit1.Text));
end;


теперь как получить текст из едита используя SendMessage?

SendMessage(MainFm. Handle,CX_MY_MESSAGE,????,0);


Slym   (2008-05-15 14:09:00) [21]

1. tytus   (15.05.08 14:03) [16]
Move  я делал, только забыл установить размер S перед этим

о... это плохо... это очень плохо!
2. tytus   (15.05.08 14:03) [16]
Для чнго собственно  и служит if LParam<Result then exit;

чтоб не сmoveить больше чем под него место выделено и если этого не сделать goto 1;
3. tytus   (15.05.08 14:03) [16]
для чего и потребовалось два раза SendMessage

первый раз узнаем необходимую длинну, и растягиваем S
второй раз чтоб S заполнить


Игорь Шевченко   (2008-05-15 14:06:00) [22]

tytus   (15.05.08 14:03) [16]

читай http://ln.com.ua/~openxs/articles/smart-questions-ru.html,
учись правильно задавать вопросы


Slym   (2008-05-15 14:04:00) [23]

Игорь Шевченко ©   (15.05.08 13:57) [15]
это типа ответ :) на сабж... конечно спорно его применение, но ответ :)
можно не городить отсебятины и сделать так:
SetLength(S,1024);
SetLength(S,SendMessage(Edit1.Handle,WM_GETTEXT,Length(S),PChar(S)));

или так
s:=Edit1.Text
почему автору не подходит последний вариант я низнаю :)


tytus   (2008-05-15 14:03:00) [24]

>Игорь Шевченко ©   (15.05.08 13:57) [15]

человек ответил на мой вопрос.

>Slym ©   (15.05.08 13:50) [13]

так тоже работает.
Move  я делал, только забыл установить размер S перед этим.
Для чнго собственно  и служит if LParam<Result then exit;
для чего и потребовалось два раза SendMessage

по поводу Игорь Шевченко ©   (15.05.08 12:56) [5]
тоже согласен.

Всем спасибо.


Игорь Шевченко   (2008-05-15 13:57:00) [25]

Slym ©   (15.05.08 13:50) [13]
Slym ©   (15.05.08 13:51) [14]

Чего сказать-то хотел ?


Slym   (2008-05-15 13:51:00) [26]

Slym ©   (15.05.08 13:50) [13]
procedure TMainFm.FormCreate(Sender: TObject);
var S:string;
begin
SetLength(S,SendMessage(Handle,CX_MY_MESSAGE,0,0));
SetLength(S,SendMessage(Handle,CX_MY_MESSAGE,PChar(S),Length(S)));
end;


Slym   (2008-05-15 13:50:00) [27]

procedure TMainFm.CXMYMESSAGE(var Message: TMessage);
begin
 with Message do
 begin
   Result:=Length(Edit1.Text);
   if LParam<Result then exit;
   Move(PChar(Edit1.Text)^,PChar(WParam)^,Result);
 end;
end;

procedure TMainFm.FormCreate(Sender: TObject);
var S:string;
begin
 SetLength(S,SendMessage(Handle,CX_MY_MESSAGE,0,0));
 SendMessage(Handle,CX_MY_MESSAGE,PChar(S),Length(S));
end;


Игорь Шевченко   (2008-05-15 13:46:00) [28]


> Тогда зачем вот эта дурь


Коммутативность оператора присваивания


Reindeer Moss Eater   (2008-05-15 13:39:00) [29]

Message.WParam:=...??? - что-то не "въезжаю"

А PChar к интегеру ты наверное так делал?
Pchar(MyString) := Msg.WParam;

Не так?
Тогда зачем вот эта дурь: Message.WParam:=
?


Reindeer Moss Eater   (2008-05-15 13:36:00) [30]

Про присвоение тебе никто ничего не говорил (только спрашивали)
А говорили тебе про приведение.


tytus   (2008-05-15 13:30:00) [31]

>Reindeer Moss Eater ©   (15.05.08 13:10) [7]
Привел указатель на строку к интегеру при отправке.

SendMessage(Handle,CX_CLIENTIP,Integer(PChar(s)),0);
так?

Приведи интегер к указателю на строку при приеме

Message.WParam:=...??? - что-то не "въезжаю"


Игорь Шевченко   (2008-05-15 13:24:00) [32]


> а ответа так и нет....


До тех пор, пока ты не ответишь на вопрос в [5], его и не будет


Reindeer Moss Eater   (2008-05-15 13:10:00) [33]

Привел указатель на строку к интегеру при отправке.
Приведи интегер к указателю на строку при приеме (если сама строка еще жива).
Какие проблемы-то?


tytus   (2008-05-15 13:02:00) [34]

>Игорь Шевченко ©   (15.05.08 12:56) [5]

а ответа так и нет....


Игорь Шевченко   (2008-05-15 12:56:00) [35]

tytus   (15.05.08 12:29) [2]

Ты чего вообще хочешь добиться ?
Изменять параметры сообщения в его обработчике - это настолько бессмысленно, что даже не комментируется


tytus   (2008-05-15 12:46:00) [36]

>Хитрий Лис   (15.05.08 12:44) [3]

смысл тут прост:
 захотелось мне в сообщении передать строку...


Хитрий Лис   (2008-05-15 12:44:00) [37]

А в чём тайный смысл ? может поделитесь к чему всё это ?


tytus   (2008-05-15 12:29:00) [38]

>Игорь Шевченко ©   (15.05.08 12:18) [1]
согласен ..
вот такой код работает:

type
 PMyStr = ^TMyStr;
 TMyStr = record
   MyLen:integer;
   MyStr:PAnsiChar;
  end;


...

procedureTMainFm.CXCLIENTIP( var Message: TMessage);
begin
PMyStr( Message.WParam)^.MyLen:=Length(Edit1.Text);
PMyStr( Message.WParam)^.MyStr:=PChar(Edit1.Text);
Message.Result:=1;
end;


procedureTMainFm.Edit1KeyDown(Sender: TObject; varKey: Word;
 Shift: TShiftState);
var
 s: string;
 MyStr:PMyStr;
 len:integer;
begin
ifKey=VK_RETURN then
begin
 GetMem(MyStr,SizeOf(TMyStr));
 ZeroMemory(MyStr,SizeOf(TMyStr));
  try
   SendMessage(Handle,CX_CLIENTIP,Integer(MyStr),0);
   len:=MyStr.MyLen;
   s:=StrPas(MyStr.MyStr);
  finally
   FreeMem(MyStr);
  end;
 RE1.Lines.Add(s);
end;
end;


Игорь Шевченко   (2008-05-15 12:18:00) [39]


> procedure TMainFm.CXMYMESSAGE(var Message: TMessage);
> begin
>  Message.WParam:=Integer(PChar(Edit1.Text));
> end;


Фигня


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо