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

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

SendMessage VS Access Violation [D6, XP]


Elen ©   (2006-08-18 12:10:00) 

Подскажите где я туплю.
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
function GetItemFromListBox(ListBoxHandle:HWnd;item:integer=1):pchar;
var
 Form1: TForm1;

implementation

{$R *.dfm}

//********** FUNCTION **********
function GetItemFromListBox;
var s:pchar;
begin
sendmessage(ListBoxHandle,LB_GETTEXT,item,integer(s));//здесь вылезает Access Violation
result:=s;
end;
//********** END FUNCTION ******

procedure TForm1.FormCreate(Sender: TObject);
var s:pchar;
begin
caption:=GetItemFromListBox(Form1.ListBox1.Handle) ;
end;

end.


DiamondShark   (2006-08-18 14:06:00) [1]

Ну-ну... Ждём скорого возвращения.


Elen   (2006-08-18 13:59:00) [2]


> DiamondShark

Эта программа всего лишь проба пера для другого проекта.
Все тема закрыта.


DiamondShark   (2006-08-18 13:57:00) [3]


> Но с другой стороны - это ведь не ошибка?

Ошибка. Семантическая.


DiamondShark   (2006-08-18 13:56:00) [4]


> Если ты имееш в виду что Form1=nil, то это не так. или что
> ты имееш в виду?

Он имеет в виду, что негоже в методе класса ссылаться на конкретный экземпляр.
Понятно, что задачи разные бывают, но у Вас-то явно не тот случай.

Что будет, если открыть два экземпляра вашей формы?


Elen   (2006-08-18 13:55:00) [5]


> Какое отношение имеет переменная Form1 к тому создана какая-
> то форма или нет?

Не могу понять реплику? можно по точнее


> clickmaker не дело так писать

Знаю, просто на скорую руку... Но с другой стороны - это ведь не ошибка?


evvcom   (2006-08-18 13:48:00) [6]

> [8] DiamondShark ©   (18.08.06 12:31)
> Вот только куда эти данные на самом деле легли -- Ктулху
> знает, может на стек, может на код...

Ну в NT линейке на код не лягут, ошибку защиты получишь.


clickmaker   (2006-08-18 13:18:00) [7]


> caption:=GetItemFromListBox(Form1.ListBox1.Handle) ;//Форма
> уже создана

не дело так писать
просто ListBox1.Handle


Плохиш   (2006-08-18 13:14:00) [8]


> caption:=GetItemFromListBox(Form1.ListBox1.Handle) ;//Форма
> уже создана

Какое отношение имеет переменная Form1 к тому создана какая-то форма или нет?
В этот раз Вам повезло. Долго Вы будете искать ошибку в момент, когда Вам не повезёт. Хотя нет, Вы сразу создадите новую ветку.


Elen   (2006-08-18 13:04:00) [9]


> ПлохишУ

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
    function GetItemFromListBox(ListBoxHandle:HWnd;item:integer=0;Length:integer=255):pchar;

implementation

{$R *.dfm}
//********** FUNCTION **********
function GetItemFromListBox;
var s:pchar;//LPCSTR;
begin
GetMem(s,Length);
sendmessage(ListBoxHandle,LB_GETTEXT,item,integer(s));
result:=pchar(s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
caption:=GetItemFromListBox( Form1.ListBox1.Handle) ;// Форма уже создана
end;

end.


Clickmaster, Umbra спасибо!


Elen   (2006-08-18 13:01:00) [10]


> чему равна переменная Form1

Если ты имееш в виду что Form1=nil, то это не так. или что ты имееш в виду?
А в общем задача решена.


Плохиш   (2006-08-18 12:41:00) [11]


> Elen ©   (18.08.06 12:24) [6]


> > За такие ошибки надо руки вырывать
>
> Тоесть?

Сделай точку останова и посмотри чему равна переменная Form1.


Elen   (2006-08-18 12:35:00) [12]


> clickmaker

ВЫДЕЛИТЬ ПАМЯТЬ!!! Правильно. Ясно. Спасибо. Жарко - вот и туплю.


DiamondShark   (2006-08-18 12:31:00) [13]


> то Watch в S показывает правильное значение

Разумеется. Процедура обработки сообщений добросовестно записала данные по "мусорному" указателю, а отладчик добросовестно их прочитал.
Вот только куда эти данные на самом деле легли -- Ктулху знает, может на стек, может на код...
А потом мы поехали исполнять мусор.


clickmaker   (2006-08-18 12:30:00) [14]


> Это указатель на ASCIIZ-строку, но я не могу его передать
> так или как pointer, приходится приводить к integer из-за
> того что Lparam:integer

правильно. Но это только часть правды. Что ты пытаешься получить от листбокса? Строку, так? А для хранения строки что нужно?


Elen   (2006-08-18 12:24:00) [15]


> umbra

В SendMessage я могу передавать только integer.
Если я ставлю бряк на result:=sто Watch в S показывает правильное значение.


> За такие ошибки надо руки вырывать

Тоесть?


> что такое s: PChar ?

Это указатель на ASCIIZ-строку, но я не могу его передать так или как pointer, приходится приводить к integer из-за того что Lparam:integer


clickmaker   (2006-08-18 12:20:00) [16]


> Elen ©   (18.08.06 12:10)

Лен, а как ты себе представляешь, что такое s: PChar ?


clickmaker   (2006-08-18 12:19:00) [17]


> Целое занимает 4 байта, которые не выделены для s

как раз таки 4 байта выделены для s. В 32-битной ОС, разумеется


umbra   (2006-08-18 12:18:00) [18]

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


umbra   (2006-08-18 12:13:00) [19]

Целое занимает 4 байта, которые не выделены для s


Плохиш   (2006-08-18 12:12:00) [20]


> caption:=GetItemFromListBox( Form1.ListBox1.Handle) ;

За такие ошибки надо руки вырывать.


Наверх

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