Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

опять Access vialation......................... :(   Найти похожие ветки 

 
Dust ©   (2006-03-20 12:05) [0]

После строчки выделенной жирным при работе с любыми строками или функциями происходит Aхтунг. Как быть? Что я делаю не правильно?

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;  var Height: Integer);
var ListBox     : TListBox;
   tmp_str     : string;
   count_chars : Integer;
   res : LongBool;
   Int1p, Int2p : Integer;
   tgSIZE : tagSIZE;
   pch1 : Pchar;
begin
ListBox   := Control as TListBox;
tmp_str   := ListBox.Items[Index];

tgSIZE.cx := ListBox.Width;
tgSIZE.cy := ListBox.ItemHeight;

pch1 := StrAlloc (length(tmp_str));
StrPCopy(pch1, tmp_str);

res := GetTextExtentExPoint (ListBox.Canvas.Handle, pch1, length(tmp_str), ListBox.Width, @Int1p, @Int2p, tgSIZE);
if not res then
  ShowMessage (SysErrorMessage(GetLastError));
.......................


 
wicked ©   (2006-03-20 12:09) [1]


> pch1 := StrAlloc (length(tmp_str));
> StrPCopy(pch1, tmp_str);

это зачем?.... можно просто написать PChar(tmp_str).......

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


> tgSIZE.cx := ListBox.Width;
лучше заменить на
tgSIZE.cx := ListBox.ClientWidth;
для учета того, что когда то в этом листбоксе и скроллер появится....


 
Dust ©   (2006-03-20 12:09) [2]

Эта дрянная функция возвращает True даже если написать вот так!
res := GetTextExtentExPoint (0, nil , 0, ListBox.Width, @Int1p, @Int2p, tgSIZE);
Это глюк? или фича??


 
Dust ©   (2006-03-20 12:11) [3]

wicked,
за совет спасибо, учту


 
wicked ©   (2006-03-20 12:16) [4]

хм.... прочел msdn, советую прочитать также........ насчет адресов я ошибся, признаю.......
итак, даю 99% и зуб в придачу, что AV валятся из-за того, что 3-й и 2-й параметры с конца передаются неправильно..... правильно было бы создать 2 динамических массива, сделать обоим SetLength(<массив>, length(tmp_str)) и передавать в функцию их как @(<массив>[0]).....


 
Dust ©   (2006-03-20 12:41) [5]

нет, только предпоследний параметр
LPINT alpDx,     // array of partial string widths


 
wicked ©   (2006-03-20 12:47) [6]

> Dust ©   (20.03.06 12:41) [5]

> нет, только предпоследний параметр
> LPINT alpDx,     // array of partial string widths

пардон, невнимательно прочел....


 
Dust ©   (2006-03-20 12:50) [7]

Вот так работает:

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;  var Height: Integer);
var ListBox     : TListBox;
   tmp_str     : string;
   str_ln : Integer;
   count_chars : Integer;
   res : LongBool;
   Int1p  : Integer;
   pInt2  : array of Integer;
   tgSIZE : tagSIZE;
begin
ListBox   := Control as TListBox;
tmp_str   := ListBox.Items[Index];
str_ln :=  Length (tmp_str);

tgSIZE.cx := 0; //ListBox.ClientWidth;
tgSIZE.cy := 0; //ListBox.ItemHeight;

SetLength (pInt2, str_ln);

res := GetTextExtentExPoint (ListBox.Canvas.Handle, Pchar(tmp_str), str_ln, ListBox.ClientWidth, @Int1p, @pInt2[0], tgSIZE);
if not res then
  ShowMessage (SysErrorMessage(GetLastError));
............


 
Dust ©   (2006-03-20 12:51) [8]

Вопрос закрыт


 
Плохиш ©   (2006-03-20 12:53) [9]


pch1 := StrAlloc (length(tmp_str)+1);
StrPCopy(pch1, tmp_str);



Страницы: 1 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1142158539
grisme
2006-03-12 13:15
2006.04.02
Двойной интеграл


2-1142401608
arhanegl_isa
2006-03-15 08:46
2006.04.02
У меня есть служба. Вней я отслежываю время!


2-1142632914
jenya_rus
2006-03-18 01:01
2006.04.02
Преобразование в hex???


2-1142951073
Dest81
2006-03-21 17:24
2006.04.02
BDE


2-1142958679
Anton22
2006-03-21 19:31
2006.04.02
MainMenu