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

Вниз

аргумент как паблик-свойство   Найти похожие ветки 

 
Сатир   (2002-09-10 15:06) [0]

подскажите идейку, как можно передать в процедуру паблик-свойство то есть

procedure(public_property:variant)
begin
...Object.public_property...
end


 
lenin ©   (2002-09-10 15:10) [1]

А ты передовай сам объект


 
Сатир   (2002-09-10 15:21) [2]

2lenin © (10.09.02 15:10)
А ты передовай сам объект
а зачем мне передавать весь объект, если он у меня глобальный и один и тот же?



 
Рыжик ©   (2002-09-10 15:41) [3]


> а зачем мне передавать весь объект, если он у меня глобальный
> и один и тот же?

А зачем тогда вообще чего-то передавать? Так и пиши
procedure Траляля
begin
Object.public_property...
end


 
Сатир   (2002-09-10 15:53) [4]

2Рыжик © (10.09.02 15:41)
А зачем тогда вообще чего-то передавать? Так и пиши
procedure Траляля
begin
Object.public_property...
end

хе-хе, а если мне в разных случаях нужно обращаться к разным свойствам, но формулы расчета одни и те же?

имхо, пять раз вставлять пять одинаковых блоков, в которых отличаются только свойства одного и того же объекта, как-то не рационально....



 
Ученик ©   (2002-09-10 16:05) [5]

uses
TypInfo;

Передавай имя свойства, потом, например
SetStrProp(Object, PropName, ...)


 
PVOzerski ©   (2002-09-10 16:23) [6]

А может, лучше не свойства передавать, а адреса соответствующих функций или переменных? Как-то проще кажется. Правда, эта идея не пройдет, если функции/процедуры/переменные не public и объявлены в другом модуле (да и то решаемо).

Пример:
type
tInProc=procedure(index:longint)of object;
tOutProc=function:longint of object;

tMyClass=class
public
procedure SetIndex(index:longint);
function GetIndex:longint);
procedure DoIt(const _in:tInProc;const _out:tOutProc);
end;

....

procedure tMyClass.DoIt(const _in:tInProc;const _out:tOutProc);
var
x:longint;
begin
x:=_out;
_in(x);
end;

....
with MyClass do
DoIt(SetIndex,GetIndex);


 
Сатир   (2002-09-10 18:02) [7]

2Ученик © (10.09.02 16:05)
идея интересная, но дело в том что, мне нужно не устанавливать значение свойства, а только прочитать

2PVOzerski © (10.09.02 16:23)
спасибо, что откликнулись, но , имхо, очень громоздко для моего случая. А проблемма вот в чём: есть некий обЪект Cells[r,c]
у этого объекта есть такие свойства: Color, BorderColor, BorderLightColor, BestWidth, BestHeight и т.д. .
И если задано множество ячеек {r1<r<r2, c1<c<c2}, то мне нужно определить для каждого свойства, равны ли между собой его значения в данном множестве или есть хотя бы одно из них, которое отличается от других.

в данный момент это решается следующим образом

function TheSameColor:boolean;
var r,c,_r,_c:integer;
begin
for r:=r1 to r2 do
for c:=c1 to c2 do
for _r:=r1 to r2 do
for _c:=c1 to c2 do
if Table.Cells[r,c]. Color<>Table.Cells[_r,_c]. Color then exit;
if (r=r2) and (c=c2) and (_r=r2) and (_c=c2) then Result:=true
else Result:=false;
end;

и таким макаром нужно сравнить ещё четыре выше перечисленных свойства, то есть было бы не плохо, если бы на вход данной ф-ции передавалось только имя свойства, а на выходе - равны ли между собой значения данного массива или нет...


 
Ученик ©   (2002-09-10 18:20) [8]

if GetOrdProp(Table.Cells[r,c], PropName)<>GetOrdProp(Table.Cells[_r,_c], PropName) then Exit


 
Сатир   (2002-09-10 18:39) [9]

2Ученик © (10.09.02 18:20)
хе-хе, GetOrdProp в указателе не нашёл:-(, но может и работает:-)
тогда встречный вопрос:
PropName: TString?


 
Ученик ©   (2002-09-10 18:41) [10]

>Сатир (10.09.02 18:39)
uses
TypInfo;

PropName : string


 
Сатир   (2002-09-10 20:02) [11]

