Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.045 c
2-1161730544
Raptoridze
2006-10-25 02:55
2006.11.12
webbrowser и кукисы


15-1161780471
ocean
2006-10-25 16:47
2006.11.12
Разрезать видео


15-1161705433
vidiv
2006-10-24 19:57
2006.11.12
Помогите найти документ.


2-1161676141
Mishenka
2006-10-24 11:49
2006.11.12
Модальное окно


1-1159719430
Master_
2006-10-01 20:17
2006.11.12
EXCEL документ в DLL ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский