Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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];  // &#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.044 c
1-1155112767
5serg
2006-08-09 12:39
2006.09.24
Как редактировать реестр из под пользователя


2-1157113761
Серге И
2006-09-01 16:29
2006.09.24
Помогите определить количество суббот????


6-1146868280
KASioZ
2006-05-06 02:31
2006.09.24
Состояние сокета winsock


2-1157274149
koha
2006-09-03 13:02
2006.09.24
Как определить в видимой части номер строки в StringGrid


15-1157137886
Sergey Masloff
2006-09-01 23:11
2006.09.24
Тоже опрос. Про то что нужно всегда улыбаться... хе-хе





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