Форум: "Основная";
Текущий архив: 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