![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы
mike.dld © (2003-02-06 11:23:00)Хочу задать пару вопросов по поводу рисования и работы с памятью.
1. Я перевел текст TStringGrid на KOL, но столкнулся с маленькой проблемой. В TCustomGrid есть процедура DrawSizingLine, которая у меня выглядит так:
[code]
procedure TStGrd.DrawSizingLine(const DrawInfo: TGridDrawInfo);
var
OldPen: PGraphicTool;
D: PStGrdData;
begin
D := Pointer(CustomObj);
OldPen := NewPen;
try
with Canvas^, DrawInfo do begin
OldPen.Assign(Pen);
Pen.PenStyle := psDot;
Pen.PenMode := pmXor;
Pen.PenWidth := 1;
try
if D.fGridState = gsRowSizing then begin
MoveTo(0, D.fSizingPos);
LineTo(Horz.GridBoundary, D.fSizingPos);
end else begin
MoveTo(D.fSizingPos, 0);
LineTo(D.fSizingPos, Vert.GridBoundary);
end;
finally
( OldPen)Хочу задать пару вопросов по поводу рисования и работы с памятью.
1. Я перевел текст TStringGrid на KOL, но столкнулся с маленькой проблемой. В TCustomGrid есть процедура DrawSizingLine, которая у меня выглядит так:
[code]
procedure TStGrd.DrawSizingLine(const DrawInfo: TGridDrawInfo);
var
OldPen: PGraphicTool;
D: PStGrdData;
begin
D := Pointer(CustomObj);
OldPen := NewPen;
try
with Canvas^, DrawInfo do begin
OldPen.Assign(Pen);
Pen.PenStyle := psDot;
Pen.PenMode := pmXor;
Pen.PenWidth := 1;
try
if D.fGridState = gsRowSizing then begin
MoveTo(0, D.fSizingPos);
LineTo(Horz.GridBoundary, D.fSizingPos);
end else begin
MoveTo(D.fSizingPos, 0);
LineTo(D.fSizingPos, Vert.GridBoundary);
end;
finally
Pen.Assign(OldPen);
end;
end;
finally
OldPen.Free;
end;
end;
[/code]
Однако при ее вызове на мониторе не наблюдается никаких изменений. То же самое и с DrawMove. Как быть?
2. Для реализации Cells[ACol,ARow] я решил создать что-нибудь такое:
[code]
PStrArray = ^TStrArray;
TStrArray = array of array of PAnsiString;
[/code]
Как, где и каким образом нужно выделять и освобождать память под строки? Или предложите вариант поумнее, т.к. мне больше ничего в голову не приходит. Хотя есть идея сделать массив TStrList, а он потом пусть сам разбирается с памятью.
mike.dld (2003-02-07 08:53:00) [1]
Извините. Я кое-что проверил. Оказалось, что этот код не работает в D7, а в D6 всё нормально. Странно.
Gandalf (2003-02-06 23:10:00) [2]
> Может кинуть исходник, только я не знаю куда.
Кидай, на мыло. Чем смогу, так сказать...
SPeller (2003-02-06 15:30:00) [3]
> В CustomObj всё нормально. Если б было ненормально, не компилилось
> бы.
А значения проверял во время выполнения?
mike.dld (2003-02-06 14:09:00) [4]
Может кинуть исходник, только я не знаю куда.
mike.dld (2003-02-06 14:05:00) [5]
Я перевел всё, полностью!
Gandalf (2003-02-06 14:03:00) [6]
> 1. Я перевел текст TStringGrid на KOL, но столкнулся с маленькой
> проблемой. В TCustomGrid
В оригинале, DrawSizingLine вызывается при движениях мышой, а у тебя?
> 2. Для реализации Cells[ACol,ARow] я решил создать что-нибудь
> такое:
Не напрягайся - используй TStrList.
mike.dld (2003-02-06 13:20:00) [7]
В CustomObj всё нормально. Если б было ненормально, не компилилось бы. Может есть еще какие-нибудь соображения?
Если добавить DrawSizingLine в Paint, а потом, когда нужно, делать invalidate, то рисует...
SPeller (2003-02-06 13:14:00) [8]
> Хотя есть идея сделать массив TStrList, а он потом пусть
> сам разбирается с памятью.
Правильная идея. Работать самому с памятью - зачем? Есть уже готовое. Но если всё же очень хочется, то сделай процедуры для создания массива строк и в ней работай с памятью.
А на счёт неотрисовки... На первый взгляд всё нормально написано. Посмотри, может у тебя в CustomObj содержится не то что надо.
И небольшое замечание - писать OldPen := NewPen; не надо перед использованием метода Assign, в котором старый объект всё-равно уничтожается, а затем создаётся новый со свойствами объекта, переданного в качестве параметра.