MFileOpen.Filename := GetValue;
MFileOpen.Filter := 'Правильный тип файлов|*.*'; (* Поместите здесь ваш собственный фильтр...*)
MFileOpen.Options := MFileOpen.Options + [ofPathMustExist,ofFileMustExist];
try
ifMFileOpen.Execute thenSetValue(MFileOpen.Filename);
finally
MFileOpen.Free;
end;
end;
В Delphi 2.0 я пытаюсь прочесть текстовый файл и получаю проблему. Текстовый файл, который я хочу прочесть, имеет записи фиксированной длины, но в самих записях могут располагаться различные типы с различной длиной, и оканчиваться в различных позициях, в зависимости от типа.
Файл выглядит примерно так:
TFH.......
TBH.......
TAB........
TAA........
Вы можете поймать больше одного зайца в случае объявления переменной записи, но если сделаете это правильно.
Type
TDataTag = Array[1..3] ofChar;
TDataTags = Array[0..NumOfTags-1] ofTDataTag;
TDataRec = packed Record
tagfield: TDataTag;
caseinteger of
0: ( поля для тэга TFH );
1: ( поля для тэга TBH );
2: …
…
end;
TMultiRec = packed Record
CaseBoolean of
false: (строка: Array [0..1024] of Char);
{ должно установать строку максимально возможной длины }
true : ( data: TDataRec );
End;
ConstDataTags: TDataTags = ('TFH', 'TBH', …);
varrec: TMultirec;
ReadLn(datafile, rec.line);
CaseIndexFromDataTag(rec.data.tagfield) Of
0: …
1: …
IndexFromDataTag должен искать передаваемый тэг поля в массиве DataTags. Определите все поля в TDataRec как Array [1..someUpperBound] of Char.
– Peter Below
Передача массива записей символов в Memo
Тема: Передача массива записей символов в Memo.
Обработка больших строк в 16-битной версии Delphi задача далеко непростая. Особенно когда строки являются частью структуры записи и вы хотите передать их в TMemo. В данном совете показано как создать структуру записи размером 1000 символов, прочесть в нее содержимое Memo и затем записать ее обратно в Memo. Основной метод, который мы здесь используем — метод Memo GetTextBuf. Используемая структура записи представляет собой простую строку и массив из 1000 символов, но структура могла бы быть сложнее.
unitURcrdIO;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls,dbtables;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedureButton1Click(Sender: TObject);
procedureButton2Click(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
type
TMyRec = record
MyArray: array[1..1000] ofchar;
mystr: string;
end;
var
Form1: TForm1;
MyRec : TMyRec;
mylist : TStringlist;
PMyChar : PChar;
myfile : file;
mb : TStream;
implementation
{$R *.DFM}
procedureTForm1.Button1Click(Sender: TObject);
begin
assignfile(myfile, 'c:\testblob.txt');
rewrite(myfile,1);
fillchar(MyRec.MyArray,sizeof(MyRec.MyArray),#0);
pmychar:=@MyRec.MyArray;
StrPCopy(pmychar,memo1.text);
Blockwrite(MyFile,MyRec,SizeOf(MyRec));
closefile(MyFile);
end;
procedureTForm1.Button2Click(Sender: TObject);
begin
assignfile(myfile, 'c:\testblob.txt');
reset(myfile,1);
fillchar(MyRec.MyArray, sizeof(MyRec.MyArray),#0);
Blockread(MyFile, MyRec, SizeOf(MyRec));
pmychar:=@MyRec.MyArray;
Memo1.SetTextBuf(pmychar);
end;
end.
Для начала необходимо привести объект к нужному типу, например, так:
var
i: integer;
begin
…
for
i := 0 toMyList.Count - 1 dodispose(PMyRecord(MyList[i]));
MyList.Free;
end;
или
begin
for i := 0 toMyList.Count - 1 dodispose(PMyRecord(MyList.items[i]));
MyList.Free;
end;
Items — свойство по умолчанию, поэтому вам нет необходимости определять это, хотя обратное не помешает.
Теперь можно заняться созданием работоспособной и полезной функцией. В форме:
varp : ^mystruct;
Читать дальше