Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.027 c
4-1147634476
Mr tray
2006-05-14 23:21
2006.09.10
зачем нужен CallNextHookEx


2-1156248430
J Cara
2006-08-22 16:07
2006.09.10
Что делать? rtl70.bpl.


2-1155884246
Sergey_b
2006-08-18 10:57
2006.09.10
Подписка на события


4-1147542569
Dstr
2006-05-13 21:49
2006.09.10
Правый клик


2-1155883084
ttt_111
2006-08-18 10:38
2006.09.10
Виртуальная память.