关于记录(Recoed)这种数据类型的问题!!! (50分)

  • 主题发起人 主题发起人 yanxiaobai
  • 开始时间 开始时间
Y

yanxiaobai

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个Recoed数据类型,如下:
MyRec = Record
xxx000: string[3];
xxx001: string[3];
xxx002: string[8];
xxx003: string[5];
xxx004: string[8]

xxx005: string[8];
xxx006: string[12];
xxx007: string[30]

...... ......
...... ......
xxx050: string[30]

end;
这51个字符串变量中已经分别存入了相应的值,我现在想把这51个值分别
保存到51个TEdit编辑框的Text属性中,怎样用最简便、快捷的方法!而不必
写51条赋值语句呢?
 
好东西,我试试看看。

题目不错,谢谢

曾经有过类同的,没时间搞所以没深究,今天来试试。

等我啊~~~~~~~~~~
 
用类可以做到这一点,不过没什么意思。一般被设定的eidt的名字会取成特别的名字,所以及时完成了以上策略也没意思。
 
代码:
用指针指向第一个字段的

unit RecordFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmRecord = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    btnSetData: TButton;
    procedure btnSetDataClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmRecord: TfrmRecord;

implementation

{$R *.dfm}

procedure TfrmRecord.btnSetDataClick(Sender: TObject);
type
  TMyData = record
    Str1: string;
    Str2: string;
    Str3: string;
    Str4: string;
    Str5: string;
    Str6: string;
    Str7: string;
  end;
var
  MyData: TMyData;
  FirstData: ^string;
  I: Integer;
begin
  MyData.Str1 := '1';
  MyData.Str2 := '2';
  MyData.Str3 := '3';
  MyData.Str4 := '4';
  MyData.Str5 := '5';
  MyData.Str6 := '6';
  MyData.Str7 := '7';
             
  for I := 0 to ComponentCount - 1 do
  begin
    FirstData := @(MyData.Str1);
    if Components[I] is TEdit then
    begin
      Inc(FirstData, (Components[I] as TEdit).Tag);
      (Components[I] as TEdit).Text := FirstData^;
    end;
  end;


end;

end.

 
设Edit的Tag与记录字段对应,作为偏移量。
 
类型要一样~~~~~~~~~~~~~~

SizeOf(string[4])
SizeOf(string[2])
是不同
 
Nizvoo 的办法不错,但是相对麻烦点,如果你的 Edit 都是按顺序命名,且
你要按顺序赋值(一般也因该是这样),则这样应该更简单,不用 Tag:

var
i: Integer;
p: Pointer;
Data: MyRec;
begin
// 给 Data 赋值,略
p := @Data;
for i := 1 to 51 do
begin
TEdit(FindComponent('Edit' + IntToStr(i))).Text := PChar(p^);
Inc(PChar(p), SizeOf(string));
end;
end;

不过正如 Nizvoo 所说,你的每一个字段的长度 [red]必须[/red] 一样,建议如下定义:
MyRec = Record
xxx000: string;
xxx001: string;
xxx002: string;
xxx003: string;
xxx004: string

xxx005: string;
xxx006: string;
xxx007: string

...... ......
...... ......
xxx050: string

end;
 
后退
顶部