![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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) ;
За такие ошибки надо руки вырывать.