Главная страница
    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.038 c
1-1155579611
lookin
2006-08-14 22:20
2006.09.24
Компонент на основе TCustomPanel: свойство Parent


2-1157114544
VitV
2006-09-01 16:42
2006.09.24
FastReport-подсчёт количества строк


2-1157443259
VitV
2006-09-05 12:00
2006.09.24
Построение графика в FastReport


3-1153404215
Pazitron_Brain
2006-07-20 18:03
2006.09.24
Два вопроса по удаленной бд


15-1157200726
Andy BitOff
2006-09-02 16:38
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский