Форум: "Основная";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизRectToObject и наоборот Найти похожие ветки
← →
RASkov (2006-10-01 16:54) [0]Есть 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];
← →
Zeqfreed © (2006-10-01 17:02) [1]
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;
← →
Zeqfreed © (2006-10-01 17:06) [2]А, ну и получить 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;
← →
RASkov (2006-10-01 18:18) [3]Немного вопрос задал неверно....
у меня 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 18:21) [4]New выделяет память для одного TRect"а. После использования эту память желательно освободить. CleanupList можешь оставить без изменений и вызывать перед разрушением списка.
← →
RASkov (2006-10-01 18:32) [5]> [4] Zeqfreed © (01.10.06 18:21)
> CleanupList можешь оставить без изменений и вызывать перед
> разрушением списка.
Ну перед разрушением - это понятно, а перед очередным S.Assign() - надо?
У меня код такой:
....
S.Assign();
SetSRect; //тут идет заполнение Rect"ами
...
> New выделяет память для одного TRect"а. После использования
> эту память желательно освободить.
Что это имелось ввиду по отношению к тем кускам кода которые я привел?
У меня пока есть S то должны быть и Rect"ы в его Object"ах....
Спасибо.
← →
Zeqfreed © (2006-10-01 18:47) [6]> [5] RASkov (01.10.06 18:32)
> Ну перед разрушением - это понятно, а перед очередным S.Assign()
> - надо?
Предлагаю все-таки вникнуть в приведенный код. Ну и справку почитать при необходимости.
> Что это имелось ввиду по отношению к тем кускам кода которые
> я привел?
New работает вне зависимости от того, какой код её окружает.
> У меня пока есть S то должны быть и Rect"ы в его Object"ах....
Так я и полагал.
← →
RASkov (2006-10-01 18:52) [7]> Ну и справку почитать при необходимости
Да это понятно.... тама англ. я его не знаю а рус нету:(
И еще, вот код заполнения: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; для пересчета....
← →
RASkov (2006-10-01 18:56) [8]> [7] RASkov (01.10.06 18:52)
Можно конечно и чаще вызывать CleanupList(S); т.е. и при изменении Direct но это както не красиво... Имхо.
← →
Zeqfreed © (2006-10-01 19:00) [9]> А как быть со сменой Direct, и нужно только пересчитать
> имеющиеся Rect"ы
> New(R) то вроде уже как и ненадо?
> т.е. я выполнил SetS(S);
> а потом поменял Direct и вызвал SetSRect; для пересчета....
Извини, но ты можешь писать по-русски? Лучше опиши задачу конкретно.
← →
RASkov (2006-10-01 19:18) [10]Задача конкретно: один раз заполнить у StringList"а его Objects Rectami при необходимости изменять эти Rect"ы.
Ну как еще конкретней, я уж, впринципе, и отвечаю на свои вопросы хотелось бы только знать правильно ли...:(
Пишу вот такой компанентик если интересно
http://delphimaster.net/view/5-1157851665/
(скилет самый первый:)
И вот нужно в FItemsMenu: TStrings; хранить названия пунктов и их координаты....
← →
Zeqfreed © (2006-10-01 19:29) [11]> [10] RASkov (01.10.06 19:18)
Так вот, использовать New нужно только когда добавляешь новый прямоугольник, а освобождать память (Dispose) только когда тебе этот прямоугольник уже не понадобится.
← →
RASkov (2006-10-01 19:38) [12]А как избавиться от
[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:51) [13]> [12] RASkov (01.10.06 19:38)
> А как избавиться от
Сначала избавься от непонимания того, что ты делаешь с помощью New. Почитай лучше что-нибудь позновательное.
← →
RASkov (2006-10-01 20:45) [14]> [13] Zeqfreed © (01.10.06 19:51)
C помощью New я выделяю память для указателя в его параметре...
if IsNew then New(R) else R:=PRect(FItemsMenu.Objects[N]);
← →
Zeqfreed © (2006-10-01 20:49) [15]> [14] RASkov (01.10.06 20:45)
> if IsNew then New(R) else R:=PRect(FItemsMenu.Objects[N])
> ;
Вот это уже больше похоже на правильный код.
← →
RASkov (2006-10-01 20:58) [16]Да, теперь мучаюсь как правильно все это состыковать
при первом вызове SetSRect error AV потом вроде работает
но это не из-за этих кусков кода, что здесь приведены, а в 17 строке которую никак невыловлю. Как при писании компанентов Брики ставить :) вся работа ведется в дизайнтайм...пока :(
← →
Суслик © (2006-10-01 21:57) [17]>>Как при писании компанентов Брики ставить :)
Это вопрос?
Отладка *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. Я в свое время настройки взял именно у него.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.043 c