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

Вниз

Тип 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];  // &#228;&#238;&#239; &#232;&#237;&#244;&#238;
 cJobTitle: String[255];
end;

type TProdaga=record
 pFrom, pTo, pSumma: String[255];
 pType: (ptIn, ptOut);
 pDateTime: TDateTime;
 pProdano: string[255];
 pAbout: String[255];  // &#228;&#238;&#239; &#232;&#237;&#244;&#238;
 pJobTitle: String[255];
end;

type TFax=record
 fNum: Integer;
 fFrom, fTo, fSKem: String[255];
 fType: (ftIn, ftOut, ftInfo, ftNone);
 fDateTime: TDateTime;
 fAbout:String[255];  // &#228;&#238;&#239; &#232;&#237;&#244;&#238;
 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] := "&#221;&#235;&#239;&#240;&#238;&#236;&#236;&#224;&#248;";
 Data.int[id] := 3812727;
 Data.str[prcity] := "&#209;&#224;&#236;&#224;&#240;&#224;";
 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
8-1141738221
Vitaly73
2006-03-07 16:30
2006.09.24
mp3-проигрыватель


10-1123433445
Nick Denry
2005-08-07 20:50
2006.09.24
Все тот же ActiveX....


2-1156642642
Juri
2006-08-27 05:37
2006.09.24
Помогите профильтровать базу данных по дате


15-1157055376
Torry
2006-09-01 00:16
2006.09.24
ISDEF 2006 Start


3-1153467923
RomanH
2006-07-21 11:45
2006.09.24
Столбец-массив в IB