Record v funkciji ali v razredu

Vse drugo, kar ne spada v nobeno zgornjo kategorijo.
Odgovori
odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Record v funkciji ali v razredu

Odgovor Napisal/-a odisej » 12.11.2013 10:56:43

Neki se igram, da bi unicode stringe lahko dajal v nek record, ki gre pol v sort naprej. Tkole je definiran record

Koda: Izberi vse

  TMyRec = record
    i: Integer;
    s: String[50];
  end;
Spodej pa dve funkciji in event na gumbu

Koda: Izberi vse

procedure StringToShortString(const src: String; var dest: ShortString);
var
  l: Integer;
begin
  l := Min(SizeOf(dest) - 1, Length(src) * SizeOf(Char));
  Move(src[1], dest[1], l);
end;

function StringFromShortString(src: ShortString): String;
begin
  SetString(Result, PChar(@src[1]), Length(src) div SizeOf(Char));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  s2: String[50];
  r: TMyRec;
begin
  StringToShortString('грабкуце', r.s);
  Caption := StringFromShortString(r.s);
end;
Če je r deklariran v eventu Button2Click (kot v zgornji kodi), zadeva dela. Če deklariram r v samem razredu forme, ne dela. Je komu jasno, v čem je trik?

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a gabr » 12.11.2013 10:59:23

Definiraj "ne dela".

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a odisej » 12.11.2013 11:02:10

Če je deklariran v samem eventu, pride v funkcijo StringToShortString dest kot zaporedje 50 naključnik znakov. kar mi je pričakovano in ok. Če je deklariran v razredu, pride dest kot prazen string in tudi Move, kot da tega ne spremeni. Zato Caption potem ni tak, kot v prvem primeru.

Sej rešitev je, da dam v StringToShortString dest := StringOfChar(#0, l); ampak me zanima, zakaj razlika.

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a gabr » 12.11.2013 11:18:47

Če je record deklariran v objektu, ga compiler inicializira na 0 pred uporabo.

Če je deklariran kot lokalna spremenljivka, pa tega ne naredi. Če bi imel notri navaden string, potem bi bil inicializiran na '', v shortstringe se pa compiler očitno ne vtika.

Tvoje kode pa ne razumem - kaj sploh hočeš narediti?

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a odisej » 12.11.2013 11:33:12

V turbo sort bi dajal recorde. In nazivi so unicode. Kokr razumem, record ne morem deklarirat samo kot String, ker je to potem pointer in bo turbo sort ubilo. Če pa deklariraš kot String[50] je pa avtomatsko to short string. in zdej, kako unicode string spravit v record, in pol na izhodu turbo sorta v tabelo.
Pa sem pač pomislil, da bi unicode string spravu v record kot array baytov oz. kot short string, na izhodu pa obratno. Koda je pač samo test.

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a gabr » 12.11.2013 11:44:42

A sort funkcija bi bila pa tvoja in bi ta shortrecord pretvorila v Unicode in primerjala?

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a gabr » 12.11.2013 11:48:45

Ah, našel.

V bistvu je problem samo v tem, da v StringToShortString ne nastavil dolžine (bajt 0) izhodnega ShortStrings.

Koda: Izberi vse

procedure StringToShortString(const src: String; var dest: ShortString);
var
  l: Integer;
begin
  l := Min(SizeOf(dest) - 1, Length(src) * SizeOf(Char));
  Move(src[1], dest[1], l);
  dest[0] := AnsiChar(l);
end;

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Re: Record v funkciji ali v razredu

Odgovor Napisal/-a odisej » 12.11.2013 12:05:28

Ok, razumem, hvala.

Odgovori