Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > указатель на строку


Автор: bagos 2.2.2009, 14:53
ловлю сообщение 
procedure TForm1.handlenewdata(var message: TMessage);
var
 data: ^string;
begin
  Integer(@data) := message.wparam;
  lst1.Items.Add(string(data));
end;

код неправильный, с указателями траблы:( что не так? ткните носом!

Автор: SneG0K 2.2.2009, 15:10
А в чем именно проявляется ошибка?
В Delphi7 я заметил, что integer криво преобразовывает.
И ты пытаешся в указатель на string запихнуть integer

Автор: Rrader 2.2.2009, 15:12
Все неверно - память для строки не выделена, информации о символах (содержимом) нет (на их месте мусор). Фактически ты передаешь одно число, а надо массив. А для этого уже следует использовать помощь Windows smile 

Строки можно передавать через WM_COPYDATA.

P.S.
Забыл сказать, это касается IPC. Для своего процесса все попроще smile 

Автор: Alexeis 2.2.2009, 15:17
data - это сам по себе указатель на указатель (строка это указатель). А операция взятия адреса даст указатель на указатель на указатель smile .

Автор: marinovsoft 2.2.2009, 15:21
Зачем такой запутанный код?
Может лучше так
Код

procedure TForm1.handlenewdata(var Message1: TMessage);
var
 data: string;
begin
  data:=IntToStr(Message1.WParam);
  lst1.Items.Add(data);
end;

Удачи

Автор: Alexeis 2.2.2009, 15:36
marinovsoft, и что? В строку запишется значение адреса smile . Кому это нужно? 

bagos, чтобы ответить на вопрос как принять строку нужно сначала увидеть как ее туда заносили в параметр wparam

Автор: Frees 2.2.2009, 15:38
Цитата(marinovsoft @  2.2.2009,  17:21 Найти цитируемый пост)
Зачем такой запутанный код?Может лучше так

глупость помоему

Код

procedure TForm1.handlenewdata(var Message1: TMessage);
var
 data: string;
begin
  data:=string(Message1.WParam);
  lst1.Items.Add(data);
end;


но тут надо смотреть как ты в Message1.WParam засовываеш строку

Автор: marinovsoft 2.2.2009, 17:19
Цитата
marinovsoft, и что? В строку запишется значение адреса  . Кому это нужно? 


В wParam лежит адрес строки???
Я не телепат. Мало ли кто что "накодил"
тогда 
Цитата

bagos, чтобы ответить на вопрос как принять строку нужно сначала увидеть как ее туда заносили в параметр wparam
 

Автор: bagos 2.2.2009, 18:39
Никак еще не заносил, мне то как раз и надо все это сделать, занести указатель на строку в wparam, и потом прочитать строку.
Спасибо ответившим!

Добавлено через 14 минут и 57 секунд
заношу вот так:
Код

Var p: PAnsiChar;
GetMem(p,1000);
p:='Hello, my dear window.';
SendMessage(wnd,WM_USER+1111, 0 ,dword(p));

Автор: bagos 2.2.2009, 18:59
  data:=inttostr(Message.WParam);

выдает все нулиsmile

может заношу неправильно?

Автор: bagos 2.2.2009, 19:14
var
data: PChar;
begin
data := PChar(Pointer(message.LParam)^);
lst1.Items.Add(data)


заработало)))

Автор: marinovsoft 2.2.2009, 19:26
Немного поздновато, но все же...
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
   MY_MESSAGE = WM_USER + 4242;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    lst1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  procedure handlenewdata(var message1: TMessage);message MY_MESSAGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.handlenewdata(var message1: TMessage);
var
 data: PChar;
begin
  data := PChar(message1.lparam);
  lst1.Items.Add(data);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   txt: string;
 begin
   txt := 'Hello World';
   SendMessage(Form1.Handle, MY_MESSAGE, 0, DWORD(PChar(txt)));
end;

end.

Автор: bagos 2.2.2009, 20:48
Спасибо! Это лучше smile

