но возникла проблема при получение поля значения типа msestring, значение получаются "левые".
- Код: Выделить всё
{ TV }
type tvnorm=(NTSC,NTSC_M,NTSC_M_JP,NTSC_M_KR,PAL,PAL_BG,
PAL_H,PAL_I,PAL_DK,PAL_M,PAL_N,PAL_Nc,PAL_60,SECAM,SECAM_B,
SECAM_G,SECAM_H,SECAM_DK,SECAM_L,SECAM_Lc);
const
TvStr : array [tvnorm] of String [20] =('NTSC','NTSC-M','NTSC-M-JP','NTSC-M-KR','PAL','PAL-BG',
'PAL-H','PAL-I','PAL-DK','PAL-M','PAL-N','PAL-Nc','PAL-60','SECAM','SECAM-B',
'SECAM-G','SECAM-H','SECAM-DK','SECAM-L','SECAM-Lc');
type
tmainfo = class(tmainform)
l_Name: tlabel;
l_freq: tlabel;
l_norm: tlabel;
e_Name: tstringedit;
e_norm: tstringedit;
tlabel1: tlabel;
e_count: tstringedit;
tbutton1: tbutton;
tbutton2: tbutton;
tdatabutton1: tdatabutton;
e_freq: tstringedit;
procedure _init(const sender: TObject);
procedure _prev(const sender: TObject);
procedure _next(const sender: TObject);
end;
type
PTVData = ^TTVData;
TTVData = record
Name:msestring;
Norm:tvnorm;
Freq: integer;
end;
{ TTVDataList }
TTVDataList = class
private
FTVList: TList; // хранилище данных
public
constructor Create;
destructor Destroy; override;
function AddItem(Item: TTVData): Integer;
procedure RemoveItem(ItemIndex: Integer);
function GetData(Idx: integer): TTVData;
function Count: integer;
procedure Exchange(idx1, idx2: integer);
end;
var
mainfo: tmainfo;
Count:integer;
data:ttvdatalist;
implementation
uses
main_mfm,sysutils;
function TTVDataList.AddItem(Item: TTVData): Integer;
var p: PTVData;
begin
GetMem(p, SizeOf(Item{TTVData})); // выделением памяти занимаемся самостоятельно
Move(Item, p^, SizeOf(Item{TTVData}));
Result := FTVList.Add(p); // просто перенаправляем вызов
end;
function TTVDataList.Count: integer;
begin
Result := FTVList.Count; // просто перенаправляем вызов
end;
constructor TTVDataList.Create;
begin
inherited Create;
FTVList := TList.Create; // не забываем создать объект
end;
destructor TTVDataList.Destroy;
begin
FTVList.Free; // уничтожаем объект
inherited Destroy;
end;
procedure TTVDataList.Exchange(idx1, idx2: integer);
begin
FTVList.Exchange(idx1, idx2); // просто перенаправляем вызов
end;
function TTVDataList.GetData(Idx: integer): TTVData;
begin
//FillChar(Result, SizeOf(TTVData), #0);
Result := TTVData(FTVList.Items[Idx]^); // перенаправляем вызов и приводим к TTVData
end;
procedure TTVDataList.RemoveItem(ItemIndex: Integer);
begin
FreeMem(FTVList[ItemIndex]); // освобождаем память тоже сами
FTVList.Delete(ItemIndex);
end;
procedure showitem(Idx:integer);
var
tmp:Ttvdata;
begin
tmp:=data.GetData(Count);
mainfo.e_name.value:=tmp.Name;
mainfo.e_freq.value:=inttostr(tmp.Freq);
mainfo.e_norm.value:=tvstr[tmp.norm];
mainfo.e_count.value:=inttostr(Count);
end;
procedure tmainfo._init(const sender: TObject);
var
i:integer;
tmp:Ttvdata;
begin
data:=ttvdatalist.create;
for i:=0 to 10 do
begin
tmp.name:='name='+inttostr(i);
tmp.freq:=i*5;
tmp.norm:=secam;
data.additem(tmp);
end;
Count:=0;
showitem(Count);
end;
procedure tmainfo._prev(const sender: TObject);
begin
if Count>0 then dec(count);
showitem(Count);
end;
procedure tmainfo._next(const sender: TObject);
begin
if Count<data.count-1 then inc(Count);
showitem(Count);
end;
PS:просто хотел добавить к alsmplayer хранение название канала в списке

ОС:linux 32, fpc 2.4.2