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

Вниз

Metaclass   Найти похожие ветки 

 
kip/bl/   (2003-04-16 02:44) [0]

Как передать в функцию аргумент, который может быть либо строкой, либо объектом одного из нескольких (разных) моих классов


 
default ©   (2003-04-16 02:49) [1]

передавай указатель
он же может указывать на что угодно


 
kip/bl/   (2003-04-16 03:09) [2]

Так нет ведь такого типа - указатель...есть указатель на что-то.
На что указывать, на variant?


 
MBo ©   (2003-04-16 04:34) [3]

>Так нет ведь такого типа - указатель
Есть. Да и в любом случае можно приводить тип.
А как ты, кстати, в функции будешь различать, строка это или объект?


 
kip/bl/   (2003-04-16 04:44) [4]

Да, буду.
И с указателями я попробовал - туда получается, а обратно -нет :(

как разуказать объект (чтоб потом его свойствами пользоваться) ^ не работает.

А, вообще, вот код, чтоб понятнее:
case 1:
...
strRData := String(inet_ntoa(serv_addr.sin_addr));
varData := @strRData;
...
case 5:
objSoaData := CDnsSoaData.Create;

If objSoaData.CreateFromStream(arrBuffer, intCurPosition) Then
varData := @objSoaData;
...
fAnswers.Add(strRName, lngRType, lngRClass, dblRTTL, lngRDataLength, varData);
...


 
MBo ©   (2003-04-16 05:09) [5]

^ и @ не нужно
объекты и строки и так являются указателями.

function ObjAndString(p:pointer;objtype:integer):string;
begin
case objtype of
1://string
Result:=String(p);
2://любой объект
Result:=TObject(p).Classname;
3://TButton
Result:=TButton(p).Caption;
end;

s:="asdg";
a:=ObjAndString(Pointer(s),1)
b:=ObjAndString(Pointer(Button1,3);



 
kip/bl/   (2003-04-16 05:23) [6]

Насчет того что объекты и строки - указатели...
если написать просто
varData := (strRData);
то ругается Incompatible types "String" and "Pointer"
а если так:
varData := Pointer(strRData);
то проходит, только как мне потом получить строку обратно:
strData := String(varData); Не работает.


 
MBo ©   (2003-04-16 05:29) [7]

что-то ты напутал.

рабочий пример:

procedure TForm1.Button1Click(Sender: TObject);
var s:string;

function ObjAndString(p:pointer;objtype:integer):string;
begin
case objtype of
1://string
Result:=String(p);
2://любой объект
Result:=TObject(p).Classname;
3://TButton
Result:=TButton(p).Caption;
end;
end;

begin
s:="asdf";
Memo1.Lines.Add(ObjAndString(Pointer(s),1));
Memo1.Lines.Add(ObjAndString(Pointer(Memo1),2));
Memo1.Lines.Add(ObjAndString(Pointer(Button1),3));
end;


 
kip/bl/   (2003-04-16 07:19) [8]

Ну прям вот так "string(pointer)" оно не работает, работает как pchar(pointer) но не всегда (не все строки выводит и некоторые неполностью... (там вроде с нуль-символом связано).


 
MBo ©   (2003-04-16 07:29) [9]

Да как это не работает????
У тебя Ansisitring?


 
Юрий Зотов ©   (2003-04-16 07:31) [10]

> Как передать в функцию аргумент, который может быть либо
> строкой, либо объектом одного из нескольких (разных) моих
> классов

А почему не перегрузить?

procedure MyProc(Param: string); overload;
procedure MyProc(Param: TObject); overload;

И все проблемы. И не надо мучаться с определением типа параметра.


 
MBo ©   (2003-04-16 08:09) [11]

:)
Да уж, не туда мысль двигалась


 
Palladin ©   (2003-04-16 08:18) [12]


> kip/bl/ (16.04.03 05:23)

приведи полностью что ты там написал и тогда с тебе укажут на ошибку...


 
kip/bl/   (2003-04-16 08:44) [13]

Вот здесь я заполняю коллекции (параметр vardata):


....
Case lngRType of
1:
begin
// IP


 
MBo ©   (2003-04-16 08:54) [14]

varData := @strRData;
зачем @ ??????


 
kip/bl/   (2003-04-16 09:02) [15]

>> varData := @strRData;
это недоглядел, но все равно это ничего не меняет...
string(vardata) пишет всякую чушь


 
MBo ©   (2003-04-16 09:06) [16]

в этой куче кода трудно раобраться
Откда берется строка?
Вижу работу с потоком, так может, в него пишется не содержимое строки, а ее адрес?


 
kip/bl/   (2003-04-16 09:22) [17]

Ну алгоритм вкратце:
Case lngRType of
1:
strRData := "192.168.1.1";
varData := @strRData;
2:
strRData := "www.mail.ru"
varData := Pointer(strRData);
3:
objMxData := CDnsMxData.Create;
// мой класс (2 текстовых свойства)
varData := objMxData;
4:
objSoaData := CDnsSoaData.Create;
// другой класс (6 свойств разного типа)
varData := objSoaData;
end;
// занесение данных в коллекцию
fAnswers.Add(strRName, lngRType, lngRClass, dblRTTL, lngRDataLength, varData);

...
ну и чтение из коллекции


 
kip/bl/   (2003-04-16 09:24) [18]

ну там в 1 не @ а pointer(strData)
и собственно фишка в том что сразу после выполнения этого, я смотрю в дебагере и string(strData) он не показывает, но показывает pchar(strdata)


 
REA ©   (2003-04-16 09:28) [19]

Присоединяюсь к совету не смешивать типы данных. Надо что-то где-то перегрузить. Если возникает такая экзотическая задача, то велика вероятность ошибки дизайна.


 
kip/bl/   (2003-04-16 09:33) [20]

Совсем себя дебилом чувствую, что такое "ошибка дизайна"?


 
REA ©   (2003-04-16 09:48) [21]

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


 
Anatoly Podgoretsky ©   (2003-04-16 09:50) [22]

А не лучше ли тебе использовать Variant?
Если уж не хочешь использовать перегрузку.
А насчет дизайна это они так ругаются.


 
Polevi ©   (2003-04-16 10:18) [23]

описываешь абстрактный класс, в ф-ию передаещь указатель на его наследников


 
kip/bl/   (2003-04-16 12:08) [24]

Varint я пробовал - не передаются мои классы (строки нормально). Если его использовать, то как потом его обратно в (ну скажем) CDnsSoaData переколбашивать?
DnsSoaData := CDnsSoaData ( variant type)
?





 
kip/bl/   (2003-04-16 12:09) [25]

А насчет абстрактного класса - можно какой -нить примерчик - а то пробовал - не разобрался... (и желательно пояснить как в этот класс строку писать - как свойство?


 
erikIvanov   (2003-04-16 14:00) [26]

Помоему подход в корне неправильный. Что надо сделать? Как я понял передать список строк или одну строку. Это делается record в котором описывается что надо передавать. А далее создается динамический масив этих рекордов. Определяется указатель на этот масив. Далее передаеш указатель и немучиешся.
Пример:
prvOptions = (prvCurrentRow, prvMetaData);
RProvRef = packed record
Name: ShortString;
Options: set of prvOptions;
end;
TProv = packed Array of RProvRef;
pRefDataSet = ^TProv;

procedure DataToVariant(Const pRef: pRefDataSet; Var VData: OleVariant);
...
for i := 0 to Length(pRef^)-1 do begin
StrLen := Length(pRef^[i].Name)+1;
Move(pRef^[i],Buf^[Size],StrLen);
Size := Size + StrLen+SizeOf(pRef^[0].Options);
end;
...
end;



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

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

Наверх




Память: 0.53 MB
Время: 0.025 c
7-91565
Ал
2003-03-11 14:21
2003.04.28
Можно и нужно ли устанавливать screensaver в папку c: Windows?


8-91412
Mihey
2002-11-23 00:10
2003.04.28
Проблемы с DelphiX


1-91247
Dmitry V. Averuanov
2003-04-16 13:34
2003.04.28
Очень прошу пример DLL


14-91453
Piero
2003-04-11 19:19
2003.04.28
Дополнительная математика в Delphi


4-91590
Nimda2000
2003-03-02 15:49
2003.04.28
Кодировка