Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.007 c
3-91167
tv
2003-04-07 16:17
2003.04.28
Программная репликация базы MS Access из Delphi


14-91468
Карлсон
2003-04-09 19:12
2003.04.28
сколько всего сервиспаков для win2k?


3-91179
mama
2003-04-09 16:05
2003.04.28
Delphi6, Paradox, BDE,


6-91441
RUS1
2003-03-05 08:49
2003.04.28
Использование массивов переменной длинны при работе с Socket


1-91357
shurik
2003-04-15 21:30
2003.04.28
стиль ХР





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