Текущий архив: 2006.09.10;
Скачать: CL | DM;
ВнизSendMessage VS Access Violation Найти похожие ветки
← →
Elen © (2006-08-18 12:10) [0]Подскажите где я туплю.
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.
← →
Плохиш © (2006-08-18 12:12) [1]
> caption:=GetItemFromListBox(Form1.ListBox1.Handle) ;
За такие ошибки надо руки вырывать.
← →
umbra © (2006-08-18 12:13) [2]Целое занимает 4 байта, которые не выделены для s
← →
umbra © (2006-08-18 12:18) [3]я хотел сказать, что s не инициализирована и может содержать любое число. Да и приводить ее к целому ни к чему
← →
clickmaker © (2006-08-18 12:19) [4]
> Целое занимает 4 байта, которые не выделены для s
как раз таки 4 байта выделены для s. В 32-битной ОС, разумеется
← →
clickmaker © (2006-08-18 12:20) [5]
> Elen © (18.08.06 12:10)
Лен, а как ты себе представляешь, что такое s: PChar ?
← →
Elen © (2006-08-18 12:24) [6]
> umbra
В SendMessage я могу передавать только integer.
Если я ставлю бряк наresult:=s
то Watch в S показывает правильное значение.
> За такие ошибки надо руки вырывать
Тоесть?
> что такое s: PChar ?
Это указатель на ASCIIZ-строку, но я не могу его передать так или как pointer, приходится приводить к integer из-за того что Lparam:integer
← →
clickmaker © (2006-08-18 12:30) [7]
> Это указатель на ASCIIZ-строку, но я не могу его передать
> так или как pointer, приходится приводить к integer из-за
> того что Lparam:integer
правильно. Но это только часть правды. Что ты пытаешься получить от листбокса? Строку, так? А для хранения строки что нужно?
← →
DiamondShark © (2006-08-18 12:31) [8]
> то Watch в S показывает правильное значение
Разумеется. Процедура обработки сообщений добросовестно записала данные по "мусорному" указателю, а отладчик добросовестно их прочитал.
Вот только куда эти данные на самом деле легли -- Ктулху знает, может на стек, может на код...
А потом мы поехали исполнять мусор.
← →
Elen © (2006-08-18 12:35) [9]
> clickmaker
ВЫДЕЛИТЬ ПАМЯТЬ!!! Правильно. Ясно. Спасибо. Жарко - вот и туплю.
← →
Плохиш © (2006-08-18 12:41) [10]
> Elen © (18.08.06 12:24) [6]
> > За такие ошибки надо руки вырывать
>
> Тоесть?
Сделай точку останова и посмотри чему равна переменная Form1.
← →
Elen © (2006-08-18 13:01) [11]
> чему равна переменная Form1
Если ты имееш в виду что Form1=nil, то это не так. или что ты имееш в виду?
А в общем задача решена.
← →
Elen © (2006-08-18 13:04) [12]
> ПлохишУ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 спасибо!
← →
Плохиш © (2006-08-18 13:14) [13]
> caption:=GetItemFromListBox(Form1.ListBox1.Handle) ;//Форма
> уже создана
Какое отношение имеет переменная Form1 к тому создана какая-то форма или нет?
В этот раз Вам повезло. Долго Вы будете искать ошибку в момент, когда Вам не повезёт. Хотя нет, Вы сразу создадите новую ветку.
← →
clickmaker © (2006-08-18 13:18) [14]
> caption:=GetItemFromListBox(Form1.ListBox1.Handle) ;//Форма
> уже создана
не дело так писать
просто ListBox1.Handle
← →
evvcom © (2006-08-18 13:48) [15]> [8] DiamondShark © (18.08.06 12:31)
> Вот только куда эти данные на самом деле легли -- Ктулху
> знает, может на стек, может на код...
Ну в NT линейке на код не лягут, ошибку защиты получишь.
← →
Elen © (2006-08-18 13:55) [16]
> Какое отношение имеет переменная Form1 к тому создана какая-
> то форма или нет?
Не могу понять реплику? можно по точнее
> clickmaker не дело так писать
Знаю, просто на скорую руку... Но с другой стороны - это ведь не ошибка?
← →
DiamondShark © (2006-08-18 13:56) [17]
> Если ты имееш в виду что Form1=nil, то это не так. или что
> ты имееш в виду?
Он имеет в виду, что негоже в методе класса ссылаться на конкретный экземпляр.
Понятно, что задачи разные бывают, но у Вас-то явно не тот случай.
Что будет, если открыть два экземпляра вашей формы?
← →
DiamondShark © (2006-08-18 13:57) [18]
> Но с другой стороны - это ведь не ошибка?
Ошибка. Семантическая.
← →
Elen © (2006-08-18 13:59) [19]
> DiamondShark
Эта программа всего лишь проба пера для другого проекта.
Все тема закрыта.
← →
DiamondShark © (2006-08-18 14:06) [20]Ну-ну... Ждём скорого возвращения.
Страницы: 1 вся ветка
Текущий архив: 2006.09.10;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.047 c