Добавлено через 11 минут и 3 секунды
А как быть в записями?
создаю запись

Код

type
  TRecord = Record
    name : string[50];
    tema : string[150];
  end;

var
    MyRec : ^TRecord;  

...
myrec.name := 'Anton';
myrec.tema := 'xz';



как в этом случае послать через указатель запись?

Автор: bagos 2.2.2009, 21:24
пытаюсь так:


Код

type
  PTMyRecord=^TMyrecord;
  TMyRecord = Record
    name : string[50];
    tema : string[150];
  end;

procedure TForm1.handlenewdata(var message: TMessage);
var
  xz:TMyRecord;
begin
 xz := PTMyRecord(message.WParam);  ругается
 ShowMessage(xz^.Str);
 Dispose(xz); 
end;




Автор: MetalFan 2.2.2009, 22:27
автор пытается передать данные внутри своего приложения или между приложениями?
если внутри - то последовательность такая:
выделил память, заполнил данными, отослал указатель.
принял указатель, прочитал данные, освободил память.
это общий случай.
в данных муках с записью сделано несколько ошибок. неправильное приведение типа, и Dispose непонятно на что.

Добавлено через 1 минуту и 7 секунд
кстати, marinovsoft привел некрасивый пример, использование которого в общем случае может привести к AV или порче данных.

Автор: bagos 2.2.2009, 23:42
MetalFan, пример некрасивый потому что не выделяется память под указатель?

Добавлено через 11 минут и 6 секунд
чем тогда заменить Dispose, и почему он не подходит?

Автор: bagos 3.2.2009, 05:04
Код

procedure TForm1.btn2Click(Sender: TObject);
var
  msg: PMyRecord;
begin
  New(msg);
  msg.name := 'prapapa';
  SendMessage(Handle, WM_MYMESSAGE, 0, Integer(msg));

end;


procedure TForm1.MessageHandler(var Msg: TMessage);
var msg_: PMyRecord;
begin
  try
    msg_ := PMyRecord(Msg.LParam);
   edt1.Text := msg_.name;
  finally
    Dispose(msg_);
  end;
end;


Вот что получилось))

Автор: MetalFan 3.2.2009, 13:11
bagos, в твоем примере тоже есть недочет. неправильно используется конструкция try..finally.
кстати, в случае использования SendMessage память можно выделять и освобождать в одном месте.

Автор: bagos 3.2.2009, 20:46
В чем заключается неверность использования try ...finally?
SendMessage посылается из рабочего треда, а messagehandler принимает в мэйнтреде

Автор: MetalFan 3.2.2009, 22:41
Цитата(bagos @  3.2.2009,  20:46 Найти цитируемый пост)
В чем заключается неверность использования try ...finally?

неясно, от чего она должна "защитить". если ошибка произойдет в первой строке после try, то в finally получишь исключение.

Цитата(bagos @  3.2.2009,  20:46 Найти цитируемый пост)
SendMessage посылается из рабочего треда, а messagehandler принимает в мэйнтреде 

а это вообще к чему?

Автор: bagos 4.2.2009, 01:52
Сейчас делаю по другому:
Мэйн тред:
Код

type
  PRecord = ^TRecord;
  TRecord = record
    name: string[50];
    tema: string[150];
  end;


procedure TForm1.handleonterminate(sender: TObject);
var mess: PRecord;
  i: integer;
begin
  try
    for i := 0 to potok.List.Count - 1 do
    begin
      mess := PRecord(potok.List.Items[i]);
      mmo1.Lines.Add('Имя: ' + mess.name + ', Тема: ' + mess.tema);
    end;
  finally
  end;
end;


раб. тред:
Код

execute:
var
  mess: TRecord;
begin
...
     List.Add(@mess);
...

почему то возвращает пустые строчки? что делаю не так?

Автор: THandle 4.2.2009, 10:33
bagos, что за List то хоть? И выложи что ли полный пример. Мне лично из этих огрызков не все понятно)

Автор: bagos 4.2.2009, 11:08
разобрался, не выделял память 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)