Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизТип TRecord и его копирование... Найти похожие ветки
← →
fly_mer (2006-09-07 13:19) [0]Здравствуйте, ув. жители!
Подскажите пожалуйста, каким образом можно перегнать данные из одной TRecord в другую если в другой есть те же (но НЕ ВСЕ) поля?
Например:
type x1=record
n1: string;
n2: string;
n3: integer;
end;
type x2=record
n1: string;
n3: record; // <- тут n2 не используется - для укомпакчивания данных
end;
Вот.:) помогите, пожалуйста?
← →
Elen © (2006-09-07 13:22) [1]
> n3: record
Что еще за record ?
← →
balepa © (2006-09-07 13:27) [2]X1.N1:= x2.n1
....
x1.Ni:= x2.Ni
← →
lessard (2006-09-07 13:38) [3]balera, нифига. если не совпадают некоторые поля типа l: (v1, v2, v3), то ничего не скопируется, уже пробовал...
n3: string
записался просто.
← →
Barloggg (2006-09-07 13:41) [4]если есть несовпадение, то только по одному полю за раз.
более того нельзя сделать а:=в даже в том случае если поля одинаковы, но типы разные (всмысле объявлены как независимые типы данных). компилятор ругается.
лично я для таких случаев использую фишку "OVERLOAD".
то есть у меня есть стопка процедур
procedure copy(one:typeA;two:typeB);overload;
и всего делов. для каждой комбинации типов запустится своя собственная процедура.
что вроде старого бейсиковского оператора Let.
← →
fly_mer (2006-09-07 13:43) [5]let i=1... гыы... :) не пойму..:)
← →
Barloggg (2006-09-07 13:43) [6]впрочем можно рискнуть сделать грубость.
а^:=@b; (или что-то вроде того)
но делая так можно отхватить по щщам. и от винды в том числе.
да и это не копирование а присваивание.
← →
Elen © (2006-09-07 13:44) [7]
> лично я для таких случаев использую фишку "OVERLOAD".
А я Variant... и иногда move(источник, получатель)
← →
balepa © (2006-09-07 13:45) [8]
lessard (07.09.06 13:38) [3]
balera, нифига. если не совпадают некоторые поля типа l: (v1, v2, v3), то ничего не скопируется, уже пробовал...
n3: string
записался просто.
X1.N3:= StrToInt(X2.N3);
← →
fly_mer (2006-09-07 13:45) [9]Тсс... ребят, то что используете вы я уже понял:) лучше что-нибудь по конкретному случаю...
← →
fly_mer (2006-09-07 13:46) [10]balera, угу. я немного не про то. у меня поля исчезают в новой записи и имеет она уже не record а packed record. вот в чём фишка... а переписывать все поля по одному ох как геморно (полей 50 штук)
← →
Barloggg (2006-09-07 13:53) [11]в таком случае никак. одним движением такие вещи не делаются.
может стоит изменить саму структуру данных? сделать не перечисление стопки полей, а динамический массив с полями? а имена загнать в константы.
т.е. будет не так .a а вот так .s[a] где s=array of string (а поле а в первом случае строка а во втором const a=0)
← →
Barloggg (2006-09-07 13:55) [12]если бы были поля фиксированного размера, то можно было бы использовать move. но строки это что-то вроде динамического массива с обалденной по мощности обвязкой.
← →
fly_mer (2006-09-07 13:56) [13]barlogg, не понял мысли... на примере можно?
← →
Barloggg (2006-09-07 14:06) [14]исходный вариант
type x1=record
a: string;
b: string;
c: string;
i:integer;
j:integer;
end;
вариант с массивами
type x1=record
str:array of string;
int:array of integer;
end;
const a=0;b=1;c=2;i=0;j=1;
---------
var i:x1;
в первом случае вот такая запись
i.a;
будет эквивалентна вот такой
i.str[a];
но для второго случая понадобится нехилая обвязка, которая ну совершенно не стоит затрат на ее создание.
Во всяком случае лично я такую структуру разработал и использовал под НуВаащеУниверсальнуюСтруктуруХраненияДанных.
Короче наш ответ ООП в общем и наследованию в частности.
у меня даже есть работающий пример такой структуры.
← →
default © (2006-09-07 14:07) [15]fly_mer (07.09.06 13:56) [13]
он рекомендует бороться с причиной , а не со следствием
← →
fly_mer (2006-09-07 14:24) [16]а как это можно применить на реальном примере:
unit ss_classes;
interface
uses Graphics, Classes, Controls;
type
TPrD=record
PrNum: Integer;
PrName: String;
end;
TZametka=record
PrNum: Integer;
Data: String[255];
end;
TLock=record
LockedWhen: TDateTime;
LockedWho: String[50];
LockedNum: Integer;
end;
TMetka=packed record
Color: TColor;
PrNum, InFile: Integer;
end;
TLockKey=record
CSum: String[64];
CompName: String[100];
Validate1: (a1, a2, a3, a4, a5);
Validate2: (aa1, aa2, aa3, aa4, aa5);
end;
TOrganization=record
Name : String[100];
AdressIndex : String[8];
AdressCity : String[50];
AdressStreet : String[100];
AdressDom : String[4];
AdressOffice : String[4];
OfficePhoneC : String[6];
OfficePhoneN : String[8];
RukovodName : String[80];
RukovodPhoneC : String[6];
RukovodPhoneN : String[8];
RukovodPhoneE : String[4];
ExtPhones : String[110];
Vajnost : (vlLow, vlMedium, vlHigh, vlNone);
VajnostFlag : (vfRed, vfGreen, vfBlue, vfNone);
Prozvon : (psProzvoneno, psNeprozvoneno, psPM);
Vozrast : (tsOld, tsNew);
Obrabotka : (osObrabotano, osNeobrabotano);
Prodagi : (pcLow, pcMedium, pcHigh, pcNone);
SpecFlag : (sfRed, sfGreen, sfBlue, sfNone);
ExtInfoFile : String[20]; // ext-info filename
Category : String[80];
Region : String[80];
IsInHolding : Boolean;
HoldingName : String[100];
WWW : String[80];
Email : String[80];
end;
type TRs=record
Firma: String[255];
Adress: String[255];
Index: String[8];
GeoAdr: String[255];
RcptName: String[255];
RcptTitle: String[255];
end;
type TCl=record
CLL: String[255];
CLN: String[12];
end;
type TCurOrg=record
Bankrot : Boolean;
SST : (otPostavshik, otPokupatel, otBoth, otBariga, otService, otNone);
end;
type TManLog=record
tDate: TDateTime;
tResult: String[255];
end;
type TManCall=record
cFrom, cTo, cSkem: String[255];
cType: (ctIn, ctOut);
cDateTime: TDateTime;
cNextDate: TDateTime;
cAbout: String[255]; // äîï èíôî
cJobTitle: String[255];
end;
type TProdaga=record
pFrom, pTo, pSumma: String[255];
pType: (ptIn, ptOut);
pDateTime: TDateTime;
pProdano: string[255];
pAbout: String[255]; // äîï èíôî
pJobTitle: String[255];
end;
type TFax=record
fNum: Integer;
fFrom, fTo, fSKem: String[255];
fType: (ftIn, ftOut, ftInfo, ftNone);
fDateTime: TDateTime;
fAbout:String[255]; // äîï èíôî
fJobTitle: String[255];
end;
type TEmail=record
eFrom, eTo: String[50];
eAddr: String[50];
eType: (eIn, eOut);
eText: String[255];
eDateTime: TDateTime;
eJobTitle: String[255];
end;
type TDogovor=record
dFrom, dTo: String[100];
dType: (dIn, dOut);
dSK: String[50];
dText: String[255];
dDN: String[50];
dJobTitle: String[255];
end;
type TJobA=record
DateTime: TDateTime;
Title: String[255];
DataFile: String[255];
end;
type TEnvelope=record
eDatePlan: TDateTime;
eDateReal: TDateTime;
eState: (eMarked, eRunning, eFinished);
eName: String[255];
eFile: String[255];
end;
type TEnvData=record
DbPos: Integer;
Finished: Boolean;
end;
type TUser=record
Username, Password: String[20];
FullName: String[100];
Access: Word;
end;
type TUserData=record
Username, Password: String[20];
FullName: String[100];
end;
type TJob=record
ManagerName: String[50];
Spec: array[1..100] of String[100];
end;
type TMind=record
mFrom, mTo: String[25];
mText: String[255];
mIsRead: Boolean;
mSent: TDateTime;
mInclude: String[255];
end;
type sgSmData=(stUp, stDown);
TDoDList=record
Name: TStringList;
Num: TStringList;
end;
TFT=(ftFolders, ftFiles, ftBoth);
TDoD=record
Num: Integer;
Last: TDate;
end;
TBan=record
Num: Integer;
Banned: Boolean;
end;
TDT=(dtPos, dtName);
TEQ=record
Data: TOrganization;
Num: integer;
end;
var Database: file of TOrganization;
implementation
end.
← →
fly_mer (2006-09-07 14:29) [17]На
[code]var
Form1: TForm1;
type x1=record
str:array of string;
int:array of integer;
end;
const prname=1; id=58237; prcity=23942;
var Data: x1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Data.str[prname] := "Ýëïðîììàø";
Data.int[id] := 3812727;
Data.str[prcity] := "Ñàìàðà";
Showmessage(inttostr(sizeof(Data)));
[/code]
access violation...
← →
Сергей М. © (2006-09-07 15:26) [18]
> fly_mer (07.09.06 14:29) [17]
>
> На
Инициализировать переменную Data будет Пушкин ?
← →
fly_mer (2006-09-07 15:27) [19]Сергей, м.. этта как?
← →
Сергей М. © (2006-09-07 15:27) [20]Тьфу ты.. не data, а поля соотв.структуры ..
← →
evvcom © (2006-09-07 15:43) [21]> Showmessage(inttostr(sizeof(Data)));
Это тебе зачем? Всегда получишь 8.
← →
fly_mer (2006-09-07 16:49) [22]evvcom баловался размер считал :-P
← →
evvcom © (2006-09-07 16:59) [23]> [22] fly_mer (07.09.06 16:49)
> evvcom баловался
Я не баловался :)
> размер считал
А чего его считать? Там 2 указателя всего, итого 8 байт.
← →
fly_mer (2006-09-07 16:59) [24]evvcom тема садика закрыта. я уже разобрался...
лучше обрати внимание на новый пост:)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.04 c