2Ученик ©
кстати, данный метод применим только к опубликованым свойствам, и благо, что все свойства, которые мне надо было сравнить, оказались именно такими.
А как быть/поступать с неопубликованными свойствами?


 
Ученик ©   (2002-09-10 20:37) [12]

В зависимости от реализации, если

TA = class
private
FB : TColor;
public
property B : TColor read FB write FB;
end;

и A : TA; то можно передавать @A.B



 
vuk ©   (2002-09-10 20:37) [13]

Что делаю в подобных случаях я.

Не знаю, как там у Вас описан элемент массива Cells... Предположим, что это TCell.
Описываем тип функции, которая будет сравнивать два элемента типа TCell по какому-либо критерию. Если значения равны, то возвращается 0, если нет - что-то другое. Это для простейшего случая. Для более сложных случаев можно использовать те же правила, что применяются в функциях типа CompareText.


type
TCompareCells = function (Cell1, Cell2 : TCell) : integer;


Можно, по желанию, сделать of object - как будет удобнее. Я буду рассматривать обычную функцию.

Пишем функцию, которая сравнивает два цвета:


function CompareCellColors(Cell1, Cell2 : TCell) : integer;
begin
if Cell1.Color = Cell2.Color then
Result := 0
else
Result := 1;
end;


Тогда функцию, которая производит сравнение множества ячеек можно написать так:


function TestCells( r1, r2, c1, c2 : integer;
CompareProc : TCompareCells ) : boolean;
var
r,c,_r,_c:integer;
begin
for r:=r1 to r2 do
for c:=c1 to c2 do
for _r:=r1 to r2 do
for _c:=c1 to c2 do
if CompareProc(Table.Cells[r,c], Table.Cells[_r,_c]) <> 0 then exit;
if (r=r2) and (c=c2) and (_r=r2) and (_c=c2) then Result:=true
else Result:=false;
end;



Далее все просто

TestCells( r1, r2, c1, c2, CompareCellColors );



 
Сатир   (2002-09-10 22:19) [14]

2vuk © (10.09.02 20:37)
спасибо-спасибо, но немножко не так...
во-первых, Вы предлагаете сравнить две ячейки, в то время, как число сравниваемых ячеек заранее неизвестно. Оно получается в результате выделения пользователем группы ячеек, начало выделения которой обозначается ячейкой с координатами r1,c1 и кол-вом рядов r2 и столбцов c2.
во-вторых, вы предлагаете конкретную реализацию для сравнения цвета, то есть если мне нужно будет сравнивать другое свойство, напр., BestWidth, тогда надо будет писать и для него ф-цию(тип)
а нужно универсальную ф-цию для свойств разных типов...

2Ученик © (10.09.02 20:37)
а можно поподробней об этом методе, то есть как непосредственно можна сравнивать значения?


 
vuk ©   (2002-09-10 22:30) [15]

>Вы предлагаете сравнить две ячейки,
Сколько ячеек Вы сравниваете следующей строкой? :o) Разьве не две?

if Table.Cells[r,c].Color<>Table.Cells[_r,_c].Color


 
Ученик ©   (2002-09-10 22:46) [16]

>Сатир (10.09.02 22:19)

function TheSameColor(PropertyOffset : Integer):boolean;
var r,c,_r,_c:integer;
begin
for r:=r1 to r2 do
for c:=c1 to c2 do
for _r:=r1 to r2 do
for _c:=c1 to c2 do
if PInteger(Integer(Table.Cells[r,c]) + PropertyOffset)^ <>
PInteger(Integer(Table.Cells[_r,_c]) + PropertyOffset)^ then exit;
if (r=r2) and (c=c2) and (_r=r2) and (_c=c2) then Result:=true
else Result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Cell : TCell;
begin
TheSameColor(Integer(@Cell.Color) - Integer(Cell));
end;


 
Сатир   (2002-09-11 14:25) [17]

2Ученик © (10.09.02 22:46)
kruto... thanx



Страницы: 1 вся ветка

Текущий архив: 2002.09.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
1-73732
Елена
2002-09-11 14:40
2002.09.23
Редактор с синтаксическим выделением


1-73598
AlexNO
2002-09-12 09:40
2002.09.23
Региональные стандарты


1-73673
MsGuns
2002-09-09 22:41
2002.09.23
Cовместимость C++ Builder5 & Delphi 6


6-73797
Brand
2002-07-21 22:40
2002.09.23
ServerSocket1....................SendText


14-73891
Malder
2002-08-20 18:52
2002.09.23
обворовали