czyszczenie rekordu jak

0

Jak wyczyścić wszystkie pola rekordu nie odwołując się bezpośrednio do tych pól ? nie chodzi mi o zwolnienie rekordu

np:

type TMoj=record
a: integer;
b:string[20];
c:byte;
end;

var ob : TMoj

normalnie zawartosc czyszcze

ob.a :=0;
ob.b := '';
ob.c := 0;

a chce zczyscic uzyskujac ten sam efekt co pozwyzej, ale nie odwolujac sie do tych pol bezposrednio

0

Jeżeli koniecznie chcesz wyczyścić cały rekord za jednym zamachem, to możesz to zrobić w taki sposób

FillChar(ob, SizeOf(ob), 0);

Ta procedura wypełnia zerami cały obszar pamięci zajęty przez zmienną ob typu rekordowego. Funkcja **SizeOf **podaje rozmiar pamięci zajmowanej przez zmienną. Co prawda polu b, które zawiera tekst nie jest przypisywany łańcuch pusty, ale jest ustawiana jest jego długość na zero, co w efekcie daje ten sam rezultat.

Jest jednak małe ale. Jest to operacja potencjalnie niebezpieczna, gdyż nie jest przeprowadzana żadna kontrola zakresów i można wyzerować jakiś inny obszar pamięci, co niechybnie spowoduje problemy. Po prostu trzeba uważać, co się robi. Zresztą w Turbo Pascalu można zastosować ten trik i spełnia on swoje zadanie, ale już w Delphi program się nie wykonuje (Runtime error 103)
Najlepiej więc zeruj rekord w taki sposób, jaki podałeś. Tak będzie najbezpieczniej

Tak sobie jeszcze pomyślałem. Może chodzi Ci o zastosowanie instrukcji wiążącej with (chociaż chyba nie)

with ob do begin
  a:= 0;
  b:= '';
  c:= 0;
end;
0

Co prawda polu b, które zawiera tekst nie jest przypisywany łańcuch pusty, ale jest ustawiana jest jego długość na zero, co w efekcie daje ten sam rezultat.

Jeśli string jest shortstringiem, to ciąg o długości zero jest ciągiem pustym.
Jeśli string jest ansistringiem, widestringiem lub unicodestringiem, to wartość nil jest ciągiem pustym.
Tak czy inaczej, jest przypisywany łańcuch pusty.

0
unit Unit1;

interface

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

type
  TMyRecord = record
    a: integer;
    b: string;
    procedure Clear;
  end;

type
  TMyClass = class
    a: integer;
    b: string;
    procedure Clear;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    myrecord: TMyRecord;
    myclass: TMyClass;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyRecord.Clear;
begin
 a:=0;
 b:='';
end;

procedure TMyClass.Clear;
begin
 a:=0;
 b:='';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 myrecord.a:=1;
 myrecord.b:=IntToStr(myrecord.a);
 ShowMessage(myrecord.b);
 myrecord.Clear;
 ShowMessage(myrecord.b);

 myclass:=TMyClass.Create;
 myclass.a:=2;
 myclass.b:=IntToStr(myclass.a);
 ShowMessage(myclass.b);
 myclass.Clear;
 ShowMessage(myclass.b);
 myclass.Free;
end;

end. 
0

to jeszcze tylko napisz od której wersji delphi to zadziała...

0

Właśnie jedno rozwiązanie pod Turbo Pascala drugie pod Delphi Net, a nie pod win32,

a może można wypełnić obszar pamięci (równy rozmiarowi rekordu) "czymś" i później za pomoca wskaźnika "zerować" pola rekordu (wskazujac na ten obszar), można tak by udalo się przypisać te zera i puste łańcuchy wszystkim polom rekordu (i czym wypełnić by niezaleznie czy liczba czy łańcuch nastapilo zerowanie)?

0

co ty chcesz kombinować? kol. simplex już ci dał rozwiązanie:

FillChar(ob, SizeOf(ob), 0);

1 użytkowników online, w tym zalogowanych: 0, gości: 1