Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.49 MB
Время: 0.008 c
1-73601
maxim2
2002-09-12 09:45
2002.09.23
Как сделать такое?


1-73722
Rule
2002-09-11 10:11
2002.09.23
Помогите


14-73830
Карлсон
2002-08-25 17:44
2002.09.23
101010101010101010


7-73906
Agran
2002-07-15 13:10
2002.09.23
Как запретить пользователю двигать курсором


1-73634
Porolonchick
2002-09-12 15:33
2002.09.23
TreeView.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский