procedure TForm1.Button6Click(Sender: TObject);
var kolRow, b, j, k:integer;
f:textfile;
begin
kolRow:=0;//кол-во строк, относящихся к служебной информации
assignfile(f,'Отчёт1.txt');//связываем переменную с текстовым файлом
reset(f);//открываем файл для чтения
i:=0;//устанавливаем начальный индекс строк
while not eof(f) do//цикл заполнения таблиц из базы данных
begin
readln(f,s);//читаем текст из текущей строки файла и записываем его в переменную S
b:=1;//устанавливаем начальный номер 1-го символа слова
j:=0;//устанавливаем начальный индекс столбцов
i:=i+1;//увеличиваем индекс строк
for k:=1 to length(s) do//цикл сортировки данных в строке
begin
if s[k]='|' then//проверяем наличие разделителя
begin
ListView2.Items[j].SubItems:=copy(s,b,k-b);//записываем в ячейку значение
b:=k+1;//запоминаем номер символа, с которого начинается новое слово
j:=j+1;//увеличиваем номер столбца
end;
end;
end;
end;
Работа с индексными файлами
Подскажите пожалуйста как правильно работать с индексными файлами!!!
Создание такого файла, запись в него, чтение из него, добавление/изменение/удаление.
И с помощью каких компонентов с ними работать в Delphi???
За ранее пасибо
2. я таких компонент не видел.
3. организованы по принципу массивов (одномерных) и к ним применимы все алгоритмы для массивов, т.к. сортировка, поиск, слияние-разделение и т.п.
Хорошо, как использовать ListView с этими индексными файлами (или даже просто с файлами)??
АУ-АУ, специалисты и эксперты где вы??? ну подскажите хоть что нибудь!!! :(
Для начала скажи, что ты подразумиваешь по термином "индексный файл".;)
например текст в текстовом файле таков:
1|Фамилия1|
2|Фамилия2|
и т.д.
Его надо отобразить в listview без разделительного знака, по столбцам и строкам :confused:
что-то структура текстового файла у тебя не особо понятная, тебе просто список загрузить чтоли нужно? или ветвление какое-то подразумевается?
Мне необходимо чтобы информация из текстового файла загружалась в listview по столбцам и строкам (информация в тектовом файле должна храниться с разделителями типа: "|")
То, что от начала строки до первого "|" помещаешь в первый столбец, от первого "|" до второго - во второй и т.д.
вот как это сделать, вот в чём вопрос!!!
потом в цикле читаешь из файла по одной строке, а во внутреннем цикле считанную строку разбераешь по словам
как сохранять у меня есть процедура, а вот как загружать, то с этим проблема!!!
Вот мой код загрузки из файла в listview, но он не работает, где ошибка, скажите пожалуйста:
может как-то так:
Код:
var f:textfile;s,b:string;i:integer;n:TListItem;
begin
try
assignfile(f,'Отчёт1.txt');
reset(f);
i:=0;
while not eof(f) do
begin
readln(f,s);
n:=ListView2.Items.Add;
while s<>'' do
begin
b:=copy(s,1,pos('|',s)-1);
if n.Caption='' then n.Caption:=b
else
n.SubItems.Add(b);
delete(s,1,pos('|',s));
end;
inc(i);
end;
finally
closefile(f);
end;
end;
begin
try
assignfile(f,'Отчёт1.txt');
reset(f);
i:=0;
while not eof(f) do
begin
readln(f,s);
n:=ListView2.Items.Add;
while s<>'' do
begin
b:=copy(s,1,pos('|',s)-1);
if n.Caption='' then n.Caption:=b
else
n.SubItems.Add(b);
delete(s,1,pos('|',s));
end;
inc(i);
end;
finally
closefile(f);
end;
end;
з.ы. в текстовом файле каждая строка обязательно должна заканчиваться на |
здесь лучше StringGride использовать
спасибо за ответ, нет stringrid не подходит, нужно именно listview
Процедура по загрузке данных из файла в ListView:
Код:
Procedure ReadListView(S: String; ListView: TListView);
Const Razdel = '|';
Var f: TextFile;
Begin
AssignFile(f, 'base\base.db');
Reset(f);
try
While not Eof(f) Do
Begin
ReadLn(f,S);
With ListView.Items.Add Do
Begin
Caption:=Copy(S,1,Pos(Razdel,S)-1);
System.Delete(S,1,Pos(Razdel,S));
S:=StringReplace(S,Razdel,#13#10,[rfReplaceAll]);
SubItems.Text:=S;
End; {With}
End; {While}
finally
CloseFile(f);
end;
End;
Const Razdel = '|';
Var f: TextFile;
Begin
AssignFile(f, 'base\base.db');
Reset(f);
try
While not Eof(f) Do
Begin
ReadLn(f,S);
With ListView.Items.Add Do
Begin
Caption:=Copy(S,1,Pos(Razdel,S)-1);
System.Delete(S,1,Pos(Razdel,S));
S:=StringReplace(S,Razdel,#13#10,[rfReplaceAll]);
SubItems.Text:=S;
End; {With}
End; {While}
finally
CloseFile(f);
end;
End;
А при нажатии кнопки её вызываем так:
Код:
ReadListView('base\base.db', ListView1);
Вот процедура сохранения данных в файл:
Код:
Const Razdel = '|';
var f:textfile;
s:string;
i:integer;
begin
AssignFile(f, 'base\base.db');
ReWrite(f);
try
With ListView1 Do For i:=0 to Items.Count - 1 Do
WriteLn(f,StringReplace(Items.Caption + Razdel + Items.Item.SubItems.Text,#13#10,Razdel,[rfReplaceAll]));
finally
CloseFile(f);
end;
var f:textfile;
s:string;
i:integer;
begin
AssignFile(f, 'base\base.db');
ReWrite(f);
try
With ListView1 Do For i:=0 to Items.Count - 1 Do
WriteLn(f,StringReplace(Items.Caption + Razdel + Items.Item.SubItems.Text,#13#10,Razdel,[rfReplaceAll]));
finally
CloseFile(f);
end;
Всё прекрасно работает, сам уж попробовал.
Всем спасибо за участие ;)
ещё вопрос, а как, чтобы при выделении какой либо в listview строки с данными, открывалось окно и поля заполнялись данными из этих столбцов (столбцов в listview больше 3)
Цитата: Cool Xacker
ещё вопрос, а как, чтобы при выделении какой либо в listview строки с данными, открывалось окно и поля заполнялись данными из этих столбцов (столбцов в listview больше 3)
Код:
procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if Selected
then ShowMessage(Item.Caption);
end;
Selected: Boolean);
begin
if Selected
then ShowMessage(Item.Caption);
end;
Мой код:
Код:
edit2.text:=ListView1.Selected.Caption;
edit3.text:=ListView1.Selected.SubItems.text;
edit4.text:=ListView1.Selected.SubItems.text;
edit5.text:=ListView1.Selected.SubItems.text;
edit3.text:=ListView1.Selected.SubItems.text;
edit4.text:=ListView1.Selected.SubItems.text;
edit5.text:=ListView1.Selected.SubItems.text;
например строка в listview:
Номер|Дата |Событие |
1 |12.03.2008|Приветствие|
значит edit заполнится так:
edit1.text= 1
edit2.text=12.03.2008
edit3.text=Приветствие
Вот как мне надо, они заполняют только первый edit, а во второй пишут все остальные данные не разделяя
Цитата: Cool Xacker
Но мне нужно чтобы edit'ы заполнялись данными из выделенной строки (столбцов 4 и более)
Мой код:
например строка в listview:
Номер|Дата |Событие |
1 |12.03.2008|Приветствие|
значит edit заполнится так:
edit1.text= 1
edit2.text=12.03.2008
edit3.text=Приветствие
Вот как мне надо, они заполняют только первый edit, а во второй пишут все остальные данные не разделяя
Мой код:
Код:
edit2.text:=ListView1.Selected.Caption;
edit3.text:=ListView1.Selected.SubItems.text;
edit4.text:=ListView1.Selected.SubItems.text;
edit5.text:=ListView1.Selected.SubItems.text;
edit3.text:=ListView1.Selected.SubItems.text;
edit4.text:=ListView1.Selected.SubItems.text;
edit5.text:=ListView1.Selected.SubItems.text;
например строка в listview:
Номер|Дата |Событие |
1 |12.03.2008|Приветствие|
значит edit заполнится так:
edit1.text= 1
edit2.text=12.03.2008
edit3.text=Приветствие
Вот как мне надо, они заполняют только первый edit, а во второй пишут все остальные данные не разделяя
Код:
[LEFT]procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
[LEFT] Selected: Boolean);
begin
if Selected
then begin
edit2.text:=Item.Caption;
edit3.text:=Item.SubItems[0];
edit4.text:=Item.SubItems[1];
edit5.text:=Item.SubItems[2];[/LEFT]
[LEFT]end;
end;[/LEFT]
[LEFT] Selected: Boolean);
begin
if Selected
then begin
edit2.text:=Item.Caption;
edit3.text:=Item.SubItems[0];
edit4.text:=Item.SubItems[1];
edit5.text:=Item.SubItems[2];[/LEFT]
[LEFT]end;
end;[/LEFT]
[/LEFT]
Для справки SubItems имеет тип TStrings.... и как следствие его св-во Text выдаёт ВЕСЬ текст в нём содржащийся.....
Без обид, но справку по св-вам и методам читать то надо...
Цитата: misha_turist
Код:
[LEFT]procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
[LEFT] Selected: Boolean);
begin
if Selected
then begin
edit2.text:=Item.Caption;
edit3.text:=Item.SubItems[0];
edit4.text:=Item.SubItems[1];
edit5.text:=Item.SubItems[2];[/LEFT]
[LEFT]end;
end;[/LEFT]
[LEFT] Selected: Boolean);
begin
if Selected
then begin
edit2.text:=Item.Caption;
edit3.text:=Item.SubItems[0];
edit4.text:=Item.SubItems[1];
edit5.text:=Item.SubItems[2];[/LEFT]
[LEFT]end;
end;[/LEFT]
[/LEFT]
Для справки SubItems имеет тип TStrings.... и как следствие его св-во Text выдаёт ВЕСЬ текст в нём содржащийся.....
Без обид, но справку по св-вам и методам читать то надо...
Скажи пожалуйста, а
edit3.text:=Item.SubItems[0]; тоже самое что и edit3.text:=Item.SubItems.strings[0]; или нет
Поэтому вызывая "SubItems[0]" ты фактически вызываешь "SubItems.strings[0]".
огромнейшее спасибки (везде инфу про listview искал, в основном ничего нет и справочников так же нет)
Стандартная справка тебе в руки.... Я все ответы для тебя именно там или великим и могучим методом научного тыка нашёл.
а можешь мне дать ссылку на эту справку или скинуть на мыло: [email]shicko@land.ru[/email]
Ну и коль завели вопрос по поводу этого list view, тогда как сортировать по столбцам, искать данные???
А по поводу второго вопроса - смотри предыдущие два предложение. ;)
окей, спасибки, нашёл (очень не здорово что на не нашем, но что поделать)
Ты спасибо скажи, что ещё с БД серьёзным не работал, там без документации ни куда... а её МНОГО.... и по Русски ни чего нету... :)