Форум: "Основная";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
Внизаргумент как паблик-свойство Найти похожие ветки
← →
Сатир (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c