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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.064 c
15-1161749235
Palladin
2006-10-25 08:07
2006.11.12
Марка самолета


2-1161510433
DiX
2006-10-22 13:47
2006.11.12
Обработка строки


15-1161593916
Сатир
2006-10-23 12:58
2006.11.12
Free and nil


3-1158224830
vodvorezlaya
2006-09-14 13:07
2006.11.12
Подскажите с компонентом TDBEdit и TDBComboBox


15-1161574022
Slider007
2006-10-23 07:27
2006.11.12
С днем рождения ! 23 октября