Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.042 c
15-1155613986
Александр Иванов
2006-08-15 07:53
2006.09.10
Urarsoft


15-1152722095
Колдун
2006-07-12 20:34
2006.09.10
Любимые стихи


1-1153968571
-=Germe$=-
2006-07-27 06:49
2006.09.10
Перерисовка контрола


2-1156332390
GeLLeR
2006-08-23 15:26
2006.09.10
Добавление вложенных папок в плейлист


2-1156347985
Jimmy
2006-08-23 19:46
2006.09.10
Порядок передачи фокуса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский