![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RectToObject и наоборот
RASkov © (2006-10-01 16:54:00)Есть S: StringList;
есть R: TRect;
как засунуть R в S.Object?
for N:= 0 to S.Count-1 do
begin
R:=TRect(10, 10+N*33, 100, 30+N*33);
S.AddObject(IntToStr(N),?);
end;
и как потом его вытащить
R:=S.Object[i];
Суслик (2006-10-01 21:57:00) [1]>>Как при писании компанентов Брики ставить :)
Это вопрос?
Отладка *design-time* пакетов делается это так - нужно в параметрах запуска пакета (projects/run/parameter) указать, что нужно запускать вторую копию Delphi.
В моей версии дельфи (д2006) это делается так
host app: C:\Program Files\Borland\BDS\4.0\Bin\bds.exe
parameters: -pDelphi
Делаешь run и получаешь вторую копию дельфи, где работают brakepoints.
Как это делать в твоей версии - ищи в доке. Если не найдешь, то можешь посмотреть в cc.borland.com в разделе toolsapi исходники design-time пакетов для твоей версии. Очень вероятно, что в найденных пакетах будут прописаны верные настройки. Обрати внимание на пакеты серии Productivity автора Chua Chee Wee. Я в свое время настройки взял именно у него.
RASkov (2006-10-01 20:58:00) [2]Да, теперь мучаюсь как правильно все это состыковать
при первом вызове SetSRect error AV потом вроде работает
но это не из-за этих кусков кода, что здесь приведены, а в 17 строке которую никак невыловлю. Как при писании компанентов Брики ставить :) вся работа ведется в дизайнтайм...пока :(
Zeqfreed (2006-10-01 20:49:00) [3]> [14] RASkov (01.10.06 20:45)
> if IsNew then New(R) else R:=PRect(FItemsMenu.Objects[N])
> ;
Вот это уже больше похоже на правильный код.
RASkov (2006-10-01 20:45:00) [4]> [13] Zeqfreed © (01.10.06 19:51)
C помощью New я выделяю память для указателя в его параметре...
if IsNew then New(R) else R:=PRect(FItemsMenu.Objects[N]);
Zeqfreed (2006-10-01 19:51:00) [5]> [12] RASkov (01.10.06 19:38)
> А как избавиться от
Сначала избавься от непонимания того, что ты делаешь с помощью New. Почитай лучше что-нибудь позновательное.
RASkov (2006-10-01 19:38:00) [6]А как избавиться от
[Warning] PicMenu.pas(122): Variable 'R' might not have been initialized
если зделать нечто такое:
procedure SetSRect(const IsNew: Boolean);
var N: Integer; R: PRect;
begin
for N:= 0 to S.Count - 1 do begin
if IsNew then New(R);
....
S.Objects[N]:=TObject(R);
end;
end;
Zeqfreed (2006-10-01 19:29:00) [7]> [10] RASkov (01.10.06 19:18)
Так вот, использовать New нужно только когда добавляешь новый прямоугольник, а освобождать память (Dispose) только когда тебе этот прямоугольник уже не понадобится.
RASkov (2006-10-01 19:18:00) [8]Задача конкретно: один раз заполнить у StringList'а его Objects Rectami при необходимости изменять эти Rect'ы.
Ну как еще конкретней, я уж, впринципе, и отвечаю на свои вопросы хотелось бы только знать правильно ли...:(
Пишу вот такой компанентик если интересно
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1157851665&n=12
(скилет самый первый:)
И вот нужно в FItemsMenu: TStrings; хранить названия пунктов и их координаты....
Zeqfreed (2006-10-01 19:00:00) [9]> А как быть со сменой Direct, и нужно только пересчитать
> имеющиеся Rect'ы
> New(R) то вроде уже как и ненадо?
> т.е. я выполнил SetS(S);
> а потом поменял Direct и вызвал SetSRect; для пересчета....
Извини, но ты можешь писать по-русски? Лучше опиши задачу конкретно.
RASkov (2006-10-01 18:56:00) [10]> [7] RASkov (01.10.06 18:52)
Можно конечно и чаще вызывать CleanupList(S); т.е. и при изменении Direct но это както не красиво... Имхо.
RASkov (2006-10-01 18:52:00) [11]> Ну и справку почитать при необходимости
Да это понятно.... тама англ. я его не знаю а рус нету:(
И еще, вот код заполнения:
procedure SetSRect;
var N: Integer; R: PRect;
begin
for N:= 0 to S.Count - 1 do begin
New(R);
case Direct of
omVert: R^:=Rect(FLeft, FTop+N*(FHeight+FSpacing), FLeft+FWidth, FTop+FHeight+N*(FHeight+FSpacing));
omHoriz: R^:=Rect(FLeft+N*(FWidth+FSpacing), FTop, FLeft+FWidth+N*(FWidth+FSpacing), FTop+FHeight);
end;
S.Objects[N]:=TObject(R);
end;
end;
.....
procedure SetS(const Value: TStrings);
begin
CleanupList(S);
FItemsMenu.Assign(Value);
SetSRect;
end;
А как быть со сменой Direct, и нужно только пересчитать имеющиеся Rect'ы
New(R) то вроде уже как и ненадо?
т.е. я выполнил SetS(S);
а потом поменял Direct и вызвал SetSRect; для пересчета....
Zeqfreed (2006-10-01 18:47:00) [12]> [5] RASkov (01.10.06 18:32)
> Ну перед разрушением - это понятно, а перед очередным S.Assign()
> - надо?
Предлагаю все-таки вникнуть в приведенный код. Ну и справку почитать при необходимости.
> Что это имелось ввиду по отношению к тем кускам кода которые
> я привел?
New работает вне зависимости от того, какой код её окружает.
> У меня пока есть S то должны быть и Rect'ы в его Object'ах....
Так я и полагал.
RASkov (2006-10-01 18:32:00) [13]> [4] Zeqfreed © (01.10.06 18:21)
> CleanupList можешь оставить без изменений и вызывать перед
> разрушением списка.
Ну перед разрушением - это понятно, а перед очередным S.Assign() - надо?
У меня код такой:
....
S.Assign();
SetSRect; //тут идет заполнение Rect'ами
...
> New выделяет память для одного TRect'а. После использования
> эту память желательно освободить.
Что это имелось ввиду по отношению к тем кускам кода которые я привел?
У меня пока есть S то должны быть и Rect'ы в его Object'ах....
Спасибо.
Zeqfreed (2006-10-01 18:21:00) [14]New выделяет память для одного TRect'а. После использования эту память желательно освободить. CleanupList можешь оставить без изменений и вызывать перед разрушением списка.
RASkov (2006-10-01 18:18:00) [15]Немного вопрос задал неверно....
у меня S заполняется таким вот образом S.Assign(<TStrings>)
затем нужно пробежаться по всему S и его Object присвоить R
сделал так:
pR: PRect;
for N:=0 to S.Count-1 do begin
New(pR);
pR^:=Rect(10, 10+N*33, 100, 30+N*33);
S.Objects[N]:=TObject(pR);
end;
и достаю соответственно так
R: TRect;
R:=PRect(S.Objects[N])^;
Canvas.Rectangle(R);
куда засунутьDispose(PRect(S.Objects[i]));может передS.Assign(<TStrings>)?
ЗЫ Я ответил на свой вопрос?:)
Zeqfreed (2006-10-01 17:06:00) [16]А, ну и получить TRect:
function RetrieveRect(List : TStrings; Idx : Integer) : TRect;
begin
Result := Rect(0, 0, 0, 0);
if not Assigned(List) then Exit;
if (Idx >= 0) and (List.Count > Idx) then
Result := PRect(List.Objects[Idx])^;
end;
Zeqfreed (2006-10-01 17:02:00) [17]
function AppendRect(List : TStrings; const S : String; Rect : TRect) : Integer;
var
r : PRect;
begin
Result := -1;
if not Assigned(List) then Exit;
New(r);
r^ := Rect;
Result := List.AddObject(S, TObject(r));
end;
procedure CleanupList(List : TStrings);
var
i : Integer;
begin
if not Assigned(List) then Exit;
for i := 0 to List.Count - 1 do
Dispose(PRect(List.Objects[i]));
end;